{"version":3,"sources":["configure/apiAuthorizationConfig.ts","api/api-authorization/AuthorizeService.ts","api/api-authorization/useAuthorizeService.ts","api/api-authorization/useAuthenticatedState.ts","components/layout/UserNav.tsx","api/account/AccountService.ts","api/account/ClaimTypes.ts","api/account/useAccountService.ts","globalState/currentUserDetails/useCurrentUserRolesCache.ts","api/account/useCurrentUserRoles.ts","api/account/useExternalAuthenticationSchemes.ts","api/account/useResendConfirmationEmailCallback.ts","api/account/useStartExternalLoginCallback.ts","shared/authorizeRoute/AuthorizeContainer.tsx","shared/authorizeRoute/AuthorizeRoute.tsx","components/shared/NavLinkTrackActive.tsx","configure/security/IdentityRoles.ts","components/layout/Navigation.tsx","components/layout/appNavbarBrand/AppNavbarBrand.tsx","globalState/globalSearchText/useGlobalSearchText.ts","components/shared/searchInput/SearchInput.tsx","components/layout/headerSearchInput/HeaderSearchInput.tsx","components/layout/Header.tsx","components/layout/FooterNavigation.tsx","components/layout/Footer.tsx","shared/sidebarNav/SidebarNav.tsx","shared/sidebarNav/SidebarNavTitle.tsx","components/shared/AppRoutes.tsx","components/shared/LoadingIndicator.tsx","components/shared/background/Background.tsx","components/account/AccountBackground.tsx","components/api-authorization/LoginWaiting.tsx","components/api-authorization/ApiAuthorizationConstants.ts","components/api-authorization/Login.tsx","components/api-authorization/Logout.tsx","components/api-authorization/routes.tsx","shared/userFriendlyErrorMessage/registerErrorMessageConverters.ts","shared/alertOnErrors/AlertOnErrors.tsx","shared/userFriendlyErrorMessage/userFriendlyErrorMessage.ts","shared/useChanges/useChanges.ts","shared/useChanges/useChangesArray.ts","components/account/ExternalLoginButton.tsx","components/shared/FormButtons.tsx","components/shared/sideContainer/SideContainer.tsx","configure/mainApiConfig.ts","api/main/models/CmsVideo.ts","api/main/models/BlobReference.ts","api/main/models/CmsText.ts","api/main/blobReferences/BlobUploadService.ts","shared/htmlEditor/BlobReferenceUploadAdapter.ts","shared/htmlEditor/HtmlEditor.tsx","shared/fetch-oembed/providers/DailyMotionProvider.ts","shared/fetch-oembed/providers/FacebookProvider.ts","shared/fetch-oembed/providers/FlickrProvider.ts","shared/fetch-oembed/providers/GoogleMapsProvider.ts","shared/fetch-oembed/providers/InstagramProvider.ts","shared/fetch-oembed/providers/SpotifyProvider.ts","shared/fetch-oembed/providers/TwitterProvider.ts","shared/fetch-oembed/providers/VimeoProvider.ts","shared/fetch-oembed/providers/YouTubeProvider.ts","shared/fetch-oembed/FetchOEmbed.ts","shared/fetch-oembed/processOEmbedElements.ts","shared/htmlEditor/HtmlDisplay.tsx","components/cms/cmsTexts/CmsTextHtmlDisplay.tsx","components/cms/cmsVideos/CmsVideoDisplay.tsx","components/cmsPages/LoginPartialPage.tsx","api/main/cmsPages/viewModels/useLoginPartialPageViewModel.ts","shared/passwordValidation/PasswordOptions.ts","shared/passwordValidation/PasswordValidation.ts","shared/passwordValidation/usePasswordValidation.ts","shared/passwordValidation/generatePasswordRulesDescription.ts","api/main/models/RoleGroup.ts","api/main/models/User.ts","api/main/models/Profile.ts","components/shared/TwoValueSwitch.tsx","components/tags/TagSelector.tsx","shared/useFetchMoreCallback/useFetchMoreCallback.ts","api/main/models/ItemTag.ts","api/main/itemTags/useItemTags.ts","components/profiles/RegisterProfileDetails.tsx","api/main/profiles/useRegisterProfileCallback.ts","components/shared/MainContainer.tsx","components/shared/Banner.tsx","components/profiles/ConfirmInviteProfileDetails.tsx","api/main/profiles/useProfileForInvite.ts","components/account/routes.ts","components/account/Login.tsx","api/account/useLoginWithPasswordCallback.ts","components/account/Register.tsx","api/account/useRegisterAccountCallback.ts","components/account/ExternalLoginCallback.tsx","api/account/useCompletedExternalLoginDetails.ts","api/account/useCreateAccountForExternalLoginCallback.ts","components/account/ForgotPassword.tsx","api/account/useSendPasswordResetEmailCallback.ts","components/account/ResetPassword.tsx","api/account/useResetPasswordCallback.ts","components/account/ConfirmEmail.tsx","api/account/useConfirmEmailCallback.ts","components/account/ConfirmEmailChange.tsx","api/account/useConfirmEmailChangeCallback.ts","components/account/ConfirmInvite.tsx","api/account/useConfirmInviteCallback.ts","api/main/profiles/useProfile.ts","shared/useSaveInStore/useSaveInStore.ts","api/main/profiles/useCreateProfileCallback.ts","api/main/profiles/useUpdateProfileCallback.ts","api/main/profiles/useSaveProfileCallback.ts","components/profiles/ProfileDetails.tsx","components/profiles/ChangePassword.tsx","api/account/useChangePasswordCallback.ts","components/profiles/ChangeEmail.tsx","api/main/users/useUser.ts","api/account/useChangeEmailCallback.ts","components/profiles/routes.ts","components/profiles/Profile.tsx","api/main/profiles/useProfiles.ts","shared/useURLSearchParams/useURLSearchParams.ts","shared/useURLSearchParams/useReplaceSearchParamsEffect.ts","shared/useURLSearchParams/useSearchParams.ts","components/shared/NoResultsFound.tsx","components/shared/TableRowButtons.tsx","components/shared/StickyToolbar.tsx","api/main/users/useChangeUserRoleGroupCallback.ts","components/users/EditUser.tsx","api/main/profiles/useProfileSupportingData.ts","api/account/useInviteCallback.ts","api/account/useResendInviteEmailCallback.ts","api/account/useChangeAccountEmailCallback.ts","components/users/DeleteUser.tsx","api/main/profiles/useDeleteProfileCallback.ts","api/account/useLockoutCallback.ts","components/users/routes.ts","components/users/AdministratorsUserList.tsx","components/users/RegisteredUsersList.tsx","components/home/routes.ts","components/home/Home.tsx","components/shared/SidebarRequired.tsx","components/administration/routes.ts","components/administration/AdministrationHome.tsx","components/administration/AdministrationNavigation.tsx","utilities/scheduleDescription.ts","components/shared/calendar/EventTypeColorBlock.tsx","components/shared/calendar/CalendarDayEvent.tsx","components/shared/calendar/CalendarDay.tsx","components/shared/calendar/CalendarWeek.tsx","components/shared/calendar/CalendarWeekdayNames.tsx","components/shared/calendar/CalendarMonth.tsx","components/calendar/CalendarMonthHeadline.tsx","api/main/models/CalendarEventSchedule.ts","api/main/models/CalendarEvent.ts","api/main/models/CalendarEventUrl.ts","api/main/models/ItemTagLink.ts","api/main/models/CalendarEventCalendarEventProvider.ts","components/calendar/CalendarEventCardItem.tsx","utilities/getFullUrl.ts","components/shared/trackedLink/TrackedLink.tsx","utilities/generateTrackedUrl.ts","components/calendar/CalendarEventModal.tsx","utilities/generateCalendarEventRouteUrl.ts","components/calendar/CalendarHomeStickyToolbar.tsx","components/calendar/CalendarDayCard.tsx","api/main/models/CalendarEventType.ts","api/main/models/CalendarEventProvider.ts","api/main/models/CalendarHeadline.ts","components/calendarEventTypes/EventTypeSelector.tsx","api/main/models/AnalyticEvent.ts","api/main/analyticEvents/useCreateAnalyticEventCallback.ts","configure/recoilPersistConfig.ts","globalState/calendarPreferences/useCalendarPreferencesCalendarMode.ts","globalState/calendarPreferences/useCalendarPreferencesExcludedSchoolPhases.ts","globalState/calendarPreferences/useCalendarPreferencesExcludedEventTypes.ts","globalState/calendarPreferences/useCalendarPreferencesExcludedSchoolTypes.ts","components/shared/pwaInstall/useShouldShowPrompt.ts","components/shared/pwaInstall/useIosInstallPrompt.ts","components/shared/pwaInstall/InstallPwaPrompt.tsx","components/shared/pwaInstall/useWebInstallPrompt.ts","components/calendar/CalendarHome.tsx","api/main/calendarEventSchedules/viewModels/useCalendarHomeViewModel.ts","api/main/calendarEventSchedules/viewModels/useCalendarHomeSupportingData.ts","api/main/blobReferences/useBlobReferences.ts","components/calendar/generateCalendarHomeScheduleViewModel.ts","components/calendar/routes.ts","components/calendar/SearchCalendar.tsx","components/shared/colorDisplay/ColorDisplay.tsx","api/main/calendarEventTypes/useCalendarEventType.ts","api/main/calendarEventTypes/useCreateCalendarEventTypeCallback.ts","api/main/calendarEventTypes/useUpdateCalendarEventTypeCallback.ts","components/calendarEventTypes/EditCalendarEventType.tsx","api/main/calendarEventTypes/useSaveCalendarEventTypeCallback.ts","components/calendarEventTypes/DeleteCalendarEventType.tsx","components/calendarEventTypes/routes.ts","components/calendarEventTypes/CalendarEventTypesList.tsx","api/main/calendarEventTypes/useCalendarEventTypes.ts","api/main/calendarEventTypes/useDeleteCalendarEventTypeCallback.ts","components/shared/uploadedImagePreview/UploadedImagePreview.tsx","api/main/calendarEventProviders/useCreateCalendarEventProviderCallback.ts","api/main/calendarEventProviders/useUpdateCalendarEventProviderCallback.ts","components/shared/fileUploadButton/FileUploadButton.tsx","api/main/blobReferences/useUploadBlobCallback.ts","components/calendarEventProviders/EditCalendarEventProvider.tsx","api/main/calendarEventProviders/viewModels/useEditCalendarEventProviderViewModel.ts","api/main/calendarEventProviders/useSaveCalendarEventProviderCallback.ts","components/calendarEventProviders/DeleteCalendarEventProvider.tsx","components/calendarEventProviders/routes.ts","components/calendarEventProviders/CalendarEventProvidersList.tsx","api/main/calendarEventProviders/viewModels/useCalendarEventProvidersListViewModel.ts","api/main/calendarEventProviders/useCalendarEventProvider.ts","api/main/calendarEventProviders/useDeleteCalendarEventProviderCallback.ts","components/calendar/CalendarMonthHeadlinePreview.tsx","api/main/calendarHeadlines/useCreateCalendarHeadlineCallback.ts","api/main/calendarHeadlines/useUpdateCalendarHeadlineCallback.ts","components/shared/ValidatedISODateTimeInput.tsx","components/calendarHeadlines/EditCalendarHeadline.tsx","api/main/calendarHeadlines/viewModels/useEditCalendarHeadlineViewModel.ts","api/main/calendarHeadlines/useSaveCalendarHeadlineCallback.ts","components/shared/ISODateTimeInput.tsx","components/calendarHeadlines/routes.ts","components/calendarHeadlines/CalendarHeadlinesList.tsx","api/main/calendarHeadlines/viewModels/useCalendarHeadlinesListViewModel.ts","components/calendarHeadlines/DeleteCalendarHeadline.tsx","api/main/calendarHeadlines/useCalendarHeadline.ts","api/main/calendarHeadlines/useDeleteCalendarHeadlineCallback.ts","api/main/itemTags/useItemTag.ts","api/main/itemTags/useCreateItemTagCallback.ts","api/main/itemTags/useUpdateItemTagCallback.ts","api/main/itemTags/useSaveItemTagCallback.ts","components/schoolPhases/EditSchoolPhase.tsx","api/main/itemTags/useDeleteItemTagCallback.ts","components/schoolPhases/DeleteSchoolPhase.tsx","components/schoolPhases/routes.ts","components/schoolPhases/SchoolPhasesList.tsx","components/schoolTypes/EditSchoolType.tsx","components/schoolTypes/routes.ts","components/schoolTypes/SchoolTypesList.tsx","components/schoolTypes/DeleteSchoolType.tsx","components/tags/EditTag.tsx","components/tags/routes.ts","components/tags/TagsList.tsx","components/tags/DeleteTag.tsx","components/calendarEvents/CalendarEventsList.tsx","api/main/calendarEvents/useCreateCalendarEventCallback.ts","api/main/calendarEvents/useUpdateCalendarEventCallback.ts","components/calendarEvents/EventUrl.tsx","components/calendarEvents/ProviderLink.tsx","api/main/calendarEventUrls/useCreateCalendarEventUrlCallback.ts","api/main/calendarEventUrls/useUpdateCalendarEventUrlCallback.ts","api/main/calendarEventCalendarEventProviders/useCreateCalendarEventCalendarEventProviderCallback.ts","api/main/calendarEventCalendarEventProviders/useUpdateCalendarEventCalendarEventProviderCallback.ts","api/main/calendarEventSchedules/useCreateCalendarEventScheduleCallback.ts","api/main/calendarEventSchedules/useUpdateCalendarEventScheduleCallback.ts","components/calendarEvents/Schedule.tsx","api/main/itemTagLinks/useCreateItemTagLinkCallback.ts","api/main/itemTagLinks/useUpdateItemTagLinkCallback.ts","shared/validator-react-contrib/useValidatorArrayCallback.ts","components/calendarEvents/EditCalendarEvent.tsx","api/main/calendarEvents/viewModels/useEditCalendarEventViewModel.ts","api/main/calendarEvents/viewModels/useEditCalendarEventSupportingData.ts","api/main/calendarEvents/useSaveCalendarEventCallback.ts","api/main/calendarEventUrls/useSaveCalendarEventUrlCallback.ts","api/main/calendarEventUrls/useDeleteCalendarEventUrlCallback.ts","api/main/calendarEventCalendarEventProviders/useSaveCalendarEventCalendarEventProviderCallback.ts","api/main/calendarEventCalendarEventProviders/useDeleteCalendarEventCalendarEventProviderCallback.ts","api/main/calendarEventSchedules/useSaveCalendarEventScheduleCallback.ts","api/main/calendarEventSchedules/useDeleteCalendarEventScheduleCallback.ts","api/main/itemTagLinks/useSaveItemTagLinkCallback.ts","api/main/itemTagLinks/useDeleteItemTagLinkCallback.ts","components/calendarEvents/DeleteCalendarEvent.tsx","components/calendarEvents/routes.ts","api/main/calendarEvents/viewModels/useCalendarEventsListViewModel.ts","api/main/calendarEvents/useCalendarEvent.ts","api/main/calendarEvents/useDeleteCalendarEventCallback.ts","api/main/analyticEvents/viewModels/useAnalyticEventsListViewModel.ts","components/analyticEvents/AnalyticEventsChart.tsx","components/analyticEvents/routes.ts","components/analyticEvents/CalendarEventOpenAnalyticEventsList.tsx","components/analyticEvents/LinkClickAnalyticEventsList.tsx","components/cms/shared/CmsAdministrationWarning.tsx","api/main/cmsTexts/useCreateCmsTextCallback.ts","api/main/cmsTexts/useUpdateCmsTextCallback.ts","api/main/cmsTexts/useCmsText.ts","components/cms/cmsTexts/EditCmsText.tsx","api/main/cmsTexts/useSaveCmsTextCallback.ts","components/cms/cmsTexts/DeleteCmsText.tsx","components/cms/cmsTexts/routes.ts","components/cms/cmsTexts/CmsTextsList.tsx","api/main/cmsTexts/useCmsTexts.ts","api/main/cmsTexts/useDeleteCmsTextCallback.ts","components/cmsPages/AboutPage.tsx","components/cmsPages/routes.ts","api/main/cmsPages/viewModels/useAboutPageViewModel.ts","components/cmsPages/PrivacyPolicyPage.tsx","components/cmsPages/TermsAndConditionsPage.tsx","components/links/routes.ts","components/links/RedirectToLink.tsx","api/main/models/CmsImage.ts","components/cms/cmsImages/CmsImagesList.tsx","api/main/cmsImages/useCreateCmsImageCallback.ts","api/main/cmsImages/useUpdateCmsImageCallback.ts","components/cms/cmsImages/EditCmsImage.tsx","api/main/cmsImages/viewModels/useEditCmsImageViewModel.ts","api/main/cmsImages/useSaveCmsImageCallback.ts","components/cms/cmsImages/DeleteCmsImage.tsx","components/cms/cmsImages/routes.ts","api/main/cmsImages/viewModels/useCmsImagesListViewModel.ts","api/main/cmsImages/useCmsImage.ts","api/main/cmsImages/useDeleteCmsImageCallback.ts","components/cms/cmsVideos/CmsVideosList.tsx","api/main/cmsVideos/useCreateCmsVideoCallback.ts","api/main/cmsVideos/useUpdateCmsVideoCallback.ts","components/cms/cmsVideos/EditCmsVideo.tsx","api/main/cmsVideos/viewModels/useEditCmsVideoViewModel.ts","api/main/cmsVideos/useSaveCmsVideoCallback.ts","components/cms/cmsVideos/DeleteCmsVideo.tsx","components/cms/cmsVideos/routes.ts","api/main/cmsVideos/viewModels/useCmsVideosListViewModel.ts","api/main/cmsVideos/useCmsVideo.ts","api/main/cmsVideos/useDeleteCmsVideoCallback.ts","configure/routeConfig.ts","components/shared/NotFound.tsx","components/layout/Sidebar.tsx","components/layout/Layout.tsx","configure/iconsConfig.ts","configure/configureApollo.ts","configure/languageConfig.ts","App.tsx","configure/configureServices.ts","configure/i18n.ts","configure/errorMessageConfig.ts","registerServiceWorker.ts","reportWebVitals.ts","index.tsx"],"names":["apiAuthorizationConfig","authService","_popUpDisabled","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_userManager","this","undefined","a","getUser","user","profile","ensureUserManagerInitialized","userManager","access_token","state","signinSilent","createArguments","silentUser","updateState","success","console","log","Error","signinPopup","popUpUser","message","error","signinRedirect","redirect","url","signinCallback","signoutPopup","signoutRedirect","signoutCallback","response","notifySubscribers","callback","push","subscription","subscriptionId","subscriptionIndex","map","element","index","found","filter","length","splice","i","useReplaceToNavigate","data","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","prefix","UserManager","events","addUserSignedOut","removeUser","useAuthorizeService","useAuthenticatedState","options","React","isAuthenticated","setIsAuthenticated","setUser","stateChanged","authenticated","userResult","includeUser","subscribe","unsubscribe","UserNav","useToggleState","dropdownOpen","toggleDropdown","t","useTranslation","location","useLocation","Dropdown","direction","isOpen","toggle","nav","DropdownToggle","size","round","name","email","preferred_username","className","DropdownMenu","right","DropdownItem","header","tag","to","icon","divider","pathname","local","showIf","toLowerCase","NavItem","Button","color","AccountService","api","loginWithPassword","request","returnUrl","post","encodeURIComponent","credentials","result","register","defaultRegisterReturnUrl","getExternalAuthenticationSchemes","get","startExternalLogin","provider","form","document","createElement","action","method","body","append","submit","completeExternalLogin","remoteError","createAccountForExternalLogin","model","sendPasswordResetEmail","resetPassword","confirmEmail","confirmEmailChange","currentUserRoles","changePassword","changeEmail","resendConfirmEmail","invite","resendInviteEmail","confirmInvite","changeAccountEmail","lockout","ApiFetch","window","origin","ClaimTypes","useAccountService","useServices","services","accountService","currentUserRolesCacheState","atom","key","default","roles","isLoading","useCurrentUserRolesCache","useRecoilState","refreshCurrentUserRoles","setRoles","isNullOrUndefined","prevState","useCurrentUserRoles","useAsyncCallback","refresh","isExecuting","errors","lazy","useExternalAuthenticationSchemes","externalAuthenticationSchemes","setExternalAuthenticationSchemes","useResendConfirmationEmailCallback","useStartExternalLoginCallback","AuthorizeContainer","props","usersRoles","hasRequiredRole","setHasRequiredRole","requireRole","requireRoles","flat","hasRole","roleToCheck","find","it","children","failedCheck","showIfNotAuthorized","AuthorizeRoute","Component","component","render","rest","redirectUrl","href","NavLinkTrackActive","exact","activeClassName","IdentityRoles","Navigation","NavLink","AppNavbarBrand","globalSearchTextState","useGlobalSearchText","SearchInput","type","placeholder","style","onSearchButtonClick","InputGroup","Input","onKeyPress","e","charCode","InputGroupAddon","addonType","onClick","HeaderSearchInput","searchText","setSearchText","history","useHistory","performSearch","cleanSearchText","trim","value","onChange","currentTarget","Header","fixed","Container","fluid","display","mobile","Nav","minWidth","FooterNavigation","target","rel","Footer","SidebarNav","SidebarNavTitle","child","AppRoutes","routes","item","authorize","path","LoadingIndicator","fullWidth","inline","ret","width","textAlign","Spinner","Background","centerChildren","AccountBackground","LoginWaiting","waiting","QueryParameterNames","LogoutActions","LoginActions","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","login","getReturnUrl","processLoginCallback","URLSearchParams","search","setState","redirectToProfile","redirectToRegister","signIn","navigateToReturnUrl","completeSignIn","fromQuery","startsWith","redirectToApiAuthorizationPath","apiAuthorizationPath","replace","Logout","isReady","logout","processLogoutCallback","populateAuthenticationState","signOut","completeSignOut","apiAuthorizationRoutes","loginAction","logoutAction","configuredErrorMessageConverters","AlertOnErrors","simple","openErrors","setOpenErrors","toggleOpen","friendlyErrors","friendly","converter","Array","isArray","toString","userFriendlyErrorMessage","errorGroups","groups","group","Alert","Row","Col","xs","cursor","Badge","pill","details","lang","JSON","stringify","useChanges","unchanged","initialChanges","changes","setChanges","change","reset","useChangesArray","getKey","_changes","hasAnythingChanged","unchangedItem","unchangedItemKey","changeRecord","isAddition","isRemoval","hasUnsavedChanges","oldItem","oldItemKey","newArray","newState","keysInNewArray","newChanges","modelFromChanges","changesToUse","added","removed","updated","Object","keys","modelFor","changeFor","changesFor","addFor","removeFor","markAsSaved","models","hasChangedSomething","keysToCheck","ExternalLoginButton","providerDisplayName","propsClassName","text","context","FormButtons","SideContainer","side","mainApiConfig","cmsVideoFieldsFragment","gql","blobReferenceFieldsFragment","cmsTextFieldsFragment","BlobUploadService","apiFetch","files","uploadMultiple","file","FormData","init","headers","newHeaders","Headers","delete","filename","dataUrl","blob","BlobReferenceUploadAdapter","loader","then","Promise","resolve","reject","uploadFile","BlobReferenceUploadAdapterPlugin","editor","plugins","createUploadAdapter","HtmlEditor","onBlur","Guid","newGuid","setKey","trackedValue","current","ClassicEditor","config","extraPlugins","event","getData","DailyMotionProvider","format","urls","FacebookProvider","FlickrProvider","GoogleMapsProvider","InstagramProvider","SpotifyProvider","TwitterProvider","VimeoProvider","YouTubeProvider","FetchOmbed","_providers","pattern","regExp","RegExp","match","getProvider","fetchJsonp","escape","elements","tagName","getElementsByTagName","service","theElement","getAttribute","getOEmbedData","html","innerHTML","HtmlDisplay","elementRef","setTimeout","processOEmbedElements","ref","dangerouslySetInnerHTML","__html","CmsTextHtmlDisplay","CmsVideoDisplay","controls","src","videoBlobReference","poster","thumbnailBlobReference","LoginPartialPage","useLazyQuery","variables","fetchPolicy","pollInterval","onCompleted","load","loading","refetch","useLoginPartialPageViewModel","video","loadErrors","Card","defaultPasswordOptions","requireDigit","requiredLength","requireLowercase","requireNonAlphanumeric","requiredUniqueChars","requireUppercase","PasswordValidation","passwordOptions","password","i18n","charMap","char","charAt","indexOf","test","errorDescription","join","valid","usePasswordValidation","passwordValidation","checkPassword","check","passwordRequirements","passwordErrors","requirements","generatePasswordRulesDescrption","roleGroupFieldsFragment","userFieldsFragment","profileFieldsFragment","TwoValueSwitch","checked","leftLabel","rightLabel","disabled","uniqueName","noGutters","CustomInput","id","TagSelector","items","isSelected","outline","useFetchMoreCallback","fetchMoreFromStore","currentEndOffset","merge","newResultLength","_hasMore","setHasMore","fetchMore","offset","updateQuery","previousQueryResult","fetchMoreResult","hasMore","itemTagFieldsFragment","useItemTags","startOffset","first","pageSize","includeArchived","tagType","prevResults","newResults","useRegisterProfileDetailsProps","useMutation","mutationAction","actionErrors","useRegisterProfileCallback","_registerProfile","isRegisteringProfile","registerProfileErrors","firstName","lastName","organisationName","organisationType","isSubscribedToDailyNewsLetter","isSubscribedToWeeklyNewsLetter","isIntrestedInWorkingTogether","urn","jobTitle","registrationSchoolPhasesJson","registeredDate","moment","toISOString","useValidatorCallback","validation","fieldsToCheck","rules","organsiationType","checkRules","validate","validationErrors","registerProfile","userId","RegisterProfileDetails","schoolPhaseTags","isSchoolPhaseSelected","selectedNames","parse","toggleSchoolPhase","existing","FormGroup","Label","htmlFor","MainContainer","Banner","ConfirmInviteProfileDetails","params","code","useProfileForInvite","loadingErrors","readOnly","accountRoutes","requiresTwoFactor","requiresEmailConfirmation","useLoginWithPasswordCallback","isLoggingIn","loginErrors","isPendingEmailConfirmation","setIsPendingEmailConfirmation","resendConfirmationEmail","isResendingConfirmationEmail","resendConfirmationEmailErrors","hasSentConfirmationEmail","setHasSentConfirmationEmail","rememberMe","isDoingFullPageRedirect","setIsDoingFullPageRedirect","performLogin","succeeded","md","xl","Form","onSubmit","preventDefault","executingChildren","autoComplete","label","displayName","useRegisterAccountCallback","isRegistering","registerErrors","confirmPassword","registerProfileDetailsProps","singleCheck","performRegister","FormText","claims","isNewUser","loginProvider","setData","useCompletedExternalLoginDetails","useCreateAccountForExternalLoginCallback","createAccount","isCreatingAccount","createAccountErrors","emailClaim","emailSent","setEmailSent","useSendPasswordResetEmailCallback","sendResetEmail","isSendingResetEmail","sendResetEmailErrors","hasResetPassword","setHasResetPassword","useResetPasswordCallback","isResettingPassword","resetPasswordErrors","emailConfirmed","setEmailConfirmed","useConfirmEmailCallback","confirmEmailErrors","useConfirmEmailChangeCallback","useConfirmInviteCallback","isConfirmingInvite","confirmInviteErrors","useProfile","isUserId","empty","useSaveInStore","createDataStore","updateDataStore","create","isCreating","createErrors","update","isUpdating","updateErrors","isCreate","beforeSaving","afterSaving","save","isSaving","saveErrors","useCreateProfileCallback","useUpdateProfileCallback","useSaveProfileCallback","_create","createStatus","_update","updateStatus","ProfileDetails","hasSaved","setHasSaved","setIsCreate","sub","storeModel","refreshProfile","lockDailyEmail","setLockDailyEmail","lockWeeklyEmail","setLockWeeklyEmail","hasDefaultedLockState","setHasDefaultedLockState","saveForm","ChangePassword","hasChangedPassword","setHasChangedPassword","currentPassword","newPassword","useChangePasswordCallback","isChangingPassword","changePasswordErrors","ChangeEmail","useUser","refreshUserModel","newEmail","useChangeEmailCallback","changeEmailErrors","hasSentEmail","setHasSentEmail","profileRoutes","activeTab","setActiveTab","tabs","TabContent","TabPane","tabId","useProfiles","useURLSearchParams","useReplaceSearchParamsEffect","changesValue","set","hash","useSearchParams","forEach","NoResultsFound","TableRowButtons","StickyToolbar","isStuck","setIsStuck","topOffset","scrollableAncestor","onEnter","onLeave","useChangeUserRoleGroupCallback","resetCurrentUserRoles","useResetCurrentUserRolesCallback","CreateUser","EditUser","useParams","_isLoading","useProfileSupportingData","roleGroups","isLoadingSupportingData","loadSupportingDataErrors","userModel","changeUserModel","roleGroup","roleGroupModel","changeRoleGroupModel","useInviteCallback","inviteErrors","useResendInviteEmailCallback","isResendingInviteEmail","resendInviteEmailErrors","hasResentInviteEmail","setHasResentInviteEmail","currentEmail","useChangeAccountEmailCallback","changeUserRoleGroupInStore","changeUserRoleGroupInStoreErrors","sendEmail","roleGroupId","goBack","saveFormErrors","DeleteUser","useDeleteProfileCallback","remove","removeErrors","useLockoutCallback","lockoutErrors","onRemoveFormSubmit","isRemoving","removeFormErrors","plaintext","userRoutes","searchParam","setSearch","allItems","useToggleStateArray","isMenuOpen","toggleMenuOpen","lowerSearch","toLocaleLowerCase","Table","responsive","striped","onDoubleClick","ButtonGroup","ButtonDropdown","caret","colSpan","count","hasMorePlus","download","homeRoutes","SidebarRequired","data-sidebar-required","administrationRoutes","administrationSidebarRoutes","scheduleDescription","schedule","formatDate","date","timeOnly","isAllDay","i18next","start","end","EventTypeColorBlock","transparent","backgroundColor","CalendarDayEvent","startOfDay","startOf","endOfDay","endOf","startsBeforeThisDay","endsAfterThisDay","isMultiDayEvent","isDayTwoOfMultiDayEvent","add","isDayBeforeEndOfMultiDayEvent","isMonday","calendarEvent","eventType","CalendarDay","schedules","onEventClick","daySettings","today","dayNumber","dayName","isToday","diff","isPast","mySchedules","CalendarWeek","startDate","endDate","renderDays","day","dayOfWeek","includeWeekend","includeWeekdays","sm","CalendarWeekdayNames","CalendarMonth","monthStart","monthEnd","renderWeeks","CalendarMonthHeadline","changeDate","headlines","images","calendarMode","previousMonth","nextMonth","onChangeDate","currentHeadline","orderedHeadlines","reverse","isoDate","endOfMonth","theEndDate","currentHeadlineImage","imageBlobReferenceId","backgroundImage","lg","descriptionHtml","calendarEventScheduleFieldsFragment","calendarEventFieldsFragment","calendarEventUrlFieldsFragment","itemTagLinkFieldsFragment","calendarEventCalendarEventProviderFieldsFragment","CalendarEventCardItem","ListGroupItem","providers","providerLink","imageBlobReference","alt","getFullUrl","TrackedLink","calendarEventUrlId","calendarEventId","trackingUrl","generateTrackedUrl","CalendarEventModal","Modal","ModalHeader","ModalBody","URL","generateCalendarEventRouteUrl","nameUrlComponent","CalendarHomeStickyToolbar","CalendarDayCard","title","CardBody","CardTitle","calendarEventTypeFieldsFragment","calendarEventProviderFieldsFragment","calendarHeadlineFieldsFragment","EventTypeSelector","analyticEventFieldsFragment","useCreateAnalyticEventCallback","persistKey","persistAtom","recoilPersist","calendarPreferencesCalendarModeState","effects_UNSTABLE","calendarPreferencesExcludedSchoolPhasesState","calendarPreferencesExcludedEventTypesState","calendarPreferencesExcludedSchoolTypesState","setInstallPromptSeenToday","promptName","localStorage","setItem","getUserShouldBePromptedToInstall","daysToWaitBeforePromptingAgain","lastPrompt","getItem","getInstallPromptLastSeenAt","daysSinceLastPrompt","isNaN","useShouldShowPrompt","useState","userShouldBePromptedToInstall","setUserShouldBePromptedToInstall","handleUserSeeingInstallPrompt","isIOS","navigator","standalone","ua","userAgent","isIPad","isIPhone","InstallPwaPrompt","useIosInstallPrompt","iosInstallPrompt","handleIOSInstallDeclined","installPromptEvent","setInstallPromptEvent","useEffect","beforeInstallPromptHandler","addEventListener","removeEventListener","prompt","userChoice","choice","outcome","useWebInstallPrompt","webInstallPrompt","handleWebInstallDeclined","handleWebInstallAccepted","isHidden","toggleHidden","CardText","xmlns","viewBox","fill","d","CalendarHome","startInCalendarMode","_calendarEventScheduleId","calendarEventScheduleId","setCalendarEventScheduleId","calendarDate","setCalendarDate","fromDate","toDate","useCalendarHomeViewModel","_schedules","calendarEvents","calendarEventCalendarEventProviders","calendarEventUrls","itemTagLinks","useCalendarHomeSupportingData","calendarEventTypes","itemTags","imageBlobReferences","useBlobReferences","setValue","useCalendarPreferencesExcludedEventTypes","isEventTypeExcluded","toggleEventTypeExcluded","useCalendarPreferencesExcludedSchoolPhases","isSchoolPhaseExcluded","toggleSchoolPhaseExcluded","useCalendarPreferencesExcludedSchoolTypes","isSchoolTypeExcluded","toggleSchoolTypeExcluded","schedulesViewModel","optionalData","calendarEventProviderLinks","eventTypes","blobReferences","calendarEventTypeId","myCalendarEventProviderLinks","myCalendarEventUrls","myItemTagLinks","targetId","calendarEventProviderId","image","tagLinks","itemTagId","itemTag","generateCalendarHomeScheduleViewModel","schoolTypeLinks","notExcludedCount","link","schoolPhaseLinks","pastEventsCount","futureEventsCount","dayStart","monthEntry","days","dayEntry","listViewGroupedSchedules","thisWeekSchedules","weekStart","weekEnd","entry","featuredSchedules","thisWeekEnd","planAheadEnd","featuredSechedules","isFeatured","calendarEventModalIsOpen","toggleCalendarEvetModal","createAnalyticEvent","openEvent","closeEvent","previousCalendarEventScheduleId","setPreviousCalendarEventScheduleId","eventModelForModal","useCalendarPreferencesCalendarMode","_calendarMode","_setCalendarMode","useStartInCalendarMode","setUseStartInCalendarMode","setCalendarMode","isShowingPastItemsInList","toggleShowingPastItemsInList","isCalendarDateCurrentMonth","isFilterOpen","toggleFilter","filterSummary","includedEventTypes","excludedEventTypes","includedSchoolTypes","excludedSchoolTypes","includedSchoolPhases","excludedSchoolPhases","Collapse","month","ListGroup","flush","calendarRoutes","setGlobalSearchText","ColorDisplay","useCalendarEventType","useCreateCalendarEventTypeCallback","useUpdateCalendarEventTypeCallback","EditCalendarEventType","displayOrder","useSaveCalendarEventTypeCallback","step","valueAsNumber","calendarEventTypeRoutes","useCalendarEventTypes","isMenuOpenIds","setIsMenuOpenIds","useDeleteCalendarEventTypeCallback","UploadedImagePreview","useCreateCalendarEventProviderCallback","useUpdateCalendarEventProviderCallback","FileUploadButton","onUpload","useUploadBlobCallback","uploadService","upload","EditCalendarEventProvider","useEditCalendarEventProviderViewModel","useSaveCalendarEventProviderCallback","imageBlob","setImageBlob","uploadBlob","uploadImageBlob","isUploadingImageBlob","uploadImageBlobErrors","clearImage","calendarEventProviderRoutes","useCalendarEventProvidersListViewModel","maxWidth","useCalendarEventProvider","useDeleteCalendarEventProviderCallback","CalendarMonthHeadlinePreview","useCreateCalendarHeadlineCallback","useUpdateCalendarHeadlineCallback","ValidatedISODateTimeInput","theType","theFormat","theValue","onChangeWrapper","newValue","utc","newEvent","EditCalendarHeadline","useEditCalendarHeadlineViewModel","useSaveCalendarHeadlineCallback","ISODateTimeInput","valueMoment","isValid","calendarHeadlineRoutes","useCalendarHeadlinesListViewModel","editUrl","borderTopStyle","useCalendarHeadline","useDeleteCalendarHeadlineCallback","useItemTag","useCreateItemTagCallback","useUpdateItemTagCallback","useSaveItemTagCallback","EditSchoolPhase","useDeleteItemTagCallback","schoolPhaseRoutes","EditSchoolType","schoolTypeRoutes","EditTag","tagRoutes","useCreateCalendarEventCallback","useUpdateCalendarEventCallback","EventUrl","singleItem","paddingLeft","paddingRight","paddingTop","paddingBottom","borderBottomStyle","ProviderLink","useCreateCalendarEventUrlCallback","useUpdateCalendarEventUrlCallback","useCreateCalendarEventCalendarEventProviderCallback","useUpdateCalendarEventCalendarEventProviderCallback","useCreateCalendarEventScheduleCallback","useUpdateCalendarEventScheduleCallback","Schedule","dateInputType","useCreateItemTagLinkCallback","useUpdateItemTagLinkCallback","useValidatorArrayCallback","validating","deps","setValidationErrors","validator","Validator","fields","EditCalendarEvent","useEditCalendarEventViewModel","useEditCalendarEventSupportingData","calendarEventProviders","useSaveCalendarEventCallback","urlsManager","useSaveCalendarEventUrlCallback","saveCalendarEventUrl","useDeleteCalendarEventUrlCallback","deleteCalendarEventUrl","providerLinksManager","useSaveCalendarEventCalendarEventProviderCallback","saveCalendarEventCalendarEventProvider","useDeleteCalendarEventCalendarEventProviderCallback","deleteCalendarEventCalendarEventProvider","schedulesManager","useSaveCalendarEventScheduleCallback","saveCalendarEventSchedule","useDeleteCalendarEventScheduleCallback","deleteCalendarEventSchedule","tagLinksManager","useSaveItemTagLinkCallback","saveItemTagLink","useDeleteItemTagLinkCallback","deleteItemTagLink","toggleTagLink","myModel","isEmpty","validateProvider","providerValidationErrors","validateUrl","urlValidationErrors","validateSchedule","scheduleValidationErrors","needToAddDefaults","setNeedToAddDefaults","linkType","hasSingleSchedule","hasSingleProviderLink","hasSingleUrl","calendarEventRoutes","useCalendarEventsListViewModel","useCalendarEvent","useDeleteCalendarEventCallback","useAnalyticEventsListViewModel","AnalyticEventChart","onItemClick","height","series","x","y","_item","chart","toolbar","show","dataPointSelection","isUndefined","dataPointIndex","seriesIndex","selectedItem","w","xaxis","analyticEventRoutes","setFromDate","setToDate","calendarEventUrl","eventDate","calendarEventSchedule","sort","b","chartData","scrollToGroupUrl","setScrollToGroupUrl","groupIsOpen","toggleGroupOpen","selected","shouldScrollTo","CmsAdministrationWarning","useCreateCmsTextCallback","useUpdateCmsTextCallback","useCmsText","EditCmsText","useSaveCmsTextCallback","cmsTextRoutes","useCmsTexts","useDeleteCmsTextCallback","cmsPagesRoutes","useAboutPageViewModel","section1","section2","cmsTextErrors","cmsText","linksRoutes","hasBeenLogged","setHasBeenLogged","realUrl","decodeURIComponent","cmsImageFieldsFragment","useCreateCmsImageCallback","useUpdateCmsImageCallback","EditCmsImage","useEditCmsImageViewModel","useSaveCmsImageCallback","blobReference","blobReferenceId","cmsImageRoutes","useCmsImagesListViewModel","useCmsImage","useDeleteCmsImageCallback","plainimage","useCreateCmsVideoCallback","useUpdateCmsVideoCallback","EditCmsVideo","useEditCmsVideoViewModel","useSaveCmsVideoCallback","videoBlob","setVideoBlob","videoBlobReferenceId","uploadVideoBlob","isUploadingVideoBlob","uploadVideoBlobErrors","thumbnailBlob","setThumbnailBlob","thumbnailBlobReferenceId","uploadThumbnailBlob","isUploadingThumbnailBlob","uploadThumbnailBlobErrors","cmsVideoRoutes","useCmsVideosListViewModel","useCmsVideo","useDeleteCmsVideoCallback","appRoutes","sidebarRoutes","Sidebar","Layout","fallback","configureIcons","library","faArchive","faArchway","faBusAlt","faBusinessTime","faCalendarCheck","faCalendarDay","faCalendarPlus","faCalendarWeek","faCalendarAlt","faCaretUp","faCaretDown","faCaretLeft","faCaretRight","faCheckCircle","faChevronLeft","faChevronRight","faCloudDownloadAlt","faCogs","faCreditCard","faCross","faDesktop","faDownload","faEdit","faExclamationCircle","faEye","faFileAlt","faFlagCheckered","faInfo","faLink","faLock","faMinus","faPersonBooth","faPhotoVideo","faPlay","faPlus","faPoundSign","faRuler","faSave","faSchool","faSearch","faSpinner","faStop","faStopwatch","faSync","faTag","faThumbsDown","faThumbsUp","faTimes","faTimesCircle","faTrash","faTrashAlt","faTrashRestore","faUndo","faUser","faUserCheck","faUserClock","faUserGraduate","faUserTag","faUsers","faVoteYea","farCalendarAlt","farCalendarTimes","farCircle","farClock","farFrown","farFrownOpen","farListAlt","faPhone","faEnvelope","cache","InMemoryCache","apolloCachePersistor","CachePersistor","storage","restore","HttpLink","uri","apolloClient","ApolloClient","availableLanguages","flagCountryCode","momentLocale","numeralLocale","serviceProvider","ServiceProvider","builder","singleton","removeItem","purgeRecoilPersist","purge","use","Backend","LanguageDetector","initReactI18next","fallbackLng","interpolation","escapeValue","Date","isMoment","Number","isNumber","numeral","on","lng","thisLanguage","locale","shouldHandle","graphQLErrors","externalProviderError","subStr","App","I18nextProvider","Provider","ApolloProvider","client","defaultTitle","titleTemplate","isLocalhost","Boolean","hostname","registerValidSW","swUrl","serviceWorker","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","baseUrl","rootElement","getElementById","createBrowserHistory","basename","ReactGA","initialize","listen","identity","page","pageview","ReactDOM","process","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"+0CAAaA,EACC,IADDA,EAEQ,gBC+NfC,EAAc,IAxNpB,WAaI,aAAe,yBAVfC,gBAAiB,EAUH,KARdC,gBAQc,OAPdC,yBAOc,OANdC,WAMc,OALdC,kBAA4B,EAKd,KAJdC,kBAIc,EACVC,KAAKL,WAAa,GAClBK,KAAKJ,oBAAsB,EAC3BI,KAAKH,MAAQ,KACbG,KAAKF,kBAAmB,EACxBE,KAAKD,kBAAeE,EAlB5B,0FAqBI,4BAAAC,EAAA,sEACuBF,KAAKG,UAD5B,cACUC,EADV,2BAEaA,GAFb,gDArBJ,kHA0BI,kCAAAF,EAAA,2DACQE,EAAOJ,KAAKH,SAEJO,EAAKC,QAHrB,yCAIeD,EAAKC,SAJpB,uBAO8BL,KAAKM,+BAPnC,cAOUC,EAPV,gBAQiBA,EAAYJ,UAR7B,cAQIC,EARJ,6CASWA,SATX,aASW,EAAMC,eATjB,QAS4B,MAT5B,iDA1BJ,yHAsCI,gCAAAH,EAAA,sEAC8BF,KAAKM,+BADnC,cACUC,EADV,gBAEuBA,EAAYJ,UAFnC,cAEUC,EAFV,0CAGWA,QAHX,IAGWA,OAHX,EAGWA,EAAMI,oBAHjB,QAGiC,MAHjC,gDAtCJ,iHAoDI,WAAaC,GAAb,mBAAAP,EAAA,sEAC8BF,KAAKM,+BADnC,cACUC,EADV,yBAGiCA,EAAYG,aAAaV,KAAKW,mBAH/D,cAGcC,EAHd,OAIQZ,KAAKa,YAAYD,GAJzB,kBAKeZ,KAAKc,QAAQL,IAL5B,qCAQQM,QAAQC,IAAI,gCAAZ,MARR,WAWgBhB,KAAKN,eAXrB,uBAYsB,IAAIuB,MAAM,uGAZhC,yBAeoCV,EAAYW,YAAYlB,KAAKW,mBAfjE,eAekBQ,EAflB,OAgBYnB,KAAKa,YAAYM,GAhB7B,kBAiBmBnB,KAAKc,QAAQL,IAjBhC,sCAmBuC,wBAAvB,KAAWW,QAnB3B,0CAqBuBpB,KAAKqB,MAAM,gCArBlC,QAsBwBrB,KAAKN,gBACbqB,QAAQC,IAAI,+BAAZ,MAvBhB,mCA4BsBT,EAAYe,eAAetB,KAAKW,gBAAgBF,IA5BtE,iCA6BuBT,KAAKuB,YA7B5B,0CA+BgBR,QAAQC,IAAI,kCAAZ,MA/BhB,kBAgCuBhB,KAAKqB,MAAL,OAhCvB,0EApDJ,0HA0FI,WAAqBG,GAArB,iBAAAtB,EAAA,+EAEkCF,KAAKM,+BAFvC,cAEcC,EAFd,gBAG2BA,EAAYkB,eAAeD,GAHtD,cAGcpB,EAHd,OAIQJ,KAAKa,YAAYT,GAJzB,kBAKeJ,KAAKc,QAAQV,GAAQA,EAAKK,QALzC,yCAOQM,QAAQC,IAAI,kCAAZ,MAPR,kBAQehB,KAAKqB,MAAM,mCAR1B,0DA1FJ,mHA2GI,WAAcZ,GAAd,eAAAP,EAAA,sEAC8BF,KAAKM,+BADnC,UACUC,EADV,iBAGYP,KAAKN,eAHjB,sBAIkB,IAAIuB,MAAM,uGAJ5B,uBAOcV,EAAYmB,aAAa1B,KAAKW,mBAP5C,cAQQX,KAAKa,YAAY,MARzB,kBASeb,KAAKc,QAAQL,IAT5B,yCAWQM,QAAQC,IAAI,wBAAZ,MAXR,oBAakBT,EAAYoB,gBAAgB3B,KAAKW,gBAAgBF,IAbnE,iCAcmBT,KAAKuB,YAdxB,0CAgBYR,QAAQC,IAAI,2BAAZ,MAhBZ,kBAiBmBhB,KAAKqB,MAAL,OAjBnB,kEA3GJ,2HAiII,WAAsBG,GAAtB,iBAAAtB,EAAA,sEAC8BF,KAAKM,+BADnC,cACUC,EADV,yBAG+BA,EAAYqB,gBAAgBJ,GAH3D,cAGcK,EAHd,OAIQ7B,KAAKa,YAAY,MAJzB,kBAKeb,KAAKc,QAAQe,GAAYA,EAASpB,QALjD,yCAOQM,QAAQC,IAAR,4DAPR,kBAQehB,KAAKqB,MAAL,OARf,0DAjIJ,gFA6II,SAAYjB,GACRJ,KAAKH,MAAQO,EACbJ,KAAKF,mBAAqBE,KAAKH,MAC/BG,KAAK8B,sBAhJb,uBAmJI,SAAUC,GAEN,OADA/B,KAAKL,WAAWqC,KAAK,CAAED,WAAUE,aAAcjC,KAAKJ,wBAC7CI,KAAKJ,oBAAsB,IArJ1C,yBAwJI,SAAYsC,GACR,IAAMC,EAAoBnC,KAAKL,WAC1ByC,KAAI,SAACC,EAASC,GAAV,OAAoBD,EAAQJ,eAAiBC,EAAiB,CAAEK,OAAO,EAAMD,SAAU,CAAEC,OAAO,MACpGC,QAAO,SAAAH,GAAO,OAAsB,IAAlBA,EAAQE,SACE,IAA7BJ,EAAkBM,SAClBzC,KAAKL,WAAaK,KAAKL,WAAW+C,OAAOP,EAAkB,GAAGG,MAAiB,MA7J3F,+BAmKI,WACI,IAAK,IAAIK,EAAI,EAAGA,EAAI3C,KAAKL,WAAW8C,OAAQE,IAAK,EAE7CZ,EADiB/B,KAAKL,WAAWgD,GAAGZ,eArKhD,6BA0KI,SAAgBtB,GACZ,MAAO,CAAEmC,sBAAsB,EAAMC,KAAMpC,KA3KnD,mBA8KI,SAAMW,GACF,MAAO,CAAE0B,OAAQC,EAA2BC,KAAM5B,aA/K1D,qBAkLI,SAAQX,GACJ,MAAO,CAAEqC,OAAQC,EAA2BE,QAASxC,WAnL7D,sBAsLI,WACI,MAAO,CAAEqC,OAAQC,EAA2BG,YAvLpD,iFA0LI,qCAAAhD,EAAA,8DAC8BD,IAAtBD,KAAKD,aADb,yCAEeC,KAAKD,cAFpB,uBAKyBoD,MAAM,GAAD,OAAI3D,EAAJ,0BAAqDA,IALnF,WAKQqC,EALR,QAMkBuB,GANlB,sBAOc,IAAInC,MAAJ,uCAA0CzB,EAA1C,MAPd,uBAUyBqC,EAASwB,OAVlC,cAUQC,EAVR,QAWaC,sBAAuB,EAChCD,EAASE,6BAA8B,EACvCF,EAASG,UAAY,IAAIC,uBAAqB,CAC1CC,OAAQnE,IAGZQ,KAAKD,aAAe,IAAI6D,cAAYN,GAEpCtD,KAAKD,aAAa8D,OAAOC,iBAAzB,sBAA0C,sBAAA5D,EAAA,sEAC/B,EAAKH,aAA6BgE,aADH,OAEtC,EAAKlD,YAAY,MAFqB,4CAnB9C,kBAwBWb,KAAKD,cAxBhB,iDA1LJ,4EAqNI,WAAwB,OAAON,MArNnC,MA0NeA,IAEFsD,EAA6B,CACtCG,SAAU,WACVD,QAAS,UACTD,KAAM,QCnOH,SAASgB,IACZ,OAAOvE,ECSJ,SAASwE,IAA+H,IAAzGC,EAAwG,uDAA/D,GACrEzE,EAAcuE,IACpB,EAA8CG,WAA+B,MAA7E,mBAAOC,EAAP,KAAwBC,EAAxB,KACA,EAAwBF,WAA+B,MAAvD,mBAAO/D,EAAP,KAAakE,EAAb,KAEMC,EAAeJ,cAAA,sBAAkB,8BAAAjE,EAAA,sEACPT,EAAY2E,kBADL,UAC7BI,EAD6B,OAG/BC,EAA6B,MAC7BP,EAAQQ,YAJuB,gCAKZjF,EAAYU,UALA,OAK/BsE,EAL+B,OAM/BH,EAAQG,GANuB,OASnCJ,EAAmBG,GATgB,4CAUpC,CAAC/E,EAAayE,EAAQQ,cASzB,OANAP,aAAgB,WACZ,IAAMlC,EAAexC,EAAYkF,WAAU,WAAQJ,OAEnD,OADAA,IACO,WAAQ9E,EAAYmF,YAAY3C,MACxC,CAACxC,EAAa8E,IAEV,CAAEH,gBAAiBA,EAAiBhE,KAAMA,G,mCCvBxCyE,EAAU,WAAO,IAAD,QACzB,EAAkCZ,EAAsB,CAAES,aAAa,IAA/DN,EAAR,EAAQA,gBAAiBhE,EAAzB,EAAyBA,KACzB,EAAuC0E,cAAvC,mBAAOC,EAAP,KAAqBC,EAArB,KAEQC,EAAMC,cAAND,EACFE,EAAWC,cAOjB,OAAKhB,EAyBD,eAACiB,EAAA,EAAD,CAAUC,UAAU,OAAOC,OAAQR,EAAcS,OAAQ,kBAAMR,KAAkBS,KAAG,EAApF,UACI,eAACC,EAAA,EAAD,CAAgBD,KAAG,EAAnB,UACI,cAAC,IAAD,CAAQE,KAAK,KAAKC,OAAK,EAACC,KAAI,iBAAEzF,QAAF,IAAEA,OAAF,EAAEA,EAAMyF,YAAR,QAAgB,GAAIC,MAAK,2BAAE1F,QAAF,IAAEA,OAAF,EAAEA,EAAM0F,aAAR,eAAiB1F,QAAjB,IAAiBA,OAAjB,EAAiBA,EAAM2F,0BAAvB,QAA6C,KAClG,sBAAMC,UAAU,UAAhB,0BACK5F,QADL,IACKA,OADL,EACKA,EAAMyF,YADX,QACmB,QAGvB,eAACI,EAAA,EAAD,CAAcC,OAAK,EAAnB,UACI,cAACC,EAAA,EAAD,CAAcC,QAAM,EAACC,IAAI,MAAML,UAAU,cAAzC,SAAuD,iCAASf,EAAE,kBAAmB,eACrF,cAAC,gBAAD,CAAeqB,GAAI,WAAnB,SACI,eAACH,EAAA,EAAD,WACI,cAAC,IAAD,CAAiBI,KAAK,SACtB,yCAAItB,EAAE,kBAAmB,mBAGjC,cAACkB,EAAA,EAAD,CAAcK,SAAO,IACrB,cAAC,gBAAD,CAAeF,GAAI,CAAEG,SAAU,yBAA0BhG,MAAO,CAAEiG,OAAO,IAAzE,SACI,eAACP,EAAA,EAAD,WACI,cAAC,IAAD,CAAiBI,KAAK,SACtB,yCAAItB,EAAE,kBAAmB,0BA1CrC,qCACI,cAAC,IAAD,CAAqB0B,OAA4C,sBAApCxB,EAASsB,SAASG,cAA/C,SACI,cAACC,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeb,UAAU,2BAA2BM,GAAG,oBAAvD,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,mBAAoB,4BAKvC,cAAC4B,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeP,GAAG,wBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQd,UAAU,wBAAwBe,MAAM,YAAhD,SACK9B,EAAE,iBAAkB,qB,0CClCpC+B,EAGT,WAAYC,GAAiB,IAAD,gCAF5BA,SAE4B,OAO5BC,kBAP4B,uCAOR,WAAOC,GAAP,6BAAAjH,EAAA,6DAA0CkH,EAA1C,+BAA8D,GAA9D,SACK,EAAKH,IAAII,KAAT,uCACeC,mBAAkB,OAACF,QAAD,IAACA,IAAa,KAChED,EACA,CACII,YAAa,YALL,cACVC,EADU,yBAQTA,GARS,2CAPQ,2DAqB5BC,SArB4B,uCAqBjB,WAAON,GAAP,6BAAAjH,EAAA,6DAAiCkH,EAAjC,+BAAqD,GAArD,SACc,EAAKH,IAAII,KAAT,0CACkBC,mBAAmBF,GAAaM,IACnEP,EACA,CACII,YAAa,YALd,cACDC,EADC,yBAQAA,GARA,2CArBiB,2DAmC5BG,iCAnC4B,sBAmCO,4BAAAzH,EAAA,sEACV,EAAK+G,IAAIW,IAAyC,iDADxC,cACzBJ,EADyB,yBAExBA,GAFwB,2CAnCP,KA2C5BK,mBAAqB,SAACC,GAA8C,IAA5BV,EAA2B,uDAAP,GAEpDW,EAAOC,SAASC,cAAc,QAClCF,EAAKG,OAAL,mDAA0DZ,mBAAmBQ,GAA7E,sBAAoGR,mBAAkB,OAACF,QAAD,IAACA,IAAa,KACpIW,EAAKI,OAAS,OACdH,SAASI,KAAKC,OAAON,GACrBA,EAAKO,UAjDmB,KAuD5BC,sBAvD4B,sBAuDJ,4CAAArI,EAAA,6DAAOkH,EAAP,+BAA2B,GAAIoB,EAA/B,+BAAqD,GAArD,SACC,EAAKvB,IAAIW,IAAT,uDAA0FN,mBAAkB,OAACF,QAAD,IAACA,IAAa,IAA1H,wBAA6IE,mBAAkB,OAACkB,QAAD,IAACA,IAAe,MADhL,cACdhB,EADc,yBAEbA,GAFa,2CAvDI,KA+D5BiB,8BA/D4B,uCA+DI,WAAOC,GAAP,6BAAAxI,EAAA,6DAAiDkH,EAAjD,+BAAqE,GAArE,SACP,EAAKH,IAAII,KAAT,+DACuCC,mBAAkB,OAACF,QAAD,IAACA,IAAa,KACxFsB,EACA,CACInB,YAAa,YALO,cACtBC,EADsB,yBAOrBA,GAPqB,2CA/DJ,2DA4E5BmB,uBA5E4B,uCA4EH,WAAO7C,GAAP,eAAA5F,EAAA,sEACA,EAAK+G,IAAII,KAAT,sCAA8D,CAAEvB,MAAOA,IADvE,cACf0B,EADe,yBAEdA,GAFc,2CA5EG,2DAoF5BoB,cApF4B,uCAoFZ,WAAOF,GAAP,eAAAxI,EAAA,sEACS,EAAK+G,IAAII,KAAT,6BAAqDqB,GAD9D,cACNlB,EADM,yBAELA,GAFK,2CApFY,2DA4F5BqB,aA5F4B,uCA4Fb,WAAOH,GAAP,eAAAxI,EAAA,sEACU,EAAK+G,IAAII,KAAT,4BAAoDqB,GAD9D,cACLlB,EADK,yBAEJA,GAFI,2CA5Fa,2DAoG5BsB,mBApG4B,uCAoGP,WAAOJ,GAAP,eAAAxI,EAAA,sEACI,EAAK+G,IAAII,KAAT,kCAEjBqB,EACA,CACInB,YAAa,YALJ,cACXC,EADW,yBAOVA,GAPU,2CApGO,2DAiH5BuB,iBAjH4B,sBAiHT,4BAAA7I,EAAA,sEACM,EAAK+G,IAAIW,IAC1B,gCACA,CACIL,YAAa,YAJN,cACTC,EADS,yBAORA,GAPQ,2CAjHS,KA8H5BwB,eA9H4B,uCA8HX,WAAON,GAAP,eAAAxI,EAAA,sEACQ,EAAK+G,IAAII,KAAT,8BAEjBqB,EACA,CACInB,YAAa,YALR,cACPC,EADO,yBAONA,GAPM,2CA9HW,2DA2I5ByB,YA3I4B,uCA2Id,WAAOP,GAAP,eAAAxI,EAAA,sEACW,EAAK+G,IAAII,KAAT,2BAEjBqB,EACA,CACInB,YAAa,YALX,cACJC,EADI,yBAOHA,GAPG,2CA3Ic,2DAwJ5B0B,mBAxJ4B,uCAwJP,WAAOpD,GAAP,eAAA5F,EAAA,sEACI,EAAK+G,IAAII,KAAT,kCAEjB,CAAEvB,MAAOA,IAHI,cACX0B,EADW,yBAKVA,GALU,2CAxJO,2DAoK5B2B,OApK4B,uCAoKnB,WAAOT,GAAP,eAAAxI,EAAA,sEACgB,EAAK+G,IAAII,KAAT,sBAEjBqB,EACA,CACInB,YAAa,YALhB,cACCC,EADD,yBAQEA,GARF,2CApKmB,2DAkL5B4B,kBAlL4B,uCAkLR,WAAOtD,GAAP,eAAA5F,EAAA,sEACK,EAAK+G,IAAII,KAAT,iCAEjB,CAAEvB,MAAOA,IAHG,cACV0B,EADU,yBAKTA,GALS,2CAlLQ,2DA6L5B6B,cA7L4B,uCA6LZ,WAAOX,GAAP,6BAAAxI,EAAA,6DAAoCkH,EAApC,+BAAwD,GAAxD,SACS,EAAKH,IAAII,KAAT,+CACuBC,mBAAmBF,GAAaM,IACxEgB,GAHQ,cACNlB,EADM,yBAKLA,GALK,2CA7LY,2DAwM5B8B,mBAxM4B,uCAwMP,WAAOZ,GAAP,eAAAxI,EAAA,sEACI,EAAK+G,IAAII,KAAT,kCAEjBqB,EACA,CACInB,YAAa,YALJ,cACXC,EADW,yBAOVA,GAPU,2CAxMO,2DAqN5B+B,QArN4B,uCAqNlB,WAAOb,GAAP,eAAAxI,EAAA,sEACe,EAAK+G,IAAII,KAAT,uBAEjBqB,EACA,CACInB,YAAa,YALf,cACAC,EADA,yBAQCA,GARD,2CArNkB,sDACxBxH,KAAKiH,IAAL,OAAWA,QAAX,IAAWA,IAAO,IAAIuC,KAgOxB9B,EAAwB,0CAAsCJ,mBAAmBmC,OAAOC,OAAS,MC1O1FC,EAiGF,qE,SC7FJ,SAASC,IACZ,OAAOC,aAAY,SAACC,GAAD,OAA2BA,EAASC,oB,+BCC9CC,EAA6BC,eAA4B,CAClEC,IAAK,6BACLC,QAAS,CAAE/F,iBAAiB,EAAOgG,MAAO,GAAIC,WAAW,KAOtD,SAASC,IACZ,MAA0BC,yBAAeP,GAAzC,mBACA,MAAO,CADP,WCLJ,IAAMQ,EAAuB,uCAAG,WAAOpG,EAAiC2F,EAAgCU,GAAxE,eAAAvK,EAAA,0DAExBwK,4BAAkBtG,GAFM,oDAOvBA,EAPuB,uBAQxBqG,EAAS,CAAErG,iBAAiB,EAAOgG,MAAO,GAAIC,WAAW,IARjC,iCAa5BI,GAAS,SAAAE,GAAS,kCAAUA,GAAV,IAAqBN,WAAW,OAbtB,SAcTN,EAAehB,mBAdN,OAcxBvB,EAdwB,OAe5BiD,EAAS,CAAErG,iBAAiB,EAAMgG,MAAO5C,EAAO4C,MAAOC,WAAW,IAftC,4CAAH,0DAqBtB,SAASO,IAAuG,IAAD,EAAlF1G,EAAkF,uDAAtD,GAC5D,EAA4BD,IAApBG,EAAR,EAAQA,gBACR,EAA0BkG,IAA1B,mBAAOF,EAAP,KAAcK,EAAd,KACMV,EAAiBH,IAEvB,EAAsDiB,YAAgB,sBAAC,sBAAA3K,EAAA,0DAE/DkK,EAAMC,UAFyD,iEAM7DG,EAAwBpG,EAAiB2F,EAAgBU,GANI,2CAOpE,CAACV,EAAgB3F,EAAiBqG,EAAUL,IAP/C,mBAAOU,EAAP,YAA+BT,EAA/B,EAAkBU,YAAwBC,EAA1C,EAA0CA,OA0B1C,OAjBA7G,aAAgB,WACRD,EAAQ+G,MAKRP,4BAAkBtG,IAIjBgG,GAASA,EAAMhG,kBAAoBA,GACpC0G,MAEL,CAACA,EAAS5G,EAAQ+G,KAAM7G,EAAiBgG,IAIrC,CACHvH,KAAM,CAAEuH,MAAK,iBAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAOA,aAAT,QAAkB,MAC/BU,QAASA,EACTT,UAAWA,EACXW,OAAQA,GC7DT,SAASE,KAA2J,IAA1HhH,EAAyH,uDAA7F,GACzE,EAA0EC,WAAoD,IAA9H,mBAAOgH,EAAP,KAAsCC,EAAtC,KAEMrB,EAAiBH,IAEvB,EAAsDiB,YAAgB,sBAAC,4BAAA3K,EAAA,sEAChD6J,EAAepC,mCADiC,OAC/DH,EAD+D,OAEnE4D,EAAiC5D,GAFkC,2CAGpE,CAACuC,EAAgBqB,IAHpB,mBAAON,EAAP,YAA+BT,EAA/B,EAAkBU,YAAwBC,EAA1C,EAA0CA,OAa1C,OARA7G,aAAgB,WACPD,EAAQ+G,MACTH,MAEL,CAACA,EAAS5G,EAAQ+G,OAId,CACHpI,KAAM,CAAEsI,8BAA+BA,GACvCL,QAASA,EACTT,UAAWA,EACXW,OAAQA,GCxBT,SAASK,KACZ,IAAMtB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO/E,GAAP,SAAA5F,EAAA,sEAC1C6J,EAAeb,mBAAmBpD,GADQ,mFAAD,sDAEvD,CAACiE,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SCH3B,SAASM,KACZ,IAAMvB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO/C,EAAkBV,GAAzB,SAAAlH,EAAA,sDACvD6J,EAAelC,mBAAmBC,EAAUV,GADW,2CAAD,wDAEvD,CAAC2C,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SCQ3B,IAAMO,GAAqB,SAACC,GAC/B,IAAQpH,EAAoBH,IAApBG,gBACeqH,EAAiBb,IAAhC/H,KAAQuH,MAChB,EAAgDjG,aAAhD,mBAAQuH,EAAR,KAAyBC,EAAzB,KAGAxH,aAAgB,WACZ,GAAIqH,EAAMI,cAAgBlB,4BAAkBe,GAAa,CACrD,IADqD,EAC/CI,EAAe,CAACL,EAAMI,aAAaE,KAAK,GAC1CC,GAAU,EAFuC,cAG7BF,GAH6B,yBAG5CG,EAH4C,QAIjD,GAAIP,EAAWQ,MAAK,SAAAC,GAAE,OAAIA,IAAOF,KAE7B,OADAD,GAAU,EACV,SAHR,2BAAsC,kBAG9B,OAN6C,8BASrDJ,EAAmBI,MAExB,CAACP,EAAMI,YAAaH,EAAYE,EAAoBvH,IAIvD,IAAQ+H,EAAaX,EAAbW,SAGR,GAAIzB,4BAAkBtG,GAClB,OAAQ,6BAGZ,IAAIgI,GAAc,EAQlB,OALKhI,IACDgI,GAAc,GAIdhI,GAAmBoH,EAAMI,aAAelB,4BAAkBe,GAClD,+BAIY,IAApBC,IACAU,GAAc,GAIdA,EACIZ,EAAMa,oBACE,mCAAGF,IAGP,6BAGRX,EAAMa,oBACE,6BAGJ,mCAAGF,M,8CC7DFG,GAAiB,SAACd,GAC3B,IAAQpH,EAAoBH,IAApBG,gBACeqH,EAAiBb,IAAhC/H,KAAQuH,MAChB,EAAgDjG,aAAhD,mBAAQuH,EAAR,KAAyBC,EAAzB,KAGAxH,aAAgB,WACZ,GAAIqH,EAAMI,cAAgBlB,4BAAkBe,GAAa,CACrD,IADqD,EAC/CI,EAAe,CAACL,EAAMI,aAAaE,KAAK,GAC1CC,GAAU,EAFuC,cAG7BF,GAH6B,yBAG5CG,EAH4C,QAIjD,GAAIP,EAAWQ,MAAK,SAAAC,GAAE,OAAIA,IAAOF,KAE7B,OADAD,GAAU,EACV,SAHR,2BAAsC,kBAG9B,OAN6C,8BASrDJ,EAAmBI,MAExB,CAACP,EAAMI,YAAaH,EAAYE,EAAoBvH,IAIvD,IAAmBmI,EAAyCf,EAApDgB,UAAsBC,EAA8BjB,EAA9BiB,OAAQN,EAAsBX,EAAtBW,SAAaO,EAAnD,aAA4DlB,EAA5D,IAGA,OAAId,4BAAkBtG,IAKlBoH,EAAMI,aAAelB,4BAAkBe,GAJ/B,8BASY,IAApBC,EACQ,6FAIR,cAAC,IAAD,2BAAWgB,GAAX,IACID,OAAQ,SAACjB,GACL,GAAIpH,EACA,OAAImI,EACO,cAACA,EAAD,eAAef,IACfiB,EACAA,EAAOjB,GAEPW,EAGX,IAAMQ,EAAW,0CAAsCrF,mBAAmBmC,OAAOtE,SAASyH,OAC1F,OAAO,cAAC,IAAD,CAAUtG,GAAIqG,S,oCCzD5BE,GAAqB,SAACrB,GAC/B,IAAQlF,EAAwCkF,EAAxClF,GAAIwG,EAAoCtB,EAApCsB,MAAOC,EAA6BvB,EAA7BuB,gBAAoBL,EAAvC,aAAgDlB,EAAhD,IAEA,OACI,cAAC,UAAD,aAASlF,GAAIA,EAAIwG,SAAY,OAALA,QAAK,IAALA,IAAgB,MAAPxG,GAAyByG,gBAAe,OAAEA,QAAF,IAAEA,IAAmB,UAAcL,KCZvGM,GACO,iBCOPC,GAAa,WACtB,IAAQhI,EAAMC,cAAND,EAER,OACI,qCACI,eAAC,GAAD,WACI,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,YAArC,UACI,cAAC,IAAD,CAAiBC,KAAM,CAAC,MAAO,gBAAiBP,UAAU,aAC1D,yCAAIf,EAAE,sBAAuB,oBAKrC,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,SAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,OAAOP,UAAU,aACvC,yCAAIf,EAAE,sBAAuB,oBAIzC,cAAC,GAAD,CAAoB2G,YAAaoB,GAAjC,SACI,cAACnG,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,kBAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,OAAOP,UAAU,aACvC,yCAAIf,EAAE,4BAA6B,gCC5B9CkI,I,OAAiB,WAC1B,OACI,qBAAKnH,UAAU,mBCPVoH,GAAwBnD,eAAa,CAC9CC,IAAK,wBACLC,QAAS,KAON,SAASkD,KACZ,MAA0B9C,yBAAe6C,IAAzC,mBACA,MAAO,CADP,W,6GCASE,GAAc,SAAC9B,GACxB,IAAQ+B,EAAsE/B,EAAtE+B,KAAMC,EAAgEhC,EAAhEgC,YAAaxH,EAAmDwF,EAAnDxF,UAAWyH,EAAwCjC,EAAxCiC,MAAOC,EAAiClC,EAAjCkC,oBAAwBhB,EAArE,aAA8ElB,EAA9E,IAEQvG,EAAMC,cAAND,EAER,OACI,eAAC0I,GAAA,EAAD,CAAY3H,UAAS,8BAAkBA,QAAlB,IAAkBA,IAAa,IAAMyH,MAAOA,EAAjE,UACI,cAACG,GAAA,EAAD,aAAO5H,UAAU,qBAAqBuH,KAAI,OAAEA,QAAF,IAAEA,IAAQ,SAChDC,YAAW,OAAEA,QAAF,IAAEA,IAAevI,EAAE,0BAA2B,UACzD4I,WAAY,SAAAC,GAEW,KAAfA,EAAEC,UACEL,GACAA,MAIRhB,IACR,cAACsB,GAAA,EAAD,CAAiBC,UAAU,SAA3B,SACI,eAACnH,EAAA,EAAD,CAAQd,UAAU,sBAAsBkI,QAASR,EAAjD,UACI,cAAC,IAAD,CAAiBnH,KAAK,WACtB,sBAAMP,UAAU,UAAhB,SAA2Bf,EAAE,2BAA4B,qBCxBhEkJ,I,OAAoB,WAE7B,MAAoCd,KAApC,mBAAOe,EAAP,KAAmBC,EAAnB,KAGMC,EAAUC,cACVC,EAAgBrK,eAAkB,WACpC,IAAMsK,EAAkBL,EAAWM,OAC9BD,EAGDH,EAAQtM,KAAR,2BAAiCsF,mBAAmBmH,KAFpDH,EAAQtM,KAAK,eAIlB,CAACsM,EAASF,IAEb,OACI,cAAC,GAAD,CAAapI,UAAU,sBAAsB2I,MAAOP,EAAYQ,SAAU,SAAAd,GAAC,OAAIO,EAAcP,EAAEe,cAAcF,QAAQjB,oBAAqB,kBAAMc,SCb3IM,GAAS,WAClB,OACI,cAAC,IAAD,CAAWC,OAAK,EAAC/I,UAAU,SAA3B,SACI,eAACgJ,EAAA,EAAD,CAAWC,OAAK,EAAhB,UACI,cAAC,IAAD,CAAmBjJ,UAAU,YAAYkJ,QAAQ,KAAKC,QAAM,IAE5D,cAAC,OAAD,CAAM7I,GAAG,IAAT,SACI,cAAC,GAAD,MAEJ,cAAC,IAAD,CAAmBN,UAAU,6BAA6BkJ,QAAQ,OAElE,cAACE,EAAA,EAAD,CAAKpJ,UAAU,4BAAf,SACI,cAAC,GAAD,MAEJ,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,6CAGf,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,wCAAf,SACI,cAAC,GAAD,UACI,cAAC,GAAD,QAKR,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,aAAf,SACI,cAAC,EAAD,MAUJ,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,6CAA6CyH,MAAO,CAAE4B,SAAU,QAA/E,SACI,cAAC,GAAD,UACI,cAAC,GAAD,cC1CXC,I,OAAmB,WAC5B,IAAQrK,EAAMC,cAAND,EAER,OACI,qCACI,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,SAArC,SACKrB,EAAE,yBAA0B,2BAGrC,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAASN,KAAK,4BAA4B2C,OAAO,SAASC,IAAI,aAA9D,SACKvK,EAAE,gCAAiC,oBAG5C,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,wBAArC,SACKrB,EAAE,sCAAuC,4BAGlD,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,kBAArC,SACKrB,EAAE,iCAAkC,2BCvB5CwK,GAAS,WAClB,IAAQxK,EAAMC,cAAND,EAER,OACI,eAAC,IAAD,CAAWe,UAAU,SAArB,UACI,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,aAAf,SACI,cAAC,GAAD,MAEJ,qBAAKA,UAAU,sBAAf,SACKf,EAAE,qBAAsB,2I,8BCb5ByK,GAAa,SAAClE,GACvB,OACI,cAAC,KAAD,CAAkBxF,UAAU,cAA5B,SACKwF,EAAMW,YCKNwD,I,OAAkB,SAACnE,GAC5B,IAAQxF,EAA+BwF,EAA/BxF,UAAW4J,EAAoBpE,EAApBoE,MAAOzD,EAAaX,EAAbW,SAE1B,OACI,cAACtF,EAAA,EAAD,CAASb,UAAW,cAAgB4J,EAAO,kBAAmB,KAA1C,OAAiD5J,QAAjD,IAAiDA,IAAa,IAAlF,SACKmG,MCPA0D,GAAY,SAACrE,GACtB,IAAQsE,EAAWtE,EAAXsE,OAER,OACI,cAAC,IAAD,UAEQA,EAAO1N,KAAI,SAAC2N,EAAMzN,GAEd,OAAIyN,EAAKC,WAAaD,EAAKnE,YACf,cAAC,GAAD,CAA4BqE,KAAMF,EAAKE,KAAMnD,MAAOiD,EAAKjD,MAAON,UAAWuD,EAAKvD,UAAWC,OAAQsD,EAAKtD,OAAQb,YAAamE,EAAKnE,aAA7GtJ,GAIzB,cAAC,IAAD,CAAmB2N,KAAMF,EAAKE,KAAMnD,MAAOiD,EAAKjD,MAAON,UAAWuD,EAAKvD,UAAWC,OAAQsD,EAAKtD,QAAnFnK,S,qCCT3B4N,GAAmB,SAAC1E,GAC7B,IAAQxF,EAAuCwF,EAAvCxF,UAAWmK,EAA4B3E,EAA5B2E,UAAWxK,EAAiB6F,EAAjB7F,KAAMyK,EAAW5E,EAAX4E,OAE9B3C,EAAQtJ,WAAc,WACxB,IAAIkM,EAA2B,GAU/B,OATIF,IACAE,EAAIC,MAAQ,OACZD,EAAIE,UAAY,UAGhBH,IACAC,EAAInB,QAAU,UAGXmB,IACR,CAACD,EAAQD,IAEZ,OACI,sBAAKnK,UAAW,sBAAwBA,GAAwB,IAAKyH,MAAOA,EAA5E,UACI,cAAC+C,GAAA,EAAD,CAASjD,KAAK,OAAO5H,KAAMA,IAC3B,sBAAMK,UAAU,UAAhB,yBCnBCyK,I,cAAa,SAACjF,GACvB,IAAQW,EAAwCX,EAAxCW,SAAUnG,EAA8BwF,EAA9BxF,UAAW0K,EAAmBlF,EAAnBkF,eAE7B,OACI,qBAAK1K,UAAS,qBAAgB0K,EAAc,qCAAiCA,GAAmB,GAAlF,mBAAwF1K,QAAxF,IAAwFA,IAAa,IAAnH,SACKmG,M,iBCXAwE,GAAoB,SAACnF,GAC9B,IAAQxF,EAAuBwF,EAAvBxF,UAAc0G,EAAtB,aAA+BlB,EAA/B,IAEA,OAAQ,cAAC,GAAD,aAAYxF,UAAS,oCAAwBA,QAAxB,IAAwBA,IAAa,KAAU0G,KCGnEkE,GAAe,SAACpF,GACzB,IAAQqF,EAAqBrF,EAArBqF,QAASzP,EAAYoK,EAAZpK,QAEjB,OACI,cAAC,GAAD,UAIQyP,EACI,qCACI,cAAC,GAAD,CAAkBV,WAAS,IAC3B,qBAAKnK,UAAU,UAAf,SACK5E,OAIL,mCAEUA,EAAW,8BAAMA,IAAkB,UChCxD0P,GACA,YADAA,GAEF,UAGEC,GACK,kBADLA,GAEH,SAFGA,GAGA,aAGAC,GACJ,QADIA,GAEI,iBAFJA,GAGE,eAHFA,GAIF,UAJEA,GAKD,WAGNrN,GAAS,kBAEFsN,GAAmB,CAC9BC,yBAA0B,IAC1BC,uBAAwBxN,GACxByN,MAAM,GAAD,OAAKzN,GAAL,YAAeqN,IACpBK,YAAY,GAAD,OAAK1N,GAAL,YAAeqN,IAC1BM,cAAc,GAAD,OAAK3N,GAAL,YAAeqN,IAC5BO,SAAS,GAAD,OAAK5N,GAAL,YAAeqN,IACvBQ,QAAQ,GAAD,OAAK7N,GAAL,YAAeqN,IACtBS,OAAO,GAAD,OAAK9N,GAAL,YAAeoN,IACrBW,UAAU,GAAD,OAAK/N,GAAL,YAAeoN,IACxBY,eAAe,GAAD,OAAKhO,GAAL,YAAeoN,IAC7Ba,qBAAsB,oBACtBC,mBAAoB,YChBTT,GAAb,oDACI,WAAY5F,GAAoB,IAAD,8BAC3B,cAAMA,IAED/K,MAAQ,CACTW,aAASnB,GAJc,EADnC,qDASI,WACI,IAAMiI,EAASlI,KAAKwL,MAAMtD,OAC1B,OAAQA,GACJ,KAAK8I,GACDhR,KAAK8R,MAAM9R,KAAK+R,gBAChB,MACJ,KAAKf,GACDhR,KAAKgS,uBACL,MACJ,KAAKhB,GACD,IACM3P,EADS,IAAI4Q,gBAAgBxI,OAAOtE,SAAS+M,QAC9BtK,IAAIkJ,IACzB9Q,KAAKmS,SAAS,CAAE/Q,QAASC,IACzB,MACJ,KAAK2P,GACDhR,KAAKoS,oBACL,MACJ,KAAKpB,GACDhR,KAAKqS,qBACL,MACJ,QACI,MAAM,IAAIpR,MAAJ,0BAA6BiH,EAA7B,SA9BtB,oBAkCI,WACI,IAAMA,EAASlI,KAAKwL,MAAMtD,OAClB9G,EAAYpB,KAAKS,MAAjBW,QAER,OAAQ8G,GACJ,KAAK8I,GACD,OAAQ,cAAC,GAAD,CAAcH,SAAO,EAACzP,QAASA,GAAW,qBACtD,KAAK4P,GACD,OAAQ,cAAC,GAAD,CAAcH,SAAO,EAACzP,QAASA,GAAW,8BACtD,KAAK4P,GACL,KAAKA,GACD,OAAQ,cAAC,GAAD,CAAcH,SAAO,EAACzP,QAASA,GAAW,YACtD,QACI,MAAM,IAAIH,MAAJ,0BAA6BiH,EAA7B,SA/CtB,0DAmDI,WAAYd,GAAZ,iBAAAlH,EAAA,6DACUO,EAAQ,CAAE2G,aADpB,SAEyB3H,EAAY6S,OAAO7R,GAF5C,OAEU+G,EAFV,YAGYA,EAAO1E,OAHnB,cAIaC,EAA2BG,SAJxC,SAMaH,EAA2BE,QANxC,SASaF,EAA2BC,KATxC,uEAOkBhD,KAAKuS,oBAAoBnL,GAP3C,mDAUYpH,KAAKmS,SAAS,CAAE/Q,QAASoG,EAAOpG,UAV5C,mCAakB,IAAIH,MAAJ,gCAAmCuG,EAAO1E,OAA1C,MAblB,iDAnDJ,gIAoEI,8BAAA5C,EAAA,6DACUsB,EAAMiI,OAAOtE,SAASyH,KADhC,SAEyBnN,EAAY+S,eAAehR,GAFpD,OAEUgG,EAFV,YAGYA,EAAO1E,OAHnB,cAIaC,EAA2BG,SAJxC,SAQaH,EAA2BE,QARxC,SAWaF,EAA2BC,KAXxC,yBAOkB,IAAI/B,MAAM,wBAP5B,wBASkBjB,KAAKuS,oBAAoBvS,KAAK+R,aAAavK,EAAO/G,QATpE,mDAYYT,KAAKmS,SAAS,CAAE/Q,QAASoG,EAAOpG,UAZ5C,mCAekB,IAAIH,MAAJ,gDAAmDuG,EAAO1E,OAA1D,OAflB,iDApEJ,gFAuFI,SAAarC,GACT,IACMgS,EADS,IAAIR,gBAAgBxI,OAAOtE,SAAS+M,QAC1BtK,IAAIkJ,IAC7B,GAAI2B,IAAcA,EAAUC,WAAV,UAAwBjJ,OAAOtE,SAASuE,OAAxC,MAEd,MAAM,IAAIzI,MAAM,yFAEpB,OAAQR,GAASA,EAAM2G,WAAcqL,GAA9B,UAA8ChJ,OAAOtE,SAASuE,OAA9D,OA9Ff,gCAiGI,WACI1J,KAAK2S,+BAAL,UAAuC1B,GAAiBW,qBAAxD,YAAgFd,GAAhF,YAAiHxJ,mBAAmB2J,GAAiBG,WAlG7J,+BAqGI,WACIpR,KAAK2S,+BAA+B1B,GAAiBY,sBAtG7D,4CAyGI,SAA+Be,GAC3B,IAAMjG,EAAW,UAAMlD,OAAOtE,SAASuE,QAAtB,OAA+BkJ,GAIhDnJ,OAAOtE,SAAS0N,QAAQlG,KA9GhC,iCAiHI,SAAoBvF,GAGhBqC,OAAOtE,SAAS0N,QAAQzL,OApHhC,GAA2BjD,aCEd2O,GAAb,oDACI,WAAYtH,GAAqB,IAAD,8BAC5B,cAAMA,IAED/K,MAAQ,CACTW,aAASnB,EACT8S,SAAS,EACTvO,eAAe,GANS,EADpC,qDAWI,WACI,IAAM0D,EAASlI,KAAKwL,MAAMtD,OAC1B,OAAQA,GACJ,KAAK6I,GACKtH,OAAO6E,QAAQ7N,MAAMA,MAAMiG,MAC7B1G,KAAKgT,OAAOhT,KAAK+R,gBAGjB/R,KAAKmS,SAAS,CAAEY,SAAS,EAAM3R,QAAS,uDAE5C,MACJ,KAAK2P,GACD/Q,KAAKiT,wBACL,MACJ,KAAKlC,GACD/Q,KAAKmS,SAAS,CAAEY,SAAS,EAAM3R,QAAS,iCACxC,MACJ,QACI,MAAM,IAAIH,MAAJ,0BAA6BiH,EAA7B,MAGdlI,KAAKkT,gCAhCb,oBAmCI,WACI,MAA6BlT,KAAKS,MAA1BsS,EAAR,EAAQA,QAAS3R,EAAjB,EAAiBA,QACjB,IAAK2R,EACD,OAAQ,cAAC,GAAD,CAAclC,SAAO,EAACzP,QAAQ,gBAG1C,IAAM8G,EAASlI,KAAKwL,MAAMtD,OAC1B,OAAQA,GACJ,KAAK6I,GACD,OAAQ,cAAC,GAAD,CAAcF,SAAO,EAACzP,QAASA,GAAW,sBACtD,KAAK2P,GACD,OAAQ,cAAC,GAAD,CAAcF,SAAO,EAACzP,QAASA,GAAW,+BACtD,KAAK2P,GACD,OAAQ,cAAC,IAAD,CAAUzK,GAAG,MACzB,QACI,MAAM,IAAIrF,MAAJ,0BAA6BiH,EAA7B,SAlDtB,2DAqDI,WAAad,GAAb,iBAAAlH,EAAA,6DACUO,EAAQ,CAAE2G,aADpB,SAEkC3H,EAAY2E,kBAF9C,mDAI6B3E,EAAY0T,QAAQ1S,GAJjD,OAIc+G,EAJd,YAKgBA,EAAO1E,OALvB,cAMiBC,EAA2BG,SAN5C,UAQiBH,EAA2BE,QAR5C,UAWiBF,EAA2BC,KAX5C,yEASsBhD,KAAKuS,oBAAoBnL,GAT/C,mDAYgBpH,KAAKmS,SAAS,CAAE/Q,QAASoG,EAAOpG,UAZhD,mCAesB,IAAIH,MAAM,yCAfhC,gCAkBQjB,KAAKmS,SAAS,CAAE/Q,QAAS,iCAlBjC,iDArDJ,iIA2EI,8BAAAlB,EAAA,6DACUsB,EAAMiI,OAAOtE,SAASyH,KADhC,SAEyBnN,EAAY2T,gBAAgB5R,GAFrD,OAEUgG,EAFV,YAGYA,EAAO1E,OAHnB,cAIaC,EAA2BG,SAJxC,SAQaH,EAA2BE,QARxC,SAWaF,EAA2BC,KAXxC,yBAOkB,IAAI/B,MAAM,wBAP5B,wBASkBjB,KAAKuS,oBAAoBvS,KAAK+R,aAAavK,EAAO/G,QATpE,mDAYYT,KAAKmS,SAAS,CAAE/Q,QAASoG,EAAOpG,UAZ5C,mCAekB,IAAIH,MAAM,yCAf5B,iDA3EJ,sIA8FI,4BAAAf,EAAA,sEACgCT,EAAY2E,kBAD5C,OACUI,EADV,OAEIxE,KAAKmS,SAAS,CAAEY,SAAS,EAAMvO,kBAFnC,gDA9FJ,gFAmGI,SAAa/D,GACT,IACMgS,EADS,IAAIR,gBAAgBxI,OAAOtE,SAAS+M,QAC1BtK,IAAIkJ,IAC7B,GAAI2B,IAAcA,EAAUC,WAAV,UAAwBjJ,OAAOtE,SAASuE,OAAxC,MAEd,MAAM,IAAIzI,MAAM,yFAEpB,OAAQR,GAASA,EAAM2G,WACnBqL,GADG,UAEAhJ,OAAOtE,SAASuE,QAFhB,OAEyBuH,GAAiBS,aA5GzD,iCA+GI,SAAoBtK,GAChB,OAAOqC,OAAOtE,SAAS0N,QAAQzL,OAhHvC,GAA4BjD,aCdfkP,GAA4C,CACrD,CAAEpD,KAAM,wBAAyBxD,OAAQ,kBAAM6G,GAAY,WAC3D,CAAErD,KAAM,iCAAkCxD,OAAQ,kBAAM6G,GAAY,oBACpE,CAAErD,KAAM,+BAAgCxD,OAAQ,kBAAM6G,GAAY,kBAClE,CAAErD,KAAM,0BAA2BxD,OAAQ,kBAAM6G,GAAY,aAC7D,CAAErD,KAAM,2BAA4BxD,OAAQ,kBAAM6G,GAAY,cAE9D,CAAErD,KAAM,yBAA0BxD,OAAQ,kBAAM8G,GAAa,YAC7D,CAAEtD,KAAM,kCAAmCxD,OAAQ,kBAAM8G,GAAa,qBACtE,CAAEtD,KAAM,6BAA8BxD,OAAQ,kBAAM8G,GAAa,iBAGrE,SAASD,GAAYzN,GACjB,OAAQ,cAAC,GAAD,CAAOqC,OAAQrC,IAG3B,SAAS0N,GAAa1N,GAClB,OAAQ,cAAC,GAAD,CAAQqC,OAAQrC,I,oFCNrB,IAAI2N,GAAiE,G,mCCC/DC,GAAgB,SAACjI,GAC1B,IAAQR,EAAmCQ,EAAnCR,OAAQjE,EAA2ByE,EAA3BzE,MAAO2M,EAAoBlI,EAApBkI,OAAWhH,EAAlC,aAA2ClB,EAA3C,IAEA,EAAoCrH,WAA8B,IAAlE,mBAAOwP,EAAP,KAAmBC,EAAnB,KACMrO,EAASpB,eAAkB,SAAC+F,GAAD,QAAmByJ,EAAW1H,MAAK,SAAAC,GAAE,OAAIA,IAAOhC,OAAM,CAACyJ,IAClFE,EAAa1P,eAAkB,SAAC+F,GAClC0J,GAAc,SAAAjJ,GACV,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOhC,KACrBS,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOhC,KAE/B,GAAN,oBAAWS,GAAX,CAAsBT,SAG/B,CAAC0J,IAGEE,EAAiB3P,WAAc,WAOjC,MADyC,CAHxB,CAAC6G,GAAQc,KAAK,GAAGtJ,QAAO,SAAAuN,GAAI,QAAIA,KAGI3N,KAAI,SAAAf,GAAK,OC7B/D,SAAkCA,GAAiE,IAAD,kBAE7EmS,IAF6E,IAErG,2BAA0D,CAAC,IACjDO,GAAWC,EADqC,SAC3B3S,GAC3B,IAAKqJ,4BAAkBqJ,GACnB,OAAIE,MAAMC,QAAQH,KAEX,OAAKA,QAAL,IAAKA,OAAL,EAAKA,EAAmC1S,OADpC0S,EAIA,CAAE3S,QAAS2S,EAAoB1S,MAAOA,IAV4C,8BAgBrG,MAAO,CACHD,QAAO,iBAAEC,QAAF,IAAEA,OAAF,EAAEA,EAAOD,eAAT,eAAoBC,QAApB,IAAoBA,OAApB,EAAoBA,EAAO8S,SAClC9S,MAAOA,GDW2D+S,CAAyB/S,OAASyK,KAAK,KAE1G,CAACd,IAGEqJ,EAAclQ,WAAc,WAC9B,IADoC,EAChCmQ,EAA0E,GAD1C,cAGhBR,GAHgB,yBAGzBzS,EAHyB,QAI5BkT,EAAQD,EAAOrI,MAAK,SAAA8D,GAAI,OAAIA,EAAK3O,UAAYC,EAAMD,WAClDmT,IACDA,EAAQ,CAAEnT,QAASC,EAAMD,QAAS4J,OAAQ,IAC1CsJ,EAAOtS,KAAKuS,IAGhBA,EAAMvJ,OAAOhJ,KAAKX,IAPtB,2BAAqC,IAHD,8BAapC,OAAOiT,IACR,CAACR,IAGJ,OAAKA,EAAerR,OAKdiR,EAEE,eAACc,GAAA,EAAD,yBAAOzN,MAAOA,GAAS,UAAc2F,GAArC,cACKlB,EAAMW,SAGH2H,EAAe1R,KAAI,SAAC2N,EAAMzN,GAAP,OACf,8BACKyN,EAAK3O,SADAkB,UAY1B,eAACkS,GAAA,EAAD,yBAAOzN,MAAOA,GAAS,UAAc2F,GAArC,cACKlB,EAAMW,SAEHkI,EAAYjS,KAAI,SAAA2N,GAAI,OAChB,8BACI,eAAC0E,GAAA,EAAD,CAAKzO,UAAU,YAAf,UACI,cAAC0O,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,sBAAKzG,QAAS,kBAAM2F,EAAW9D,EAAK3O,UAAUqM,MAAO,CAAEmH,OAAQ,WAA/D,UACI,cAAC,IAAD,CAAiBrO,KAAMhB,EAAOwK,EAAK3O,SAAW,aAAe,gBAC7D,yCACI2O,EAAK/E,OAAOvI,OAAS,EACjB,cAACoS,GAAA,EAAD,CAAO9N,MAAM,SAAS+N,MAAI,EAA1B,SACK/E,EAAK/E,OAAOvI,SAGb,cAACoS,GAAA,EAAD,CAAO9N,MAAM,SAAS+N,MAAI,EAA1B,SACI,cAAC,IAAD,CAAiBvO,KAAK,sBAItC,cAAC,IAAD,CAAqBI,OAAQoJ,EAAK/E,OAAOvI,OAAS,EAAlD,SACI,gDAIZ,eAACiS,GAAA,EAAD,WACI,8BACK3E,EAAK3O,UAEV,cAAC,IAAD,CAAqBuF,OAAQpB,EAAOwK,EAAK3O,SAAzC,SAEQ2O,EAAK/E,OAAO5I,KAAI,SAACf,EAAOiB,GAAR,OACZ,gCACI,cAAC,IAAD,CAAqBqE,UAAS,OAACtF,QAAD,IAACA,OAAD,EAACA,EAAO0T,SAAtC,SACI,8BACK1T,EAAM0T,YAGf,sBAAMC,KAAK,OAAOvH,MAAO,GAAzB,SACKwH,KAAKC,UAAL,OAAe7T,QAAf,IAAeA,OAAf,EAAeA,EAAOA,MAAO,KAAM,OAPlCiB,eA5BxByN,EAAK3O,gBA3BpB,MExDR,SAAS+T,GAAcC,GAAoF,IAAnDC,EAAkD,uDAArB,GAExF,EAA8BlR,WAA2BkR,GAAzD,mBAAOC,EAAP,KAAgBC,EAAhB,KAGMC,EAASrR,eAAkB,SAACmR,GAC9BC,GAAW,SAAA5K,GAAS,kCACTA,GACA2K,QAEZ,CAACC,IAGEE,EAAQtR,eAAkB,WAC5BoR,EAAW,MACZ,CAACA,IAGE7M,EAAQvE,WAAc,WACxB,OAAO,2BAAP,OACQiR,QADR,IACQA,IAAa,IAAaE,KAEnC,CAACF,EAAWE,IAGTjF,EAAMlM,WAAc,iBAAO,CAC7BqR,OAAQA,EACRF,QAASA,EACTG,MAAOA,EACP/M,MAAOA,KACP,CAAC4M,EAASE,EAAQC,EAAO/M,IAE7B,OAAO2H,ECnBJ,SAASqF,GAAwBN,EAAwCO,GAE5E,MAA+BxR,WAAqD,IAApF,mBAAOyR,EAAP,KAAiBL,EAAjB,KAGApR,aAAgB,WACZoR,GAAW,SAAA5K,GAKP,IALoB,EAKhB0F,EAA4C,GAC5CwF,GAAqB,EANL,qBASMT,QATN,IASMA,IAAa,IATnB,yBASXU,EATW,QAUVC,EAAmBJ,EAAOG,GAC5BE,EAAerL,EAAUsB,MAAK,SAAA8D,GAAI,OAAIA,EAAK7F,MAAQ6L,KAGnDC,GACIA,EAAaZ,YAAcU,IAE3BE,EAAaZ,UAAYU,EACzBD,GAAqB,GAIzBxF,EAAIrO,KAAKgU,KAGT3F,EAAIrO,KAAK,CACLkI,IAAK6L,EACLX,UAAWU,EACXR,QAAS,GACTW,YAAY,EACZC,WAAW,EACXC,mBAAmB,IAEvBN,GAAqB,IAxB7B,2BAA4C,IATxB,kDAsCElL,GAtCF,yBAsCTyL,EAtCS,QAwChB,IAAKA,EAAQhB,UAIT,OAHK/E,EAAIpE,MAAK,SAAA8D,GAAI,OAAIA,IAASqG,MAC3B/F,EAAIrO,KAAKoU,GAEb,WAIJ,IAEwB,EAFlBC,EAAaV,EAAOS,EAAQhB,cACP,OAACA,QAAD,IAACA,OAAD,EAACA,EAAWnJ,MAAK,SAAA8D,GAAI,OAAI4F,EAAO5F,KAAUsG,QAEjEhG,EAAG,UAAGA,SAAH,aAAG,EAAK7N,QAAO,SAAA0J,GAAE,OAAIA,IAAOkK,KAC/BP,GAAqB,IAd7B,2BAAiC,IAtCb,8BAyDpB,OAAKA,EAKExF,EAJI1F,OAMhB,CAACyK,EAAWO,EAAQJ,IAMvB,IAAMC,EAASrR,eAAkB,SAACmS,GAC9Bf,GAAW,SAAA5K,GACP,IADoB,EAChB4L,EAAQ,aAAO5L,GACf6L,EAAiB,GAFD,cAKGF,GALH,yBAKXG,EALW,QAMZvM,EAAMyL,EAAOc,GACjBD,EAAexU,KAAKkI,GACpB,IAAI8L,EAAerL,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KAG9C8L,GAYDA,EAAaV,QAAb,2BAA4BU,EAAaV,SAAYmB,GACrDT,EAAaG,mBAAoB,GAXjCI,EAASvU,KAAK,CACVkI,IAAKA,EACLkL,UAAW,KACXE,QAASmB,EACTR,YAAY,EACZC,WAAW,EACXC,mBAAmB,KAd/B,2BAAkC,IALd,kDA6BKI,GA7BL,yBA6BXP,EA7BW,QA8BXQ,EAAevK,MAAK,SAAAC,GAAE,OAAIA,IAAO8J,EAAa9L,SAC/C8L,EAAaE,WAAY,EACzBF,EAAaG,mBAAoB,IAHzC,2BAAoC,IA7BhB,8BAoCpB,OAAOI,OAEZ,CAAChB,EAAYI,IAGVF,EAAQtR,eAAkB,WAC5BoR,EAAW,MACZ,CAACA,IAGEmB,EAAmBvS,eAAkB,SAACwS,GACxC,IADyG,EACrGtG,EAAM,GAD+F,cAGxFsG,GAHwF,IAGzG,2BAA+B,CAAC,IAAD,EAAtB5G,EAAsB,QAE3BM,EAAIrO,KAAJ,qCAAe+N,EAAKqF,iBAApB,QAAiC,IAAQrF,EAAKuF,WALuD,8BAQzG,OAAOjF,IACR,IAEG3H,EAAQvE,WAAc,kBAAMuS,EAAiBd,EAASpT,QAAO,SAAA0J,GAAE,OAAKA,EAAGgK,gBAAa,CAACN,EAAUc,IAC/FE,EAAQzS,WAAc,kBAAMuS,EAAiBd,EAASpT,QAAO,SAAA0J,GAAE,OAAIA,EAAG+J,aAAe/J,EAAGgK,WAAahK,EAAGiK,wBAAqB,CAACP,EAAUc,IACxIG,EAAU1S,WAAc,kBAAMuS,EAAiBd,EAASpT,QAAO,SAAA0J,GAAE,OAAIA,EAAGgK,YAAchK,EAAG+J,YAAc/J,EAAGiK,wBAAqB,CAACP,EAAUc,IAC1II,EAAU3S,WAAc,kBAAMuS,EAAiBd,EAASpT,QAAO,SAAA0J,GAAE,OAAKA,EAAG+J,aAAe/J,EAAGgK,WAAaa,OAAOC,KAAK9K,EAAGoJ,SAAS7S,QAAUyJ,EAAGiK,wBAAqB,CAACP,EAAUc,IAuInL,OApIYvS,WAAc,iBAAO,CAC7BuE,MAAOA,EACP8M,OAAQA,EACRC,MAAOA,EAEPmB,MAAOA,EACPC,QAASA,EACTC,QAASA,EAETG,SAAU,SAAC/M,GAAc,IAAD,EACd8L,EAAeJ,EAAS3J,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KACpD,OAAK8L,EAIE,2BAAP,QAAO,EAAMA,EAAaZ,iBAA1B,QAAuC,IAAQY,EAAaV,SAHjD,MAKf4B,UAAW,SAAChN,EAAUuM,GAClBlB,GAAW,SAAA5K,GACP,IAAI4L,EAAQ,aAAO5L,GAGfqL,EAAerL,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KAkBnD,OAfK8L,GAWDA,EAAaV,QAAb,2BAA4BU,EAAaV,SAAYmB,GACrDT,EAAaG,mBAAoB,GAXjCI,EAASvU,KAAK,CACVkI,IAAKA,EACLkL,UAAW,KACXE,QAASmB,EACTR,YAAY,EACZC,WAAW,EACXC,mBAAmB,IAQpBI,MAGfY,WAAY,SAACjN,GACT,IAAM8L,EAAeJ,EAAS3J,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KACpD,OAAK8L,EAIEA,EAAaV,QAHT,IAKf8B,OAAQ,SAACrH,GACL,IAAI7F,EAAMyL,EAAO5F,GACjBwF,GAAW,SAAA5K,GACP,IAAI4L,EAAQ,aAAO5L,GAGfqL,EAAerL,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KAmBnD,OAlBK8L,EASMA,EAAaE,YAEpBF,EAAaE,WAAY,EACzBF,EAAaV,QAAUvF,GAXvBwG,EAASvU,KAAK,CACVkI,IAAKA,EACLkL,UAAW,KACXE,QAASvF,EACTkG,YAAY,EACZC,WAAW,EACXC,mBAAmB,IAWpBI,MAGfc,UAAW,SAACnN,GACRqL,GAAW,SAAA5K,GACP,IAAI4L,EAAQ,aAAO5L,GAGfqL,EAAerL,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,EAAGhC,MAAQA,KAMnD,OALI8L,IACAA,EAAaE,WAAY,EACzBF,EAAaG,mBAAoB,GAG9BI,MAOfe,YAAa,SAACC,GACVhC,GAAW,SAAA5K,GACP,IADoB,EAChB4L,EAA8C,aAAO5L,GACrD6M,GAAsB,EACpBC,EAAcF,EAASA,EAAOnV,KAAI,SAAA2N,GAAI,OAAI4F,EAAO5F,MAAS,KAH5C,cAKDpF,GALC,yBAKToF,EALS,QAQhB,IAAKrF,4BAAkB+M,KACdA,EAAYxL,MAAK,SAAAC,GAAE,OAAIA,IAAO6D,EAAK7F,OACpC,iBAKR6F,EAAKoG,mBAAoB,EAGzBpG,EAAKkG,YAAa,EAElBuB,GAAsB,GAf1B,2BAA8B,IALV,8BAwBpB,OAAKA,EAKEjB,EAJI5L,SAOnB,CAACiL,EAAUL,EAAYC,EAAQC,EAAO/M,EAAOkO,EAAOC,EAASC,EAASnB,I,sGC3QjE+B,GAAsB,SAAClM,GAChC,IAAQvG,EAAMC,cAAND,EACA6C,EAAsE0D,EAAtE1D,SAAU6P,EAA4DnM,EAA5DmM,oBAAgCC,EAA4BpM,EAAvCxF,UAA8B0G,EAArE,aAA8ElB,EAA9E,IAEA,EAAkCrH,WAAc,WAC5C,OAAQ2D,GACJ,IAAK,YACD,MAAO,CAAE+P,KAAM5S,EAAE,mDAAoD,qBAAsBsB,KAAM,CAAC,MAAO,aAAcP,UAAW,aACtI,IAAK,SACD,MAAO,CAAE6R,KAAI,OAAEF,QAAF,IAAEA,IAAuB7P,EAAUvB,KAAM,CAAC,MAAO,UAAWP,UAAW,UACxF,IAAK,WACD,MAAO,CAAE6R,KAAI,OAAEF,QAAF,IAAEA,IAAuB7P,EAAUvB,KAAM,CAAC,MAAO,YAAaP,UAAW,YAC1F,IAAK,UACD,MAAO,CAAE6R,KAAI,OAAEF,QAAF,IAAEA,IAAuB7P,EAAUvB,KAAM,CAAC,MAAO,WAAYP,UAAW,WACzF,QACI,MAAO,CAAE6R,KAAI,OAAEF,QAAF,IAAEA,IAAuB7P,EAAUvB,KAAM,oBAAqBP,UAAW,YAE/F,CAAC8B,EAAU6P,EAAqB1S,IAb3B4S,EAAR,EAAQA,KAAMtR,EAAd,EAAcA,KAAMP,EAApB,EAAoBA,UAepB,OACI,eAACc,EAAA,EAAD,yBAAQd,UAAS,gCAA2BA,EAA3B,mBAAwC4R,QAAxC,IAAwCA,IAAkB,KAAUlL,GAArF,cACI,cAAC,IAAD,CAAiBnG,KAAMA,IAD3B,IACqCtB,EAAE,2BAA4B,0BAA2B,CAAE6S,QAAShQ,EAAU6P,oBAAqBE,SC/BnIE,I,OAAc,SAACvM,GACxB,IAAQxF,EAAwBwF,EAAxBxF,UAAWmG,EAAaX,EAAbW,SAEnB,OACI,qBAAKnG,UAAS,8BAAkBA,QAAlB,IAAkBA,IAAa,IAA7C,SACKmG,M,yCCHA6L,GAAgB,SAACxM,GAC1B,MAKIA,EAJAyM,YADJ,MACW,OADX,IAKIzM,EAHAzE,aAFJ,MAEY,OAFZ,EAGIf,EAEAwF,EAFAxF,UACG0G,EAJP,aAKIlB,EALJ,IAOA,OACI,cAACwD,EAAA,EAAD,aAAWhJ,UAAS,wCAAmCiS,EAAnC,2BAA0DlR,EAA1D,mBAAmEf,QAAnE,IAAmEA,IAAa,KAAU0G,K,qCCrBzGwL,GACC,WADDA,GAEW,aAFXA,GAGW,oBCFXC,GAAyBC,aAAH,2OCAtBC,GAA8BD,aAAH,kPCA3BE,GAAwBF,aAAH,uL,0ECGrBG,GAAb,WAKI,WAAY/W,EAAagX,GAAsB,yBAJ9BhX,SAI6B,OAH7ByF,SAG6B,EAC1CjH,KAAKwB,IAAMA,EACXxB,KAAKiH,IAAMuR,GAAY,IAAIhP,IAPnC,iFAcI,WAAaiP,GAAb,eAAAvY,EAAA,sEACyBF,KAAK0Y,eAAeD,GAD7C,WACQ5W,EADR,SAGsBA,EAASY,OAH/B,yCAIe,MAJf,gCAOWZ,EAAS,IAPpB,gDAdJ,sHA4BI,WAAiB8W,GAAjB,eAAAzY,EAAA,sEACyBF,KAAK0Y,eAAe,CAACC,IAD9C,WACQ9W,EADR,SAGsBA,EAASY,OAH/B,yCAIe,MAJf,gCAOWZ,EAAS,IAPpB,gDA5BJ,0HA0CI,WAAqB4W,GAArB,qBAAAvY,EAAA,sDAEI,IADI2C,EAAO,IAAI+V,SACNjW,EAAI,EAAGA,EAAI8V,EAAMhW,SAAUE,EAC5BgW,EAAOF,EAAM9V,GACjBE,EAAKwF,OAAO,QAASsQ,EAAMA,EAAK9S,MAJxC,gBAQuB7F,KAAKiH,IAAI9D,MAAT,UACZnD,KAAKwB,IADO,YAEf,SAACqX,GACG,IAAMC,EAAqBD,EAArBC,QAAYpM,EAAlB,aAA2BmM,EAA3B,IAKIE,EAAa,IAAIC,QAAQF,GAG7B,OAFAC,EAAWE,OAAO,gBAEX,2BACAvM,GADP,IAEIvE,OAAQ,OACR2Q,QAASC,EACT3Q,KAAMvF,OAvBtB,cAQQ2E,EARR,yBA2BWA,GA3BX,gDA1CJ,yHAwEI,WAAoB0R,EAAkBC,GAAtC,eAAAjZ,EAAA,sEACuBF,KAAKiH,IAAII,KAAT,UAAgCrH,KAAKwB,IAArC,mCAAmE8F,mBAAmB4R,IAAaC,GAD1H,cACQ3R,EADR,yBAEWA,GAFX,gDAxEJ,8HA6EI,WAAuB0R,EAAkBE,GAAzC,iBAAAlZ,EAAA,6DACQ2C,EAAO,IAAI+V,UACVvQ,OAAO,QAAS+Q,EAAMF,GAF/B,SAKuBlZ,KAAKiH,IAAI9D,MAAT,UACZnD,KAAKwB,IADO,YAEf,SAACqX,GACG,IAAMC,EAAqBD,EAArBC,QAAYpM,EAAlB,aAA2BmM,EAA3B,IAKIE,EAAa,IAAIC,QAAQF,GAG7B,OAFAC,EAAWE,OAAO,gBAEX,2BACAvM,GADP,IAEIvE,OAAQ,OACR2Q,QAASC,EACT3Q,KAAMvF,OApBtB,cAKQ2E,EALR,yBAwBWA,EAAO,IAxBlB,gDA7EJ,gECCa6R,GAAb,WAII,WAAYC,EAAad,GAAsB,yBAH/Cc,YAG8C,OAF9Cd,cAE8C,EAE1CxY,KAAKsZ,OAASA,EAEdtZ,KAAKwY,SAAL,OAAgBA,QAAhB,IAAgBA,IAAY,IAAIhP,IARxC,0CAYI,WAAU,IAAD,OACL,OAAOxJ,KAAKsZ,OAAOX,KACdY,MAAK,SAACZ,GAAD,OAAgB,IAAIa,SAAQ,SAACC,EAASC,GAIxC,OAHoB,IAAInB,GAAkBL,GAAkC,EAAKM,UAI5EmB,WAAWhB,GACXY,MAAK,SAAAH,GACEA,GAAQA,EAAK5X,IACbiY,EAAQ,CACJtP,QAASiP,EAAK5X,MAGlBkY,EAAO,oBAAD,OAAqBf,EAAK9S,oBA1B5D,KAqCO,SAAS+T,GAAiCC,GAC7CA,EAAOC,QAAQlS,IAAI,kBAAkBmS,oBAAsB,SAACT,GAExD,OAAO,IAAID,GAA2BC,IC5BvC,IAAMU,GAAa,SAACxO,GACvB,IAAQmD,EAA4BnD,EAA5BmD,MAAOC,EAAqBpD,EAArBoD,SAAUqL,EAAWzO,EAAXyO,OAKzB,EAAsB9V,YAAuB,kBAAM+V,KAAKC,aAAxD,mBAAOjQ,EAAP,KAAYkQ,EAAZ,KACMC,EAAelW,SAAA,OAAqBwK,QAArB,IAAqBA,IAAS,IAQnD,OAPAxK,aAAgB,WACRwK,IAAU0L,EAAaC,SAEvBF,EAAOF,KAAKC,aAEjB,CAACxL,EAAO0L,EAAcD,IAGrB,cAAC,YAAD,CAEIP,OAAQU,KACRC,OAAQ,CAAEC,aAAc,CAACb,KACzB/W,KAAM8L,EACNC,SAAU,SAAC8L,EAAYb,GACnB,IAAMhX,EAAOgX,EAAOc,UAGpBN,EAAaC,QAAUzX,EAEnB+L,GACAA,EAAS/L,IAGjBoX,OAAQ,SAACS,EAAYb,GACbI,GACAA,MAhBH/P,IC9BJ0Q,I,OAAsC,CAC/C/U,KAAM,cACN0H,KAAM,QACNsN,OAAQ,QACR5T,IAAK,8CACL6T,KAAM,CACF,0BCNKC,GAAmC,CAC5ClV,KAAM,WACN0H,KAAM,OACNsN,OAAQ,OACR5T,IAAK,eACL6T,KAAM,CACF,iBCNKE,GAAiC,CAC1CnV,KAAM,SACN0H,KAAM,QACNsN,OAAQ,QACR5T,IAAK,yCACL6T,KAAM,CACF,2BCNKG,GAAqC,CAC9CpV,KAAM,aACN0H,KAAM,OACNsN,OAAQ,OACR5T,IAAK,eACL6T,KAAM,CACF,SCNKI,GAAoC,CAC7CrV,KAAM,YACN0H,KAAM,QACNsN,OAAQ,QACR5T,IAAK,mCACL6T,KAAM,CACF,8BCNKK,GAAkC,CAC3CtV,KAAM,UACN0H,KAAM,OACNsN,OAAQ,QACR5T,IAAK,oCACL6T,KAAM,CACF,yCCNKM,GAAkC,CAC3CvV,KAAM,UACN0H,KAAM,QACNsN,OAAQ,OACR5T,IAAK,eACL6T,KAAM,CACF,SCNKO,GAAgC,CACzCxV,KAAM,QACN0H,KAAM,QACNsN,OAAQ,OACR5T,IAAK,oCACL6T,KAAM,CACF,gDACA,yBACA,0CACA,qBCTKQ,GAAkC,CAC3CzV,KAAM,UACN0H,KAAM,QACNsN,OAAQ,OACR5T,IAAK,iCACL6T,KAAM,CACF,mCACA,qBACA,sB,qBCEKS,GAAb,WAGI,aAAe,yBAFPC,gBAEM,EACVxb,KAAKwb,WAAa,CACdZ,GACAG,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAbZ,+CAqBI,SAAY9Z,GAAqC,IAAD,gBACrBxB,KAAKwb,YADgB,IAC5C,2BAAwC,CAAC,IAAD,EAA7B1T,EAA6B,sBACdA,EAASgT,MADK,IACpC,2BAAqC,CAAC,IAA3BW,EAA0B,QAC7BC,EAAS,IAAIC,OAAOF,GACxB,GAAIja,EAAIoa,MAAMF,GACV,OAAO5T,GAJqB,gCADI,8BAU5C,OAAO,OA/Bf,kEAsCI,WAAoBtG,GAApB,uBAAAtB,EAAA,yDAEU4H,EAAW9H,KAAK6b,YAAYra,GAFtC,uBAIQT,QAAQM,MAAR,4EAAmFG,IAJ3F,kBAKe,MALf,mBASgC,UAApBsG,EAAS+S,OATrB,iCAWmCiB,KAAW,GAAD,OAAIhU,EAASb,IAAb,4BAAoC8U,OAAOva,KAXxF,cAWkBK,EAXlB,iBAYiCA,EAASwB,OAZ1C,eAYkBmE,EAZlB,yBAamBA,GAbnB,yBAemCrE,MAAM,GAAD,OAAI2E,EAASb,IAAb,mBAA2B8U,OAAOjU,EAAS+S,QAA3C,gBAA0DkB,OAAOva,KAfzG,eAekBK,EAflB,iBAgBiCA,EAASwB,OAhB1C,eAgBkBmE,EAhBlB,yBAiBmBA,GAjBnB,iEAoBQzG,QAAQM,MAAR,gEApBR,kBAqBe,MArBf,0DAtCJ,8D,8CCVO,WAAqCgB,GAArC,2BAAAnC,EAAA,0DAEG8b,EAFH,uBAGuC,WAAlC3Z,EAAQ4Z,QAAQrV,cAA4B,CAACvE,GAAU,IAH5D,aAIIA,EAAQ6Z,qBAAqB,aAItBzZ,OARX,iDAaG0Z,EAAU,IAAIZ,GAbjB,cAcsBS,GAdtB,4DAcQI,EAdR,QAgBO5a,EAAM4a,EAAWC,aAAa,OAhBrC,yEAsBoBF,EAAQG,cAAc9a,GAtB1C,YAsBOqB,EAtBP,SAuBeA,EAAK0Z,KAvBpB,wDA4BCH,EAAWI,UAAY3Z,EAAK0Z,KA5B7B,wM,sBCMA,IAAME,GAAc,SAACjR,GACxB,IAAQ+Q,EAAS/Q,EAAT+Q,KAEFG,EAAavY,SAA6B,MAahD,OAVAA,aAAgB,WACZwY,YAAW,WACFD,EAAWpC,SDdrB,SAAP,4BCkBYsC,CAAsBF,EAAWpC,WAClC,OACJ,CAACiC,IAGA,qBAAKM,IAAKH,EAAY1W,UAAU,eAAe8W,wBAAyB,CAAEC,OAAM,OAAER,QAAF,IAAEA,IAAQ,OCjBrFS,GAAqB,SAACxR,GAAoC,IAAD,EAC1D9C,EAAU8C,EAAV9C,MAER,OACI,cAAC,GAAD,CAAa6T,KAAI,iBAAE7T,QAAF,IAAEA,OAAF,EAAEA,EAAO6T,YAAT,QAAiB,M,oCCG7BU,GAAkB,SAACzR,GAAiC,IAAD,MAExD9C,EAIA8C,EAJA9C,MADJ,GAKI8C,EAHAxF,UAGAwF,EAFA0R,iBAHJ,SAIOxQ,EAJP,aAKIlB,EALJ,IAOA,OACI,qBAAKxF,UAAU,+CAAf,SACI,mCACImX,IAAG,iBAAEzU,QAAF,IAAEA,GAAF,UAAEA,EAAO0U,0BAAT,aAAE,EAA2B5b,WAA7B,QAAoC,GACvC6b,OAAM,OAAE3U,QAAF,IAAEA,GAAF,UAAEA,EAAO4U,8BAAT,aAAE,EAA+B9b,IACvC0b,SAAUA,GACNxQ,O,UCpBP6Q,GAAmB,WAC5B,IAAQtY,EAAMC,cAAND,EAER,ECFG,WAAwH,IAAD,EAAjFf,EAAiF,uDAArD,GAErE,EAAkDsZ,aAC9CpF,aAD0D,2iBAoBxDD,GACAE,GACAC,IAEF,CACImF,UAAW,GAEXC,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA/BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAsCrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDnDyB2c,GAAtD,IAAQnb,KAAQob,EAAhB,EAAgBA,MAAOpG,EAAvB,EAAuBA,KAAgBqG,EAAvC,EAA+BlT,OAE/B,OACI,qBAAKhF,UAAU,qBAAf,SACI,eAACmY,GAAA,EAAD,CAAM/V,MAAI,EAACpC,UAAU,0BAArB,UACI,6BACKf,EAAE,2BAA4B,4BAGnC,cAAC,GAAD,CAAe+F,OAAQkT,IAEvB,cAAC,GAAD,CAAiBxV,MAAOuV,IACxB,cAAC,GAAD,CAAoBvV,MAAOmP,IAE3B,4BACI,cAAC,OAAD,CAAMvR,GAAG,SAAT,SACKrB,EAAE,+BAAgC,2B,mBEXpD,I,GAAMmZ,GAAyB,CAClCC,cAAc,EACdC,eAAgB,EAChBC,kBAAkB,EAClBC,wBAAwB,EACxBC,oBAAqB,EACrBC,kBAAkB,GCrBTC,GAAb,WAGI,WAAYC,GAAoC,yBAF/BA,qBAE8B,EAC3C5e,KAAK4e,gBAAL,OAAuBA,QAAvB,IAAuBA,IAAmBR,GAJlD,yCAWI,SAAMS,GACF,IAAIzb,GAAK,EACL4H,EAAwB,GAO5B,GALIhL,KAAK4e,gBAAgBN,eAAiBO,EAASpc,SAC/CW,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,yCAA0C,sDAAuD,CAAEqZ,eAAgBte,KAAK4e,gBAAgBN,mBAG3Jte,KAAK4e,gBAAgBH,oBAAsB,EAAG,CAE9C,IADA,IAAIM,EAAU9K,QACLtR,EAAI,EAAGA,EAAIkc,EAASpc,SAAUE,EAAG,CACtC,IAAIqc,EAAOH,EAASI,OAAOtc,GAC3B,IAA+B,IAA3Boc,EAAQG,QAAQF,KAChBD,EAAQ/c,KAAKgd,GAGTD,EAAQtc,OAASzC,KAAK4e,gBAAgBH,qBACtC,MAKRze,KAAK4e,gBAAgBH,oBAAsBM,EAAQtc,SACnDW,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,8CAA+C,kEAAmE,CAAEwZ,oBAAqBze,KAAK4e,gBAAgBH,wBAIrLze,KAAK4e,gBAAgBP,eACR,IAAI1C,OAAO,aACZwD,KAAKN,KACbzb,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,uCAAwC,4BAI/DjF,KAAK4e,gBAAgBL,mBACR,IAAI5C,OAAO,aACZwD,KAAKN,KACbzb,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,2CAA4C,sCAInEjF,KAAK4e,gBAAgBF,mBACR,IAAI/C,OAAO,aACZwD,KAAKN,KACbzb,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,2CAA4C,uCAInEjF,KAAK4e,gBAAgBJ,yBACR,IAAI7C,OAAO,oBACZwD,KAAKN,KACbzb,GAAK,EACL4H,EAAOhJ,KAAK8c,KAAK7Z,EAAE,iDAAkD,8CAK7E,IAAIma,EAA2B,GAK/B,OAJIpU,EAAOvI,SACP2c,EAAmBN,KAAK7Z,EAAE,sCAAuC,sBAAuB,CAAE+F,OAAQA,EAAOqU,KAAK,SAG3G,CAAEC,MAAOlc,EAAI4H,SAAQoU,wBA9EpC,KCMO,SAASG,KACZ,IAAIC,EAAqBrb,WAAc,kBAAM,IAAIwa,KAAsB,IAQvE,MAAO,CACHc,cARgBtb,eAAkB,SAAC0a,GACnC,OAAOW,EAAmBE,MAAMb,KACjC,CAACW,IAOAG,qBANuBxb,WAAc,WACrC,OCXD,SAAyCqb,GAC5C,MAA0CA,EAAmBE,MAAM,IAA3DJ,EAAR,EAAQA,MAAeM,EAAvB,EAAe5U,OACf,OAAIsU,EACO,GAGJR,KAAK7Z,EAAE,wDAAyD,kCAAmC,CAAE4a,aAAcD,EAAeP,KAAK,QDKnIS,CAAgCN,KACxC,CAACA,KEhBD,I,SAAMO,GAA0B3H,aAAH,6GCCvB4H,GAAqB5H,aAAH,uVAgBzB2H,IChBOE,GAAwB7H,aAAH,2eAsB5B4H,I,UCXC,I,GAAME,GAAiB,SAAC1U,GAC3B,IAAQ2U,EAAuD3U,EAAvD2U,QAASvR,EAA8CpD,EAA9CoD,SAAUwR,EAAoC5U,EAApC4U,UAAWC,EAAyB7U,EAAzB6U,WAAYC,EAAa9U,EAAb8U,SAClD,EAAqBnc,WAAuB+V,KAAKC,WAA1CoG,EAAP,oBAEA,OACI,eAAC9L,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAO3O,UAAS,UAAKma,EAAU,aAAe,GAA9B,SAAxB,SACKC,IAEL,cAAC1L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC8L,GAAA,EAAD,CAAaC,GAAIH,EAAY1a,KAAM0a,EAAYhT,KAAK,SAAS4S,QAASA,EAASvR,SAAU,SAAAd,GAAWc,GAAYA,EAASd,EAAEe,cAAcsR,UAAeG,SAAUA,MAEtK,cAAC5L,GAAA,EAAD,CAAK1O,UAAWma,EAAU,GAAK,aAA/B,SACKE,QCXJM,I,OAAc,SAACnV,GACxB,IACIoV,EAIApV,EAJAoV,MACAC,EAGArV,EAHAqV,WACArb,EAEAgG,EAFAhG,OAHJ,EAKIgG,EADAzE,aAJJ,MAIY,YAJZ,EAOA,OACI,qBAAKf,UAAU,eAAf,SAEQ4a,EAAMxe,KAAI,SAAA2N,GAAI,OACV,cAACjJ,EAAA,EAAD,CAAsBnB,KAAK,KAAKoB,MAAOA,EAAO+Z,SAAUD,EAAW9Q,EAAK2Q,IAAK1a,UAAU,oBAAoBkI,QAAS,kBAAM1I,EAAOuK,EAAK2Q,KAAtI,SACK3Q,EAAKlK,MADGkK,EAAK2Q,WCrB/B,SAASK,GACZC,EACAC,EACAC,EACAC,GAGA,MAA+Bhd,YAAwB,GAAvD,mBAAOid,EAAP,KAAiBC,EAAjB,KAGMC,EAAYnd,eAAkB,WAChC6c,EAAmB,CACfvD,UAAW,CAAE8D,OAAM,OAAEN,QAAF,IAAEA,IAAoB,GACzCO,YAAa,SAACC,EAAD,GAAkH,IAApEC,EAAmE,EAAnEA,gBACvD,OAAKA,GAKAP,EAAgBO,IACjBL,GAAW,GAIRH,EAAMO,EAAqBC,IATvBD,OAapB,CAACT,EAAoBC,EAAkBC,EAAOC,IAG3CQ,EAAUxd,eAAkB,kBAAMid,IAAU,CAACA,IAEnD,OAAOjd,WAAc,iBAAO,CACxBmd,UAAWA,EACXK,QAASA,KACT,CAACL,EAAWK,ICzCb,I,GAAMC,GAAwBxJ,aAAH,+NCiB3B,SAASyJ,KAA+F,IAAD,QAAlF3d,EAAkF,uDAAzC,GAEjE,EAAiFsZ,aAC7EpF,aADyF,+UAQvFwJ,IAEF,CAEInE,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,gBACzBC,QAAShe,EAAQge,SAErBxE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAtBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA6B9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,I,wBC5C5C,SAASU,KACZ,IAAQpd,EAAMC,cAAND,EAER,EC5BG,WAGH,MAAoCqd,aAChClK,aAD2C,iQAQrC6H,KARV,mBAAOsC,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IDKqBC,GAAjG,mBAAOC,EAAP,YAAwCC,EAAxC,EAA2B5X,YAA2C6X,EAAtE,EAA8D5X,OAC9D,EAAmCmK,GAAyB,KAAM,CAAEuL,GAAIxG,KAAKC,UAAW0I,UAAW,GAAIC,SAAU,GAAIC,iBAAkB,GAAIC,iBAAkB,SAAUC,+BAA+B,EAAOC,gCAAgC,EAAOC,8BAA8B,EAAOC,IAAK,GAAIC,SAAU,GAAIC,6BAA8B,KAAMC,eAAgBC,OAASC,gBAArW/a,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QAEvB,EAAqCoO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACVhB,UAAW,kBAAOna,EAAMma,UAAsF,GAA1E5d,EAAE,2CAA4C,2BAClF6d,SAAU,kBAAOpa,EAAMoa,SAAmF,GAAxE7d,EAAE,0CAA2C,0BAC/E8d,iBAAkB,kBAAOra,EAAMqa,iBAAmG,GAAhF9d,EAAE,0CAA2C,kCAC/F6e,iBAAkB,kBAAOpb,EAAMsa,iBAAmG,GAAhF/d,EAAE,0CAA2C,mCAInG0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAdJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAoBA,MAAO,CACHC,gBALoB/f,cAAA,uCAAkB,WAAOggB,GAAP,SAAAjkB,EAAA,sEAChCwiB,EAAiB,2BAAKha,GAAN,IAAayb,OAAQA,KADL,2CAAlB,sDAErB,CAACzB,EAAkBha,IAIlBia,qBAAsBA,EACtBC,sBAAuBA,EAEvBoB,SAAUA,EACVC,iBAAkBA,EAElBvb,MAAOA,EACP8M,OAAQA,EACRF,QAASA,GAQV,I,GAAM8O,GAAyB,SAAC5Y,GAAyE,IAAD,kBACnG9C,EAAyD8C,EAAzD9C,MAAO8M,EAAkDhK,EAAlDgK,OAAQwO,EAA0CxY,EAA1CwY,SAAUC,EAAgCzY,EAAhCyY,iBAAkB9X,EAAcX,EAAdW,SAC3ClH,EAAMC,cAAND,EAEeof,EAAqBxC,GAAY,CAAEK,QAAS,gBAA3Drf,KAAQ+d,MAGV0D,EAAwBngB,eAAkB,SAACuc,GAC7C,KAAI,OAAChY,QAAD,IAACA,OAAD,EAACA,EAAO4a,8BACR,OAAO,EAGX,IAAKe,EACD,OAAO,EAGX,IAAME,EAAgBtP,KAAKuP,MAAM9b,EAAM4a,8BAAgC,MACjEjd,EAAMge,EAAgBpY,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAOA,KACjD,QAAKra,KAIOke,EAActY,MAAK,SAAAC,GAAE,OAAIA,IAAO7F,EAAIR,UAEjD,CAAC6C,EAAO2b,IAGLI,EAAoBtgB,eAAkB,SAACuc,GACzC,GAAKhY,GAAU2b,EAAf,CAIA,IAAIE,EAAgBtP,KAAKuP,MAAM9b,EAAM4a,8BAAgC,MAC/Djd,EAAMge,EAAgBpY,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAOA,KACjD,IAAKra,EACD,OAAO,EAGX,IAAMqe,EAAWH,EAActY,MAAK,SAAAC,GAAE,OAAIA,IAAO7F,EAAIR,QAEjD0e,EADAG,EACgBH,EAAc/hB,QAAO,SAAA0J,GAAE,OAAIA,IAAO7F,EAAIR,QAEzC,uBAAO0e,GAAP,CAAsBle,EAAIR,OAG3C2P,EAAO,CAAE8N,6BAA8BrO,KAAKC,UAAUqP,QACvD,CAAC7b,EAAO8M,EAAQ6O,IAInB,OACI,qCACI,eAACM,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,2BAA4B,gBAC1D,cAAC,KAAD,CAAgBY,KAAK,YAAY0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMma,iBAAR,QAAqB,GAAIjU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqN,UAAW/U,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,cAAcC,iBAAkBA,EAAgB,eAElN,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,0BAA2B,eACxD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMoa,gBAAR,QAAoB,GAAIlU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEsN,SAAUhV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,cAE9M,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAAmC5f,EAAE,kCAAmC,gDACxE,eAAC,KAAD,CAAgBY,KAAK,kBAAkB0H,KAAK,SAASoB,MAAK,UAAEjG,EAAMsa,wBAAR,QAA4B,GAAIpU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEwN,iBAAkBlV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,qBAAqBC,iBAAkBA,EAAgB,iBAA3O,UACI,wBAAQtV,MAAM,SAAd,SAAwB1J,EAAE,iDAAkD,uBAC5E,wBAAQ0J,MAAM,MAAd,SAAqB1J,EAAE,8CAA+C,aACtE,wBAAQ0J,MAAM,QAAd,SAAuB1J,EAAE,gDAAiD,iBAGlF,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAEgC,YAAvB,OAALnc,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAAgC/d,EAAE,yCAA0C,UAC7C,SAAvB,OAALyD,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA6B/d,EAAE,sCAAuC,WAC7EA,EAAE,wCAAyC,kBAGzD,cAAC,KAAD,CAAgBY,KAAK,mBAAmB0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMqa,wBAAR,QAA4B,GAAInU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEuN,iBAAkBjV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,qBAAqBC,iBAAkBA,EAAgB,sBAG9O,eAAC,IAAD,CAAqBtd,OAAoC,YAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,mBAA6D,SAAvB,OAALta,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA5E,UACI,eAAC2B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,MAAf,SAAsB5f,EAAE,qBAAsB,2BAC9C,cAAC,KAAD,CAAgBY,KAAK,MAAM0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM0a,WAAR,QAAe,GAAIxU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4N,IAAKtV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,QAAQC,iBAAkBA,EAAgB,SAG1L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAAmC5f,EAAE,qBAAsB,mBAC3D,cAAC,GAAD,CAAa8B,MAAM,UACf6Z,MAAK,OAAEyD,QAAF,IAAEA,IAAmB,GAC1BxD,WAAY,SAAAH,GAAE,OAAI4D,EAAsB5D,IACxClb,OAAQ,SAACkb,GAAD,OAAQ+D,EAAkB/D,YAK9C,eAACiE,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,0BAA2B,0BACxD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM2a,gBAAR,QAAoB,GAAIzU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE6N,SAAUvV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,cAG7M9X,EAED,eAACwY,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,2CAA4C,sCAEjE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOua,qCAAT,SAAiDrU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEyN,8BAA+BtU,SAE5M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,gEAAiE,mJAKpF,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,6CAA8C,6CAEnE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOwa,sCAAT,SAAkDtU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE0N,+BAAgCvU,SAE9M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,4DAA6D,2IAMhF,eAAC,IAAD,CAAqB0B,OAAoC,WAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAApC,UACI,cAAC4B,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,8CAA+C,2HACpE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOya,oCAAT,SAAgDvU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE2N,6BAA8BxU,SAE1M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,kEAAmE,6P,6CE/MrF6f,GAAgB,SAACtZ,GAC1B,IACIxF,EAGYwF,EAHZxF,UACAmG,EAEYX,EAFZW,SAFJ,EAIgBX,EADZzE,aAHJ,MAGY,OAHZ,EAIO2F,EAJP,aAIgBlB,EAJhB,IAMA,OACI,cAACwD,EAAA,EAAD,yBAAWhJ,UAAS,wCAAmCe,EAAnC,mBAA4Cf,QAA5C,IAA4CA,IAAa,KAAU0G,GAAvF,aACKP,MCNA4Y,I,OAAS,SAACvZ,GACnB,IAAQW,EAA+BX,EAA/BW,SAAUnG,EAAqBwF,EAArBxF,UAAWiJ,EAAUzD,EAAVyD,MAE7B,OACI,qBAAKjJ,UAAS,wBAAYA,QAAZ,IAAYA,IAAa,IAAvC,SACI,cAACgJ,EAAA,EAAD,CAAWC,MAAOA,EAAlB,SACK9C,QCZV,I,SAAM6Y,GAA8B,WAAO,IAAD,QACrC/f,EAAMC,cAAND,EAER,ECOG,WAAsG,IAAD,EAAxEf,EAAwE,uDAA5C,GAE5D,EAAyBC,WAAc,WAAO,IAAD,QACnC8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAGnD,MAAO,CAAEiS,OAFG,oBAAGc,EAAOrd,IAAI,iBAAd,QAA2Bqd,EAAOrd,IAAI,iBAAtC,QAAmD,GAE9Csd,KADP,oBAAGD,EAAOrd,IAAI,eAAd,QAAyBqd,EAAOrd,IAAI,eAApC,QAA+C,MAE1D,IALKuc,EAAR,EAAQA,OAAQe,EAAhB,EAAgBA,KAQhB,EAAkD1H,aAC9CpF,aAD0D,4PAQxD6H,IAEF,CACIxC,UAAW,CACP0G,OAAQA,EACRe,KAAMA,GAEVxH,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAnBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA0BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDxDsB8jB,GAAnCzc,EAAhB,EAAQ7F,KAAQ6F,MAAiB0c,EAAjC,EAAyBpa,OAIzB,OACI,qCACI,cAAC,GAAD,CAAeA,OAAQoa,IAEvB,eAACT,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,wCAAyC,gBACvE,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,YAAY0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOma,iBAAT,QAAsB,GAAIwC,UAAQ,OAE/E,eAACV,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,uCAAwC,eACrE,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOoa,gBAAT,QAAqB,GAAIuC,UAAQ,OAE7E,eAACV,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oCAAqC,WAClE,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,WAAW0H,KAAK,QAAQoB,MAAK,iBAAEjG,QAAF,IAAEA,GAAF,UAAEA,EAAOtI,YAAT,aAAE,EAAa0F,aAAf,QAAwB,GAAIuf,UAAQ,WEpBhFC,GAAmC,CAC5C,CAAErV,KAAM,iBAAkBzD,UCWT,WAAO,IAAD,IACfvH,EAAMC,cAAND,EACR,EAAmFiG,KAAnEC,EAAhB,EAAQtI,KAAQsI,8BAAiCd,EAAjD,EAAiDA,UAAmB6T,EAApE,EAA4DlT,OAC5D,ECfG,WACH,IAAMjB,EAAiBH,IAGjBxC,EAAYjD,WAAc,WAAO,IAAD,IAC5B8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAEnD,OADe,oBAAG+S,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,KAEzE,IAEH,EAA0CiD,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEACpC6J,EAAe7C,kBAAkBwB,EAAOtB,GADJ,YACnDI,EADmD,QAI5C+d,oBAAqB/d,EAAOge,0BAJgB,yCAM5Che,GAN4C,gCAWhDA,GAXgD,2CAAD,sDAYvD,CAACuC,IAZJ,mBAAO7B,EAAP,YAcA,MAAO,CAACA,EAAQ,CAAE6C,YAdlB,EAAiBA,YAccC,OAd/B,EAA8BA,SDKqCya,GAAnE,mBAAO3T,EAAP,YAA6B4T,EAA7B,EAAgB3a,YAAkC4a,EAAlD,EAA0C3a,OAC1C,EAA6BM,KAAtBzD,EAAP,oBACA,EAAoE1D,YAAwB,GAA5F,mBAAOyhB,EAAP,KAAmCC,EAAnC,KACMvX,EAAUC,cAEhB,EAAwHlD,KAAxH,mBAAOya,EAAP,YAA+CC,EAA/C,EAAkChb,YAAmDib,EAArF,EAA6Ehb,OAC7E,EAAgE7G,YAAwB,GAAxF,mBAAO8hB,EAAP,KAAiCC,EAAjC,KAEA,EAA0B/Q,GAAuB,CAAErP,MAAO,GAAI+Y,SAAU,GAAIsH,YAAY,IAAhFzd,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAGTyP,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAC7C9K,EAAS,oBAAG6d,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,GAKxE,EAAqC8b,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACV/d,MAAO,kBAAO4C,EAAM5C,MAAwD,GAAhDb,EAAE,sBAAuB,sBACrD4Z,SAAU,kBAAOnW,EAAMmW,SAAiE,GAAtD5Z,EAAE,yBAA0B,0BAGlE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IAPJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAYA,EAA8D9f,YAAwB,GAAtF,mBAAOiiB,EAAP,KAAgCC,GAAhC,KACMC,GAAeniB,cAAA,sBAAkB,4BAAAjE,EAAA,yDAC9B8jB,IAD8B,iEAKhBlS,EAAMpJ,GALU,QAK/BlB,EAL+B,UAQ/Bqe,EAA8Bre,EAAOge,2BAEjChe,EAAO+d,mBACPjX,EAAQtM,KAAR,gDAAsDsF,mBAAmBE,EAAOJ,aAIhFI,EAAO+e,YAEF/e,EAAOge,2BAA8Bhe,EAAO+d,oBAC7Cc,IAA2B,GAC3B5c,OAAOtE,SAASyH,KAAOpF,EAAOJ,aAnBP,2CAuBpC,CAAC0K,EAAOpJ,EAAOmd,EAA+BvX,EAAS0V,EAAUqC,KAGpE,OACI,cAAC,GAAD,CAAmB3V,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BACKhK,EAAE,sBAAuB,aAE9B,eAACyhB,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCN,KAAvC,2CAAF,sDAAd,UACI,cAAC,GAAD,CAAe5S,QAAM,EAAC1I,OAAQ,CAACkT,EAAYyH,EAAaK,KAEpDJ,EACIK,EACI,eAACzR,GAAA,EAAD,CAAOzN,MAAM,UAAb,UACI,qCAAG9B,EAAE,uCAAwC,gHAA7C,OACA,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAwBpd,EAAM5C,OAArE,OAA6EogB,GAA4B,GAAzG,2CAAF,sDAC9Cnb,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,qBAI7B,eAACuP,GAAA,EAAD,CAAOzN,MAAM,UAAb,UACI,qCAAG9B,EAAE,oCAAqC,sFAA1C,OACA,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAwBpd,EAAM5C,OAArE,OAA6EogB,GAA4B,GAAzG,2CAAF,sDAC9Cnb,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,qBAGzC,KAER,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,cAAe,WACzC,cAAC,KAAD,CAAgBsI,KAAK,QAAQ1H,KAAK,QAAQihB,aAAa,WAAWnY,MAAOjG,EAAM5C,MAAO8I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE1P,MAAOgI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAErN,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,iBAAkB,cAC/C,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,WAAWihB,aAAa,mBAAmBnY,MAAOjG,EAAMmW,SAAUjQ,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqJ,SAAU/Q,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,cAE5O,cAACU,GAAA,EAAD,UACI,cAAClE,GAAA,EAAD,CAAaC,GAAG,aAAa7a,KAAK,aAAa0H,KAAK,SAASwZ,MAAO9hB,EAAE,mBAAoB,iCAAkCkb,QAASzX,EAAMyd,WAAYvX,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE2Q,WAAYrY,EAAEe,cAAcsR,eAG/M,cAAC,GAAD,UACI,eAAC1L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,OAAD,CAAMpO,GAAI,0BAAV,SACKrB,EAAE,2BAA4B,gCAGvC,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUgE,YAAa2a,GAAeU,EACnES,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,oBADrE,SAEKA,EAAE,eAAgB,oBAanC,8BAEQoF,EACI,cAAC,GAAD,IAEI,mCACI,8BAESc,GAC8C,IAAzCA,EAA8B1I,OAC5B,qCACI,6BAAKwC,EAAE,2BAA4B,2CAE/BkG,EAA8B/I,KAAI,SAAC2N,GAAD,OAC9B,cAAC,GAAD,CAAqCxC,KAAK,SAASzF,SAAUiI,EAAKlK,KAAM8R,oBAAqB5H,EAAKiX,YAAa9Y,QAAS,kBAAMrG,EAAmBkI,EAAKlK,KAAMuB,KAAlI2I,EAAKlK,YANlB,WAmB7D,6BACKZ,EAAE,wBAAyB,yBAEhC,4BACKA,EAAE,qBAAsB,6JAE7B,sBAAKe,UAAU,cAAf,UACI,cAAC,gBAAD,CAAeM,GAAG,oBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,uBAAwB,mBAGnC,yCACCA,EAAE,WAAY,MACf,yCACA,cAAC,gBAAD,CAAeqB,GAAG,SAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,oBAAqB,gCAOhD,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,aD5LhB,CAAEzE,KAAM,oBAAqBzD,UGYT,WAAO,IAAD,IAClBvH,EAAMC,cAAND,EACR,EAAmFiG,KAAnEC,EAAhB,EAAQtI,KAAQsI,8BAAiCd,EAAjD,EAAiDA,UAAmB6T,EAApE,EAA4DlT,OAC5D,EClBG,WACH,IAAMjB,EAAiBH,IAGjBxC,EAAYjD,WAAc,WAAO,IAAD,IAC5B8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAEnD,OADe,oBAAG+S,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,KAEzE,IAEH,EAA0CiD,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEACpC6J,EAAetC,SAASiB,EAAOtB,GADK,YACnDI,EADmD,QAI5C+d,oBAAqB/d,EAAOge,0BAJgB,yCAM5Che,GAN4C,gCAWhDA,GAXgD,2CAAD,sDAYvD,CAACuC,IAZJ,mBAAO7B,EAAP,YAcA,MAAO,CAACA,EAAQ,CAAE6C,YAdlB,EAAiBA,YAccC,OAd/B,EAA8BA,SDQ6Cic,GAA3E,mBAAOxf,EAAP,YAAgCyf,EAAhC,EAAmBnc,YAAoCoc,EAAvD,EAA+Cnc,OAC/C,EAA6BM,KAAtBzD,EAAP,oBACA,EAAoE1D,YAAwB,GAA5F,mBAAOyhB,EAAP,KAAmCC,EAAnC,KACA,EAAwHxa,KAAxH,mBAAOya,EAAP,YAA+CC,EAA/C,EAAkChb,YAAmDib,EAArF,EAA6Ehb,OACvEsD,EAAUC,cAEhB,EAAgDgR,KAAxCE,EAAR,EAAQA,cAAeE,EAAvB,EAAuBA,qBAEvB,EAA0BxK,GAA0B,CAAErP,MAAO,GAAI+Y,SAAU,GAAIuI,gBAAiB,KAAxF1e,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAET6R,EAA8BhF,KAG9B4C,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAC7C9K,EAAS,oBAAG6d,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,GAKxE,EAAqC8b,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACV/d,MAAO,kBAAO4C,EAAM5C,MAA2D,GAAnDb,EAAE,yBAA0B,sBACxD4Z,SAAU,kBAAOnW,EAAMmW,SACjBY,EAAc/W,EAAMmW,UAAUO,iBADFna,EAAE,4BAA6B,yBAEjEmiB,gBAAiB,kBAAM1e,EAAM0e,kBAAoB1e,EAAMmW,SAAW5Z,EAAE,+BAAgC,uDAAyD,KAGjK0e,EAAWI,WAAWF,EAAOD,GAG7BD,EAAW2D,YAAY,kBAAmBD,EAA4BrD,SAASJ,GAAgB,gDAChG,CAAClb,EAAO2e,EAA4BrD,WAZvC,mBAAOA,EAAP,KAAiBC,EAAjB,KAiBA,EAA8D9f,YAAwB,GAAtF,mBAAOiiB,EAAP,KAAgCC,GAAhC,KACMkB,GAAkBpjB,cAAA,sBAAkB,4BAAAjE,EAAA,yDACjC8jB,IADiC,iEAKjBvc,EAASiB,GALQ,YAKhClB,EALgC,gCAQlCqe,EAA8Bre,EAAOge,2BARH,SAW5B6B,EAA4BnD,gBAAgB1c,EAAO2c,QAXvB,wBAc5B2B,EAAwBpd,EAAM5C,OAdF,QAgB9B0B,EAAO+d,oBACPc,IAA2B,GAC3B/X,EAAQtM,KAAR,gDAAsDsF,mBAAmBE,EAAOJ,cAIhFI,EAAO+e,YAEF/e,EAAOge,2BAA8Bhe,EAAO+d,oBAC7Cc,IAA2B,GAC3B5c,OAAOtE,SAASyH,KAAOpF,EAAOJ,YA1BJ,4CA8BvC,CAACK,EAAUiB,EAAOmd,EAA+BvX,EAAS0V,EAAUqD,EAA6BhB,GAA4BP,IAGhI,OACI,cAAC,GAAD,CAAmBpV,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BACKhK,EAAE,qCAAsC,sBAE7C,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAK8R,GAAG,GAAR,SACI,eAACE,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCW,KAAvC,2CAAF,sDAAd,UACI,cAAC,GAAD,CAAe7T,QAAM,EAAC1I,OAAQ,CAACkT,EAAYiJ,EAAgBnB,EAA+BqB,EAA4BzE,yBAEtH,cAAC,IAAD,CAAqBjc,OAAQif,EAA7B,SACI,cAACpR,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACI,eAAC0N,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACKzP,EAAE,0CAA2C,yHAElD,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAwBpd,EAAM5C,OAArE,2CAAF,sDAC9CiF,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,2BAO7C,eAAC,GAAD,2BAA4BoiB,GAA5B,cACI,eAAC1C,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,iBAAkB,WAC5C,cAAC,KAAD,CAAgBsI,KAAK,QAAQ1H,KAAK,QAAQihB,aAAa,WAAWnY,MAAOjG,EAAM5C,MAAO8I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE1P,MAAOgI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAErN,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oBAAqB,cAClD,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,WAAWihB,aAAa,eAAenY,MAAOjG,EAAMmW,SAAUjQ,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqJ,SAAU/Q,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,WACpO,cAACuD,GAAA,EAAD,CAAUzgB,MAAM,QAAhB,SACK4Y,OAGT,eAACgF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,2BAA4B,sBAChE,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,kBAAkBihB,aAAa,eAAenY,MAAOjG,EAAM0e,gBAAiBxY,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4R,gBAAiBtZ,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,oBAAoBC,iBAAkBA,EAAgB,yBAOxQ,cAAC,IAAD,CAAqBtd,OAAQif,EAA7B,SACI,cAACpR,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACI,eAAC0N,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACKzP,EAAE,0CAA2C,yHAElD,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAwBpd,EAAM5C,OAArE,2CAAF,sDAC9CiF,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,2BAO7C,cAAC,GAAD,UACI,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,OAAD,CAAMpO,GAAE,mCAA8BgB,mBAAmBF,IAAzD,SACKnC,EAAE,iBAAkB,kDAG7B,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUuZ,SAAUsF,EACjD7a,YAAamc,GAAiBd,EAC9BS,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,uBAAwB,qBAF1E,SAGKA,EAAE,oBAAqB,0BAOhD,cAAC,IAAD,CAAqB0B,UAAS,OAACwE,QAAD,IAACA,OAAD,EAACA,EAA+B1I,QAA9D,SACI,cAACiS,GAAA,EAAD,CAAK8R,GAAI,EAAT,SAEQnc,EACI,cAAC,GAAD,IAEA,qCACI,6BAAKpF,EAAE,8BAA+B,4CACtC,8BAESkG,GAC8C,IAAzCA,EAA8B1I,OAC5B,mCAEQ0I,EAA8B/I,KAAI,SAAC2N,GAAD,OAC9B,8BACI,cAAC,GAAD,CAAqBjI,SAAUiI,EAAKlK,KAAM8R,oBAAqB5H,EAAKiX,YAAazZ,KAAK,SAASW,QAAS,kBAAMrG,EAAmBkI,EAAKlK,KAAMuB,OADtI2I,EAAKlK,WALF,sBAsBzE,cAAC6O,GAAA,EAAD,UACI,cAAC,GAAD,aH3MhB,CAAEzE,KAAM,yBAA0BzD,UKOD,WACjC,IAAQvH,EAAMC,cAAND,EACR,ECbG,WAAyH,IAA/Ef,EAA8E,uDAAlD,GACzE,EAAwBC,WAA4C,CAAEsjB,OAAQ,GAAIC,WAAW,EAAOC,cAAe,GAAIvgB,UAAW,KAAlI,mBAAOvE,EAAP,KAAa+kB,EAAb,KAEM7d,EAAiBH,IAGvB,EAAmCzF,WAAc,WAAO,IAAD,QAC7C8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAGnD,MAAO,CAAE9K,UAFM,oBAAG6d,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,GAEpDY,YADH,oBAAGyc,EAAOrd,IAAI,sBAAd,QAAgCqd,EAAOrd,IAAI,sBAA3C,QAA6D,MAE/E,IALKR,EAAR,EAAQA,UAAWoB,EAAnB,EAAmBA,YAOnB,EAAsDqC,YAAgB,sBAAC,4BAAA3K,EAAA,sEAChD6J,EAAexB,sBAAsBnB,EAAWoB,GADA,OAC/DhB,EAD+D,OAEnEogB,EAAQpgB,GAF2D,2CAGpE,CAACuC,EAAgB3C,EAAWoB,EAAaof,IAH5C,mBAAO9c,EAAP,YAA+BT,EAA/B,EAAkBU,YAAwBC,EAA1C,EAA0CA,OAa1C,OARA7G,aAAgB,WACPD,EAAQ+G,MACTH,MAEL,CAACA,EAAS5G,EAAQ+G,OAId,CACHpI,KAAMA,EACNiI,QAASA,EACTT,UAAWA,EACXW,OAAQA,GDjBqF6c,GAAjG,IAAQhlB,KAAQ6kB,EAAhB,EAAgBA,UAAWC,EAA3B,EAA2BA,cAAevgB,EAA1C,EAA0CA,UAAWqgB,EAArD,EAAqDA,OAAUpd,EAA/D,EAA+DA,UAAmB6T,EAAlF,EAA0ElT,OAC1E,EEdG,WACH,IAAMjB,EAAiBH,IAGjBxC,EAAYjD,WAAc,WAAO,IAAD,IAC5B8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAEnD,OADe,oBAAG+S,EAAOrd,IAAI,oBAAd,QAA8Bqd,EAAOrd,IAAI,oBAAzC,QAAyD,KAEzE,IAEH,EAA0CiD,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEACpC6J,EAAetB,8BAA8BC,EAAOtB,GADhB,cACnDI,EADmD,OAKvDiC,OAAOtE,SAASyH,KAAOpF,EAAOJ,UALyB,kBAOhDI,GAPgD,2CAAD,sDAQvD,CAACuC,IARJ,mBAAO7B,EAAP,YAUA,MAAO,CAACA,EAAQ,CAAE6C,YAVlB,EAAiBA,YAUcC,OAV/B,EAA8BA,SFI2D8c,GAAzF,mBAAOC,EAAP,YAAqCC,EAArC,EAAwBjd,YAAwCkd,EAAhE,EAAwDjd,OAElDqc,EAA8BhF,KAEpC,EAA0BlN,GAAuC,CAAErP,MAAO,KAAlE4C,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OACf,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACV/d,MAAO,kBAAO4C,EAAM5C,MAAwE,GAAhEb,EAAE,sCAAuC,uBAEzE0e,EAAWI,WAAWF,EAAOD,GAG7BD,EAAW2D,YAAY,kBAAmBD,EAA4BrD,SAASJ,GAAgB,iDAChG,CAAClb,IAZJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAiCA,OAlBA9f,aAAgB,WAEZ,GAAKujB,EAGE,CAEH,IAAIQ,EAAaT,EAAOxb,MAAK,SAAA8D,GAAI,OAAIA,EAAKxC,OAAS5D,KAC/Cue,GAAcA,EAAWvZ,OACzB6G,EAAO,CAAE1P,MAAOoiB,EAAWvZ,aAL/BlF,OAAOtE,SAASyH,KAAOxF,GAAa,MAQzC,CAACsgB,EAAWtgB,EAAWqgB,EAAQjS,IAM9BnL,IAAcqd,EAEV,qCACI,cAAC,GAAD,CAAehU,QAAM,EAAC1I,OAAQ,CAACkT,EAAY+J,KAC3C,cAAC,GAAD,OAOR,eAAC,GAAD,WACI,eAAC,GAAD,WACI,6BAAKhjB,EAAE,+CAAgD,+CAAgD,CAAE6S,QAAS6P,EAAeA,cAAeA,MAEhJ,mBAAG3hB,UAAU,YAAb,SACKf,EAAE,yCAA0C,wLAGrD,cAAC,GAAD,UACI,eAACyhB,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,eAAA5N,EAAA,yDACZ4N,EAAE8Y,iBACG5C,IAFO,iEAMS+D,EAAcrf,GANvB,YAMNlB,EANM,wCASF6f,EAA4BnD,gBAAgB1c,EAAO2c,QATjD,2CAAF,sDAAd,UAYI,cAAC,GAAD,CAAenZ,OAAQ,CAACkT,EAAY+J,KAGpC,cAAC,GAAD,eAA4BZ,IAE5B,eAAC1C,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,8BAA+B,WACzD,cAAC,KAAD,CAAgBsI,KAAK,QAAQ1H,KAAK,QAAQihB,aAAa,WAAWnY,MAAOjG,EAAM5C,MAAO8I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE1P,MAAOgI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAErN,cAAC,KAAD,CAAa1W,KAAK,SAASxG,MAAM,UAAUgE,YAAaid,EACpDnB,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,mCAAoC,qBADtF,SAEKA,EAAE,iCAAkC,wBL1FzD,CAAEgL,KAAM,0BAA2BzD,UQKT,WAC1B,IAAQvH,EAAMC,cAAND,EACR,EAAkCd,YAAwB,GAA1D,mBAAOgkB,EAAP,KAAkBC,EAAlB,KACA,ECfG,WACH,IAAMre,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO/E,GAAP,SAAA5F,EAAA,sEAC1C6J,EAAepB,uBAAuB7C,GADI,mFAAD,sDAEvD,CAACiE,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDY+Dqd,GAA7F,mBAAOC,EAAP,YAAsCC,EAAtC,EAAyBxd,YAA0Cyd,EAAnE,EAA2Dxd,OAE3D,EAA0BmK,GAAgC,CAAErP,MAAO,KAA3D4C,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAEf,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACV/d,MAAO,kBAAO4C,EAAM5C,MAAiE,GAAzDb,EAAE,+BAAgC,uBAGlE0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAVJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAcA,OACI,cAAC,GAAD,CAAmBvT,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BAAKhK,EAAE,uCAAwC,2BAC/C,4BACKA,EAAE,0BAA2B,4GAElC,eAACyhB,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,eAAA5N,EAAA,6DACZ4N,EAAE8Y,iBADU,SAEK0B,EAAe5f,EAAM5C,OAF1B,OAEN1C,EAFM,OAGZglB,EAAahlB,GAHD,2CAAF,sDAAd,UAMI,cAAC,GAAD,CAAesQ,QAAM,EAAC1I,OAAQwd,IAE1BL,EACI,cAAC3T,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACI,eAAC0N,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACKzP,EAAE,kCAAmC,yEAE1C,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUgE,YAAawd,EACpD1B,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBADnE,SAEKA,EAAE,qBAAsB,yBAKzC,KAER,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,uBAAwB,WAClD,cAAC,KAAD,CAAgBsI,KAAK,QAAQ1H,KAAK,QAAQihB,aAAa,WAAWnY,MAAOjG,EAAM5C,MAAO8I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE1P,MAAOgI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAGrN,cAAC,GAAD,UACI,eAACxP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUgE,YAAawd,EACpD1B,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,iBAAkB,iBADpE,SAEKA,EAAE,yBAA0B,yCAOjD,6BACKA,EAAE,wCAAyC,uCAEhD,4BACKA,EAAE,qCAAsC,oIAE7C,sBAAKe,UAAU,cAAf,UACI,cAAC,gBAAD,CAAeM,GAAG,wBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,iCAAkC,eAG7C,yCACCA,EAAE,uBAAwB,MAC3B,yCACA,cAAC,gBAAD,CAAeqB,GAAG,oBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,mCAAoC,2BAM3D,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,aRrGhB,CAAEzE,KAAM,yBAA0BzD,UUKT,WACzB,IAAQvH,EAAMC,cAAND,EACR,EAAgDd,YAAwB,GAAxE,mBAAOskB,EAAP,KAAyBC,EAAzB,KACA,ECfG,WACH,IAAM3e,EAAiBH,IAGvB,EAAyBzF,WAAc,WAAO,IAAD,QACnC8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAGnD,MAAO,CAAEiS,OAFG,oBAAGc,EAAOrd,IAAI,iBAAd,QAA2Bqd,EAAOrd,IAAI,iBAAtC,QAAmD,GAE9Csd,KADP,oBAAGD,EAAOrd,IAAI,eAAd,QAAyBqd,EAAOrd,IAAI,eAApC,QAA+C,MAE1D,IALKuc,EAAR,EAAQA,OAAQe,EAAhB,EAAgBA,KAOhB,EAA0Cra,YAAgB,uCAAC,WAAOgU,GAAP,SAAA3e,EAAA,sEAC1C6J,EAAenB,cAAc,CAAEub,OAAQA,EAAQe,KAAMA,EAAMrG,SAAUA,IAD3B,mFAAD,sDAEvD,CAAC9U,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDI6D2d,GAA3F,mBAAO/f,EAAP,YAAqCggB,EAArC,EAAwB7d,YAA0C8d,EAAlE,EAA0D7d,OAC1D,EAAgDuU,KAAxCE,EAAR,EAAQA,cAAeE,EAAvB,EAAuBA,qBAEvB,EAA0BxK,GAA+B,CAAE0J,SAAU,GAAIuI,gBAAiB,KAAlF1e,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OACf,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACVhF,SAAU,kBAAOnW,EAAMmW,SACjBY,EAAc/W,EAAMmW,UAAUO,iBADFna,EAAE,iCAAkC,yBAEtEmiB,gBAAiB,kBAAM1e,EAAM0e,kBAAoB1e,EAAMmW,SAAW5Z,EAAE,+BAAgC,uDAAyD,KAGjK0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAZJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAkBA,OAAKvb,EAKD,cAAC,GAAD,CAAmBgI,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BAAKhK,EAAE,qCAAsC,oBAC7C,4BACKA,EAAE,yCAA0C,wEAGjD,eAACyhB,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,eAAA5N,EAAA,yDACZ4N,EAAE8Y,iBACG5C,IAFO,iEAMKpb,EAAcF,EAAMmW,UANzB,OAMNzb,EANM,OAOZslB,EAAoBtlB,GAPR,2CAAF,sDAAd,UAUQylB,EACI,cAACrU,GAAA,EAAD,CAAOzN,MAAM,SAAb,SACK8hB,IAEL,KAGJJ,EACI,cAACjU,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACI,eAAC0N,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACKzP,EAAE,qCAAsC,mCAE7C,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,gBAAD,CAAerO,GAAG,wBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,gCAAiC,yCAMxD,KAGR,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,yBAA0B,cACvD,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,WAAWihB,aAAa,eAAenY,MAAOjG,EAAMmW,SAAUjQ,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqJ,SAAU/Q,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,WACpO,cAACuD,GAAA,EAAD,CAAUzgB,MAAM,QAAhB,SACK4Y,OAGT,eAACgF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,gCAAiC,sBACrE,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,kBAAkBihB,aAAa,eAAenY,MAAOjG,EAAM0e,gBAAiBxY,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4R,gBAAiBtZ,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,oBAAoBC,iBAAkBA,EAAgB,qBAEpQ,cAACU,GAAA,EAAD,UACI,cAAC,GAAD,UACI,eAAClQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SAEI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUgE,YAAa6d,EACpD/B,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,0BAA2B,4BAD7E,SAEKA,EAAE,sBAAuB,qCAS1D,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,WA9EJ,cAAC,GAAD,MV9BZ,CAAEzE,KAAM,wBAAyBzD,UYDT,WACxB,IAAQvH,EAAMC,cAAND,EACR,EAA4Cd,YAAwB,GAApE,mBAAO2kB,EAAP,KAAuBC,EAAvB,KACA,ECVG,WACH,IAAMhf,EAAiBH,IAGvB,EAAyBzF,WAAc,WAAO,IAAD,QACnC8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAGnD,MAAO,CAAEiS,OAFG,oBAAGc,EAAOrd,IAAI,iBAAd,QAA2Bqd,EAAOrd,IAAI,iBAAtC,QAAmD,GAE9Csd,KADP,oBAAGD,EAAOrd,IAAI,eAAd,QAAyBqd,EAAOrd,IAAI,eAApC,QAA+C,MAE1D,IALKuc,EAAR,EAAQA,OAAQe,EAAhB,EAAgBA,KAOhB,EAA0Cra,YAAgB,sBAAC,sBAAA3K,EAAA,sEAC1C6J,EAAelB,aAAa,CAAEsb,OAAQA,EAAQe,KAAMA,IADV,mFAExD,CAACnb,EAAgBoa,EAAQe,IAF5B,mBAAOhd,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDDyBge,GAAvD,mBAAOngB,EAAP,KAA+BogB,EAA/B,KAAuBje,OAcvB,OAXA7G,aAAgB,WACZ,sBAAC,4BAAAjE,EAAA,yDACQ4oB,EADR,gCAEwBjgB,IAFxB,OAEazF,EAFb,OAGO2lB,EAAkB3lB,GAHzB,0CAAD,KAMD,CAACyF,EAAckgB,EAAmBD,IAKjC,cAAC,GAAD,CAAmBpY,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BAEQga,EAAqBhkB,EAAE,0CAA2C,sDAC5D6jB,EAAiB7jB,EAAE,0CAA2C,oCACzD,cAAC,GAAD,MAInB,cAAC,IAAD,CAAqB0B,SAAUsiB,EAA/B,SACI,cAACzU,GAAA,EAAD,CAAOzN,MAAM,SAAb,SACKkiB,MAGT,eAAC,IAAD,CAAqBtiB,SAAUmiB,EAA/B,UAII,4BACK7jB,EAAE,qCAAsC,8EAE7C,cAAC,GAAD,UACI,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,gBAAD,CAAerO,GAAG,wBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,gCAAiC,iDASpE,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,aZzDhB,CAAEzE,KAAM,8BAA+BzD,UcFT,WAC9B,IAAQvH,EAAMC,cAAND,EACR,EAA4Cd,YAAwB,GAApE,mBAAO2kB,EAAP,KAAuBC,EAAvB,KACA,ECVG,WACH,IAAMhf,EAAiBH,IAGvB,EAAgCzF,WAAc,WAAO,IAAD,YAC1C8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAInD,MAAO,CAAEiS,OAHG,oBAAGc,EAAOrd,IAAI,iBAAd,QAA2Bqd,EAAOrd,IAAI,iBAAtC,QAAmD,GAG9Csd,KAFP,oBAAGD,EAAOrd,IAAI,eAAd,QAAyBqd,EAAOrd,IAAI,eAApC,QAA+C,GAElC9B,MADZ,oBAAGmf,EAAOrd,IAAI,gBAAd,QAA0Bqd,EAAOrd,IAAI,gBAArC,QAAiD,MAE7D,IANKuc,EAAR,EAAQA,OAAQe,EAAhB,EAAgBA,KAAMpf,EAAtB,EAAsBA,MAQtB,EAA0C+E,YAAgB,sBAAC,sBAAA3K,EAAA,sEAC1C6J,EAAejB,mBAAmB,CAAEqb,OAAQA,EAAQe,KAAMA,EAAMpf,MAAOA,IAD7B,mFAExD,CAACiE,EAAgBoa,EAAQe,EAAMpf,IAFlC,mBAAOoC,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDFyBke,GAAvD,mBAAOrgB,EAAP,KAA+BogB,EAA/B,KAAuBje,OAcvB,OAXA7G,aAAgB,WACZ,sBAAC,4BAAAjE,EAAA,yDACQ4oB,EADR,gCAEwBjgB,IAFxB,OAEazF,EAFb,OAGO2lB,EAAkB3lB,GAHzB,0CAAD,KAMD,CAACyF,EAAckgB,EAAmBD,IAKjC,cAAC,GAAD,CAAmBpY,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BAEQga,EAAqBhkB,EAAE,sDAAuD,gEACxE6jB,EAAiB7jB,EAAE,sDAAuD,kDACrE,cAAC,GAAD,MAInB,cAAC,IAAD,CAAqB0B,SAAUsiB,EAA/B,SACI,cAACzU,GAAA,EAAD,CAAOzN,MAAM,SAAb,SACKkiB,MAGT,eAAC,IAAD,CAAqBtiB,SAAUmiB,EAA/B,UAII,4BACK7jB,EAAE,2CAA4C,sFAEnD,cAAC,GAAD,UACI,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,gBAAD,CAAerO,GAAG,wBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,gCAAiC,+BASpE,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,adxDhB,CAAEzE,KAAM,yBAA0BzD,UgBGT,WACzB,IAAQvH,EAAMC,cAAND,EACR,ECdG,WACH,IAAM8E,EAAiBH,IAGvB,EAAyBzF,WAAc,WAAO,IAAD,QACnC8gB,EAAS,IAAIhT,gBAAgBxI,OAAOtE,SAAS+M,QAGnD,MAAO,CAAEiS,OAFG,oBAAGc,EAAOrd,IAAI,iBAAd,QAA2Bqd,EAAOrd,IAAI,iBAAtC,QAAmD,GAE9Csd,KADP,oBAAGD,EAAOrd,IAAI,eAAd,QAAyBqd,EAAOrd,IAAI,eAApC,QAA+C,MAE1D,IALKuc,EAAR,EAAQA,OAAQe,EAAhB,EAAgBA,KAOhB,EAA0Cra,YAAgB,uCAAC,WAAOnC,GAAP,SAAAxI,EAAA,sEAC1C6J,EAAeV,cAAc,CAAE8a,OAAQA,EAAQe,KAAMA,EAAMrG,SAAUnW,EAAMmW,WADjC,mFAAD,sDAEvD,CAAC9U,EAAgBoa,EAAQe,IAF5B,mBAAOhd,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDG4Dme,GAA1F,mBAAO9f,EAAP,YAAqC+f,EAArC,EAAwBre,YAAyCse,EAAjE,EAAyDre,OACzD,EAA0BmK,GAA+B,CAAE0J,SAAU,GAAIuI,gBAAiB,KAAlF1e,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OACf,EAAgD+J,KAAxCE,EAAR,EAAQA,cAAeE,EAAvB,EAAuBA,qBACjBrR,EAAUC,cAKhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhF,SAAU,kBAAOnW,EAAMmW,SACjBY,EAAc/W,EAAMmW,UAAUO,iBADFna,EAAE,iCAAkC,yBAEtEmiB,gBAAiB,kBAAM1e,EAAM0e,kBAAoB1e,EAAMmW,SAAW5Z,EAAE,oCAAqC,uDAAyD,KAGtK0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IARJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAaA,EAA8D9f,YAAwB,GAAtF,mBAAOiiB,EAAP,KAAgCC,EAAhC,KACMkB,EAAkBpjB,cAAA,sBAAkB,4BAAAjE,EAAA,yDACjC8jB,IADiC,iEAKjB3a,EAAcX,GALG,QAKhClB,EALgC,UAQ9BA,EAAO+d,mBACPjX,EAAQtM,KAAR,gDAAsDsF,mBAAmBE,EAAOJ,aAIhFI,EAAO+e,YAEF/e,EAAOge,2BAA8Bhe,EAAO+d,oBAC7Cc,GAA2B,GAC3B5c,OAAOtE,SAASyH,KAAOpF,EAAOJ,aAjBJ,2CAqBvC,CAACiC,EAAeX,EAAO4F,EAAS0V,EAAUqC,IAI7C,OACI,cAAC,GAAD,CAAmB3V,eAAe,aAAlC,SACI,eAAC+D,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGC,GAAI,EAAxB,SACI,eAAC,GAAD,CAAexX,OAAK,EAApB,UACI,6BACKhK,EAAE,0CAA2C,2BAElD,4BACKA,EAAE,mCAAoC,mGAG3C,eAACyhB,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCW,IAAvC,2CAAF,sDAAd,UACI,cAAC,GAAD,CAAe7T,QAAM,EAAC1I,OAAQ,CAACqe,KAE/B,cAAC,GAAD,IAEA,eAAC1E,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oBAAqB,cAClD,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,WAAWihB,aAAa,eAAenY,MAAOjG,EAAMmW,SAAUjQ,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqJ,SAAU/Q,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,WACpO,cAACuD,GAAA,EAAD,CAAUzgB,MAAM,QAAhB,SACK4Y,OAGT,eAACgF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,2BAA4B,sBAChE,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,kBAAkBihB,aAAa,eAAenY,MAAOjG,EAAM0e,gBAAiBxY,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4R,gBAAiBtZ,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,oBAAoBC,iBAAkBA,EAAgB,qBAIpQ,cAAC,GAAD,UACI,eAACxP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAUgE,YAAaqe,GAAsBhD,EAC1ES,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,4BAA6B,qBAD/E,SAEKA,EAAE,yBAA0B,qBAK7C,cAAC,GAAD,YAMZ,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,c,oBErGb,SAAS4U,GAAW5I,GAA6F,IAAD,EAA7Dxc,EAA6D,uDAAnC,GAEhF,EAAkDsZ,aAC9CpF,aAD0D,8NAQxD6H,IAEF,CACIxC,UAAW,CACPiD,GAAKxc,EAAQqlB,SAA8B,KAAvC,OAAoB7I,QAApB,IAAoBA,IAAMxG,KAAKsP,MACnCrF,OAAQjgB,EAAQqlB,SAAR,OAAmB7I,QAAnB,IAAmBA,IAAMxG,KAAKsP,MAAQ,MAElD9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAnBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA0BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IC5C1B,SAASooB,GACZC,EACAC,EACAzlB,GAKA,kBAAoEwlB,EAApE,GAAOE,EAAP,YAA8BC,EAA9B,EAAiB9e,YAAiC+e,EAAlD,EAA0C9e,OAC1C,cAAoE2e,EAApE,GAAOI,EAAP,YAA8BC,EAA9B,EAAiBjf,YAAiCkf,EAAlD,EAA0Cjf,OAC1C,EAA8DH,YAAgB,uCAAC,WAAO6V,EAASpL,EAAqB4U,GAArC,SAAAhqB,EAAA,yDAEvEgE,GAAWA,EAAQimB,cACnBjmB,EAAQimB,aAAazJ,EAAIpL,EAAS4U,IAIlCA,EAPuE,gCAQjEN,EAAOtU,GAR0D,6CAUjEyU,EAAOrJ,EAAIpL,GAVsD,OAcvEpR,GAAWA,EAAQkmB,aACnBlmB,EAAQkmB,YAAY1J,EAAIpL,EAAS4U,GAfsC,2CAAD,0DAiB3E,CAACN,EAAQG,EAAQ7lB,IAjBpB,mBAAOmmB,EAAP,YAA4BC,EAA5B,EAAevf,YAA+Bwf,EAA9C,EAAsCvf,OA2CtC,MAAO,CAACqf,EAAM,CAAEtf,YAAauf,GAAYT,GAAcG,EAAYhf,OAvBpD7G,WAAc,WACzB,IAAIkM,EAAM,GAWV,GAVIyZ,GACAzZ,EAAIrO,KAAK8nB,GAETG,GACA5Z,EAAIrO,KAAKioB,GAETM,GACAla,EAAIrO,KAAKuoB,GAGM,IAAfla,EAAI5N,OAIR,OAAmB,IAAf4N,EAAI5N,OACG4N,EAAI,GAGRA,IACR,CAACyZ,EAAcG,EAAcM,MCvD7B,SAASC,KACZ,MAAoClI,aAChClK,aAD2C,6PAQrC6H,KARV,mBAAOsC,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASiI,KACZ,MAAoCnI,aAChClK,aAD2C,6PAQrC6H,KARV,mBAAOsC,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICtBzE,SAASkI,KAA2E,IAApDxmB,EAAmD,uDAAJ,GAClF,EAAgCsmB,KAAhC,mBAAOG,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA6BiiB,EAAQjiB,KAA8B,CAACiiB,IAErG,EAAgCF,KAAhC,mBAAOI,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA2CuV,EAAQnK,EAAIpL,KAAgC,CAACuV,IAEzH,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GCGD,I,GAAM6mB,GAAiB,WAAO,IAAD,oBACxB9lB,EAAMC,cAAND,EACR,EAAgCd,YAAwB,GAAxD,mBAAO6mB,EAAP,KAAiBC,EAAjB,KACA,EAAgC9mB,YAAwB,GAAxD,mBAAO+lB,EAAP,KAAiBgB,EAAjB,KACQ9qB,EAAS6D,EAAsB,CAAES,aAAa,IAA9CtE,KACR,EAAiGkpB,GAAU,iBAAClpB,QAAD,IAACA,OAAD,EAACA,EAAM+qB,WAAP,QAAc,GAAI,CACzH5B,UAAU,EACVte,MAAM,EACN2S,YAAa,SAAC/a,GAEE,IAAD,EAANA,IACDqoB,GAAY,GACZ1V,EAAO,CAAEkL,GAAIxG,KAAKC,UAAWgK,OAAM,iBAAE/jB,QAAF,IAAEA,OAAF,EAAEA,EAAM+qB,WAAR,QAAe,SAPvCC,EAAvB,EAAQvoB,KAAQ6F,MAAsB2B,EAAtC,EAAsCA,UAAmB6T,EAAzD,EAAiDlT,OAA6BqgB,EAA9E,EAAqEvgB,QAUrE,EAAmCqK,GAAWiW,GAAtC1iB,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EAA8DoV,GAAuB,CAAEN,YAAa,kBAAMc,GAAY,MAAtH,mBAAOb,EAAP,YAA4BC,EAA5B,EAAevf,YAA+Bwf,EAA9C,EAAsCvf,OAEtC,EAAqC0Y,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACVhB,UAAW,kBAAOna,EAAMma,UAA8E,GAAlE5d,EAAE,mCAAoC,2BAC1E6d,SAAU,kBAAOpa,EAAMoa,SAA2E,GAAhE7d,EAAE,kCAAmC,0BACvE8d,iBAAkB,kBAAOra,EAAMqa,iBAA2F,GAAxE9d,EAAE,kCAAmC,kCACvF6e,iBAAkB,kBAAOpb,EAAMsa,iBAA2F,GAAxE/d,EAAE,kCAAmC,mCAI3F0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAdJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAiBA9f,aAAgB,WACP/D,GAILirB,MACD,CAACjrB,EAAMirB,IAGV,MAA4ClnB,YAAwB,GAApE,mBAAOmnB,EAAP,KAAuBC,EAAvB,KACA,GAA8CpnB,YAAwB,GAAtE,qBAAOqnB,GAAP,MAAwBC,GAAxB,MACA,GAA0DtnB,YAAwB,GAAlF,qBAAOunB,GAAP,MAA8BC,GAA9B,MACAxnB,aAAgB,YACPuE,GAAUgC,4BAAiB,OAAChC,QAAD,IAACA,OAAD,EAACA,EAAOgY,KAAOgL,KAI/CH,EAAkB7iB,EAAMua,+BACxBwI,GAAmB/iB,EAAMwa,gCACzByI,IAAyB,MAC1B,CAACjjB,EAAOgjB,GAAuBC,GAA0BJ,EAAmBE,KAE/E,OAAmB5gB,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC3B8jB,IAD2B,iEAK1BqG,EAAK3hB,EAAMgY,GAAIpL,EAAS4U,GALE,OAOhCe,GAAY,GAEZM,EAAkB7iB,EAAMua,+BACxBwI,GAAmB/iB,EAAMwa,gCAVO,2CAWjC,CAACmH,EAAMkB,EAAmBE,GAAoB/iB,EAAOuiB,EAAajH,EAAUkG,EAAU5U,IAXlFsW,GAAP,qBAkBA,OAAIvhB,GAAcjK,GAASsI,EAUvB,mCACI,eAACge,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCgF,KAAvC,2CAAF,sDAAd,UACI,cAAC,GAAD,CAAe5gB,OAAQ,CAACkT,EAAYqM,KAGhCS,EACI,cAACxW,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACK9B,EAAE,0BAA2B,qCAE/B,KAGX,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,2BAA4B,gBAC1D,cAAC,KAAD,CAAgBY,KAAK,YAAY0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMma,iBAAR,QAAqB,GAAIjU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqN,UAAW/U,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,cAAcC,iBAAkBA,EAAgB,iBAGtN,cAACvP,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,0BAA2B,eACxD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMoa,gBAAR,QAAoB,GAAIlU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEsN,SAAUhV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,mBAKtN,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAAmC5f,EAAE,kCAAmC,gDACxE,eAAC,KAAD,CAAgBY,KAAK,kBAAkB0H,KAAK,SAASoB,MAAK,UAAEjG,EAAMsa,wBAAR,QAA4B,GAAIpU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEwN,iBAAkBlV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,qBAAqBC,iBAAkBA,EAAgB,iBAA3O,UACI,wBAAQtV,MAAM,SAAd,SAAwB1J,EAAE,yCAA0C,uBACpE,wBAAQ0J,MAAM,MAAd,SAAqB1J,EAAE,sCAAuC,aAC9D,wBAAQ0J,MAAM,QAAd,SAAuB1J,EAAE,wCAAyC,iBAG1E,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAEoC,YAAvB,OAALnc,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAAgC/d,EAAE,yCAA0C,UACjD,SAAvB,OAALyD,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA6B/d,EAAE,sCAAuC,WACzEA,EAAE,wCAAyC,kBAG7D,cAAC,KAAD,CAAgBY,KAAK,mBAAmB0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMqa,wBAAR,QAA4B,GAAInU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEuN,iBAAkBjV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,qBAAqBC,iBAAkBA,EAAgB,sBAG9O,cAAC,IAAD,CAAqBtd,OAAoC,YAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,mBAA6D,SAAvB,OAALta,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA5E,SACI,eAAC2B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,MAAf,SAAsB5f,EAAE,qBAAsB,2BAC9C,cAAC,KAAD,CAAgBY,KAAK,MAAM0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM0a,WAAR,QAAe,GAAIxU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4N,IAAKtV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,QAAQC,iBAAkBA,EAAgB,WAI9L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,0BAA2B,0BACxD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM2a,gBAAR,QAAoB,GAAIzU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE6N,SAAUvV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,cAG9M,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,2CAA4C,sCAEjE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOua,qCAAT,SAAiDrU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEyN,8BAA+BtU,KACpM2R,SAAUgL,MAGlB,cAAC5W,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,wDAAyD,gJAIxE,cAAC,IAAD,CAAqB0B,OAAQ2kB,EAA7B,SACI,cAAC9D,GAAA,EAAD,UACKviB,EAAE,sCAAuC,iHAItD,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,6CAA8C,6CAEnE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOwa,sCAAT,SAAkDtU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE0N,+BAAgCvU,KACtM2R,SAAUkL,OAGlB,cAAC9W,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,oDAAqD,wIAIpE,cAAC,IAAD,CAAqB0B,OAAQ6kB,GAA7B,SACI,cAAChE,GAAA,EAAD,UACKviB,EAAE,sCAAuC,uHAKtD,eAAC,IAAD,CAAqB0B,OAAoC,WAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAApC,UACI,cAAC4B,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,8CAA+C,2HACpE,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOya,oCAAT,SAAgDvU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE2N,6BAA8BxU,SAE1M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,0DAA2D,yPAM9E,cAAC,GAAD,UACI,eAAC,KAAD,CAAa8B,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,qBA/HjC,qCACI,cAAC,GAAD,CAAe+F,OAAQ,CAACkT,EAAYqM,KACpC,cAAC,GAAD,QCtFHsB,GAAiB,WAC1B,IAAQ5mB,EAAMC,cAAND,EACR,EAAoDd,YAAwB,GAA5E,mBAAO2nB,EAAP,KAA2BC,EAA3B,KACA,ECZG,WACH,IAAMhiB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAOmhB,EAAyBC,GAAhC,SAAA/rB,EAAA,sEAC1C6J,EAAef,eAAe,CAAEgjB,gBAAiBA,EAAiBC,YAAaA,IADrC,mFAAD,wDAEvD,CAACliB,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SDS8DkhB,GAA5F,mBAAOljB,EAAP,YAAsCmjB,EAAtC,EAAyBphB,YAAyCqhB,EAAlE,EAA0DphB,OAC1D,EAAgDuU,KAAxCE,EAAR,EAAQA,cAAeE,EAAvB,EAAuBA,qBAEvB,EAA0BxK,GAAgC,CAAE6W,gBAAiB,GAAIC,YAAa,GAAI7E,gBAAiB,KAA3G1e,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OACf,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACVmI,gBAAiB,kBAAOtjB,EAAMsjB,gBAA8F,GAA5E/mB,EAAE,wCAAyC,iCAC3FgnB,YAAa,kBAAOvjB,EAAMujB,YACpBxM,EAAc/W,EAAMujB,aAAa7M,iBADCna,EAAE,qCAAsC,yBAEhFmiB,gBAAiB,kBAAM1e,EAAM0e,kBAAoB1e,EAAMujB,YAAchnB,EAAE,qCAAsC,uDAAyD,KAG1K0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAbJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAmBA,OAAKvb,EAKD,mCACI,eAACge,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,eAAA5N,EAAA,yDACZ4N,EAAE8Y,iBACG5C,IAFO,iEAMKhb,EAAeN,EAAMsjB,gBAAiBtjB,EAAMujB,aANjD,OAMN7oB,EANM,OAOZ2oB,EAAsB3oB,GAPV,2CAAF,sDAAd,UASI,cAAC,GAAD,CAAesQ,QAAM,EAAC1I,OAAQohB,IAG1BN,EACI,cAACtX,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACK9B,EAAE,wCAAyC,qCAEhD,KAGR,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,iCAAkC,sBACtE,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,kBAAkBihB,aAAa,mBAAmBnY,MAAOjG,EAAMsjB,gBAAiBpd,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEwW,gBAAiBle,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,oBAAoBC,iBAAkBA,EAAgB,qBAExQ,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,cAAf,SAA8B5f,EAAE,6BAA8B,kBAC9D,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,cAAcihB,aAAa,eAAenY,MAAOjG,EAAMujB,YAAard,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEyW,YAAane,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,gBAAgBC,iBAAkBA,EAAgB,cAChP,cAACuD,GAAA,EAAD,UACK7H,OAGT,eAACgF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,iCAAkC,sBACtE,cAAC,KAAD,CAAgBsI,KAAK,WAAW1H,KAAK,kBAAkBihB,aAAa,eAAenY,MAAOjG,EAAM0e,gBAAiBxY,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4R,gBAAiBtZ,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,oBAAoBC,iBAAkBA,EAAgB,qBAEpQ,cAACU,GAAA,EAAD,UACI,cAAC,KAAD,CAAapX,KAAK,SAASxG,MAAM,UAAUgE,YAAaohB,EACpDtF,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kCAAmC,2BADrF,SAEKA,EAAE,gCAAiC,4BA1C5C,cAAC,GAAD,KEzBT,I,GAAMonB,GAAc,WAAO,IAAD,IACrBpnB,EAAMC,cAAND,EACA7E,EAAS6D,EAAsB,CAAES,aAAa,IAA9CtE,KACR,ECPG,SAAiBsgB,GAA4F,IAAD,EAA5Dxc,EAA4D,uDAAhC,GAE/E,EAAkDsZ,aAC9CpF,aAD0D,wLAQxD4H,IAEF,CACIvC,UAAW,CAAEiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAC5B7L,aAAczZ,EAAQyZ,aACtBD,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpC0F,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAhBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAuBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,ID/B2DirB,CAAO,iBAAClsB,QAAD,IAACA,OAAD,EAACA,EAAM+qB,WAAP,QAAc,GAAI,CAAElgB,MAAM,IAAlGmgB,EAAvB,EAAQvoB,KAAQ6F,MAA8BwV,EAA9C,EAAsClT,OAA6BuhB,EAAnE,EAA0DzhB,QAE1D,EEhBG,WACH,IAAMf,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO2hB,GAAP,SAAAtsB,EAAA,sEAC1C6J,EAAed,YAAY,CAAEujB,SAAUA,IADG,mFAAD,sDAEvD,CAACziB,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SFawDyhB,GAAtF,mBAAOxjB,EAAP,YAAmCkjB,EAAnC,EAAsBphB,YAAyC2hB,EAA/D,EAAuD1hB,OACvD,EAAwC7G,YAAwB,GAAhE,mBAAOwoB,EAAP,KAAqBC,EAArB,KAEA,EAAwHvhB,KAAxH,mBAAOya,EAAP,YAA+CC,EAA/C,EAAkChb,YAAmDib,EAArF,EAA6Ehb,OAC7E,EAAgE7G,YAAwB,GAAxF,mBAAO8hB,EAAP,KAAiCC,EAAjC,KAEA,EAA0B/Q,GAA6B,CAAEqX,SAAQ,iBAAEpB,QAAF,IAAEA,OAAF,EAAEA,EAAYtlB,aAAd,QAAuB,KAAhF4C,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OACf,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,GAAKlb,EAAL,CAIA,IAAMmb,EAAQ,CACV2I,SAAU,kBAAO9jB,EAAM8jB,SACjBpB,GAAcA,EAAWtlB,QAAU4C,EAAM8jB,SAAWvnB,EAAE,sCAAuC,4GAC7F,GAF4BA,EAAE,+BAAgC,uBAKxE0e,EAAWI,WAAWF,EAAOD,MAC9B,CAAClb,IAZJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KA2BA,OAZA9f,aAAgB,WACP/D,GAILmsB,MACD,CAACnsB,EAAMmsB,IAML7jB,EAUD,mCACI,eAACge,GAAA,EAAD,CAAMC,SAAQ,uCAAE,WAAM7Y,GAAN,eAAA5N,EAAA,yDACZ4N,EAAE8Y,iBACG5C,IAFO,iEAMK/a,EAAYP,EAAM8jB,UANvB,OAMNppB,EANM,OAOZwpB,EAAgBxpB,GAPJ,2CAAF,sDAAd,UASI,cAAC,GAAD,CAAe4H,OAAQ0hB,IAGnBC,EACI,eAACnY,GAAA,EAAD,CAAOzN,MAAM,UAAb,UACI,qCAAG9B,EAAE,+BAAgC,gFAArC,OACA,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuC3d,EAAYP,EAAM8jB,UAAzD,2CAAF,sDAC9CzhB,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,qBAGjC,KAGJghB,EACI,eAACzR,GAAA,EAAD,CAAOzN,MAAM,UAAb,UACI,qCAAG9B,EAAE,uCAAwC,gHAA7C,OACA,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,eAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAuB,iBAACsF,QAAD,IAACA,OAAD,EAACA,EAAYtlB,aAAb,QAAsB4C,EAAM8jB,UAA1F,2CAAF,sDAC9CzhB,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,qBAGjC,KAGR,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oBAAqB,WAClD,cAAC,KAAD,CAAgBsI,KAAK,QAAQ1H,KAAK,WAAW8I,MAAOjG,EAAM8jB,SAAU5d,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEgX,SAAU1e,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,aAAaC,iBAAkBA,EAAgB,WAEjMmH,IAAeA,EAAWtC,gBAAkBpgB,EAAM8jB,WAAapB,EAAWtlB,MACtE,8BACI,cAAC,KAAD,CAAayH,KAAK,SAASxG,MAAM,OAAOmH,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCd,EAAwBpd,EAAM8jB,UAArE,OAAgFtG,GAA4B,GAA5G,2CAAF,sDAC3Cnb,YAAagb,EACbc,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,wBAAyB,yBAF1E,SAGKA,EAAE,sCAAuC,iCAG/C,QAIf,cAAC,GAAD,UACI,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUgE,YAAaohB,EACpDtF,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,4BAA6B,wBAD/E,SAEKA,EAAE,0BAA2B,yBAhE1C,qCACI,cAAC,GAAD,CAAeyO,QAAM,EAAC1I,OAAQ,CAACkT,EAAYwO,EAAmB1G,KAC9D,cAAC,GAAD,QG1DH6G,GAAmC,CAC5C,CAAE5c,KAAM,WAAYnD,OAAO,EAAMN,UCSd,WACnB,IAAQvH,EAAMC,cAAND,EACR,EAAkCd,WAAuB,WAAzD,mBAAO2oB,EAAP,KAAkBC,EAAlB,KAEA,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,6BAAK9nB,EAAE,mBAAoB,eAE/B,eAAC,GAAD,WACI,eAACmK,EAAA,EAAD,CAAK4d,MAAI,EAAT,UACI,cAACnmB,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAASlH,UAAyB,YAAd8mB,EAA0B,SAAW,GAAI5e,QAAS,SAAAJ,GAAC,OAAIif,EAAa,YAAxF,SACK9nB,EAAE,kBAAmB,eAG9B,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAASlH,UAAyB,UAAd8mB,EAAwB,SAAW,GAAI5e,QAAS,SAAAJ,GAAC,OAAIif,EAAa,UAAtF,SACK9nB,EAAE,sBAAuB,aAGlC,cAAC4B,EAAA,EAAD,UACI,cAACqG,EAAA,EAAD,CAASlH,UAAyB,aAAd8mB,EAA2B,SAAW,GAAI5e,QAAS,SAAAJ,GAAC,OAAIif,EAAa,aAAzF,SACK9nB,EAAE,yBAA0B,0BAIzC,eAACgoB,GAAA,EAAD,CAAYH,UAAWA,EAAvB,UACI,cAACI,GAAA,EAAD,CAASC,MAAO,UAAhB,SACI,cAAC,GAAD,MAEJ,cAACD,GAAA,EAAD,CAASC,MAAO,QAAhB,SACI,cAAC,GAAD,MAEJ,cAACD,GAAA,EAAD,CAASC,MAAO,WAAhB,SACI,cAAC,GAAD,gBD5CiCnd,WAAW,I,8BES7D,SAASod,KAAuF,IAAD,QAA1ElpB,EAA0E,uDAAzC,GAEzD,EAAiFsZ,aAC7EpF,aADyF,ueAmBzF,CAEIqF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,UAEnBtE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA7BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UAoC9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,I,aCzE5C,SAAS0L,GAAmBnb,GAC/B,IAAM/M,EAAWC,cACjB,OAAOjB,WAAc,wBAAM,IAAI8N,gBAAJ,iBAAoBC,QAApB,IAAoBA,IAApB,OAA8B/M,QAA9B,IAA8BA,OAA9B,EAA8BA,EAAU+M,cAAxC,QAAkD,MAAK,CAACA,EAAQ/M,ICDxF,SAASmoB,GAAgEhY,GAC5E,IAAMnQ,EAAWC,cACX6f,EAASoI,KACT/e,EAAUC,cAEV/M,EAAM2C,WAAc,WACtB,IAAK,IAAI+F,KAAOoL,EAAS,CAAC,IAAD,IAIjBiY,EAAY,UAAGjY,EAAQpL,UAAX,QAAmB,GAG/BqjB,KAFY,UAAGtI,EAAOrd,IAAIsC,UAAd,QAAsB,MAMjCqjB,EAGDtI,EAAOuI,IAAItjB,EAAKqjB,GAFhBtI,EAAOhM,OAAO/O,IAMtB,MAAM,GAAN,OAAU/E,EAASsB,SAAnB,YAA+Bwe,GAA/B,OAAwC9f,EAASsoB,QAClD,CAACnY,EAASnQ,EAAU8f,IAGvB9gB,aAAgB,WACP3C,GAIL8M,EAAQuE,QAAQrR,KACjB,CAACA,EAAK8M,I,cClCN,SAASof,KACZ,IAAMzI,EAASoI,KAYf,OAX6BlpB,WAAc,WACvC,IAAIkM,EAAM,GAOV,OANA4U,EAAO0I,SAAQ,SAAChf,EAAOzE,GACnBmG,EAAG,2BACIA,GADJ,mBAEEnG,EAAMyE,OAGR0B,IACR,CAAC4U,I,iBCFK2I,GAAiB,SAACpiB,GAC3B,IACIxF,EAIAwF,EAJAxF,UACAkM,EAGA1G,EAHA0G,OACA/F,EAEAX,EAFAW,SACA5F,EACAiF,EADAjF,KAGItB,EAAMC,cAAND,EAGR,OACI,sBAAKe,UAAS,2BAAsBkM,EAAS,0BAA4B,6BAA3D,mBAA2FlM,QAA3F,IAA2FA,IAAa,IAAtH,UACI,qBAAKA,UAAU,wBAAf,SACI,cAAC,IAAD,CAAiBO,KAAI,OAAEA,QAAF,IAAEA,IAAQ,CAAC,MAAO,aAGvC4F,GAEQ,4BAEQ+F,EACIjN,EAAE,uCAAwC,gDAAiD,CAAEiN,OAAQA,IACnGjN,EAAE,+BAAgC,sDC5B3D4oB,I,OAAkB,SAACriB,GAC5B,IAAQxF,EAAwBwF,EAAxBxF,UAAWmG,EAAaX,EAAbW,SAEnB,OACI,qBAAKnG,UAAS,mCAAuBA,QAAvB,IAAuBA,IAAa,IAAlD,SACKmG,MCKA2hB,I,OAAgB,SAACtiB,GAC1B,MAA8BrH,YAAwB,GAAtD,mBAAO4pB,EAAP,KAAgBC,EAAhB,KACQhoB,EAAwBwF,EAAxBxF,UAAWmG,EAAaX,EAAbW,SAEnB,OACI,qCACI,cAAC,KAAD,CAAU8hB,UAAU,OAAOC,mBAAoBzkB,OAAQ0kB,QAAS,kBAAMH,GAAW,IAAQI,QAAS,kBAAMJ,GAAW,MAEnH,cAAC,IAAD,CAAqBrnB,OAAQonB,EAA7B,SACI,qBAAK/nB,UAAS,0DAA8CA,QAA9C,IAA8CA,IAAa,IAAzE,SACI,cAACgJ,EAAA,EAAD,CAAWC,OAAK,EAAhB,SACK9C,QAMb,qBAAKnG,UAAS,uDAA2CA,QAA3C,IAA2CA,IAAa,IAAtE,SACKmG,SC5BV,SAASkiB,KACZ,IAAMC,ElHiEH,WACH,IAAQlqB,EAAoBH,IAApBG,gBACR,EAA8BkG,IAAZG,EAAlB,oBACMV,EAAiBH,IAEvB,EAAkBiB,YAAgB,sBAAC,sBAAA3K,EAAA,sEACzBsK,EAAwBpG,EAAiB2F,EAAgBU,GADhC,2CAEhC,CAACV,EAAgB3F,IAFb0G,EAAP,oBAIA,OAAO3G,eAAkB,WACrB2G,MACD,CAACA,IkH5E0ByjB,GAE9B,EAAoCjM,aAChClK,aAD2C,4QAQrC4H,IAEN,CACI+J,OAAQ,kBAAMuE,OAXtB,mBAAO/L,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAgBzB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICLzE,I,GAAMgM,GAAa,kBAAO,cAAC,GAAD,CAAUtE,UAAU,KAKxCuE,GAAW,SAACjjB,GAA0B,IAAD,4BACtC0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAmFqkB,GADpEoF,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAgCimB,EAAhD,EAAqCtkB,UAA+B6T,EAApE,EAA4DlT,OAC5D,EC5BG,WAA8G,IAAD,EAA3E9G,EAA2E,uDAAjD,GAE/D,EAAkDsZ,aAC9CpF,aAD0D,iLAS1D,CACIqF,UAAW,GAEXC,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAhBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAuBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDV0EutB,GAAvFC,EAAhB,EAAQhsB,KAAQgsB,WAAyBC,EAAzC,EAA8BzkB,UAA4C0kB,EAA1E,EAAkE/jB,OAC5DX,EAAYskB,GAAcG,EAChC,EAAmC3Z,GAAWiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAW0I,UAAW,GAAIC,SAAU,GAAIC,iBAAkB,GAAIC,iBAAkB,SAAUC,+BAA+B,EAAOC,gCAAgC,EAAOC,8BAA8B,EAAOC,IAAK,GAAIC,SAAU,GAAIC,6BAA8B,GAAIC,eAAgBC,OAASC,oBAAkBxjB,GAAxXyI,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EAAsDH,GAAU,OAACiW,QAAD,IAACA,OAAD,EAACA,EAAYhrB,MAA9D4uB,EAAf,EAAQtmB,MAA0BumB,EAAlC,EAA0BzZ,OAC1B,EAAgEL,GAA2B,CAAEuL,GAAE,iBAAE0K,QAAF,IAAEA,GAAF,UAAEA,EAAYhrB,YAAd,iBAAE,EAAkB8uB,iBAApB,aAAE,EAA6BxO,UAA/B,QAAqC,IAAMwJ,EAAU,CAAExJ,GAAI,sBAAkBzgB,GAA7JkvB,EAAf,EAAQzmB,MAA+B0mB,EAAvC,EAA+B5Z,OAC/B,EAAuCkV,KAAvC,mBAAOL,EAAP,KAAuBE,EAAvB,KAAevf,OACf,EE1CG,WACH,IAAMjB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEACpC6J,EAAeZ,OAAOT,GADc,cACnDlB,EADmD,yBAEhDA,GAFgD,2CAAD,sDAGvD,CAACuC,IAHJ,mBAAO7B,EAAP,YAKA,MAAO,CAACA,EAAQ,CAAE6C,YALlB,EAAiBA,YAKcC,OAL/B,EAA8BA,SFuCaqkB,GAA3C,oBAAOlmB,GAAP,MAAyBmmB,GAAzB,MAAiBtkB,OACjB,GG5CG,WACH,IAAMjB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO/E,GAAP,SAAA5F,EAAA,sEAC1C6J,EAAeX,kBAAkBtD,GADS,mFAAD,sDAEvD,CAACiE,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SHyCwEukB,GAAtG,qBAAOnmB,GAAP,eAAyComB,GAAzC,GAA4BzkB,YAA6C0kB,GAAzE,GAAiEzkB,OACjE,GAAwD7G,YAAwB,GAAhF,qBAAOurB,GAAP,MAA6BC,GAA7B,MACA,GI9CG,WACH,IAAM5lB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAO+kB,EAAsBpD,GAA7B,SAAAtsB,EAAA,sEAC1C6J,EAAeT,mBAAmB,CAAEsmB,aAAcA,EAAepD,SAAUA,IADjC,mFAAD,wDAEvD,CAACziB,IAFJ,mBAAO7B,EAAP,YAIA,MAAO,CAACA,EAAQ,CAAE6C,YAJlB,EAAiBA,YAIcC,OAJ/B,EAA8BA,SJ2C8B6kB,GAA5D,qBAAOvmB,GAAP,MAAqCojB,GAArC,MAA6B1hB,OAC7B,GAAmFqjB,KAAnF,qBAAOyB,GAAP,MAA6CC,GAA7C,MAAqC/kB,OAC/BsD,GAAUC,cAEhB,GAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhB,UAAW,kBAAM,OAACna,QAAD,IAACA,OAAD,EAACA,EAAOma,WAAwE,GAA5D5d,EAAE,6BAA8B,2BACrE6d,SAAU,kBAAM,OAACpa,QAAD,IAACA,OAAD,EAACA,EAAOoa,UAAqE,GAA1D7d,EAAE,4BAA6B,0BAClEa,MAAO,kBAAM,OAACkpB,QAAD,IAACA,OAAD,EAACA,EAAWlpB,OAA2D,GAAnDb,EAAE,yBAA0B,uBAGjE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,EAAOsmB,IARX,qBAAOhL,GAAP,MAAiBC,GAAjB,MAUA,GAAsEpZ,YAAgB,sBAAC,gCAAA3K,EAAA,yDAC9E8jB,KAD8E,oDAM/EG,EAASzb,EAAMyb,QACf+F,EAP+E,iCAU1D/gB,GAAO,2BAAK6lB,GAAN,IAAiBgB,WAAW,KAVwB,OAUzExoB,EAVyE,OAW/E2c,EAAS3c,EAAO2c,OAChB8K,EAAgB,CAAEvO,GAAIyD,IACtB3O,EAAO,CAAE2O,OAAQA,IAb8D,yBAgB7EkG,EAAK3hB,EAAMgY,GAAP,YAAC,eAAepL,GAAhB,IAAyB6O,OAAQA,MAAY+F,GAhB4B,YAmB/EA,EAnB+E,kCAoBzE9gB,GAAkB4lB,EAAUlpB,OApB6C,WAwB9EokB,IAAYkB,GAAcA,EAAWhrB,KAAK0F,QAAUkpB,EAAUlpB,MAxBgB,kCAyBzEwD,GAAmB8hB,EAAWhrB,KAAK0F,MAAOkpB,EAAUlpB,OAzBqB,YA6B/EokB,IAAsB,OAAVkB,QAAU,IAAVA,GAAA,UAAAA,EAAYhrB,KAAK8uB,iBAAjB,eAA4BxO,MAAOyO,EAAezO,GA7BiB,kCA8BzEoP,GAA2B,CAAE3L,OAAQA,EAAQ8L,YAAad,EAAezO,KA9BA,QAiCnFpS,GAAQ4hB,SAjC2E,4CAkCpF,CAAClM,GAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,GAAS0gB,EAAW7lB,GAAQ8lB,EAAiBzZ,EAAQlM,GAAoBF,KAlCvH,qBAAOwiB,GAAP,eAAgCtB,GAAhC,GAAmBvf,YAA+BolB,GAAlD,GAA0CnlB,OAoC1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,yBAA0B,cAE3B,mCAAGA,EAAE,uBAAwB,mBAKjD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY6Q,EAA0BoB,GAAgB5F,EAAY+E,GAAcG,GAAyB/C,GAAmBqD,MAGhJL,GACI,eAAClb,GAAA,EAAD,CAAOzN,MAAM,UAAb,UACI,qCAAG9B,EAAE,0CAA2C,qGAAhD,OACA,cAAC,KAAD,CAAasI,KAAK,SAASxG,MAAM,UAAUmH,QAAO,uCAAE,WAAMJ,GAAN,iBAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCxd,GAAiB,iBAACgiB,QAAD,IAACA,GAAD,UAACA,EAAYhrB,YAAb,aAAC,EAAkB0F,aAAnB,QAA4BkpB,EAAUlpB,OAA9F,2CAAF,sDAC9CiF,YAAaykB,GACb3I,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,iBAAkB,iBAFnE,SAGKA,EAAE,qBAAsB,qBAGjC,KAGR,eAACyhB,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,MAA3C,UACI,eAACnX,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,qBAAsB,gBACpD,cAAC,KAAD,CAAgBY,KAAK,YAAY0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMma,iBAAR,QAAqB,GAAIjU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEqN,UAAW/U,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,cAAcC,iBAAkBA,GAAgB,iBAGtN,cAACvP,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oBAAqB,eAClD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMoa,gBAAR,QAAoB,GAAIlU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEsN,SAAUhV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,aAAaC,iBAAkBA,GAAgB,mBAItN,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,iBAAkB,WAC5C,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,KAAD,CAAgB7O,KAAK,QAAQ0H,KAAK,QAAQoB,MAAK,UAAEqgB,EAAUlpB,aAAZ,QAAqB,GAAI8I,SAAU,SAAAd,GAAC,OAAImhB,EAAgB,CAAEnpB,MAAOgI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,UAAUC,iBAAkBA,GAAgB,UAG5MmH,IAAeA,EAAWhrB,KAAK0oB,gBAAkBkG,EAAUlpB,QAAUslB,EAAWhrB,KAAK0F,MACjF,cAAC4O,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAAC,KAAD,CAAapH,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAO,uCAAE,WAAMJ,GAAN,SAAA5N,EAAA,6DAAa4N,EAAE8Y,iBAAf,SAAuCxd,GAAkB4lB,EAAUlpB,OAAnE,OAA2E6pB,IAAwB,GAAnG,2CAAF,sDAC1D5kB,YAAaykB,GACT3I,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAQV,EAAE,wBAAyB,0BAF1E,UAGI,cAAC,IAAD,CAAiBsB,KAAK,aACtB,yCAAItB,EAAE,wBAAyB,yBAGxC,QAIPmmB,IAAeA,EAAWhrB,KAAK0oB,gBAAkBkG,EAAUlpB,QAAUslB,EAAWhrB,KAAK0F,MACjF,cAAC0hB,GAAA,EAAD,UACKviB,EAAE,oCAAqC,0GAE5CmmB,IAAeA,EAAWhrB,KAAK0oB,gBAAkBkG,EAAUlpB,QAAUslB,EAAWhrB,KAAK0F,MACjF,cAAC0hB,GAAA,EAAD,UACKviB,EAAE,mDAAoD,8GAE3DmmB,GAAcA,EAAWhrB,KAAK0oB,gBAAkBkG,EAAUlpB,QAAUslB,EAAWhrB,KAAK0F,MACpF,cAAC0hB,GAAA,EAAD,CAAUzgB,MAAM,UAAhB,SACK9B,EAAE,mDAAoD,yKAEvDmmB,GAAcA,EAAWhrB,KAAK0oB,gBAAkBkG,EAAUlpB,QAAUslB,EAAWhrB,KAAK0F,MACpF,cAAC0hB,GAAA,EAAD,UACKviB,EAAE,mDAAoD,8GAE5D,QAInB,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,qBAAsB,oBACpD,cAAC,KAAD,CAAgBY,KAAK,YAAY0H,KAAK,SAASoB,MAAK,iBAAEwgB,QAAF,IAAEA,OAAF,EAAEA,EAAgBzO,UAAlB,QAAwB,GAAI9R,SAAU,SAAAd,GAAC,OAAIshB,EAAqB,CAAE1O,GAAI5S,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,cAAcC,iBAAkBA,GAAgB,UAA1N,gBAEQ4K,QAFR,IAEQA,OAFR,EAEQA,EAAYzsB,KAAI,SAAA2N,GAAI,OAChB,wBAAsBpB,MAAOoB,EAAK2Q,GAAlC,SAAuC3Q,EAAKlK,MAA/BkK,EAAK2Q,YAMlC,eAAC,IAAD,CAAqB/Z,OAA+B,mBAAT,OAAdwoB,QAAc,IAAdA,OAAA,EAAAA,EAAgBzO,IAA7C,UACI,eAACiE,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAAmC5f,EAAE,4BAA6B,gDAClE,eAAC,KAAD,CAAgBY,KAAK,kBAAkB0H,KAAK,SAASoB,MAAK,UAAEjG,EAAMsa,wBAAR,QAA4B,GAAIpU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEwN,iBAAkBlV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,qBAAqBC,iBAAkBA,GAAgB,iBAA3O,UACI,wBAAQtV,MAAM,SAAd,SAAwB1J,EAAE,mCAAoC,uBAC9D,wBAAQ0J,MAAM,MAAd,SAAqB1J,EAAE,gCAAiC,aACxD,wBAAQ0J,MAAM,QAAd,SAAuB1J,EAAE,kCAAmC,iBAGpE,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,mBAAf,SAEoC,YAAvB,OAALnc,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAAgC/d,EAAE,mCAAoC,UAC3C,SAAvB,OAALyD,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA6B/d,EAAE,gCAAiC,WACnEA,EAAE,kCAAmC,kBAGvD,cAAC,KAAD,CAAgBY,KAAK,mBAAmB0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAMqa,wBAAR,QAA4B,GAAInU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEuN,iBAAkBjV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,qBAAqBC,iBAAkBA,GAAgB,sBAG9O,cAAC,IAAD,CAAqBtd,OAAoC,YAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,mBAA6D,SAAvB,OAALta,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAA5E,SACI,eAAC2B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,MAAf,SAAsB5f,EAAE,eAAgB,2BACxC,cAAC,KAAD,CAAgBY,KAAK,MAAM0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM0a,WAAR,QAAe,GAAIxU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE4N,IAAKtV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,QAAQC,iBAAkBA,GAAgB,WAI9L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,oBAAqB,0BAClD,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,UAAEjG,EAAM2a,gBAAR,QAAoB,GAAIzU,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE6N,SAAUvV,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,aAAaC,iBAAkBA,GAAgB,cAG9M,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,qCAAsC,sCAE3D,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOua,qCAAT,SAAiDrU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEyN,8BAA+BtU,SAE5M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,kDAAmD,mJAKtE,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,uCAAwC,6CAE7D,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOwa,sCAAT,SAAkDtU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE0N,+BAAgCvU,SAE9M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,8CAA+C,2IAMlE,eAAC,IAAD,CAAqB0B,OAAoC,WAAvB,OAAL+B,QAAK,IAALA,OAAA,EAAAA,EAAOsa,kBAApC,UACI,cAAC4B,GAAA,EAAD,CAAOC,QAAQ,GAAf,SAAmB5f,EAAE,wCAAyC,2HAC9D,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAgByL,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OAAQkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOya,oCAAT,SAAgDvU,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE2N,6BAA8BxU,SAE1M,cAAC+F,GAAA,EAAD,UACI,qBAAK1O,UAAU,GAAf,SACKf,EAAE,oDAAqD,4PAQ5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqB0B,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,GACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,GAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBKjRzC,IAAMmrB,GAAa,WAAO,IAAD,QACpBnrB,EAAMC,cAAND,EAER,EAA2DqkB,GAD5CoF,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,ECfG,WACH,MAAoCsX,aAChClK,aAD2C,oOAQrC6H,KARV,mBAAOsC,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IDNjC6N,GAA3C,mBAAOC,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACjB,EElBG,WACH,IAAMjB,EAAiBH,IAEvB,EAA0CiB,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEACpC6J,EAAeR,QAAQb,GADa,cACnDlB,EADmD,yBAEhDA,GAFgD,2CAAD,sDAGvD,CAACuC,IAHJ,mBAAO7B,EAAP,YAKA,MAAO,CAACA,EAAQ,CAAE6C,YALlB,EAAiBA,YAKcC,OAL/B,EAA8BA,SFeewlB,GAA7C,mBAAOjnB,EAAP,KAA0BknB,EAA1B,KAAkBzlB,OACZsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,GAAUA,EAAMtI,KAD4E,iEAK3FkwB,EAAO5nB,EAAMgY,IAL8E,uBAM3FnX,EAAQ,CAAEzD,MAAO4C,EAAMtI,KAAK0F,QAN+D,OAQjGwI,EAAQ4hB,SARyF,2CASlG,CAAC3mB,EAASb,EAAO4F,IATpB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,qBAAsB,kDAEjC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,EAAcE,KAEpE,eAAC/J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAACjc,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,uBAAwB,gBACtD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,YAAY0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOma,iBAAT,QAAsB,UAG1F,cAACnO,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,sBAAuB,eACpD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,WAAW0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOoa,gBAAT,QAAqB,aAI5F,eAAC6B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,mBAAoB,WAC9C,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,WAAW0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,GAAF,UAAEA,EAAOtI,YAAT,aAAE,EAAa0F,aAAf,QAAwB,QAGvF,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBa,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBGhFnC6rB,GAAgC,CACzC,CAAE7gB,KAAM,uCAAwCnD,OAAO,EAAMN,UCgB1B,WAAO,IAAD,EACjCvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EAA4F5D,GAAY,CAAEpL,cAAU/hB,IAA7FgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAAqCuP,cAArC,mBAAOC,EAAP,KAAmBC,EAAnB,KACM9iB,EAAUC,cAGVqS,EAAQzc,WAAc,WAExB,IAAIkM,GAAM,OAAC4gB,QAAD,IAACA,IAAY,IAClBzuB,QAAO,SAAAuN,GAAI,cAAiC,mBAA7B,UAAAA,EAAK3P,YAAL,mBAAW8uB,iBAAX,eAAsBxO,OAE1C,IAAKuQ,IAAa/e,EACd,OAAO7B,EAGX,IAAIghB,EAAcnf,EAAOof,oBAGzB,OAAOjhB,EAAI7N,QAAO,SAAAuN,GAAI,qBAClBA,EAAK8S,UAAUyO,oBAAoBpS,QAAQmS,IAAgB,GACxDthB,EAAK+S,SAASwO,oBAAoBpS,QAAQmS,IAAgB,GAC1DthB,EAAK3P,KAAK0F,MAAMwrB,oBAAoBpS,QAAQmS,IAAgB,IAC5D,oBAACthB,EAAK3P,YAAN,iBAAC,EAAW8uB,iBAAZ,iBAAC,EAAsBrpB,YAAvB,iBAAC,EAA4ByrB,2BAA7B,aAAC,EAAiDpS,QAAQmS,UAA1D,SAA2E,IAAM,GACjF,UAAGthB,EAAK8S,UAAR,YAAqB9S,EAAK+S,UAAWwO,oBAAoBpS,QAAQmS,IAAgB,GACjF,UAAGthB,EAAK+S,SAAR,YAAoB/S,EAAK8S,WAAYyO,oBAAoBpS,QAAQmS,IAAgB,OAEzF,CAACJ,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAKvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,iCAAkC,sBAE7C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,gBAAD,CAAerO,GAAG,2CAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,6BAA8B,yBAQ3F,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,8BAA+B,UACzE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,mCAAoC,gBAC9E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,kCAAmC,eAC7E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,WAC1E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,uCAAwC,oBAClF,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,eACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,oDAA0D+N,EAAK2Q,MAArG,UACI,qBAAI1a,UAAU,yBAAd,UACI,gCAAM+J,EAAK8S,UAAX,IAAuB9S,EAAK+S,YAC5B,qBAAK9c,UAAU,aAAf,SAA6B+J,EAAK3P,KAAK0F,WAE3C,oBAAIE,UAAU,yBAAd,SAAwC+J,EAAK8S,YAC7C,oBAAI7c,UAAU,yBAAd,SAAwC+J,EAAK+S,WAC7C,oBAAI9c,UAAU,yBAAd,SAAwC+J,EAAK3P,KAAK0F,QAClD,oBAAIE,UAAU,yBAAd,6BAAwC+J,EAAK3P,KAAK8uB,iBAAlD,aAAwC,EAAqBrpB,YAA7D,QAAqE,KACrE,6BACI,cAAC,GAAD,UACI,eAAC8rB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,oDAA+CyJ,EAAK2Q,IAArE,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,sDAAiDyJ,EAAK2Q,IAAvE,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCA1B9C8K,EAAK2Q,OAqCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAtFf,EAsFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAnD,SACI,6BAAI,oBAAIqvB,QAzFf,EAyFW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA9Ff,EA8FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDjJ0CH,WAAW,EAAMpE,YAAaoB,IAC/H,CAAEiD,KAAM,gDAAiDzD,UAAWiiB,GAAUze,WAAW,EAAMpE,YAAaoB,IAC5G,CAAEiD,KAAM,2CAA4CzD,UAAWgiB,GAAYxe,WAAW,EAAMpE,YAAaoB,IACzG,CAAEiD,KAAM,kDAAmDzD,UAAW4jB,GAAYpgB,WAAW,EAAMpE,YAAaoB,IAGhH,CAAEiD,KAAM,mCAAoCnD,OAAO,EAAMN,UEU1B,WAAO,IAAD,IAC7BvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EAA4F5D,GAAY,CAAEpL,cAAU/hB,IAA7FgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAAqCuP,cAArC,mBAAOC,EAAP,KAAmBC,EAAnB,KACM9iB,EAAUC,cAGVqS,EAAQzc,WAAc,WAExB,IAAIkM,GAAM,OAAC4gB,QAAD,IAACA,IAAY,IAClBzuB,QAAO,SAAAuN,GAAI,cAAiC,mBAA7B,UAAAA,EAAK3P,YAAL,mBAAW8uB,iBAAX,eAAsBxO,OAE1C,IAAKuQ,IAAa/e,EACb,OAAO7B,EAGZ,IAAIghB,EAAcnf,EAAOof,oBAGzB,OAAOjhB,EAAI7N,QAAO,SAAAuN,GAAI,qBAClBA,EAAK8S,UAAUyO,oBAAoBpS,QAAQmS,IAAgB,GACxDthB,EAAK+S,SAASwO,oBAAoBpS,QAAQmS,IAAgB,GAC1DthB,EAAK3P,KAAK0F,MAAMwrB,oBAAoBpS,QAAQmS,IAAgB,GAC5DthB,EAAKgT,iBAAiBuO,oBAAoBpS,QAAQmS,IAAgB,IAClE,oBAACthB,EAAK3P,YAAN,iBAAC,EAAW8uB,iBAAZ,iBAAC,EAAsBrpB,YAAvB,iBAAC,EAA4ByrB,2BAA7B,aAAC,EAAiDpS,QAAQmS,UAA1D,SAA2E,IAAM,GACjF,UAAGthB,EAAK8S,UAAR,YAAqB9S,EAAK+S,UAAWwO,oBAAoBpS,QAAQmS,IAAgB,GACjF,UAAGthB,EAAK+S,SAAR,YAAoB/S,EAAK8S,WAAYyO,oBAAoBpS,QAAQmS,IAAgB,OAEzF,CAACJ,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAKvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,+BACKzP,EAAE,6BAA8B,oBACjC,cAAC,IAAD,CAAqB0B,UAAS,OAACia,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAW4H,EAAjD,SACI,kCACI,yCACCpF,EAAE,kCAAmC,qCAAsC,CAAE8sB,MAAK,iBAAEnR,QAAF,IAAEA,OAAF,EAAEA,EAAOne,cAAT,QAAmB,EAAGuvB,YAAarQ,IAAW,IAAK,eAMtJ,cAAC,IAAD,CAAqBhb,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,oBAAG3O,UAAU,kBAAkB4G,KAAK,8BAA8BqlB,UAAQ,EAA1E,UACI,cAAC,IAAD,CAAiB1rB,KAAK,aAAa,yCAAItB,EAAE,4BAA6B,mCAO1F,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,0BAA2B,UACrE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,gBAC1E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,8BAA+B,eACzE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,2BAA4B,WACtE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,sCAAuC,qCACjF,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,OACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,gDAAsD+N,EAAK2Q,MAAjG,UACI,qBAAI1a,UAAU,yBAAd,UACI,gCAAM+J,EAAK8S,UAAX,IAAuB9S,EAAK+S,YAC5B,qBAAK9c,UAAU,aAAf,SAA6B+J,EAAK3P,KAAK0F,WAE3C,oBAAIE,UAAU,yBAAd,SAAwC+J,EAAK8S,YAC7C,oBAAI7c,UAAU,yBAAd,SAAwC+J,EAAK+S,WAC7C,oBAAI9c,UAAU,yBAAd,SAAwC+J,EAAK3P,KAAK0F,QAClD,oBAAIE,UAAU,yBAAd,SAAwC+J,EAAKgT,mBAC7C,6BACI,cAAC,GAAD,UACI,eAAC4O,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,gDAA2CyJ,EAAK2Q,IAAjE,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,kDAA6CyJ,EAAK2Q,IAAnE,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCA1B9C8K,EAAK2Q,OAqCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QA7Ff,EA6FW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAnD,SACI,6BAAI,oBAAIqvB,QAhGf,EAgGW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QArGf,EAqGW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBFnJkCH,WAAW,EAAMpE,YAAaoB,IACvH,CAAEiD,KAAM,4CAA6CzD,UAAWiiB,GAAUze,WAAW,EAAMpE,YAAaoB,IACxG,CAAEiD,KAAM,uCAAwCzD,UAAWgiB,GAAYxe,WAAW,EAAMpE,YAAaoB,IACrG,CAAEiD,KAAM,8CAA+CzD,UAAW4jB,GAAYpgB,WAAW,EAAMpE,YAAaoB,KGdnGklB,GAAgC,CACzC,CAAEjiB,KAAM,IAAKnD,OAAO,EAAMN,UCGV,WAEhB,IAAMG,EAAgB+gB,KAAhB/gB,YAEN,OACI,mCACI,cAAC,IAAD,CAAUrG,GAAE,OAAEqG,QAAF,IAAEA,IAAe,iBDTMqD,WAAW,I,mBEI7CmiB,GAAkB,WAC3B,OACI,mCACI,cAAC,KAAD,UACI,sBAAMC,wBAAsB,cCR/BC,GAA0C,CACnD,CAAEpiB,KAAM,kBAAmBnD,OAAO,EAAMN,UCCV,WAC9B,OACI,mCACI,cAAC,IAAD,CAAUlG,GAAG,gCDDZgsB,GAAiD,CAC1D,CAAEriB,KAAM,kBAAmBzD,UEIS,WACpC,IAAQvH,EAAMC,cAAND,EAER,OACI,qCACI,cAAC,GAAD,IACA,eAAC,GAAD,CAAoB2G,YAAaoB,GAAjC,UACI,cAAC,GAAD,UACK/H,EAAE,yCAA0C,yBAEjD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,yBAArC,UACI,cAAC,IAAD,CAAiBC,KAAM,CAAC,MAAO,SAAUP,UAAU,aACnD,yCAAIf,EAAE,kCAAmC,kBAGjD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,4BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,YAAYP,UAAU,aAC5C,yCAAIf,EAAE,qCAAsC,qBAGpD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,4BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,qBAAqBP,UAAU,aACrD,yCAAIf,EAAE,qCAAsC,qBAIpD,cAAC,GAAD,UACKA,EAAE,qCAAsC,eAE7C,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,iDAArC,UACI,cAAC,IAAD,CAAiBC,KAAM,CAAC,MAAO,SAAUP,UAAU,aACnD,yCAAIf,EAAE,8CAA+C,yBAG7D,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,wCAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,OAAOP,UAAU,aACvC,yCAAIf,EAAE,sCAAuC,uBAIrD,cAAC,GAAD,UACKA,EAAE,qCAAsC,oBAE7C,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,8BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,iBAAiBP,UAAU,aACjD,yCAAIf,EAAE,sCAAuC,uBAGrD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,+BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,UAAUP,UAAU,aAC1C,yCAAIf,EAAE,uCAAwC,wBAGtD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,gCAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,WAAWP,UAAU,aAC3C,yCAAIf,EAAE,wCAAyC,yBAGvD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,2BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,MAAMP,UAAU,aACtC,yCAAIf,EAAE,oCAAqC,oBAInD,cAAC,GAAD,UACKA,EAAE,oCAAqC,uBAE5C,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,4BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,WAAWP,UAAU,aAC3C,yCAAIf,EAAE,oCAAqC,oBAGnD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS7G,IAAKwG,GAAoBvG,GAAG,6BAArC,UACI,cAAC,IAAD,CAAiBC,KAAK,WAAWP,UAAU,aAC3C,yCAAIf,EAAE,qCAAsC,sBAUpD,cAAC,GAAD,UACKA,EAAE,sCAAuC,qBAG9C,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS5G,GAAG,mCAAmCD,IAAKwG,GAApD,UACI,cAAC,IAAD,CAAiBtG,KAAK,gBAAgBP,UAAU,aAChD,yCAAIf,EAAE,0CAA2C,4BAIzD,cAAC4B,EAAA,EAAD,UACI,eAACqG,EAAA,EAAD,CAAS5G,GAAG,uCAAuCD,IAAKwG,GAAxD,UACI,cAAC,IAAD,CAAiBtG,KAAK,QAAQP,UAAU,aACxC,yCAAIf,EAAE,0CAA2C,mC,yDCnHlE,SAASstB,GAAoBC,EAAiCtuB,GACjE,IAAMuuB,EAAa,SAACC,GAChB,cAAIxuB,QAAJ,IAAIA,OAAJ,EAAIA,EAASyuB,UAELH,EAASI,SACFC,KAAQ5tB,EAAE,6BAA8B,WAExC4tB,KAAQ5tB,EAAE,kBAAmB,kBAAmB,CAAEytB,KAAMlP,KAAOkP,KAItEF,EAASI,SACFC,KAAQ5tB,EAAE,cAAe,uBAAwB,CAAEytB,KAAMlP,KAAOkP,KAEhEG,KAAQ5tB,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMlP,KAAOkP,MAM7F,OAAIF,EAASM,QAAUN,EAASO,IACrBN,EAAWD,EAASM,OAGxBD,KAAQ5tB,EAAE,gCAAiC,uBAAwB,CAAE6tB,MAAOL,EAAWD,EAASM,OAAQC,IAAKN,EAAWD,EAASO,O,6BCd/HC,GAAsB,SAACxnB,GAChC,IAAQzE,EAA2CyE,EAA3CzE,MAAOf,EAAoCwF,EAApCxF,UAAf,EAAmDwF,EAAzBynB,mBAA1B,SAEA,OACI,qBAAKjtB,UAAS,iCAA4BitB,EAAc,qCAAuC,GAAjF,mBAAuFjtB,QAAvF,IAAuFA,IAAa,IAC9GyH,MAAO,CAAEylB,gBAAiBD,EAAc,cAAelsB,MCHtDosB,GAAmB,SAAC3nB,GAAkC,IAAD,QACtDknB,EAA4BlnB,EAA5BknB,KAAMF,EAAsBhnB,EAAtBgnB,SAAUtkB,EAAY1C,EAAZ0C,QAGxB,EAOI/J,WAAc,WACd,IAAMivB,EAAa5P,KAAOkP,GAAMW,QAAQ,OAAO5P,cACzC6P,EAAW9P,KAAOkP,GAAMa,MAAM,OAAO9P,cAErC+P,EAAuBhQ,KAAOgP,EAASM,OAAOrP,cAAgB2P,EAC9DK,EAAoBjQ,KAAOgP,EAASO,KAAKtP,cAAgB6P,EAM/D,MAAO,CACHE,sBACAC,mBACAC,gBARoBF,GAAuBC,EAS3CE,wBAR4BH,GAAuBhQ,KAAOgP,EAASM,OAAOc,IAAI,EAAG,OAAOnQ,eAAiB2P,EASzGS,8BARkCJ,GAAoBjQ,KAAOgP,EAASO,KAAKa,KAAK,EAAG,OAAOnQ,eAAiB2P,EAS3GU,SARyD,WAA5CpB,EAAK7X,OAAO,QAAQyW,uBAUtC,CAACoB,EAAMF,IAzBNgB,EADJ,EACIA,oBACAC,EAFJ,EAEIA,iBACAC,EAHJ,EAGIA,gBACAC,EAJJ,EAIIA,wBACAE,EALJ,EAKIA,8BACAC,EANJ,EAMIA,SAsBJ,OACI,sBAAK9tB,UAAS,6BAAwBwtB,EAAsB,mCAAqC,GAAnF,YAAyFC,EAAmB,gCAAkC,GAA9I,YAAoJC,EAAkB,8BAAgC,GAAtM,YAA4MC,EAA0B,yCAA2C,GAAjR,YAAuRE,EAAgC,iDAAmD,IACpX3lB,QAASA,EADb,UAGI,cAAC,IAAD,CAAqBvH,QAAS6rB,EAASI,UAAYY,GAAuBC,EAA1E,SACI,qBAAKztB,UAAU,0BAAf,SACKusB,GAAoBC,EAAU,CAAEG,UAAYa,IAAwBC,QAG7E,eAAChf,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAK,oBAAEyrB,EAASuB,qBAAX,iBAAE,EAAwBC,iBAA1B,aAAE,EAAmCjtB,aAArC,QAA8C,cACpEksB,YAAaO,IAAwBM,MAE7C,cAACpf,GAAA,EAAD,UACI,qBAAK1O,UAAU,0BAAf,mBACKwsB,EAASuB,qBADd,aACK,EAAwBluB,gBClDpCouB,GAAc,SAACzoB,GACxB,IAAQknB,EAAkClnB,EAAlCknB,KAAMwB,EAA4B1oB,EAA5B0oB,UAAWC,EAAiB3oB,EAAjB2oB,aAEjBlvB,EAAMC,cAAND,EAEFmvB,EAAcjwB,WAAc,WAC9B,IAAMkwB,EAAQ7Q,OAAS6P,QAAQ,OAE/B,MAAO,CACHiB,UAAW5B,EAAK7X,OAAO,MACvB0Z,QAAS7B,EAAK7X,OAAO,QACrB2Z,QAAqD,IAA5CH,EAAMI,KAAKjR,KAAOkP,GAAMW,QAAQ,QACzCqB,OAAQL,EAAMI,KAAKjR,KAAOkP,GAAMW,QAAQ,QAAU,KAEvD,CAACX,IAGEiC,EAAcxwB,WAAc,WAC9B,IAAMivB,EAAa5P,KAAOkP,GAAMW,QAAQ,OAAO5P,cACzC6P,EAAW9P,KAAOkP,GAAMa,MAAM,OAAO9P,cAG3C,OADS,OAAGyQ,QAAH,IAAGA,OAAH,EAAGA,EAAW1xB,QAAO,SAAA0J,GAAE,OAAIsX,KAAOtX,EAAG4mB,OAAOrP,eAAiB6P,GAAY9P,KAAOtX,EAAG6mB,KAAKtP,eAAiB2P,OAEnH,CAACc,EAAWxB,IAEf,OACI,sBAAK1sB,UAAS,oCAA+BouB,EAAYG,QAAQ3tB,cAAnD,YAAoEwtB,EAAYI,QAAU,qBAAuB,IAA/H,UACI,sBAAKxuB,UAAS,4BAAuBouB,EAAYM,OAAS,yBAA2B,4BAArF,UACKhC,EAAK7X,OAAO,MACb,uBAAM7U,UAAU,6BAAhB,UACI,yCACCf,EAAE,uBAAwB,iBAAkB,CAAEytB,eAGvD,qBAAK1sB,UAAU,sBAAf,gBAEQ2uB,QAFR,IAEQA,OAFR,EAEQA,EAAavyB,KAAI,SAAA2N,GAAI,OACjB,cAAC,GAAD,CACI2iB,KAAMA,EACNF,SAAUziB,EACV7B,QAAS,WACDimB,GACAA,EAAapkB,KALFA,EAAK2Q,aCrCvCkU,GAAe,SAACppB,GACzB,IAAQknB,EAAkClnB,EAAlCknB,KAAMwB,EAA4B1oB,EAA5B0oB,UAAWC,EAAiB3oB,EAAjB2oB,aAGzB,EAA+BhwB,WAAc,WAMzC,MAAO,CACH0wB,UALcrR,KAAOkP,GAAMW,QAAQ,QAMnCyB,QAJYtR,KAAOkP,GAAMa,MAAM,WAMpC,CAACb,IAVImC,EAAR,EAAQA,UAAWC,EAAnB,EAAmBA,QAabC,EAAa5wB,eAAkB,SAACD,GAGlC,IAFA,IAAImM,EAA8B,GAEzB2kB,EAAMxR,KAAOqR,GAAYG,GAAOF,EAASE,EAAMxR,KAAOwR,GAAKpB,IAAI,EAAG,OAAQ,CAE/E,IAAMqB,EAAYD,EAAIna,OAAO,KAG7B,GAFgC,MAAdoa,GAAkD,MAAdA,GAGlD,IAAK/wB,EAAQgxB,eACT,cAGJ,IAAKhxB,EAAQixB,gBACT,SAIR9kB,EAAIrO,KACA,cAAC0S,GAAA,EAAD,CAA6BC,GAAI,GAAIygB,GAAG,GAAxC,SACI,cAAC,GAAD,CAAa1C,KAAMsC,EAAKd,UAAWA,EAAWC,aAAcA,KADtDa,EAAIvR,gBAMtB,OAAOpT,IACR,CAACwkB,EAAWC,EAASZ,EAAWC,IAGnC,OACI,qBAAKnuB,UAAU,gBAAf,SACI,cAACyO,GAAA,EAAD,CAAK+L,WAAS,EAACxa,UAAU,yBAAzB,SACK+uB,EAAW,CAAEI,iBAAiB,EAAMD,gBAAgB,SCpDxDG,I,OAAuB,SAAC7pB,GACjC,IAAQknB,EAASlnB,EAATknB,KAEAztB,EAAMC,cAAND,EAGR,EAA+Bd,WAAc,WAMzC,MAAO,CACH0wB,UALcrR,KAAOkP,GAAMW,QAAQ,QAMnCyB,QAJYtR,KAAOkP,GAAMa,MAAM,WAMpC,CAACb,IAVImC,EAAR,EAAQA,UAAWC,EAAnB,EAAmBA,QAabC,EAAa5wB,eAAkB,SAACD,GAGlC,IAFA,IAAImM,EAA8B,GAEzB2kB,EAAMxR,KAAOqR,GAAYG,GAAOF,EAASE,EAAMxR,KAAOwR,GAAKpB,IAAI,EAAG,OAAQ,CAG/E,IAAMqB,EAAYD,EAAIna,OAAO,KAG7B,GAFgC,MAAdoa,GAAkD,MAAdA,GAGlD,IAAK/wB,EAAQgxB,eACT,cAGJ,IAAKhxB,EAAQixB,gBACT,SAIR9kB,EAAIrO,KACA,cAAC0S,GAAA,EAAD,UACI,qBAAK1O,UAAU,6BAAf,SACKf,EAAE,uBAAwB,iBAAkB,CAAEytB,KAAMsC,OAFnDA,EAAIvR,gBAQtB,OAAOpT,IACR,CAACwkB,EAAWC,EAAS7vB,IAGxB,OACI,cAACwP,GAAA,EAAD,CAAKzO,UAAU,yBAAyBwa,WAAS,EAAjD,SACKuU,EAAW,CAAEI,iBAAiB,EAAMD,gBAAgB,QClDpDI,GAAgB,SAAC9pB,GAC1B,IAAQknB,EAAkClnB,EAAlCknB,KAAMwB,EAA4B1oB,EAA5B0oB,UAAWC,EAAiB3oB,EAAjB2oB,aAGzB,EAA+BhwB,WAAc,WACzC,IAAMoxB,EAAa/R,KAAOkP,GAAMW,QAAQ,SAClCmC,EAAWhS,KAAOkP,GAAMa,MAAM,SAQpC,MAAO,CACHgC,aACAC,WACAX,UARcrR,KAAO+R,GAAYlC,QAAQ,QASzCyB,QANYtR,KAAOgS,GAAUjC,MAAM,WAQxC,CAACb,IAhBImC,EAAR,EAAQA,UAAWC,EAAnB,EAAmBA,QAmBbW,EAActxB,eAAkB,WAGlC,IAFA,IAAIkM,EAA8B,GAEzB2kB,EAAMxR,KAAOqR,GAAYG,GAAOF,EAASE,EAAMxR,KAAOwR,GAAKpB,IAAI,EAAG,QACvEvjB,EAAIrO,KACA,cAAC,GAAD,CAAsC0wB,KAAMsC,EAAKd,UAAWA,EAAWC,aAAcA,GAAlEa,EAAIvR,gBAI/B,OAAOpT,IACR,CAACwkB,EAAWC,EAASZ,EAAWC,IAGnC,OACI,sBAAKnuB,UAAU,iBAAf,UACI,cAAC,GAAD,CAAsB0sB,KAAMmC,IAC5B,qBAAK7uB,UAAU,sBAAf,SACKyvB,UCjCJC,I,OAAwB,SAAClqB,GAAuC,IAAD,IAChEknB,EAAuDlnB,EAAvDknB,KAAMiD,EAAiDnqB,EAAjDmqB,WAAYC,EAAqCpqB,EAArCoqB,UAAWC,EAA0BrqB,EAA1BqqB,OAAQC,EAAkBtqB,EAAlBsqB,aAErC7wB,EAAMC,cAAND,EAGR,EAAqCd,WAAc,WAC/C,MAAO,CACH4xB,cAAevS,KAAOkP,GAAMkB,KAAK,EAAG,SACpCoC,UAAWxS,KAAOkP,GAAMkB,IAAI,EAAG,YAEpC,CAAClB,IALIqD,EAAR,EAAQA,cAAeC,EAAvB,EAAuBA,UAQjBC,EAAe9xB,eAAkB,SAACuuB,GAC/BiD,GAILA,EAAWjD,KACZ,CAACiD,IAGEO,EAAkB/xB,WAAc,WAElC,IAAIgyB,EAAgB,aAAOP,GAC3BO,EAAiBC,UAIjB,IAAIC,EAAU3D,EAAKjP,cACb4Q,EAAQ7Q,OAAS6P,QAAQ,OACzBiD,EAAa9S,KAAOkP,GAAMkB,IAAI,EAAG,SAUvC,OATIS,GAAS3B,GAAQ2B,EAAQiC,IACzBD,EAAUhC,EAAM5Q,eAIR0S,EAAiBlqB,MAAK,SAAAC,GAC9B,IAAMqqB,EAAa/S,KAAOtX,EAAG4mB,OAAOc,IAAI,EAAG,SAASnQ,cACpD,OAAOvX,EAAG4mB,OAASuD,GAAWE,EAAaF,OAGhD,CAACT,EAAWlD,IAET8D,EAAuBryB,WAAc,WACvC,GAAK+xB,GAAoBL,EAKzB,OADYA,EAAO5pB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAOwV,EAAgBO,0BAEzD,CAACZ,EAAQK,IAEZ,OACI,sBAAKlwB,UAAS,0DAAqD8vB,GAC/DroB,MAAO,CAAEipB,gBAAiBF,EAAoB,sBAAWA,QAAX,IAAWA,OAAX,EAAWA,EAAsBh1B,IAAjC,WAA2CvB,GAD7F,UAGI,eAACwU,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGmQ,GAAI,EAAGlQ,GAAI,EAA/B,SACI,qBAAKzgB,UAAU,sCAInB,cAAC0O,GAAA,EAAD,UACI,sBAAK1O,UAAU,kCAAf,UACI,8CAAKkwB,QAAL,IAAKA,OAAL,EAAKA,EAAiBrwB,YAAtB,QAA8BZ,EAAE,qCAAsC,2BAA4B,CAAEytB,YAEjF,OAAfwD,QAAe,IAAfA,OAAA,EAAAA,EAAiBU,iBACb,cAAC,GAAD,CAAara,KAAI,iBAAE2Z,QAAF,IAAEA,OAAF,EAAEA,EAAiBU,uBAAnB,QAAsC,KAEnD,4BACK3xB,EAAE,oCAAqC,8EAQpE,qBAAKe,UAAU,qCAAf,SACI,eAACyO,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC,IAAD,CAAqB7Z,OAAyB,aAAjBmvB,EAA7B,SACI,cAACphB,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAAC7N,EAAA,EAAD,CAAQC,MAAM,YAAY+Z,SAAO,EAAC9a,UAAU,qDAAqDkI,QAAS,kBAAM+nB,EAAaF,IAA7H,UACI,cAAC,IAAD,CAAiBxvB,KAAK,iBACtB,yCAAOtB,EAAE,oBAAqB,iBAAkB,CAAEytB,KAAMqD,WAIpE,cAACrhB,GAAA,EAAD,UACI,qBAAK1O,UAAU,gDAAf,SACI,sBAAMA,UAAU,sDAAhB,SACKf,EAAE,2BAA4B,gCAAiC,CAAEytB,KAAMA,UAIpF,cAAC,IAAD,CAAqB/rB,OAAyB,aAAjBmvB,EAA7B,SACI,cAACphB,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAAC7N,EAAA,EAAD,CAAQC,MAAM,YAAY+Z,SAAO,EAAC9a,UAAU,iDAAiDkI,QAAS,kBAAM+nB,EAAaD,IAAzH,UACK/wB,EAAE,oBAAqB,iBAAkB,CAAEytB,KAAMsD,IAClD,yCAAM,cAAC,IAAD,CAAiBzvB,KAAK,mCC1H/CswB,GAAsCze,aAAH,0ZCAnC0e,GAA8B1e,aAAH,yUCA3B2e,GAAiC3e,aAAH,yQCA9B4e,GAA4B5e,aAAH,sLCAzB6e,GAAmD7e,aAAH,+Q,qBCgBhD8e,GAAwB,SAAC1rB,GAAuC,IAAD,cAChEknB,EAA6BlnB,EAA7BknB,KAAMF,EAAuBhnB,EAAvBgnB,SAAUtkB,EAAa1C,EAAb0C,QAGxB,EAAkD/J,WAAc,WAC5D,IAAMivB,EAAa5P,KAAOkP,GAAMW,QAAQ,OAAO5P,cACzC6P,EAAW9P,KAAOkP,GAAMa,MAAM,OAAO9P,cAK3C,MAAO,CACH+P,oBAJyBhQ,KAAOgP,EAASM,OAAOrP,cAAgB2P,EAKhEK,iBAJsBjQ,KAAOgP,EAASO,KAAKtP,cAAgB6P,KAMhE,CAACZ,EAAMF,IAXFgB,EAAR,EAAQA,oBAAqBC,EAA7B,EAA6BA,iBAa7B,OACI,eAAC0D,GAAA,EAAD,CAAenxB,UAAS,mCAA8BwtB,EAAsB,yCAA2C,GAA/F,YAAqGC,EAAmB,sCAAwC,IACpLvlB,QAASA,EADb,UAGI,cAAC,IAAD,CAAqBvH,QAAS6rB,EAASI,UAAYY,GAAuBC,EAA1E,SACI,qBAAKztB,UAAU,gCAAf,SACKusB,GAAoBC,EAAU,CAAEG,UAAYa,IAAwBC,QAG7E,eAAChf,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC,IAAD,CAAqB7Z,QAAS6sB,EAA9B,SACI,cAAC9e,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAK,oBAAEyrB,EAASuB,qBAAX,iBAAE,EAAwBC,iBAA1B,aAAE,EAAmCjtB,aAArC,QAA8C,oBAGhF,cAAC2N,GAAA,EAAD,UACI,qBAAK1O,UAAU,gCAAf,mBACKwsB,EAASuB,qBADd,aACK,EAAwBluB,SAGjC,cAAC,IAAD,CAAqBc,UAAS,UAAC6rB,EAASuB,qBAAV,aAAC,EAAwBqD,WAAvD,mBAEQ5E,EAASuB,qBAFjB,iBAEQ,EAAwBqD,iBAFhC,aAEQ,EAAmCh1B,KAAI,SAAAi1B,GAAiB,IAAD,QAEnD,OAAI,UAACA,EAAavvB,gBAAd,aAAC,EAAuBwvB,oBAKxB,cAAC5iB,GAAA,EAAD,CAA2BC,GAAG,OAA9B,SACI,qBAAK3O,UAAU,mDAAmDmX,IAAG,UAAEka,EAAavvB,SAASwvB,mBAAmB91B,WAA3C,QAAkD,GAAI+1B,IAAG,oBAAEF,EAAavvB,gBAAf,aAAE,EAAuBjC,YAAzB,QAAiC,MADzJwxB,EAAa3W,IAJhB,iB,uCCzDhC,SAAS8W,GAAWh2B,GAEvB,OAAIA,EAAI0d,QAAQ,OAAS,EACd1d,EAGL,UAAN,OAAiBA,G,kECGRi2B,GAAc,SAACjsB,GACxB,IACIoB,EAKApB,EALAoB,KACA8qB,EAIAlsB,EAJAksB,mBACAC,EAGAnsB,EAHAmsB,gBACAxrB,EAEAX,EAFAW,SACGO,EALP,aAMIlB,EANJ,IAQMosB,EAAczzB,WAAc,kBCnB/B,SAA4B3C,EAAak2B,EAA6BC,GACzE,MAAM,YAAN,OAAmBrwB,mBAAmB9F,GAAtC,YAA8Ck2B,EAAkB,8BAA0BpwB,mBAAkB,OAACowB,QAAD,IAACA,IAAsB,IAAnE,4BAA0FpwB,mBAAkB,OAACqwB,QAAD,IAACA,IAAmB,KAAQ,IDkBhKE,CAAkB,OAACjrB,QAAD,IAACA,IAAQ,GAAI8qB,EAAoBC,KAAkB,CAAC/qB,EAAM8qB,EAAoBC,IAExI,OACI,2CAAG/qB,KAAMgrB,GAAiBlrB,GAA1B,aAAiCP,MEA5B2rB,GAAqB,SAACtsB,GAAoC,IAAD,oCAC1D9C,EAA0B8C,EAA1B9C,MAAOnD,EAAmBiG,EAAnBjG,OAAQC,EAAWgG,EAAXhG,OAEfP,EAAMC,cAAND,EAGR,OACI,eAAC8yB,GAAA,EAAD,CAAO/xB,UAAU,uBAAuBL,KAAK,KAAKJ,OAAQA,EAAQC,OAAQA,EAA1E,UACI,cAACwyB,GAAA,EAAD,CAAaxyB,OAAQA,EAArB,SACI,eAACiP,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB3O,UAAU,qDAAqDe,MAAK,iBAAE2B,QAAF,IAAEA,GAAF,UAAEA,EAAOqrB,qBAAT,iBAAE,EAAsBC,iBAAxB,aAAE,EAAiCjtB,aAAnC,QAA4C,kBAEzI,eAAC2N,GAAA,EAAD,CAAK1O,UAAU,mCAAf,UACI,oCACK0C,QADL,IACKA,GADL,UACKA,EAAOqrB,qBADZ,aACK,EAAsBluB,OAE3B,cAAC,IAAD,CAAqBc,UAAS,OAAC+B,QAAD,IAACA,GAAD,UAACA,EAAOqrB,qBAAR,aAAC,EAAsB5uB,UAArD,SACI,qBAAKa,UAAU,sCAAf,gBACK0C,QADL,IACKA,GADL,UACKA,EAAOqrB,qBADZ,aACK,EAAsB5uB,aAI/B,qBAAKa,UAAU,kCAAf,SACI,eAACyO,GAAA,EAAD,CAAK+L,WAAS,EAAd,UAII,cAAC9L,GAAA,EAAD,iBACKhM,QADL,IACKA,GADL,UACKA,EAAOqrB,qBADZ,iBACK,EAAsBC,iBAD3B,aACK,EAAiCnuB,OAEtC,eAAC6O,GAAA,EAAD,CAAKC,GAAG,OAAO3O,UAAU,4BAAzB,UACI,cAAC,IAAD,CAAiBO,KAAK,iBACtB,yCAEImC,EAAS,mCAAG6pB,GAAoB7pB,KACzB,6CAQnC,cAACuvB,GAAA,EAAD,UACI,eAACxjB,GAAA,EAAD,WACI,eAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,UACI,cAAC,IAAD,CAAqB7f,UAAS,OAAC+B,QAAD,IAACA,GAAD,UAACA,EAAOqrB,qBAAR,aAAC,EAAsBuD,oBAArD,SACI,qBAAKtxB,UAAU,mDAAf,SACI,qBAAKA,UAAU,mDAAmDmX,KAAU,OAALzU,QAAK,IAALA,GAAA,UAAAA,EAAOqrB,qBAAP,mBAAsBuD,0BAAtB,eAA0C91B,MAAO,GAAI+1B,IAAG,OAAE7uB,QAAF,IAAEA,GAAF,UAAEA,EAAOqrB,qBAAT,aAAE,EAAsBluB,WAI/J,qBAAKG,UAAU,+CAAf,SACI,cAAC,GAAD,CAAauW,KAAI,iBAAE7T,QAAF,IAAEA,GAAF,UAAEA,EAAOqrB,qBAAT,aAAE,EAAsB6C,uBAAxB,QAA2C,UAGpE,cAACliB,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAjB,SACI,sBAAKxgB,UAAU,+BAAf,UACI,sBAAKA,UAAU,4BAAf,UACI,8BACKf,EAAE,+BAAgC,iBAF3C,OAKQyD,QALR,IAKQA,GALR,UAKQA,EAAOqrB,qBALf,iBAKQ,EAAsBjZ,YAL9B,aAKQ,EAA4B1Y,KAAI,SAAC2N,EAAMzN,GAAP,eAC5B,cAAC,GAAD,CACIsK,KAAM4qB,GAAU,UAACznB,EAAKvO,WAAN,QAAa,IAC7Bk2B,mBAAoB3nB,EAAK2Q,GACzBiX,gBAAe,OAAEjvB,QAAF,IAAEA,GAAF,UAAEA,EAAOqrB,qBAAT,aAAE,EAAsBrT,GACvClR,IAAI,aACJD,OAAO,SACPvJ,UAAS,kDANb,SAQK+J,EAAKlK,MARQkK,EAAK2Q,UAanC,sBAAK1a,UAAU,iCAAf,UACI,8BACKf,EAAE,+BAAgC,2BAEvC,oBAAGe,UAAU,qDAAqD4G,KAAI,kCAA6BlE,EAAMgY,IAAMuR,UAAQ,EAAvH,UACI,cAAC,IAAD,CAAiB1rB,KAAK,kBAAkB,yCACvCtB,EAAE,mCAAoC,mCAK3C,oBAAGe,UAAU,qDAAqD4G,KAAI,UAAK,IAAIsrB,IAAJ,2BAAoCzuB,OAAOtE,SAASyH,MAAMA,KAAKiG,QAAQ,UAAW,YAA7J,UACI,cAAC,IAAD,CAAiBtM,KAAK,iBAAiB,yCACtCtB,EAAE,yCAA0C,4CAGrD,sBAAKe,UAAU,iCAAf,UACI,qBAAKA,UAAU,yCAAf,SACKf,EAAE,sCAAuC,mBAE9C,qBAAKe,UAAU,sCAAf,SACI,cAACyO,GAAA,EAAD,iBAEQ/L,QAFR,IAEQA,GAFR,UAEQA,EAAOqrB,qBAFf,iBAEQ,EAAsBqD,iBAF9B,aAEQ,EAAiCh1B,KAAI,SAAA2N,GAAI,+BACrC,cAAC2E,GAAA,EAAD,CAAmBC,GAAG,GAAG6R,GAAI,GAAIxgB,UAAU,gCAA3C,SACI,cAAC,gBAAD,CAAeM,GAAE,2BAAsBgB,mBAAkB,oBAACyI,EAAKjI,gBAAN,aAAC,EAAejC,YAAhB,QAAwB,KAAjF,UAEY,OAAJkK,QAAI,IAAJA,GAAA,UAAAA,EAAMjI,gBAAN,eAAgBwvB,oBAAsB,qBAAKtxB,UAAU,gDAAgDmX,IAAG,oBAAEpN,EAAKjI,gBAAP,iBAAE,EAAewvB,0BAAjB,aAAE,EAAmC91B,WAArC,QAA4C,GAAI+1B,IAAG,oBAAExnB,EAAKjI,gBAAP,aAAE,EAAejC,YAAjB,QAAyB,KAC7K,qBAAKG,UAAU,yCAAf,6BAAyD+J,EAAKjI,gBAA9D,aAAyD,EAAejC,YAAxE,QAAgF,QAJzFkK,EAAK2Q,4BC5HxD,SAASyX,GAA8B3F,GAAsE,IAAD,EAE/G,IAAKA,EACD,MAAO,YAIX,KAAI,OAACA,QAAD,IAACA,GAAD,UAACA,EAAUuB,qBAAX,aAAC,EAAyBluB,MAC1B,MAAM,mBAAN,OAA0B2sB,EAAS9R,IAIvC,IAAM0X,EAAmB9wB,mBACrBkrB,EAASuB,cAAcluB,KAClBgN,QAAQ,IAAK,KACbA,QAAQ,IAAK,KACbA,QAAQ,KAAM,KACdye,qBAGT,MAAM,aAAN,OAAoB8G,EAApB,YAAwC5F,EAAS9R,I,wCCVxC2X,GAA4B,SAAC7sB,GACtC,IAAQxF,EAAuBwF,EAAvBxF,UAAc0G,EAAtB,aAA+BlB,EAA/B,IAEA,OACI,cAAC,GAAD,aAAexF,UAAS,8CAAkCA,QAAlC,IAAkCA,IAAa,KAAU0G,K,6BCD5E4rB,GAAkB,SAAC9sB,GAC5B,IAAQknB,EAA0BlnB,EAA1BknB,KAAM6F,EAAoB/sB,EAApB+sB,MAAOpsB,EAAaX,EAAbW,SAEblH,EAAMC,cAAND,EAEFmvB,EAAcjwB,WAAc,WAC9B,IAAMkwB,EAAQ7Q,OAAS6P,QAAQ,OAE/B,MAAO,CAGHmB,QAAqD,IAA5CH,EAAMI,KAAKjR,KAAOkP,GAAMW,QAAQ,QACzCqB,OAAQL,EAAMI,KAAKjR,KAAOkP,GAAMW,QAAQ,QAAU,KAEvD,CAACX,IAEJ,OACI,cAACvU,GAAA,EAAD,CAAMnY,UAAS,4BAAuBouB,EAAYI,QAAU,0BAA4B,GAAzE,YAA+EJ,EAAYM,OAAS,yBAA0B,IAA7I,SACI,eAAC8D,GAAA,EAAD,CAAUnyB,IAAI,MAAd,UACI,cAACoyB,GAAA,EAAD,UAEQF,GACMtzB,EAAE,+BAAgC,yBAA0B,CAAEytB,KAAMA,MAEjFvmB,QCrCJusB,GAAkCtgB,aAAH,kOCA/BugB,GAAsCvgB,aAAH,iSCAnCwgB,GAAiCxgB,aAAH,8Q,iBCc9BygB,GAAoB,SAACrtB,GAC9B,IACIoV,EAGApV,EAHAoV,MACAC,EAEArV,EAFAqV,WACArb,EACAgG,EADAhG,OAGJ,OACI,qBAAKQ,UAAU,sBAAf,SAEQ4a,EAAMxe,KAAI,SAAA2N,GAAI,OACV,cAACjJ,EAAA,EAAD,CAAsBnB,KAAK,KAAKoB,MAAM,YAAY+Z,SAAUD,EAAW9Q,EAAK2Q,IAAK1a,UAAU,2BAA2BkI,QAAS,kBAAM1I,EAAOuK,EAAK2Q,KAAjJ,SACI,eAACjM,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAOgJ,EAAKhJ,UAErC,cAAC2N,GAAA,EAAD,UACK3E,EAAKlK,WANLkK,EAAK2Q,UCzBzBoY,GAA8B1gB,aAAH,+NCQjC,SAAS2gB,KACZ,MAAoCzW,aAChClK,aAD2C,qRAQrC0gB,KARV,mBAAOvW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,I,cC9B1EwW,GAAa,iBAUJC,GAAgBC,yBAAc,CACzChvB,IAAK8uB,KADMC,YCHR,IAAME,GAAuClvB,eAAmB,CACnEC,IAAK,uCACLC,QAAS,WACTivB,iBAAkB,CAACH,MCRhB,IAAMI,GAA+CpvB,eAAoB,CAC5EC,IAAK,+CACLC,QAAS,GACTivB,iBAAkB,CAACH,MCHhB,IAAMK,GAA6CrvB,eAAoB,CAC1EC,IAAK,6CACLC,QAAS,GACTivB,iBAAkB,CAACH,MCHhB,IAAMM,GAA8CtvB,eAAoB,CAC3EC,IAAK,8CACLC,QAAS,GACTivB,iBAAkB,CAACH,M,cCFjBO,GAA4B,SAACC,GAC/B,IAAMpF,EAAQ7Q,OAASC,cACvBiW,aAAaC,QAAQF,EAAYpF,IAGrC,SAASuF,GAAiCH,EAAoBI,GAC1D,IAAMC,EAAatW,KARY,SAACiW,GAAD,OAAuChwB,OAAOiwB,aAAaK,QAAQN,GAQxEO,CAA2BP,IAC/CQ,EAAsBzW,OAASiR,KAAKqF,EAAY,QACtD,OAAOI,MAAMD,IAAwBA,EAAsBJ,EAGxD,I,GAAMM,GAAsB,SAACV,GAAoF,IAAhEI,EAA+D,uDAA9B,GACrF,EAA0EO,mBACtER,GAAiCH,EAAYI,IADjD,mBAAOQ,EAAP,KAAsCC,EAAtC,KAIMC,EAAgC,WAClCD,GAAiC,GACjCd,GAA0BC,IAG9B,MAAO,CAACY,EAA+BE,ICtBrCC,GAAQ,WAEV,GAAIC,UAAUC,WAEV,OAAO,EAEX,IAAMC,EAAKlxB,OAAOgxB,UAAUG,UACtBC,IAAWF,EAAG/e,MAAM,SACpBkf,IAAaH,EAAG/e,MAAM,WAC5B,OAAOif,GAAUC,GCLRC,I,OAAmB,WAC5B,MDO+B,WAC/B,MAAuEZ,GAf9C,wBAezB,mBAAOE,EAAP,KAAsCE,EAAtC,KAEA,MAAO,CAACC,MAAWH,EAA+BE,GCVCS,GAAnD,mBAAKC,EAAL,KAAuBC,EAAvB,KACA,ECL+B,WAC/B,MAAoDd,qBAApD,mBAAOe,EAAP,KAA2BC,EAA3B,KACA,EAAuEjB,GAJ9C,wBAIzB,mBAAOE,EAAP,KAAsCE,EAAtC,KAkCA,OAhCAc,qBAAU,WACN,IAAMC,EAA6B,SAAC5gB,GAChCA,EAAMkM,iBAGFyT,GAEAe,EAAsB1gB,IAI9B,OADAjR,OAAO8xB,iBAAiB,sBAAuBD,GACxC,kBAAM7xB,OAAO+xB,oBAAoB,sBAAuBF,MAChE,CAACjB,IAoBG,CAACc,EAlBsB,WAC1BZ,IACAa,EAAsB,OAGI,WAE1BD,EAAmBM,SAGnBN,EAAmBO,WAAWniB,MAAK,SAACoiB,GAET,aAAnBA,EAAOC,SACPrB,IAEJa,EAAsB,WD5BiDS,GAA/E,mBAAOC,EAAP,KAAyBC,EAAzB,KAAmDC,EAAnD,KAEA,EAAiCl3B,aAAe,GAAhD,mBAAOm3B,EAAP,KAAiBC,EAAjB,KAEQj3B,EAAMC,cAAND,EAGR,OAAKg2B,GAAqBa,EAKtBG,EACO,KAIP,cAAC9d,GAAA,EAAD,CAAMpX,MAAM,OAAOf,UAAU,qBAA7B,SACI,eAACwyB,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAWzyB,UAAU,cAArB,SACI,qBAAKA,UAAU,iCAAf,SACI,sBAAMA,UAAU,UAAhB,SACKf,EAAE,iCAAkC,uBAIjD,4BACKA,EAAE,wBAAyB,sJAI5Bg2B,EACI,qCACI,eAACkB,GAAA,EAAD,CAAUn2B,UAAU,cAApB,UACKf,EAAE,yCAA0C,QAC7C,qBACIm3B,MAAM,6BACNp2B,UAAU,oCACVq2B,QAAQ,cAHZ,SAKI,oBAAGC,KAAK,eAAR,UACI,sBAAMC,EAAE,0EACR,sBAAMA,EAAE,oDAGft3B,EAAE,wCAAyC,iCAEhD,qBAAKe,UAAU,gCAAf,SACI,cAACc,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,WACrCgtB,IACAgB,KAFJ,SAIKj3B,EAAE,eAAgB,gBAK3B,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,IAEA,cAACA,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC7N,EAAA,EAAD,CAAQC,MAAM,UAAUmH,QAAS8tB,EAAjC,SACK/2B,EAAE,2BAA4B,eAGvC,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC7N,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,WACrC6tB,IACAG,KAFJ,SAIKj3B,EAAE,eAAgB,qBA9D5C,OE+BR,I,GAAMu3B,GAAe,SAAChxB,GAA8B,IAAD,UAC9CixB,EAAwBjxB,EAAxBixB,oBAEAx3B,EAAMC,cAAND,EAIqBy3B,EACzBhO,cADAiO,wBAEJ,EAA8Dx4B,WAAmCu4B,GAAjG,mBAAOC,EAAP,KAAgCC,EAAhC,KAGA,EAAwCz4B,YAAuB,kBAAMqf,OAAS6P,QAAQ,YAAtF,mBAAOwJ,EAAP,KAAqBC,EAArB,KAGA,EC3CG,WAAqI,IAAD,EAAlG54B,EAAkG,uDAAjD,GAEtF,EAAmDsZ,aAC/CpF,aAD2D,iwBAwBzDye,GACAA,GACAC,GACAG,GACAF,GACAC,IAEF,CAEIvZ,UAAW,CACPsf,SAAU74B,EAAQ64B,SAClBC,OAAQ94B,EAAQ84B,QAEpBtf,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAzCpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAgDrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDpBoI47B,GAAjK,IAAQp6B,KAAmBq6B,EAA3B,EAAgBhJ,UAAuBiJ,EAAvC,EAAuCA,eAAgBC,EAAvD,EAAuDA,oCAAqCC,EAA5F,EAA4FA,kBAAmBC,EAA/G,EAA+GA,aAAgBjzB,EAA/H,EAA+HA,UAAmB6T,EAAlJ,EAA0IlT,OAC1I,EElDG,WAA0H,IAAD,EAAlF9G,EAAkF,uDAAtD,GAEtE,EAAkDsZ,aAC9CpF,aAD0D,0hBAoBxDsgB,GACA9W,GACA+W,GACAC,IAEF,CACInb,UAAW,GAEXC,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAhCpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAuCrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IFJ8Ek8B,GAA3G,IAAQ16B,KAAQ26B,EAAhB,EAAgBA,mBAAoBC,EAApC,EAAoCA,SAAU7H,EAA9C,EAA8CA,UAAWwB,EAAzD,EAAyDA,UAAqBrI,EAA9E,EAAsE/jB,OAG/C0yB,EGtDpB,WAA4G,IAAD,QAAhFx5B,EAAgF,uDAA/C,GAE/D,EAAiFsZ,aAC7EpF,aADyF,8PAQvFC,IAEF,CAEIoF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,UAEnBtE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MApBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA2B9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IHJEgc,GAAzC96B,KAAQ+d,MAGhB,EAA4BvT,KAA5B,mBAAO6E,EAAP,KAAe8e,EAAf,KAGA,EN7DG,WACH,MAA0BzmB,yBAAe+uB,IAAzC,mBAAO3qB,EAAP,KAAcivB,EAAd,KAaA,MAAO,CAZSz5B,eAAkB,SAACuc,GAAD,QAAkB/R,EAAM1C,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAK,CAAC/R,IAC/DxK,eAAkB,SAACuc,GAClCkd,GAAS,SAAAjzB,GAEL,OADiBA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KAElC/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAGnC,GAAN,oBAAW/V,GAAX,CAAsB+V,SAE3B,CAACkd,KMiDmDC,GAAvD,oBAAOC,GAAP,MAA4BC,GAA5B,MACA,GP9DG,WACH,MAA0BxzB,yBAAe8uB,IAAzC,mBAAO1qB,EAAP,KAAcivB,EAAd,KAaA,MAAO,CAZSz5B,eAAkB,SAACuc,GAAD,QAAkB/R,EAAM1C,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAK,CAAC/R,IAC/DxK,eAAkB,SAACuc,GAClCkd,GAAS,SAAAjzB,GAEL,OADiBA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KAElC/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAGnC,GAAN,oBAAW/V,GAAX,CAAsB+V,SAE3B,CAACkd,KOkDuDI,GAA3D,qBAAOC,GAAP,MAA8BC,GAA9B,MACA,GL/DG,WACH,MAA0B3zB,yBAAegvB,IAAzC,mBAAO5qB,EAAP,KAAcivB,EAAd,KAaA,MAAO,CAZSz5B,eAAkB,SAACuc,GAAD,QAAkB/R,EAAM1C,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAK,CAAC/R,IAC/DxK,eAAkB,SAACuc,GAClCkd,GAAS,SAAAjzB,GAEL,OADiBA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KAElC/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAGnC,GAAN,oBAAW/V,GAAX,CAAsB+V,SAE3B,CAACkd,KKmDqDO,GAAzD,qBAAOC,GAAP,MAA6BC,GAA7B,MAGMC,GAAqBn6B,WAAc,WACrC,GAAK+4B,EAeL,OAXYA,EAAW96B,KAAI,SAAA2N,GAAI,OIrEhC,SAA+CyiB,EAAiC+L,GASpD,IAAD,MAE1BpB,EAQAoB,EARApB,eACAqB,EAOAD,EAPAC,2BACAnB,EAMAkB,EANAlB,kBACAC,EAKAiB,EALAjB,aACAlG,EAIAmH,EAJAnH,UACAqH,EAGAF,EAHAE,WACAhB,EAEAc,EAFAd,SACAiB,EACAH,EADAG,eAGE3K,EAAa,OAAGoJ,QAAH,IAAGA,OAAH,EAAGA,EAAgBlxB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAO8R,EAASmF,mBAC9D3D,EAAS,OAAGyK,QAAH,IAAGA,OAAH,EAAGA,EAAYxyB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,MAAH,OAAUqT,QAAV,IAAUA,OAAV,EAAUA,EAAe4K,wBAC5DC,EAA4B,iBAAGJ,QAAH,IAAGA,OAAH,EAAGA,EAA4Bh8B,QAAO,SAAA0J,GAAE,OAAIA,EAAGyrB,mBAAH,OAAuB5D,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAerT,cAAlF,QAAyF,GACrHme,EAAmB,iBAAGxB,QAAH,IAAGA,OAAH,EAAGA,EAAmB76B,QAAO,SAAA0J,GAAE,OAAIA,EAAGyrB,mBAAH,OAAuB5D,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAerT,cAAzE,QAAgF,GACnGoe,EAAc,iBAAGxB,QAAH,IAAGA,OAAH,EAAGA,EAAc96B,QAAO,SAAA0J,GAAE,OAAIA,EAAG6yB,YAAH,OAAgBhL,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAerT,cAA7D,QAAoE,GAClF4W,EAAkB,OAAGoH,QAAH,IAAGA,OAAH,EAAGA,EAAgBzyB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,MAAH,OAAUqT,QAAV,IAAUA,OAAV,EAAUA,EAAe0C,yBAE/E,OAAO,2BACAjE,GADP,IAEIuB,cAAgBA,EAAD,2BACRA,GADQ,IAEXqD,UAAWwH,EAA6Bx8B,KAAI,SAAA2N,GACxC,IAAMjI,EAAQ,OAAGsvB,QAAH,IAAGA,OAAH,EAAGA,EAAWnrB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAO3Q,EAAKivB,2BAChDC,EAAK,OAAGP,QAAH,IAAGA,OAAH,EAAGA,EAAgBzyB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,MAAH,OAAU5Y,QAAV,IAAUA,OAAV,EAAUA,EAAU2uB,yBAC7D,OAAO,2BACA1mB,GADP,IAEIjI,SAAWA,EAAD,2BACHA,GADG,IAENwvB,mBAAoB2H,SAFHh/B,OAM7Bi/B,SAAUJ,EAAe18B,KAAI,SAAA2N,GACzB,IAAMmvB,EAAQ,OAAGzB,QAAH,IAAGA,OAAH,EAAGA,EAAUxxB,MAAK,SAAAC,GAAE,OAAIA,EAAGwU,KAAO3Q,EAAKovB,aACrD,OAAO,2BACApvB,GADP,IAEIqvB,QAASF,OAGjBpkB,KAAM+jB,EACN7K,UAAWA,EACXsD,mBAAoBA,SAtBOr3B,IJuCIo/B,CAC/BtvB,EAAM,CACFotB,iBACAqB,2BAA4BpB,EAC5BC,oBACAC,eACAmB,WAAYjB,EACZpG,YACAqG,WACAiB,eAAgBhB,SAGzB,CAACR,EAAYC,EAAgBC,EAAqCC,EACjEC,EAAcE,EAAoBpG,EAAWqG,EAAUC,IAGrDxJ,GAAY/vB,WAAc,WAC5B,IAAKm6B,GACD,OAAOA,GAGX,IAAIjuB,EAAMiuB,GAGV,GAAIpsB,EAAQ,CACR,IAAMmf,EAAcnf,EAAOof,oBAC3BjhB,EAAMA,EAAI7N,QAAO,SAAAuN,GAAI,6BACjBwiB,GAAoBxiB,GAAMuhB,oBAAoBpS,QAAQmS,IAAgB,IACnE,oBAACthB,EAAKgkB,qBAAN,aAAC,EAAoBluB,YAArB,QAA6B,IAAIyrB,oBAAoBpS,QAAQmS,IAAgB,IAC7E,oBAACthB,EAAKgkB,qBAAN,iBAAC,EAAoBC,iBAArB,aAAC,EAA+BnuB,YAAhC,QAAwC,IAAIyrB,oBAAoBpS,QAAQmS,IAAgB,IACxF,oBAACthB,EAAKgkB,qBAAN,aAAC,EAAoBqD,iBAArB,QAAkC,IAAI50B,QAAO,SAAA0J,GAAE,eAAI,oBAACA,EAAGpE,gBAAJ,aAAC,EAAajC,YAAd,QAAsB,IAAIyrB,oBAAoBpS,QAAQmS,IAAgB,KAAG5uB,SAC5H,oBAACsN,EAAKgkB,qBAAN,aAAC,EAAoBmL,gBAArB,QAAiC,IAAI18B,QAAO,SAAA0J,GAAE,eAAI,oBAACA,EAAGkzB,eAAJ,aAAC,EAAYv5B,YAAb,QAAqB,IAAIyrB,oBAAoBpS,QAAQmS,IAAgB,KAAG5uB,UAiDrI,OA5CA4N,EAAMA,EAAI7N,QAAO,SAAAuN,GAAS,IAAD,YAErB,GAAI+tB,GAAmB,oBAAC/tB,EAAKgkB,qBAAN,aAAC,EAAoB4K,2BAArB,QAA4C,IAC/D,OAAO,EAKX,IAAMW,GAAkB,oBAACvvB,EAAKgkB,qBAAN,aAAC,EAAoBmL,gBAArB,QAAiC,IAAI18B,QAAO,SAAA0J,GAAE,YAA4B,gBAAxB,UAAAA,EAAGkzB,eAAH,eAAYld,YACtF,GAAIod,EAAgB78B,OAAQ,CACxB,IADwB,EACpB88B,EAAmB,EADC,cAELD,GAFK,IAExB,2BAAoC,CAAC,IAAD,IAAzBE,EAAyB,QAC3BpB,GAAoB,oBAACoB,EAAKJ,eAAN,aAAC,EAAc1e,UAAf,QAAqB,OACxC6e,GAJc,8BASxB,GAAIA,GAAoB,EACpB,OAAO,EAMf,IAAME,GAAmB,oBAAC1vB,EAAKgkB,qBAAN,aAAC,EAAoBmL,gBAArB,QAAiC,IAAI18B,QAAO,SAAA0J,GAAE,YAA4B,iBAAxB,UAAAA,EAAGkzB,eAAH,eAAYld,YACvF,GAAIud,EAAiBh9B,OAAQ,CACzB,IADyB,EACrB88B,EAAmB,EADE,cAENE,GAFM,IAEzB,2BAAqC,CAAC,IAAD,IAA1BD,EAA0B,QAC5BvB,GAAqB,oBAACuB,EAAKJ,eAAN,aAAC,EAAc1e,UAAf,QAAqB,OACzC6e,GAJe,8BASzB,GAAIA,GAAoB,EACpB,OAAO,EAKf,OAAO,OAIZ,CAACjB,GAAoBpsB,EAAQksB,GAAsBH,GAAuBH,KAG7E,GAAqF35B,WAAc,WAC/F,IAAK+vB,GACD,MAAO,CACHA,UAAW,GACXwL,gBAAiB,EACjBC,kBAAmB,GAI3B,IATqG,EASjGtvB,EAGC,GACDqvB,EAA0B,EAC1BC,EAA4B,EAE1BtL,EAAQ7Q,OAAS6P,QAAQ,OAAO5P,cAhB+D,cAkB9EyQ,IAlB8E,yBAkB1F1B,EAlB0F,QAmB3F+C,EAAa/R,KAAOgP,EAASM,OAAOO,QAAQ,SAC5CuM,EAAWpc,KAAOgP,EAASM,OAAOO,QAAQ,OAG5CwM,EAAaxvB,EAAIpE,MAAK,SAAAC,GAAE,OAAIA,EAAGqpB,WAAW9R,gBAAkB8R,EAAW9R,iBACtEoc,IACDA,EAAa,CAAEtK,WAAYA,EAAYuK,KAAM,IAC7CzvB,EAAIrO,KAAK69B,IAIb,IAAIE,EAAWF,EAAWC,KAAK7zB,MAAK,SAAAC,GAAE,OAAIA,EAAGwmB,KAAKjP,gBAAkBmc,EAASnc,iBACxEsc,IACDA,EAAW,CACPrN,KAAMkN,EACNlL,OAASkL,EAASnc,cAAgB4Q,EAClCzT,MAAO,IAEXif,EAAWC,KAAK99B,KAAK+9B,IAGzBA,EAASnf,MAAM5e,KAAKwwB,GAGhBuN,EAASrL,SACPgL,IAEAC,GA5BV,2BAAmC,IAlBkE,8BAkDrG,MAAO,CACHzL,UAAW7jB,EACXqvB,kBACAC,uBAEL,CAACzL,KAvDe8L,GAAnB,GAAQ9L,UAAqCwL,GAA7C,GAA6CA,gBAAiBC,GAA9D,GAA8DA,kBA2DxDM,GAAoB97B,WAAc,WACpC,IAAK+vB,GACD,MAAO,GAGX,IAL0C,EAKpCgM,EAAY1c,OAAS6P,QAAQ,QAC7B8M,EAAU3c,OAASoQ,IAAI,EAAG,QAE5BvjB,EAA4E,GARtC,cAUnB6jB,IAVmB,yBAU/B1B,EAV+B,QAWhCE,EAAOlP,KAAOgP,EAASM,OAAOO,QAAQ,OAE5C,GAAIX,EAAOwN,GAAaxN,GAAQyN,EAC5B,iBAGJ,IAAIC,EAAQ/vB,EAAIpE,MAAK,SAAAC,GAAE,OAAIA,EAAGwmB,KAAKjP,gBAAkBiP,EAAKjP,iBACrD2c,IACDA,EAAQ,CAAE1N,KAAMA,EAAM9R,MAAO,IAC7BvQ,EAAIrO,KAAKo+B,IAGbA,EAAMxf,MAAM5e,KAAKwwB,IAbrB,2BAAkC,IAVQ,8BA0B1C,OAAOniB,IACR,CAAC6jB,KAGEmM,GAAoBl8B,WAAc,WACpC,IAAK+vB,GACD,MAAO,GAGX,IAL0C,EAKpCoM,EAAc9c,OAAS+P,MAAM,QAC7BgN,EAAe/c,OAAS6P,QAAQ,OAAOO,IAAI,EAAG,SAEhDvjB,EAA4E,GAG1EmwB,EAAqBtM,GAAU1xB,QAAO,SAAAuN,GAAI,uBAAIA,EAAKgkB,qBAAT,aAAI,EAAoB0M,cAX9B,cAcnBD,GAdmB,yBAc/BhO,EAd+B,QAehCE,EAAOlP,KAAOgP,EAASM,OAAOO,QAAQ,OAE5C,GAAIX,EAAO4N,GAAe5N,GAAQ6N,EAC9B,iBAGJ,IAAIH,EAAQ/vB,EAAIpE,MAAK,SAAAC,GAAE,OAAIA,EAAGwmB,KAAKjP,gBAAkBiP,EAAKjP,iBACrD2c,IACDA,EAAQ,CAAE1N,KAAMA,EAAM9R,MAAO,IAC7BvQ,EAAIrO,KAAKo+B,IAGbA,EAAMxf,MAAM5e,KAAKwwB,IAbrB,2BAA2C,IAdD,8BA8B1C,OAAOniB,IACR,CAAC6jB,KAGJ,GAA4DpvB,cAAiB63B,GAA7E,qBAAO+D,GAAP,MAAiCC,GAAjC,MACMryB,GAAUC,cAChB,GAA8BwqB,KAAvB6H,GAAP,qBACMC,GAAY18B,eAAkB,SAACquB,GACjCoK,EAA2BpK,EAAS9R,IACpCigB,IAAwB,GACxBryB,GAAQtM,KAAKm2B,GAA8B3F,IAG3CoO,GAAoB,CAChBlgB,GAAIxG,KAAKC,UACT6Z,UAAW,oBACX2I,wBAAyBnK,EAAS9R,GAClCiX,gBAAiBnF,EAASmF,oBAE/B,CAACiF,EAA4B+D,GAAyBryB,GAASsyB,KAC5DE,GAAa38B,eAAkB,WACjCw8B,IAAwB,GACxBryB,GAAQtM,KAAKm2B,QAA8Bl4B,MAC5C,CAAC0gC,GAAyBryB,KAG7B,GAA8EnK,WAAmCw4B,GAAjH,qBAAOoE,GAAP,MAAwCC,GAAxC,MACA78B,aAAgB,WAERw4B,IAA4BoE,KAKhCJ,IAAyBj2B,4BAAkBiyB,IAC3CqE,GAAmCrE,MACpC,CAACA,EAAyBoE,GAAiCC,GAAoCL,KAElG,IAAMM,GAAkB,OAAG/M,SAAH,IAAGA,QAAH,EAAGA,GAAWjoB,MAAK,SAAA8D,GAAI,OAAIA,EAAK2Q,KAAOic,KAG/D,GRtTG,WACH,MAA0BpyB,yBAAe4uB,IAAzC,mBACA,MAAO,CADP,WQqT0C+H,GAA1C,qBAAOC,GAAP,MAAsBC,GAAtB,MACA,GAA4Dj9B,aAA0Bs4B,GAAtF,qBAAO4E,GAAP,MAA+BC,GAA/B,MACMxL,GAAe2G,GAAuB4E,GAAyB5E,EAAsB0E,GACrFI,GAAkBp9B,eAAkB,SAAAwK,GACtC2yB,IAA0B,GAC1BF,GAAiBzyB,KAClB,CAACyyB,GAAkBE,KAGtB,GAAiEx8B,aAAe,GAAhF,qBAAO08B,GAAP,MAAiCC,GAAjC,MAGMC,GAA6Bv9B,WAAc,WAC7C,OAAQ04B,EAAaxJ,QAAQ,SAAS5P,gBAAkBD,OAAS6P,QAAQ,SAAS5P,gBACnF,CAACoZ,IAGJ,GAAqC/3B,aAAe,GAApD,qBAAO68B,GAAP,MAAqBC,GAArB,MACMC,GAAgB19B,WAAc,WAAO,IAAD,oBAEtC,MAAO,CACH29B,mBAAkB,iBAAEtE,QAAF,IAAEA,OAAF,EAAEA,EAAoBh7B,QAAO,SAAA0J,GAAE,OAAK4xB,GAAoB5xB,EAAGwU,cAA3D,QAAmE,GACrFqhB,mBAAkB,iBAAEvE,QAAF,IAAEA,OAAF,EAAEA,EAAoBh7B,QAAO,SAAA0J,GAAE,OAAI4xB,GAAoB5xB,EAAGwU,cAA1D,QAAkE,GACpFshB,oBAAmB,iBAAEvE,QAAF,IAAEA,GAAF,UAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,eAAfA,EAAGgW,kBAA5B,aAAE,EAAqD1f,QAAO,SAAA0J,GAAE,OAAKkyB,GAAqBlyB,EAAGwU,cAA7F,QAAqG,GACxHuhB,oBAAmB,iBAAExE,QAAF,IAAEA,GAAF,UAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,eAAfA,EAAGgW,kBAA5B,aAAE,EAAqD1f,QAAO,SAAA0J,GAAE,OAAIkyB,GAAqBlyB,EAAGwU,cAA5F,QAAoG,GACvHwhB,qBAAoB,iBAAEzE,QAAF,IAAEA,GAAF,UAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,gBAAfA,EAAGgW,kBAA5B,aAAE,EAAsD1f,QAAO,SAAA0J,GAAE,OAAK+xB,GAAsB/xB,EAAGwU,cAA/F,QAAuG,GAC3HyhB,qBAAoB,iBAAE1E,QAAF,IAAEA,GAAF,UAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,gBAAfA,EAAGgW,kBAA5B,aAAE,EAAsD1f,QAAO,SAAA0J,GAAE,OAAI+xB,GAAsB/xB,EAAGwU,cAA9F,QAAsG,MAE/H,CAACud,GAAuBG,GAAsBN,GAAqBN,EAAoBC,IAG1F,OACI,sBAAKz3B,UAAU,gBAAf,UACI,eAAC,GAAD,CAAee,MAAM,cAAckI,OAAK,EAAxC,UACI,cAAC,GAAD,CAAejE,OAAQ,CAACkT,EAAY6Q,KACpC,eAACta,GAAA,EAAD,WACI,eAACC,GAAA,EAAD,WACI,eAAC,GAAD,WACI,eAACD,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,+BAEQxC,EACI,qCACKjN,EAAE,mCAAoC,iCAAkC,CAAEiN,WAC3E,4CAGI,mCACCjN,EAAE,0BAA2B,sBAK9C,yCACA,eAAC0sB,GAAA,EAAD,CAAa3rB,UAAU,+CAAvB,UACI,eAACc,EAAA,EAAD,CAAQnB,KAAK,KAAKoB,MAAM,YAAYf,UAAU,GAAGkI,QAAS,kBAAM0zB,MAAhE,UACI,+BAEQC,GAAcC,mBAAmBr/B,OAAS,GAAiD,IAA5Co/B,GAAcE,mBAAmBt/B,OAAewC,EAAE,2CAA4C,wBAC3F,IAA5C48B,GAAcC,mBAAmBr/B,OAAewC,EAAE,0CAA2C,gCACjD,IAA5C48B,GAAcC,mBAAmBr/B,OAAewC,EAAE,2CAA4C,4BAA6B,CAAEY,KAAI,UAAEg8B,GAAcC,mBAAmB,GAAGj8B,YAAtC,QAA8C,KAC3KZ,EAAE,gDAAiD,mCAAoC,CAAE8sB,MAAO8P,GAAcC,mBAAmBr/B,WAGnJ,+BAEQo/B,GAAcG,oBAAoBv/B,OAAS,GAAkD,IAA7Co/B,GAAcI,oBAAoBx/B,OAAewC,EAAE,4CAA6C,sBAC7F,IAA7C48B,GAAcG,oBAAoBv/B,OAAewC,EAAE,2CAA4C,8BAClD,IAA7C48B,GAAcG,oBAAoBv/B,OAAewC,EAAE,4CAA6C,0BAA2B,CAAEY,KAAI,UAAEg8B,GAAcG,oBAAoB,GAAGn8B,YAAvC,QAA+C,KAC5KZ,EAAE,iDAAkD,gCAAiC,CAAE8sB,MAAO8P,GAAcG,oBAAoBv/B,WAGlJ,+BAEQo/B,GAAcK,qBAAqBz/B,OAAS,GAAmD,IAA9Co/B,GAAcM,qBAAqB1/B,OAAewC,EAAE,6CAA8C,cAC/F,IAA9C48B,GAAcK,qBAAqBz/B,OAAewC,EAAE,4CAA6C,sBACnD,IAA9C48B,GAAcK,qBAAqBz/B,OAAewC,EAAE,6CAA8C,kBAAmB,CAAEY,KAAI,UAAEg8B,GAAcK,qBAAqB,GAAGr8B,YAAxC,QAAgD,KACvKZ,EAAE,kDAAmD,+BAAgC,CAAE8sB,MAAO8P,GAAcK,qBAAqBz/B,WAInJ,yCACA,cAAC,IAAD,CAAiB8D,KAAMo7B,GAAe,WAAa,eACnD,sBAAM37B,UAAU,UAAhB,SACKf,EAAE,4BAA6B,sBAGxC,cAAC,IAAD,CAAqB0B,SAAUuL,EAA/B,SACI,eAACpL,EAAA,EAAD,CAAQnB,KAAK,KAAKoB,MAAM,SAASmH,QAAS,kBAAM8iB,EAAU,KAA1D,UACI,cAAC,IAAD,CAAiBzqB,KAAK,UAAU,yCAC/BtB,EAAE,sCAAuC,6BAM9D,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,WAG/B,eAAC+O,GAAA,EAAD,CAAKC,GAAG,KAAK6R,GAAG,OAAOxgB,UAAU,aAAjC,UACI,cAAC,IAAD,CAAqBW,OAAyB,aAAjBmvB,KAAgC4L,GAA7D,SACI,eAAC56B,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAAC9a,UAAU,OAAOkI,QAAS,kBAAM4uB,EAAgBtZ,OAAS6P,QAAQ,SAAjG,UACI,cAAC,IAAD,CAAiB9sB,KAAK,iBAAiB,yCACtCtB,EAAE,yBAA0B,oBAGrC,eAAC0sB,GAAA,EAAD,CAAa3rB,UAAU,OAAvB,UACI,eAACc,EAAA,EAAD,CAAQga,QAA0B,aAAjBgV,GAA6B5nB,QAAS,kBAAMqzB,GAAgB,aAA7E,UACI,cAAC,IAAD,CAAiBh7B,KAAM,CAAC,MAAO,kBAAmB,yCACjDtB,EAAE,8BAA+B,eAEtC,eAAC6B,EAAA,EAAD,CAAQga,QAA0B,SAAjBgV,GAAyB5nB,QAAS,kBAAMqzB,GAAgB,SAAzE,UACI,cAAC,IAAD,CAAiBh7B,KAAM,CAAC,MAAO,cAAe,yCAC7CtB,EAAE,0BAA2B,oBAK9C,cAACm9B,GAAA,EAAD,CAAU78B,OAAQo8B,GAAlB,SACI,eAACxjB,GAAA,EAAD,CAAM/V,MAAI,EAACpC,UAAU,sCAArB,UACI,eAACyO,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGmQ,GAAI,EAAxB,SACK1xB,EAAE,iCAAkC,qBAEzC,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,CAAmBkM,MAAK,OAAE4c,QAAF,IAAEA,IAAsB,GAAI3c,WAAY,SAAAH,GAAE,OAAKod,GAAoBpd,IAAKlb,OAAQ,SAAAkb,GAAE,OAAIqd,GAAwBrd,WAG9I,eAACjM,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGmQ,GAAI,EAAxB,SACK1xB,EAAE,kCAAmC,kBAE1C,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,CAAakM,MAAK,iBAAE6c,QAAF,IAAEA,OAAF,EAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,eAAfA,EAAGgW,kBAA5B,QAAyD,GAAIrB,WAAY,SAAAH,GAAE,OAAK0d,GAAqB1d,IAAKlb,OAAQ,SAAAkb,GAAE,OAAI2d,GAAyB3d,WAG3K,eAACjM,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAI,EAAGmQ,GAAI,EAAxB,SACK1xB,EAAE,kCAAmC,mBAE1C,cAACyP,GAAA,EAAD,UACI,cAAC,GAAD,CAAakM,MAAK,iBAAE6c,QAAF,IAAEA,OAAF,EAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,gBAAfA,EAAGgW,kBAA5B,QAA0D,GAAIrB,WAAY,SAAAH,GAAE,OAAKud,GAAsBvd,IAAKlb,OAAQ,SAAAkb,GAAE,OAAIwd,GAA0Bxd,mBAO1L,eAAC,IAAD,CAAqB/Z,OAAyB,aAAjBmvB,GAA7B,UACI,cAAC,GAAD,CACIpD,KAAMmK,EAAclH,WAAY,SAACjD,GAAD,OAAUoK,EAAgBpK,IAC1DkD,UAAS,OAAEA,QAAF,IAAEA,IAAa,GACxBC,OAAM,OAAE6H,QAAF,IAAEA,IAAuB,GAC/B5H,aAAcA,KAElB,cAAC,GAAD,CAAepD,KAAMmK,EAAc3I,UAAWA,GAAWC,aAAc,SAAA3B,GAAQ,OAAIqO,GAAUrO,SAGjG,eAAC,IAAD,CAAqB7rB,OAAyB,SAAjBmvB,GAA7B,UACI,cAAC,IAAD,CAAqBnvB,OAAQ+4B,GAAkB,EAA/C,SACI,sBAAK15B,UAAU,+CAA+CkI,QAAS,kBAAMuzB,MAA7E,UAEQD,GACIv8B,EAAE,kCAAmC,mGAAqG,CAAE8sB,MAAO2N,KACjJz6B,EAAE,kCAAmC,qIAAuI,CAAE8sB,MAAO2N,KAE/L,yCACA,cAAC,IAAD,CAAiBn5B,KAAMi7B,GAA0B,WAAY,oBAKjExB,GAAyB59B,KAAI,SAAAigC,GAAU,IAAD,EAElC,OAAKb,IAA6Ba,EAAMvC,KAAKt9B,QAAO,SAAAwyB,GAAG,OAAKA,EAAIN,UAAQjyB,OAKpE,eAAC,WAAD,WACI,cAAC,GAAD,CACIiwB,KAAM2P,EAAM9M,WAAYI,WAAY,SAACjD,GAAD,OAAUoK,EAAgBpK,IAC9DkD,UAAS,OAAEA,QAAF,IAAEA,IAAa,GACxBC,OAAM,OAAE6H,QAAF,IAAEA,IAAuB,GAC/B5H,aAAcA,KAElB,qBAAK9vB,UAAU,SAPnB,UAWQq8B,EAAMvC,YAXd,aAWQ,EAAY19B,KAAI,SAAA4yB,GAEZ,OAAKwM,IAA4BxM,EAAIN,OAC1B,KAIP,cAAC,GAAD,CAA8ChC,KAAMsC,EAAItC,KAAxD,SACI,cAAC4P,GAAA,EAAD,CAAWC,OAAK,EAAhB,SAEQvN,EAAIpU,MAAMxe,KAAI,SAAA2N,GAAI,OACd,cAAC,GAAD,CAAqC2iB,KAAMsC,EAAItC,KAAMF,SAAUziB,EAC3D7B,QAAS,kBAAM2yB,GAAU9wB,KADDA,EAAK2Q,UAJ3BsU,EAAItC,KAAKjP,oBAlB1B4e,EAAM9M,WAAW9R,eAJ/B,QAyCnB,cAAC,IAAD,CAAqB9c,QAAS0D,IAAcs1B,GAA5C,UAEQ,OAACK,SAAD,IAACA,QAAD,EAACA,GAA0Bv9B,SAWpB++B,IAAkD,IAAtB7B,IAA2BD,GAAkB,EACxE,eAAC,GAAD,CAAgBxtB,OAAQA,EAAQ3L,KAAM,CAAC,MAAO,kBAA9C,UACI,4BAEQ2L,EACIjN,EAAE,0CAA2C,2EAA4E,CAAEytB,KAAMmK,EAAc3qB,OAAQA,IACrJjN,EAAE,kCAAmC,mDAAoD,CAAEytB,KAAMmK,MAG/G,4BACI,cAAC/1B,EAAA,EAAD,CAAQnB,KAAK,KAAKuI,QAAS,kBAAMuzB,MAAjC,SACKx8B,EAAE,0CAA2C,4CAA6C,CAAE0J,MAAO+wB,YAK9G,KA1BN,cAAC,GAAD,CAAgBxtB,OAAQA,EAAQ3L,KAAM,CAAC,MAAO,kBAA9C,SACI,4BAEQ2L,EACIjN,EAAE,oCAAqC,mEAAoE,CAAEytB,KAAMmK,EAAc3qB,OAAQA,IACvIjN,EAAE,4BAA6B,4CAA6C,CAAEytB,KAAMmK,gBA2B1H,eAACnoB,GAAA,EAAD,CAAKC,GAAI,GAAIgiB,GAAI,EAAGlQ,GAAI,EAAxB,UACI,6BACKxhB,EAAE,8BAA+B,eAIlCg7B,GAAkB79B,KAAI,SAAA4yB,GAAG,OACrB,cAAC,GAAD,CAA8CtC,KAAMsC,EAAItC,KACpD6F,MAAOtzB,EAAE,mCAAoC,oBAAqB,CAAEytB,KAAMsC,EAAItC,OADlF,SAGI,cAAC4P,GAAA,EAAD,CAAWC,OAAK,EAAhB,SAEQvN,EAAIpU,MAAMxe,KAAI,SAAA2N,GAAI,OACd,cAAC,GAAD,CAAqC2iB,KAAMsC,EAAItC,KAAMF,SAAUziB,EAC3D7B,QAAS,kBAAM2yB,GAAU9wB,KADDA,EAAK2Q,UAN3BsU,EAAItC,KAAKjP,kBAgBvC,6BACKxe,EAAE,+BAAgC,gBAGnCo7B,GAAkBj+B,KAAI,SAAA4yB,GAAG,OACrB,cAAC,GAAD,CAA8CtC,KAAMsC,EAAItC,KACpD6F,MAAOtzB,EAAE,oCAAqC,oBAAqB,CAAEytB,KAAMsC,EAAItC,OADnF,SAGI,cAAC4P,GAAA,EAAD,CAAWC,OAAK,EAAhB,SAEYvN,EAAIpU,MAAMxe,KAAI,SAAA2N,GAAI,OACd,cAAC,GAAD,CAAqC2iB,KAAMsC,EAAItC,KAAMF,SAAUziB,EAC3D7B,QAAS,kBAAM2yB,GAAU9wB,KADDA,EAAK2Q,UAN/BsU,EAAItC,KAAKjP,2BAkBnD,cAAC,IAAD,CAAqB9c,OAAQ+5B,MAA8BO,GAA3D,SACI,cAAC,GAAD,CACI17B,OAAQm7B,GAA0Bl7B,OAAQ,kBAAMs7B,MAChDp4B,MAAOu4B,OAIf,cAAC,GAAD,QKvnBCuB,GAAoC,CAC7C,CAAEvyB,KAAM,gCAAiCzD,UCGf,WAC1B,IACI4B,EACAsgB,cADAtgB,WAEJ,EAAgCf,KAAvBo1B,EAAT,oBAQA,OALAt+B,aAAgB,WACZs+B,EAAmB,OAACr0B,QAAD,IAACA,IAAc,MACnC,CAACA,EAAYq0B,IAGR,cAAC,GAAD,CAAchG,oBAAoB,UDf0BzsB,WAAW,GAC/E,CAAEC,KAAM,yDAA0DnD,OAAO,EAAMN,UAAWgwB,GAAcxsB,WAAW,I,oBEQ1G0yB,GAAe,SAACl3B,GACzB,IAAQzE,EAA4ByE,EAA5BzE,MAAOf,EAAqBwF,EAArBxF,UAAWyH,EAAUjC,EAAViC,MAClBxI,EAAMC,cAAND,EAER,OACI,qBAAKe,UAAS,+BAAmBA,QAAnB,IAAmBA,IAAa,IAAMyH,MAAK,kCAAQA,QAAR,IAAQA,IAAS,IAAjB,IAAsBylB,gBAAiBnsB,IAAhG,SACI,sBAAMf,UAAU,UAAhB,SACIe,EAAQ9B,EAAE,qBAAsB,oBAAqB,CAAE8B,UACjD9B,EAAE,uBAAwB,kBCRzC,SAAS09B,GAAqBjiB,GAAyG,IAAD,EAAzExc,EAAyE,uDAA7C,GAE5F,EAAkDsZ,aAC9CpF,aAD0D,+NAQxDsgB,IAEF,CACIjb,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAlBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAyBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IC3C1B,SAASuhC,KACZ,MAAoCtgB,aAChClK,aAD2C,qSAQrCsgB,KARV,mBAAOnW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASqgB,KACZ,MAAoCvgB,aAChClK,aAD2C,qSAQrCsgB,KARV,mBAAOnW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICHzE,I,GAKMsgB,GAAwB,SAACt3B,GAAuC,IAAD,MAChE0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAuE09B,GADxDjU,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAA8BiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,GAAIk9B,aAAc,GAAIh8B,MAAO,WAAc,IAAvJ2B,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EC/BG,WAAwG,IAA9DpR,EAA6D,uDAAJ,GACtG,EAAgC0+B,KAAhC,mBAAOjY,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAuCiiB,EAAQjiB,KAAwC,CAACiiB,IAEzH,EAAgCkY,KAAhC,mBAAOhY,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAqDuV,EAAQnK,EAAIpL,KAA0C,CAACuV,IAE7I,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GDqBmC8+B,GAAvC,mBAAO3Y,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAEhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAAqE,GAA9DZ,EAAE,qCAAsC,sBAGvE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,sCAAuC,oBAExC,mCAAGA,EAAE,oCAAqC,yBAK9D,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,KAEpD,eAAC7D,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,6BAA8B,UACvD,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,eAAf,SAA+B5f,EAAE,qCAAsC,WACvE,cAAC,KAAD,CAAgBY,KAAK,eAAe0H,KAAK,SAAS01B,KAAK,IAAIt0B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOq6B,oBAAT,QAAyB,GAAIn0B,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEutB,aAAcj1B,EAAEe,cAAcq0B,iBAAkBjpB,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,iBAAiBC,iBAAkBA,EAAgB,kBAElP,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,8BAA+B,YACzD,cAAC,KAAD,CAAgBY,KAAK,QAAQ0H,KAAK,QAAQoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO3B,aAAT,QAAkB,GAAI6H,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEzO,MAAO+G,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAGpM,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBtd,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBE3FzC,I,GCdMk+B,GAA6C,CACtD,CAAElzB,KAAM,8BAA+BnD,OAAO,EAAMN,UCiBlB,WAAO,IAAD,EAChCvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,ECVG,WAAsI,IAAD,QAAtG9sB,EAAsG,uDAAnD,GAErF,EAAiFsZ,aAC7EpF,aADyF,wUAQvFsgB,IAEF,CAEIjb,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MArBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA4B9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IDjD6CyhB,CAAsB,CAAEphB,cAAU/hB,IAAvGgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,eAAgBzR,oBAAoBpS,QAAQmS,IAAgB,OAExH,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,iCAAkC,mBAE7C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,kCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,6BAA8B,2BAS/F,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,mCAAoC,gBAC9E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,8BAA+B,UACzE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,sCAAuC,WACjF,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,YAC1E,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,OACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,2CAAiD+N,EAAK2Q,MAA5F,UACI,oBAAI1a,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,yBAAd,SAAwCf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,iBAC5F,oBAAI/8B,UAAU,yBAAd,SAAuC,cAAC,GAAD,CAAce,MAAOgJ,EAAKhJ,UACjE,6BACI,cAAC,GAAD,UACI,eAAC4qB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,2CAAsCyJ,EAAK2Q,IAA5D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,6CAAwCyJ,EAAK2Q,IAA9D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAxB9C8K,EAAK2Q,OAoCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QArFf,EAqFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAxFf,EAwFW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA7Ff,EA6FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDnJgCH,WAAW,EAAMpE,YAAaoB,IACrH,CAAEiD,KAAM,uCAAwCzD,UAAWs2B,GAAuB9yB,WAAW,EAAMpE,YAAaoB,IAChH,CAAEiD,KAAM,kCAAmCzD,UHoBR,kBAAO,cAAC,GAAD,CAAuB0d,UAAU,KGpBIla,WAAW,EAAMpE,YAAaoB,IAC7G,CAAEiD,KAAM,yCAA0CzD,UDUf,WAAO,IAAD,EACjCvH,EAAMC,cAAND,EAER,EAA2D09B,GAD5CjU,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EIdG,WACH,MAAoCsX,aAChClK,aAD2C,kQAQrCsgB,KARV,mBAAOnW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IJPjC+gB,GAA3C,mBAAOjT,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,kCAAmC,0BAE9C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,+BAAgC,UACzD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC7D0C+K,WAAW,EAAMpE,YAAaoB,K,iBIU3Gw2B,GAAuB,SAACh4B,GACjC,IACI2R,EAKA3R,EALA2R,IACAoa,EAIA/rB,EAJA+rB,IAFJ,EAMI/rB,EAHA7F,YAHJ,MAGW,KAHX,EAIIK,EAEAwF,EAFAxF,UACAyH,EACAjC,EADAiC,MAGIxI,EAAMC,cAAND,EAER,OACI,sBAAKe,UAAS,wDAAmDL,EAAnD,mBAA2DK,QAA3D,IAA2DA,IAAa,IAAMyH,MAAOA,EAAnG,UACI,cAAC,IAAD,CAAqB9G,SAAUwW,EAA/B,SACI,qBAAKnX,UAAU,uCAAuCmX,IAAKA,EAAKoa,IAAG,OAAEA,QAAF,IAAEA,IAAOtyB,EAAE,kCAAmC,wBAErH,cAAC,IAAD,CAAqB0B,QAASwW,EAA9B,SACI,sBAAKnX,UAAU,kCAAf,UACI,qBAAKA,UAAU,uCAAf,SACI,cAAC,IAAD,CAAiBO,KAAK,kBAE1B,4BAEQtB,EAAE,oCAAqC,6CChC5D,SAASw+B,KACZ,MAAoCnhB,aAChClK,aAD2C,qTAQrCugB,KARV,mBAAOpW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASkhB,KACZ,MAAoCphB,aAChClK,aAD2C,qTAQrCugB,KARV,mBAAOpW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,I,cCXnEmhB,GAAmB,SAACn4B,GAC7B,MASIA,EARAzE,aADJ,MACY,UADZ,IASIyE,EAPAsV,eAFJ,SAGI9a,EAMAwF,EANAxF,UACAyH,EAKAjC,EALAiC,MACAtB,EAIAX,EAJAW,SACAy3B,EAGAp4B,EAHAo4B,SACA74B,EAEAS,EAFAT,YACA8b,EACArb,EADAqb,kBAGJ,OACI,eAACjC,GAAA,EAAD,CAAO5e,UAAS,qCAAgC8a,EAAU,WAAa,IAAvD,OAA4D/Z,EAA5D,YAAqEf,GAAayH,MAAOA,EAAzG,UACI,qBAAKzH,UAAU,8BAAf,SAEQ+E,EAAc8b,EACR1a,IAId,cAACyB,GAAA,EAAD,CAAO5H,UAAU,2BAA2BuH,KAAK,OAAO1H,KAAK,QACzD+I,SAAU,SAAAd,GACF81B,GACAA,EAAS91B,EAAEe,cAAc4J,cCtB1C,SAASorB,KACZ,IAAMrrB,EAAW3O,aAAY,SAACC,GAAD,OAA2BA,EAAS0O,cAEjE,OAAO3N,YAAgB,uCAAC,WAAO4N,GAAP,iBAAAvY,EAAA,6DACd4jC,EAAgB,IAAIvrB,GAAkBL,GAAkCM,GAD1D,SAEFsrB,EAAcC,OAAOtrB,GAFnB,cAEdpI,EAFc,yBAGbA,GAHa,2CAAD,sDAIpB,CAACmI,ICID,I,MAKMwrB,GAA4B,SAACx4B,GAA2C,IAAD,QACxE0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EC9BG,SAA+Cyb,GAA0H,IAAD,EAA1Fxc,EAA0F,uDAA9D,GAE7G,EAAkDsZ,aAC9CpF,aAD0D,4WAYxDugB,GACAtgB,IAEF,CACIoF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAvBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA8BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDf0C4iC,CADxDvV,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAkCiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,GAAI+wB,gBAAiB,GAAImM,aAAc,GAAIh8B,MAAO,WAAc,IAAhL2B,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EEpCG,WAAgH,IAAlEpR,EAAiE,uDAAJ,GAC9G,EAAgCu/B,KAAhC,mBAAO9Y,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA2CiiB,EAAQjiB,KAA4C,CAACiiB,IAEjI,EAAgC+Y,KAAhC,mBAAO7Y,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAyDuV,EAAQnK,EAAIpL,KAA8C,CAACuV,IAErJ,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GF0BmCggC,GAAvC,mBAAO7Z,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAIhB,EAAkCpK,aAAlC,mBAAOggC,EAAP,KAAkBC,EAAlB,KACAjgC,aAAgB,kBAAMigC,EAAY,OAAChZ,QAAD,IAACA,OAAD,EAACA,EAAYkM,sBAAqB,CAAClM,IAErE,MAAqByY,KAAdQ,EAAP,oBACA,EAAgGx5B,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACxGuY,EADwG,iEAM1F4rB,EAAW5rB,GAN+E,UAMvGW,EANuG,wDAY7G5D,EAAO,CAAEihB,qBAAsBrd,EAAKsH,KAGpC0jB,EAAahrB,GAfgG,2CAAD,sDAgB7G,CAACirB,EAAY7uB,EAAQ4uB,IAhBxB,mBAAOE,EAAP,YAAuCC,EAAvC,EAA0Bx5B,YAA2Cy5B,EAArE,EAA6Dx5B,OAkBvDy5B,EAAatgC,eAAkB,WACjCqR,EAAO,CAAEihB,qBAAsB,OAC/B2N,EAAa,QACd,CAAC5uB,IAGJ,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAAyE,GAAlEZ,EAAE,yCAA0C,sBAG3E0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,0CAA2C,kBAE5C,mCAAGA,EAAE,wCAAyC,uBAKlE,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,EAAYia,KAEhE,eAAC9d,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,iCAAkC,UAC3D,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACxP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,SACI,eAAC7B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,uBAAf,SAAuC5f,EAAE,iCAAkC,UAE3E,cAAC,GAAD,CAAsBkY,IAAG,iBAAEgnB,QAAF,IAAEA,OAAF,EAAEA,EAAW3iC,WAAb,QAAoB,KAC7C,eAACmwB,GAAA,EAAD,WACI,cAAC,GAAD,CAAkBiS,SAAU,SAAAnrB,GAAK,OAAI6rB,EAAgB7rB,IAAQ1N,YAAaw5B,EACtE1d,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,uCAAwC,oBAE/C,cAAC6B,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAASu2B,EAAxC,SACKx/B,EAAE,4CAA6C,wBAKhE,cAACyP,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,SACI,eAAC7B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,eAAf,SAA+B5f,EAAE,yCAA0C,WAC3E,cAAC,KAAD,CAAgBY,KAAK,eAAe0H,KAAK,SAAS01B,KAAK,IAAIt0B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOq6B,oBAAT,QAAyB,GAAIn0B,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEutB,aAAcj1B,EAAEe,cAAcq0B,iBAAkBjpB,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,iBAAiBC,iBAAkBA,EAAgB,uBAK1P,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,4CAA6C,iBACjF,cAAC,GAAD,CAAY0J,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOkuB,uBAAT,QAA4B,GAAIhoB,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEohB,gBAAiBjoB,UAGlG,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBhI,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBGpJzC,I,GCdMy/B,GAAiD,CAC1D,CAAEz0B,KAAM,4BAA6BnD,OAAO,EAAMN,UCiBZ,WAAO,IAAD,EACpCvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,ECbG,WAA4K,IAAD,QAA3H9sB,EAA2H,uDAApE,GAE1G,EAAiFsZ,aAC7EpF,aADyF,qdAYvFugB,GACAtgB,IAEF,CAEIoF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA1BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UAiC9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IDnD6CgjB,CAAuC,CAAE3iB,cAAU/hB,IAAxHgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,eAAgBzR,oBAAoBpS,QAAQmS,IAAgB,OAExH,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,qCAAsC,iBAEjD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,gCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,iCAAkC,2BASnG,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,sCAAuC,cACjF,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,kCAAmC,UAC7E,oBAAIe,UAAU,GAAd,kBACA,oBAAIA,UAAU,yBAAd,SAAwCf,EAAE,0CAA2C,WACrF,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,eACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,yCAA+C+N,EAAK2Q,MAA1F,UACI,oBAAI1a,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,IAAd,SACI,cAAC,GAAD,CAAsBL,KAAK,KAAK8H,MAAO,CAAEm3B,SAAU,SAAWznB,IAAG,oBAAEpN,EAAKunB,0BAAP,aAAE,EAAyB91B,WAA3B,QAAkC,OAEvG,oBAAIwE,UAAU,yBAAd,SAAwCf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,iBAC5F,6BACI,cAAC,GAAD,UACI,eAACpR,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,yCAAoCyJ,EAAK2Q,IAA1D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,2CAAsCyJ,EAAK2Q,IAA5D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCA1B9C8K,EAAK2Q,OAsCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAvFf,EAuFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QA1Ff,EA0FW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA/Ff,EA+FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDrJkCH,WAAW,EAAMpE,YAAaoB,IACvH,CAAEiD,KAAM,qCAAsCzD,UAAWw3B,GAA2Bh0B,WAAW,EAAMpE,YAAaoB,IAClH,CAAEiD,KAAM,gCAAiCzD,UJyBF,kBAAO,cAAC,GAAD,CAA2B0d,UAAU,KIzBFla,WAAW,EAAMpE,YAAaoB,IAC/G,CAAEiD,KAAM,uCAAwCzD,UDUT,WAAO,IAAD,EACrCvH,EAAMC,cAAND,EAER,EITG,SAAkCyb,GAA6G,IAAD,EAA7Exc,EAA6E,uDAAjD,GAEhG,EAAkDsZ,aAC9CpF,aAD0D,2OAQxDugB,IAEF,CACIlb,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAlBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAyBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IJ/B8BwjC,CAD5CnW,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EKdG,WACH,MAAoCsX,aAChClK,aAD2C,8QAQrCugB,KARV,mBAAOpW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ILPjCsiB,GAA3C,mBAAOxU,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,sCAAuC,wBAElD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,mCAAoC,UAC7D,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC7D4C+K,WAAW,EAAMpE,YAAaoB,KKQnH,I,SAAM+3B,GAA+B,SAACv5B,GACzC,IAAQ9C,EAAiB8C,EAAjB9C,MAAOu2B,EAAUzzB,EAAVyzB,MAEf,OACI,qBAAKj5B,UAAU,0DAA0DyH,MAAO,CAAEipB,gBAAiBuI,EAAK,eAAWA,EAAMz9B,IAAjB,WAA2BvB,GAAnI,SACI,eAACwU,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAI,GAAIgiB,GAAI,EAAjB,SACI,qBAAK3wB,UAAU,sCAGnB,cAAC0O,GAAA,EAAD,UACI,sBAAK1O,UAAU,kCAAf,UACI,6BAAK0C,EAAM7C,OACX,cAAC,GAAD,CAAa0W,KAAM7T,EAAMkuB,6BCpB1C,SAASoO,KACZ,MAAoC1iB,aAChClK,aAD2C,iSAQrCwgB,KARV,mBAAOrW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASyiB,KACZ,MAAoC3iB,aAChClK,aAD2C,iSAQrCwgB,KARV,mBAAOrW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,I,kDCnBnE0iB,GAA4B,SAAC15B,GACtC,IAAQ+B,EAA2C/B,EAA3C+B,KAAMoB,EAAqCnD,EAArCmD,MAAOkM,EAA8BrP,EAA9BqP,OAAQjM,EAAsBpD,EAAtBoD,SAAalC,EAA1C,aAAmDlB,EAAnD,IACM25B,EAAU53B,GAAQ,iBAClB63B,EAAYvqB,IAAuB,aAAZsqB,GAAsC,mBAAZA,EAA8B,qBAAsB,cAGrGE,EAAWlhC,WAAc,kBAAMqf,KAAO7U,GAAsBjI,QAAQmU,OAAOuqB,KAAY,CAACz2B,EAAOy2B,IAG/FE,EAAkBnhC,eAAkB,SAACuW,GACvC,GAAI9L,EAAU,CACV,IAAM22B,EAAW/hB,KAAO9I,EAAM7L,cAAcF,OAAO62B,MAAM/hB,cACnDgiB,EAAQ,2BACP/qB,GADO,IAEV7L,cAAc,2BACP6L,EAAM7L,eADA,IAETF,MAAO42B,IAEXh2B,OAAO,2BACAmL,EAAMnL,QADP,IAEFZ,MAAO42B,MAIf32B,EAAS62B,MAEd,CAAC72B,IAEJ,OACI,cAAC,KAAD,aAAgBrB,KAAM43B,EAASx2B,MAAO02B,EAAUz2B,SAAU02B,GAAqB54B,KCD1Eg5B,GAAuB,SAACl6B,GAAsC,IAAD,QAC9D0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EChCG,SAA0Cyb,GAAqH,IAAD,EAArFxc,EAAqF,uDAAzD,GAExG,EAAkDsZ,aAC9CpF,aAD0D,6VAYxDwgB,GACAvgB,IAEF,CACIoF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAvBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA8BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDb0CskC,CADxDjX,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAA6BiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,GAAI+wB,gBAAiB,GAAI9D,MAAOtP,OAAS6P,QAAQ,SAAS5P,eAAmB,IAAxL/a,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EEtCG,WAAsG,IAA7DpR,EAA4D,uDAAJ,GACpG,EAAgC8gC,KAAhC,mBAAOra,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAsCiiB,EAAQjiB,KAAuC,CAACiiB,IAEvH,EAAgCsa,KAAhC,mBAAOpa,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAoDuV,EAAQnK,EAAIpL,KAAyC,CAACuV,IAE3I,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GF4BmC0hC,GAAvC,mBAAOvb,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAIhB,EAAkCpK,aAAlC,mBAAOggC,EAAP,KAAkBC,EAAlB,KACAjgC,aAAgB,kBAAMigC,EAAY,OAAChZ,QAAD,IAACA,OAAD,EAACA,EAAYkM,sBAAqB,CAAClM,IAErE,MAAqByY,KAAdQ,EAAP,oBACA,EAAgGx5B,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACxGuY,EADwG,iEAM1F4rB,EAAW5rB,GAN+E,UAMvGW,EANuG,wDAY7G5D,EAAO,CAAEihB,qBAAsBrd,EAAKsH,KAGpC0jB,EAAahrB,GAfgG,2CAAD,sDAgB7G,CAACirB,EAAY7uB,EAAQ4uB,IAhBxB,mBAAOE,EAAP,YAAuCC,EAAvC,EAA0Bx5B,YAA2Cy5B,EAArE,EAA6Dx5B,OAkBvDy5B,EAAatgC,eAAkB,WACjCqR,EAAO,CAAEihB,qBAAsB,OAC/B2N,EAAa,QACd,CAAC5uB,IAGJ,EAAqCkO,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAAoE,GAA7DZ,EAAE,oCAAqC,sBAGtE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,qCAAsC,kBAEvC,mCAAGA,EAAE,mCAAoC,uBAK7D,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,EAAYia,KAEhE,eAAC9d,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,6BAA8B,UACxD,cAAC,GAAD,CAA2BsI,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOoqB,aAAT,QAAkB,GAAIlkB,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEsd,MAAOhlB,EAAEe,cAAcF,MAAOokB,IAAKvP,KAAO1V,EAAEe,cAAcF,OAAOilB,IAAI,EAAG,SAASnQ,iBAAuDxJ,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,WAExS,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,4BAA6B,UACtD,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,uBAAf,SAAuC5f,EAAE,uCAAwC,sBAEjF,cAAC,GAAD,CAAsBkY,IAAG,iBAAEgnB,QAAF,IAAEA,OAAF,EAAEA,EAAW3iC,WAAb,QAAoB,KAC7C,eAACmwB,GAAA,EAAD,WACI,cAAC,GAAD,CAAkBiS,SAAU,SAAAnrB,GAAK,OAAI6rB,EAAgB7rB,IAAQ1N,YAAaw5B,EACtE1d,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,6CAA8C,gCAErD,cAAC6B,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAASu2B,EAAxC,SACKx/B,EAAE,4CAA6C,uBAK5D,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,uCAAwC,iBAC5E,cAAC,GAAD,CAAY0J,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOkuB,uBAAT,QAA4B,GAAIhoB,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEohB,gBAAiBjoB,UAGlG,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBhI,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yB,iEGtJnC4gC,GAAmB,SAACr6B,GAC7B,MAOIA,EANA+B,YADJ,MACW,iBADX,EAEIoB,EAKAnD,EALAmD,MACAkM,EAIArP,EAJAqP,OACAjM,EAGApD,EAHAoD,SACAiiB,EAEArlB,EAFAqlB,UACGnkB,EANP,aAOIlB,EAPJ,IASQvG,EAAMC,cAAND,EAEFogC,EAAWlhC,WAAc,WAE3B,IAAMihC,EAAYvqB,IAAoB,aAATtN,GAAgC,mBAATA,EAA4B,qBAAuB,cACjGu4B,EAAsBtiB,KAAO7U,GAAsBjI,QACrD2J,EAAM,GAcV,OAbIy1B,EAAYC,YACZ11B,EAAMy1B,EAAYjrB,OAAOuqB,IAIzBvU,IAEIxgB,EADS,aAAT9C,GAAgC,mBAATA,EACjBtI,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMoT,IAE3D7gC,EAAE,cAAe,uBAAwB,CAAEytB,KAAMoT,KAIxDz1B,IACR,CAAC1B,EAAOpB,EAAMsN,EAAQgW,EAAW5rB,IAG9BqgC,EAAkBnhC,eAAkB,SAACuW,GACvC,GAAI9L,EAAU,CACV,IAAM22B,EAAW/hB,KAAO9I,EAAM7L,cAAcF,OAAO62B,MAAM/hB,cACnDgiB,EAAQ,2BACP/qB,GADO,IAEV7L,cAAc,2BACP6L,EAAM7L,eADA,IAETF,MAAO42B,IAEXh2B,OAAO,2BACAmL,EAAMnL,QADP,IAEFZ,MAAO42B,MAIf32B,EAAS62B,MAEd,CAAC72B,IAEJ,OACI,cAAChB,GAAA,EAAD,aAAOL,KAAMA,EAAMoB,MAAO02B,EAAUz2B,SAAU02B,EAAiBzU,UAAWA,GAAenkB,KC9DpFs5B,GAA4C,CACrD,CAAE/1B,KAAM,4BAA6BnD,OAAO,EAAMN,UCmBjB,WAAO,IAAD,EAC/BvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,ECfG,WAA6J,IAAD,QAAjH9sB,EAAiH,uDAA/D,GAEhG,EAAiFsZ,aAC7EpF,aADyF,scAYvFwgB,GACAvgB,IAEF,CAEIoF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA1BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UAiC9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IDjD6CskB,CAAkC,CAAEjkB,cAAU/hB,IAAnHgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,cAAe,uBAAwB,CAAEytB,KAAMlP,KAAOzT,EAAK+iB,SAAUxB,oBAAoBpS,QAAQmS,IAAgB,OAE3H,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,gCAAiC,iBAE5C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,gCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,4BAA6B,2BAS9F,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,iCAAkC,cAC5E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,8BAA+B,UACzE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,6BAA8B,UACxE,oBAAIe,UAAU,GAAd,kBACA,2CAGR,yCAEQ4a,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAS,IAAD,IACTm2B,EAAO,yCAAqCn2B,EAAK2Q,IACjDgR,EAAgB,kBAAMpjB,EAAQtM,KAAKkkC,IAEzC,OACI,eAAC,WAAD,WACI,qBAAIxU,cAAeA,EAAnB,UACI,qBAAI1rB,UAAU,yBAAd,UACI,8BAAMf,EAAE,cAAe,uBAAwB,CAAEytB,KAAMlP,KAAOzT,EAAK+iB,WACnE,8BAAM/iB,EAAKlK,UAEf,oBAAIG,UAAU,yBAAd,SAAwCf,EAAE,cAAe,uBAAwB,CAAEytB,KAAMlP,KAAOzT,EAAK+iB,WACrG,oBAAI9sB,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,IAAd,SACI,cAAC,GAAD,CAAsBL,KAAK,KAAK8H,MAAO,CAAEm3B,SAAU,SAAWznB,IAAG,oBAAEpN,EAAKunB,0BAAP,aAAE,EAAyB91B,WAA3B,QAAkC,OAEvG,6BACI,cAAC,GAAD,UACI,eAACmwB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,yCAAoCyJ,EAAK2Q,IAA1D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,2CAAsCyJ,EAAK2Q,IAA5D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,iCASvD,oBAAIysB,cAAeA,EAAnB,SACI,oBAAII,QA1F3B,EA0F8CrkB,MAAO,CAAEyB,QAAS,YAI7C,oBAAIwiB,cAAeA,EAAnB,SACI,oBAAII,QA/F3B,EA+F8CrkB,MAAO,CAAE04B,eAAgB,QAAhD,SACI,cAAC,GAAD,CAA8Bz9B,MAAOqH,EAAMkvB,MAAOlvB,EAAKunB,2BA5C9CvnB,EAAK2Q,OAoDtC,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAzGf,EAyGW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QA5Gf,EA4GW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QAjHf,EAiHW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDzK6BH,WAAW,EAAMpE,YAAaoB,IAClH,CAAEiD,KAAM,qCAAsCzD,UAAWk5B,GAAsB11B,WAAW,EAAMpE,YAAaoB,IAC7G,CAAEiD,KAAM,gCAAiCzD,UJ2BP,kBAAO,cAAC,GAAD,CAAsB0d,UAAU,KI3BGla,WAAW,EAAMpE,YAAaoB,IAC1G,CAAEiD,KAAM,uCAAwCzD,UGWd,WAAO,IAAD,IAChCvH,EAAMC,cAAND,EAER,ECVG,SAA6Byb,GAAwG,IAAD,EAAxExc,EAAwE,uDAA5C,GAE3F,EAAkDsZ,aAC9CpF,aAD0D,4NAQxDwgB,IAEF,CACInb,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAlBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAyBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,ID9B8B+kC,CAD5C1X,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EEfG,WACH,MAAoCsX,aAChClK,aAD2C,+PAQrCwgB,KARV,mBAAOrW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IFNjC6jB,GAA3C,mBAAO/V,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAUtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,iCAAkC,wBAE7C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,+BAAgC,UAC1D,cAAC,GAAD,CAAkBY,KAAK,QAAQ0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOoqB,aAAT,aAAkB7yB,OAEzF,eAAC0kB,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,8BAA+B,UACxD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBHjEuC+K,WAAW,EAAMpE,YAAaoB,KMI9G,SAASs5B,GAAW5lB,GAA+F,IAAD,EAA/Dxc,EAA+D,uDAAnC,GAElF,EAAkDsZ,aAC9CpF,aAD0D,iMAQxDwJ,IAEF,CACInE,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAlBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAyBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IC3C1B,SAASklC,KACZ,MAAoCjkB,aAChClK,aAD2C,6PAQrCwJ,KARV,mBAAOW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASgkB,KACZ,MAAoClkB,aAChClK,aAD2C,6PAQrCwJ,KARV,mBAAOW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICtBzE,SAASikB,KAA2E,IAApDviC,EAAmD,uDAAJ,GAClF,EAAgCqiC,KAAhC,mBAAO5b,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA6BiiB,EAAQjiB,KAA8B,CAACiiB,IAErG,EAAgC6b,KAAhC,mBAAO3b,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA2CuV,EAAQnK,EAAIpL,KAAgC,CAACuV,IAEzH,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GCSD,I,GAKMwiC,GAAkB,SAACl7B,GAAiC,IAAD,IACpD0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAuEqhC,GADxD5X,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAoBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAW+H,QAAS,cAAerc,KAAM,GAAIk9B,aAAc,GAAIh8B,MAAO,WAAc,IAArK2B,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EAAuCmxB,KAAvC,mBAAOpc,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAEhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAA+D,GAAxDZ,EAAE,+BAAgC,sBAGjE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,gCAAiC,sBAElC,mCAAGA,EAAE,8BAA+B,2BAKxD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,KAEpD,eAAC7D,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,uBAAwB,UACjD,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,eAAf,SAA+B5f,EAAE,+BAAgC,WACjE,cAAC,KAAD,CAAgBY,KAAK,eAAe0H,KAAK,SAAS01B,KAAK,IAAIt0B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOq6B,oBAAT,QAAyB,GAAIn0B,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEutB,aAAcj1B,EAAEe,cAAcq0B,iBAAkBjpB,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,iBAAiBC,iBAAkBA,EAAgB,kBAGlP,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBtd,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBCjGzC,SAAS0hC,KACZ,MAAoCrkB,aAChClK,aAD2C,oOAQrCwJ,KARV,mBAAOW,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICXzE,I,GCdMokB,GAAuC,CAChD,CAAE32B,KAAM,gCAAiCnD,OAAO,EAAMN,UCgB1B,WAAO,IAAD,EAC1BvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EAA4FnP,GAAY,CAAEK,QAAS,cAAeF,cAAU/hB,IAArHgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,eAAgBzR,oBAAoBpS,QAAQmS,IAAgB,OAExH,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,2BAA4B,qBAEvC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,oCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,uBAAwB,2BASzF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,6BAA8B,gBACxE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,wBAAyB,UACnE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,gCAAiC,WAC3E,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,OACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,6CAAmD+N,EAAK2Q,MAA9F,UACI,oBAAI1a,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,yBAAd,SAAwCf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,iBAC5F,6BACI,cAAC,GAAD,UACI,eAACpR,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,6CAAwCyJ,EAAK2Q,IAA9D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,+CAA0CyJ,EAAK2Q,IAAhE,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAvB9C8K,EAAK2Q,OAmCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAnFf,EAmFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAtFf,EAsFW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA3Ff,EA2FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDhJ4BH,WAAW,EAAMpE,YAAaoB,IACjH,CAAEiD,KAAM,yCAA0CzD,UAAWk6B,GAAiB12B,WAAW,EAAMpE,YAAaoB,IAC5G,CAAEiD,KAAM,oCAAqCzD,UHoBhB,kBAAO,cAAC,GAAD,CAAiB0d,UAAU,KGpBYla,WAAW,EAAMpE,YAAaoB,IACzG,CAAEiD,KAAM,2CAA4CzD,UDUvB,WAAO,IAAD,EAC3BvH,EAAMC,cAAND,EAER,EAA2DqhC,GAD5C5X,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EAA2C27B,KAA3C,mBAAOrW,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,4BAA6B,4BAExC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,yBAA0B,UACnD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC7DsC+K,WAAW,EAAMpE,YAAaoB,KEwBvG65B,GAAiB,SAACr7B,GAAgC,IAAD,IAClD0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAuEqhC,GADxD5X,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAoBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAW+H,QAAS,aAAcrc,KAAM,GAAIk9B,aAAc,GAAIh8B,MAAO,WAAc,IAApK2B,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EAAuCmxB,KAAvC,mBAAOpc,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAEhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAA8D,GAAvDZ,EAAE,8BAA+B,sBAGhE0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,+BAAgC,qBAEjC,mCAAGA,EAAE,6BAA8B,0BAKvD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,KAEpD,eAAC7D,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,sBAAuB,UAChD,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,eAAf,SAA+B5f,EAAE,8BAA+B,WAChE,cAAC,KAAD,CAAgBY,KAAK,eAAe0H,KAAK,SAAS01B,KAAK,IAAIt0B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOq6B,oBAAT,QAAyB,GAAIn0B,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEutB,aAAcj1B,EAAEe,cAAcq0B,iBAAkBjpB,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,iBAAiBC,iBAAkBA,EAAgB,kBAGlP,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBtd,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBCrGnC6hC,GAAsC,CAC/C,CAAE72B,KAAM,+BAAgCnD,OAAO,EAAMN,UCgB1B,WAAO,IAAD,EACzBvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EAA4FnP,GAAY,CAAEK,QAAS,aAAcF,cAAU/hB,IAApHgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,eAAgBzR,oBAAoBpS,QAAQmS,IAAgB,OAExH,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,0BAA2B,oBAEtC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,mCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,sBAAuB,2BASxF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,4BAA6B,gBACvE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,uBAAwB,UAClE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,WAC1E,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,OACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,4CAAkD+N,EAAK2Q,MAA7F,UACI,oBAAI1a,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,yBAAd,SAAwCf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,iBAC5F,6BACI,cAAC,GAAD,UACI,eAACpR,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,4CAAuCyJ,EAAK2Q,IAA7D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,8CAAyCyJ,EAAK2Q,IAA/D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAvB9C8K,EAAK2Q,OAmCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAnFf,EAmFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAtFf,EAsFW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA3Ff,EA2FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDhJ0BH,WAAW,EAAMpE,YAAaoB,IAC/G,CAAEiD,KAAM,wCAAyCzD,UAAWq6B,GAAgB72B,WAAW,EAAMpE,YAAaoB,IAC1G,CAAEiD,KAAM,mCAAoCzD,UDoBhB,kBAAO,cAAC,GAAD,CAAgB0d,UAAU,KCpBYla,WAAW,EAAMpE,YAAaoB,IACvG,CAAEiD,KAAM,0CAA2CzD,UEUvB,WAAO,IAAD,EAC1BvH,EAAMC,cAAND,EAER,EAA2DqhC,GAD5C5X,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EAA2C27B,KAA3C,mBAAOrW,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,2BAA4B,2BAEvC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,wBAAyB,UAClD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBF7DoC+K,WAAW,EAAMpE,YAAaoB,KGwBrG+5B,GAAU,SAACv7B,GAAyB,IAAD,IACpC0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAuEqhC,GADxD5X,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAoBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAW+H,QAAS,QAASrc,KAAM,GAAIk9B,aAAc,GAAIh8B,MAAO,WAAc,IAA/J2B,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EAAuCmxB,KAAvC,mBAAOpc,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAEhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAAuD,GAAhDZ,EAAE,uBAAwB,sBAGzD0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,wBAAyB,iBAE1B,mCAAGA,EAAE,sBAAuB,sBAKhD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,KAEpD,eAAC7D,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,eAAgB,UACzC,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAE/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,eAAf,SAA+B5f,EAAE,uBAAwB,WACzD,cAAC,KAAD,CAAgBY,KAAK,eAAe0H,KAAK,SAAS01B,KAAK,IAAIt0B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOq6B,oBAAT,QAAyB,GAAIn0B,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEutB,aAAcj1B,EAAEe,cAAcq0B,iBAAkBjpB,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,iBAAiBC,iBAAkBA,EAAgB,kBAGlP,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBtd,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBCrGnC+hC,GAA+B,CACxC,CAAE/2B,KAAM,2BAA4BnD,OAAO,EAAMN,UCgB7B,WAAO,IAAD,EAClBvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EAA4FnP,GAAY,CAAEK,QAAS,QAASF,cAAU/hB,IAA/GgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDpsB,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,eAAgBzR,oBAAoBpS,QAAQmS,IAAgB,OAExH,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,mBAAoB,gBAE/B,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,+BAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,eAAgB,2BASjF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,qBAAsB,gBAChE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,gBAAiB,UAC3D,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,wBAAyB,WACnE,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAI,OACX,qBAAkB2hB,cAAe,SAAA5jB,GAAC,OAAIQ,EAAQtM,KAAR,wCAA8C+N,EAAK2Q,MAAzF,UACI,oBAAI1a,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,yBAAd,SAAwCf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAOoB,EAAKgzB,iBAC5F,6BACI,cAAC,GAAD,UACI,eAACpR,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,wCAAmCyJ,EAAK2Q,IAAzD,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,0CAAqCyJ,EAAK2Q,IAA3D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAvB9C8K,EAAK2Q,OAmCtB,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAnFf,EAmFW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAtFf,EAsFW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA3Ff,EA2FW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDhJeH,WAAW,EAAMpE,YAAaoB,IACpG,CAAEiD,KAAM,oCAAqCzD,UAAWu6B,GAAS/2B,WAAW,EAAMpE,YAAaoB,IAC/F,CAAEiD,KAAM,+BAAgCzD,UDoBnB,kBAAO,cAAC,GAAD,CAAS0d,UAAU,KCpBela,WAAW,EAAMpE,YAAaoB,IAC5F,CAAEiD,KAAM,sCAAuCzD,UEU1B,WAAO,IAAD,EACnBvH,EAAMC,cAAND,EAER,EAA2DqhC,GAD5C5X,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EAA2C27B,KAA3C,mBAAOrW,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAWtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,oBAAqB,uBAEhC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,iBAAkB,UAC3C,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBF7DyB+K,WAAW,EAAMpE,YAAaoB,KGgBhG,I,YCfA,SAASi6B,KACZ,MAAoC3kB,aAChClK,aAD2C,qRAQrC0e,KARV,mBAAOvU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAAS0kB,KACZ,MAAoC5kB,aAChClK,aAD2C,qRAQrC0e,KARV,mBAAOvU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICPzE,I,2BAAM2kB,GAAW,SAAC37B,GAA0B,IAAD,UAE1C9C,EAIA8C,EAJA9C,MAAO8M,EAIPhK,EAJOgK,OACPwO,EAGAxY,EAHAwY,SAAUC,EAGVzY,EAHUyY,iBACVqM,EAEA9kB,EAFA8kB,OAHJ,EAKI9kB,EADA47B,kBAJJ,SAOQniC,EAAMC,cAAND,EAER,OACI,cAACkyB,GAAA,EAAD,CAAe1pB,MAAO25B,EAAa,CAAEC,YAAa,MAAOC,aAAc,MAAOC,WAAY,MAAOC,cAAe,MAAOrB,eAAgB,OAAQsB,kBAAmB,aAAWxnC,EAA7K,SACI,eAACwU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAO7e,UAAU,UAAhC,SAA2Cf,EAAE,gBAAiB,eAC9D,cAAC,KAAD,CAAgBY,KAAK,OAAO2H,YAAavI,EAAE,4BAA6B,aAAcsI,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,YAG7P,cAACvP,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,MAAM7e,UAAU,UAA/B,SAA0Cf,EAAE,eAAgB,SAC5D,eAAC0I,GAAA,EAAD,WACI,cAAC,KAAD,CAAgB9H,KAAK,MAAM2H,YAAavI,EAAE,2BAA4B,OAAQsI,KAAK,MAAMoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOlH,WAAT,QAAgB,GAAIoN,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEhU,IAAKsM,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,QAAQC,iBAAkBA,EAAgB,MACzO,cAACjW,GAAA,EAAD,CAAiBC,UAAU,SAA3B,SACI,cAAC,GAAD,CAAarB,KAAI,UAAE4qB,GAAW9uB,EAAMlH,YAAnB,QAA2B,IAAKk2B,mBAAkB,UAAEhvB,EAAMgY,UAAR,QAAc,GAAIiX,gBAAe,UAAEjvB,EAAMivB,uBAAR,QAA2B,GAAIpoB,OAAO,SAASC,IAAI,aACnJxJ,UAAS,4BAAuB0C,EAAMlH,IAAK,GAAI,YADnD,SAGKyD,EAAE,qBAAsB,0BAM7C,cAAC,IAAD,CAAqB0B,QAASygC,EAA9B,SACI,cAAC1yB,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAACgQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,SAAS7e,UAAU,UAAlC,kBACA,8BACI,eAACc,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAAS,kBAAMoiB,KAA9C,UACI,cAAC,IAAD,CAAiB/pB,KAAK,UACtB,yCACA,sBAAMP,UAAU,UAAhB,SAA2Bf,EAAE,gBAAiB,8BC1CrEyiC,GAAe,SAACl8B,GAA8B,IAAD,EAElD9C,EAKA8C,EALA9C,MAAO8M,EAKPhK,EALOgK,OACPwO,EAIAxY,EAJAwY,SAAUC,EAIVzY,EAJUyY,iBACVqM,EAGA9kB,EAHA8kB,OACA8G,EAEA5rB,EAFA4rB,UAJJ,EAMI5rB,EADA47B,kBALJ,SAQQniC,EAAMC,cAAND,EAER,OACI,cAACkyB,GAAA,EAAD,CAAe1pB,MAAO25B,EAAa,CAAEC,YAAa,MAAOC,aAAc,MAAOC,WAAY,MAAOC,cAAe,MAAOrB,eAAgB,OAAQsB,kBAAmB,aAAWxnC,EAA7K,SACI,eAACwU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAACiQ,GAAA,EAAD,UACI,eAAC,KAAD,CAAgBnX,YAAavI,EAAE,gCAAiC,aAAcsI,KAAK,SAASoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOs2B,+BAAT,QAAoC,GAAIpwB,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEwpB,wBAAyBlxB,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,4BAA4BC,iBAAkBA,EAAgB,wBAAxS,UACI,wBAAQtV,MAAM,GAAd,SAAkB1J,EAAE,oDAAqD,kCAD7E,OAGQmyB,QAHR,IAGQA,OAHR,EAGQA,EAAWh1B,KAAI,SAAA2N,GAAI,OACf,wBAAsBpB,MAAOoB,EAAK2Q,GAAlC,SACK3Q,EAAKlK,MADGkK,EAAK2Q,cAQtC,cAAC,IAAD,CAAqB/Z,QAASygC,EAA9B,SACI,cAAC1yB,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgQ,GAAA,EAAD,UACI,8BACI,eAAC7d,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAAS,kBAAMoiB,KAA9C,UACI,cAAC,IAAD,CAAiB/pB,KAAK,UACtB,yCACA,sBAAMP,UAAU,UAAhB,SAA2Bf,EAAE,gBAAiB,6BCjD3E,SAAS0iC,KACZ,MAAoCrlB,aAChClK,aAD2C,iSAQrC2e,KARV,mBAAOxU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASolB,KACZ,MAAoCtlB,aAChClK,aAD2C,iSAQrC2e,KARV,mBAAOxU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASqlB,KACZ,MAAoCvlB,aAChClK,aAD2C,yWAQrC6e,KARV,mBAAO1U,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASslB,KACZ,MAAoCxlB,aAChClK,aAD2C,yWAQrC6e,KARV,mBAAO1U,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASulB,KACZ,MAAoCzlB,aAChClK,aAD2C,qTAQrCye,KARV,mBAAOtU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASwlB,KACZ,MAAoC1lB,aAChClK,aAD2C,qTAQrCye,KARV,mBAAOtU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICPzE,I,SAAMylB,GAAW,SAACz8B,GAA0B,IAAD,MAE1C9C,EAIA8C,EAJA9C,MAAO8M,EAIPhK,EAJOgK,OACPwO,EAGAxY,EAHAwY,SAAUC,EAGVzY,EAHUyY,iBACVqM,EAEA9kB,EAFA8kB,OAHJ,EAKI9kB,EADA47B,kBAJJ,SAOQniC,EAAMC,cAAND,EAGFijC,EAAgBx/B,EAAMkqB,SAAW,OAAS,iBAEhD,OACI,cAACuE,GAAA,EAAD,CAAe1pB,MAAO25B,EAAa,CAAEC,YAAa,MAAOC,aAAc,MAAOC,WAAY,MAAOC,cAAe,MAAOrB,eAAgB,OAAQsB,kBAAmB,aAAWxnC,EAA7K,SACI,eAACwU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,iBAAkB,WAC5C,cAAC,GAAD,CAA2BY,KAAK,QAAQ0H,KAAM26B,EAAev5B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOoqB,aAAT,QAAkB,GAAIlkB,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEsd,MAAOhlB,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,UAAUC,iBAAkBA,EAAgB,aAG3N,cAACvP,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,MAAf,SAAsB5f,EAAE,eAAgB,SACxC,cAAC,GAAD,CAA2BY,KAAK,MAAM0H,KAAM26B,EAAev5B,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOqqB,WAAT,QAAgB,GAAInkB,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEud,IAAKjlB,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,QAAQC,iBAAkBA,EAAgB,WAGnN,cAACvP,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,kBACA,cAAC,GAAD,CACIzE,UAAWnb,EAAE,yBAA0B,iBACvCob,WAAYpb,EAAE,0BAA2B,uBACzCkb,UAAS,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAOkqB,gBAAT,UAA6BhkB,SAAU,SAAAuR,GAMxC3K,EALC2K,EAKM,CAAEyS,UAAWzS,GAHb,CAAEyS,UAAWzS,EAAS2S,MAAOtP,KAAO9a,EAAMoqB,OAAOO,QAAQ,OAAO5P,cAAesP,IAAKvP,KAAO9a,EAAMqqB,KAAKM,QAAQ,OAAO5P,wBAQhJ,cAAC,IAAD,CAAqB9c,QAASygC,EAA9B,SACI,cAAC1yB,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAACgQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,SAAS7e,UAAU,UAAlC,kBACA,8BACI,eAACc,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAAS,kBAAMoiB,KAA9C,UACI,cAAC,IAAD,CAAiB/pB,KAAK,UACtB,yCACA,sBAAMP,UAAU,UAAhB,SAA2Bf,EAAE,gBAAiB,8BCnE3E,SAASkjC,KACZ,MAAoC7lB,aAChClK,aAD2C,6QAQrC4e,KARV,mBAAOzU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAAS4lB,KACZ,MAAoC9lB,aAChClK,aAD2C,6QAQrC4e,KARV,mBAAOzU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,I,cCtBzE,SAAS6lB,GAAmCC,EAA4FC,GAC3I,MAAgDpkC,WAAqD,IAArG,mBAAO8f,EAAP,KAAyBukB,EAAzB,KA+BA,MAAO,CA5BUrkC,eAAkB,SAACuE,EAAUkb,GAC1C,IAAI6kB,EAAY,IAAIC,KAAUJ,GAG1BK,OAAoC1oC,EACpC2jB,IAEI+kB,EADA/kB,EACS,CAAEA,GAEDA,GAIlB,IAAMxgB,EAAKqlC,EAAUzkB,SAAStb,EAAOigC,GAOrC,OALAH,GAAoB,SAAA79B,GAAS,kCACtBA,GADsB,mBAEvBjC,EAAcgY,GAAK+nB,EAAUz9B,cAG5B5H,IApBM,uBAqBVmlC,GArBU,CAqBJD,EAAYE,KAEPrkC,eAAkB,SAACuc,GACjC,IAAMrQ,EAAM4T,EAAiBvD,GAC7B,cAAOrQ,QAAP,IAAOA,IAAO,KACf,CAAC4T,KCeD,I,MAKM2kB,GAAoB,SAACp9B,GAAmC,IAAD,sBACxD0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EC/CG,SAAuCyb,GAAkH,IAAD,EAAlFxc,EAAkF,uDAAtD,GAErG,EAAkDsZ,aAC9CpF,aAD0D,wxBA4BxD0e,GACAze,GACA0e,GACAE,GACAJ,GACAG,IAEF,CACIvZ,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA3CpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAkDrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDlBsDwnC,CADpEna,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAgCimB,EAAhD,EAAqCtkB,UAA+B6T,EAApE,EAA4DlT,OAC5D,EEpDG,WAAoI,IAAD,EAAvF9G,EAAuF,uDAA3D,GAE3E,EAAkDsZ,aAC9CpF,aAD0D,+ZAgBxDsgB,GACA9W,GACA+W,IAEF,CACIlb,UAAW,GAEXC,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA3BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAkCrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IFGqHynC,GAAlJ,IAAQjmC,KAAQ26B,EAAhB,EAAgBA,mBAAoBuL,EAApC,EAAoCA,uBAAwBtL,EAA5D,EAA4DA,SAAwB3O,EAApF,EAAyEzkB,UAA4C0kB,EAArH,EAA6G/jB,OACvGX,EAAYskB,GAAcG,EAChC,EAAmC3Z,GAA0BiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,GAAI+wB,gBAAiB,IAAQ,IAArIluB,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EG3DG,WAAgG,IAA1DpR,EAAyD,uDAAJ,GAC9F,EAAgC+iC,KAAhC,mBAAOtc,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAmCiiB,EAAQjiB,KAAoC,CAACiiB,IAEjH,EAAgCuc,KAAhC,mBAAOrc,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAiDuV,EAAQnK,EAAIpL,KAAsC,CAACuV,IAErI,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GHiDmC8kC,GAAvC,mBAAO3e,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAGV06B,EAAcvzB,GAAe,OAA2B0V,QAA3B,IAA2BA,OAA3B,EAA2BA,EAAYtQ,MAAM,SAAA/K,GAAI,OAAIA,EAAK2Q,MAC7F,EIhEG,WAAsG,IAA7Dxc,EAA4D,uDAAJ,GACpG,EAAgCyjC,KAAhC,mBAAOhd,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAsCiiB,EAAQjiB,KAAuC,CAACiiB,IAEvH,EAAgCid,KAAhC,mBAAO/c,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAoDuV,EAAQnK,EAAIpL,KAAyC,CAACuV,IAE3I,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GJsD2BglC,GAAxBC,EAAP,oBACA,EKjEG,WACH,MAAoC7mB,aAChClK,aAD2C,+PAQrC2e,KARV,mBAAOxU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IL4C3C4mB,GAA1BC,EAAP,oBAGMC,EAAuB5zB,GAAe,OAA6C0V,QAA7C,IAA6CA,OAA7C,EAA6CA,EAAYgM,WAAW,SAAArnB,GAAI,OAAIA,EAAK2Q,MAC7H,EMrEG,WAA0I,IAA/Exc,EAA8E,uDAAJ,GACxI,EAAgC2jC,KAAhC,mBAAOld,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAwDiiB,EAAQjiB,KAAyD,CAACiiB,IAE3J,EAAgCmd,KAAhC,mBAAOjd,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAsEuV,EAAQnK,EAAIpL,KAA2D,CAACuV,IAE/K,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GN2D6CqlC,GAA1CC,GAAP,oBACA,GOtEG,WACH,MAAoClnB,aAChClK,aAD2C,qTAQrC6e,KARV,mBAAO1U,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IPiDzBinB,GAA5CC,GAAP,qBAGMC,GAAmBj0B,GAAe,OAAgC0V,QAAhC,IAAgCA,OAAhC,EAAgCA,EAAY8I,WAAW,SAAAnkB,GAAI,OAAIA,EAAK2Q,MAC5G,GQ1EG,WAAgH,IAAlExc,EAAiE,uDAAJ,GAC9G,EAAgC6jC,KAAhC,mBAAOpd,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA2CiiB,EAAQjiB,KAA4C,CAACiiB,IAEjI,EAAgCqd,KAAhC,mBAAOnd,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAAyDuV,EAAQnK,EAAIpL,KAA8C,CAACuV,IAErJ,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GRgEgC0lC,GAA7BC,GAAP,qBACA,GS3EG,WACH,MAAoCvnB,aAChClK,aAD2C,8QAQrCye,KARV,mBAAOtU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ITsDtCsnB,GAA/BC,GAAP,qBAGMC,GAAkBt0B,GAAe,OAAsB0V,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAY8T,UAAU,SAAAnvB,GAAI,OAAIA,EAAK2Q,MAChG,GU/EG,WAA4F,IAAxDxc,EAAuD,uDAAJ,GAC1F,EAAgCikC,KAAhC,mBAAOxd,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAAiCiiB,EAAQjiB,KAAkC,CAACiiB,IAE7G,EAAgCyd,KAAhC,mBAAOvd,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA+CuV,EAAQnK,EAAIpL,KAAoC,CAACuV,IAEjI,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GVqEsB+lC,GAAnBC,GAAP,qBACA,GWhFG,WACH,MAAoC5nB,aAChClK,aAD2C,gPAQrC4e,KARV,mBAAOzU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IX2DhD2nB,GAArBC,GAAP,qBACMC,GAAgBlmC,eAAkB,SAACuc,GACrC,GAAKhY,EAAL,CAIA,IAAMgc,EAAWslB,GAAgBthC,MAAMuD,MAAK,SAAAC,GAAE,OAAIA,EAAGizB,YAAcze,KAC/DgE,EACAslB,GAAgB3yB,UAAUqN,EAAShE,IAEnCspB,GAAgB5yB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWglB,UAAWze,EAAIqe,SAAUr2B,EAAMgY,QAEjF,CAACspB,GAAiBthC,IAIrB,GAAkCvE,aAAlC,qBAAOggC,GAAP,MAAkBC,GAAlB,MACAjgC,aAAgB,kBAAMigC,GAAY,OAAChZ,QAAD,IAACA,OAAD,EAACA,EAAYkM,sBAAqB,CAAClM,IAErE,OAAqByY,KAAdQ,GAAP,qBACA,GAAgGx5B,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACxGuY,EADwG,iEAM1F4rB,GAAW5rB,GAN+E,UAMvGW,EANuG,wDAY7G5D,EAAO,CAAEihB,qBAAsBrd,EAAKsH,KAGpC0jB,GAAahrB,GAfgG,2CAAD,sDAgB7G,CAACirB,GAAY7uB,EAAQ4uB,KAhBxB,qBAAOE,GAAP,eAAuCC,GAAvC,GAA0Bx5B,YAA2Cy5B,GAArE,GAA6Dx5B,OAkBvDy5B,GAAatgC,eAAkB,WACjCqR,EAAO,CAAEihB,qBAAsB,OAC/B2N,GAAa,QACd,CAAC5uB,IAIJ,GAAqD6yB,IAA8D,SAACiC,EAAS3mB,EAAYC,GACrI,IAAMC,EAAQ,CACVmb,wBAAyB,kBAAM9kB,KAAKqwB,QAAL,OAAaD,QAAb,IAAaA,OAAb,EAAaA,EAAStL,yBAA2B/5B,EAAE,oDAAqD,wBAA0B,KAGrK0e,EAAWI,WAAWF,EAAOD,KAC9B,IANH,qBAAO4mB,GAAP,MAAyBC,GAAzB,MAQA,GAA2CpC,IAA4C,SAACiC,EAAS3mB,EAAYC,GACzG,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAACykC,QAAD,IAACA,OAAD,EAACA,EAASzkC,MAAsE,GAA/DZ,EAAE,iCAAkC,2BAIrE0e,EAAWI,WAAWF,EAAOD,KAC9B,IAPH,qBAAO8mB,GAAP,MAAoBC,GAApB,MASA,GAAqDtC,IAAiD,SAACiC,EAAS3mB,EAAYC,GACxH,IAAMC,EAAQ,CACViP,MAAO,kBAAM,OAACwX,QAAD,IAACA,OAAD,EAACA,EAASxX,OAAwE,GAAhE7tB,EAAE,iCAAkC,2BACnE8tB,IAAK,kBAAM,OAACuX,QAAD,IAACA,OAAD,EAACA,EAASvX,KACfuX,EAAQvX,IAAMuX,EAAQxX,MAAQ7tB,EAAE,iCAAkC,4CAClE,GAFqBA,EAAE,iCAAkC,4BAKnE0e,EAAWI,WAAWF,EAAOD,KAC9B,IATH,qBAAOgnB,GAAP,MAAyBC,GAAzB,MAWA,GAAqCnnB,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAAiE,GAA1DZ,EAAE,iCAAkC,qBAC/D05B,oBAAqB,kBAAMzkB,KAAKqwB,QAAL,OAAa7hC,QAAb,IAAaA,OAAb,EAAaA,EAAOi2B,qBAAuB15B,EAAE,gDAAiD,6BAA+B,IAGxJmyB,UAAW,kBAAMkS,EAAqB5gC,MAAMlG,QAAO,SAAA0J,GAAE,OAAKs+B,GAAiBt+B,MAAKzJ,OAASwC,EAAE,qCAAsC,qCAAuC,IACxK6V,KAAM,kBAAMmuB,EAAYvgC,MAAMlG,QAAO,SAAA0J,GAAE,OAAKw+B,GAAYx+B,MAAKzJ,OAASwC,EAAE,gCAAiC,iCAAmC,IAC5IivB,UAAW,kBAAMyV,GAAiBjhC,MAAMlG,QAAO,SAAA0J,GAAE,OAAK0+B,GAAiB1+B,MAAKzJ,OAASwC,EAAE,qCAAsC,6BAA+B,KAGhK0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,EACA4gC,EAAsBkB,GACtBvB,EAAayB,GACbf,GAAkBiB,KAftB,qBAAO5mB,GAAP,MAAiBC,GAAjB,MAkBA,GAAsEpZ,YAAgB,sBAAC,kGAAA3K,EAAA,yDAC9E8jB,KAD8E,iEAM7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GANmD,qBAShE+e,EAAYryB,OAToD,gEASxE7G,EATwE,kBAUzEo5B,EAAqBp5B,EAAK2Q,GAAIuoB,EAAY9xB,WAAWpH,EAAK2Q,KAAK,GAVU,6JAYhEuoB,EAAYnyB,SAZoD,kEAYxE/G,EAZwE,kBAazEo5B,EAAqBp5B,EAAK2Q,GAAIuoB,EAAY9xB,WAAWpH,EAAK2Q,KAAK,GAbU,+JAehEuoB,EAAYpyB,SAfoD,kEAexE9G,EAfwE,kBAgBzEs5B,EAAuBt5B,EAAK2Q,IAhB6C,iJAkBnFuoB,EAAY3xB,cAlBuE,cAqBhEgyB,EAAqB1yB,OArB2C,kEAqBxE7G,EArBwE,kBAsBzEy5B,GAAuCz5B,EAAK2Q,GAAI4oB,EAAqBnyB,WAAWpH,EAAK2Q,KAAK,GAtBjB,+JAwBhE4oB,EAAqBxyB,SAxB2C,kEAwBxE/G,EAxBwE,kBAyBzEy5B,GAAuCz5B,EAAK2Q,GAAI4oB,EAAqBnyB,WAAWpH,EAAK2Q,KAAK,GAzBjB,+JA2BhE4oB,EAAqBzyB,SA3B2C,kEA2BxE9G,EA3BwE,kBA4BzE25B,GAAyC35B,EAAK2Q,IA5B2B,wJA8BnF4oB,EAAqBhyB,cA9B8D,cAiChEqyB,GAAiB/yB,OAjC+C,qEAiCxE7G,EAjCwE,mBAkCzE85B,GAA0B95B,EAAK2Q,GAAIipB,GAAiBxyB,WAAWpH,EAAK2Q,KAAK,GAlCA,0KAoChEipB,GAAiB7yB,SApC+C,qEAoCxE/G,EApCwE,mBAqCzE85B,GAA0B95B,EAAK2Q,GAAIipB,GAAiBxyB,WAAWpH,EAAK2Q,KAAK,GArCA,0KAuChEipB,GAAiB9yB,SAvC+C,qEAuCxE9G,EAvCwE,mBAwCzEg6B,GAA4Bh6B,EAAK2Q,IAxCwC,4JA0CnFipB,GAAiBryB,cA1CkE,cA6ChE0yB,GAAgBpzB,OA7CgD,qEA6CxE7G,EA7CwE,mBA8CzEm6B,GAAgBn6B,EAAK2Q,GAAIspB,GAAgB7yB,WAAWpH,EAAK2Q,KAAK,GA9CW,0KAgDhEspB,GAAgBlzB,SAhDgD,qEAgDxE/G,EAhDwE,mBAiDzEm6B,GAAgBn6B,EAAK2Q,GAAIspB,GAAgB7yB,WAAWpH,EAAK2Q,KAAK,GAjDW,4KAmDhEspB,GAAgBnzB,SAnDgD,qEAmDxE9G,EAnDwE,mBAoDzEq6B,GAAkBr6B,EAAK2Q,IApDkD,8JAsDnFspB,GAAgB1yB,cAEhBhJ,EAAQ4hB,SAxD2E,sPAyDpF,CAAClM,GAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,EAC1C26B,EAAaE,EAAsBE,EACnCC,EAAsBE,GAAwCE,GAC9DC,GAAkBE,GAA2BE,GAC7CC,GAAiBE,GAAiBE,KA7DtC,qBAAOxe,GAAP,eAAgCtB,GAAhC,GAAmBvf,YAA+BolB,GAAlD,GAA0CnlB,OAkE1C,GAAkD7G,aAA0B+lB,GAA5E,qBAAO4gB,GAAP,MAA0BC,GAA1B,MACA5mC,aAAgB,WACP2mC,IAKApiC,GAAUugC,GAAgBK,IAK/BL,EAAY7xB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAiBjvB,EAAMgY,GAAI7a,KAAM,GAAIrE,IAAK,GAAIwpC,SAAU,UACjG1B,EAAqBlyB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAiBjvB,EAAMgY,KACzEipB,GAAiBvyB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAiBjvB,EAAMgY,GAAIoS,MAAOtP,OAAS6P,QAAQ,OAAO5P,cAAesP,IAAKvP,OAAS6P,QAAQ,OAAO5P,cAAemP,UAAU,IAE7KmY,IAAqB,MACtB,CAACD,GAAmBC,GAAsBriC,EAAOugC,EAAaK,EAAsBK,KAGvF,IAAMsB,GAAsD,IAAlCtB,GAAiBjhC,MAAMjG,OAC3CyoC,GAA8D,IAAtC5B,EAAqB5gC,MAAMjG,OACnD0oC,GAA4C,IAA7BlC,EAAYvgC,MAAMjG,OAEvC,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACgS,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,kCAAmC,eAEpC,mCAAGA,EAAE,gCAAiC,oBAK1D,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,GAAgB5F,EAAYia,GAAuBzV,KAEvF,eAACrI,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,MAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,yBAA0B,UACnD,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,SAASC,iBAAkBA,GAAgB,UAG/L,eAACxP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,eAACiQ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,sBAAf,SAAsC5f,EAAE,wCAAyC,mBAEjF,eAACwP,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAK,iBAAEy2B,QAAF,IAAEA,GAAF,UAAEA,EAAoBvxB,MAAK,SAAA8D,GAAI,OAAIA,EAAK2Q,KAAOhY,EAAMi2B,8BAArD,aAAE,EAAyE53B,aAA3E,QAAoF,kBAElH,cAAC2N,GAAA,EAAD,UACI,eAAC,KAAD,CAAgB7O,KAAK,sBAAsB0H,KAAK,SAASoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOi2B,2BAAT,QAAgC,GAAI/vB,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAEmpB,oBAAqB7wB,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,wBAAwBC,iBAAkBA,GAAgB,oBAAzP,UACI,wBAAQtV,MAAM,GAAd,SAAkB1J,EAAE,6CAA8C,uCADtE,OAGQu4B,QAHR,IAGQA,OAHR,EAGQA,EAAoBp7B,KAAI,SAAA2N,GAAI,OACxB,wBAAsBpB,MAAOoB,EAAK2Q,GAAlC,SACK3Q,EAAKlK,MADGkK,EAAK2Q,oBAU9C,cAAChM,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,OAAhB,SACI,eAAC7B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,aAAf,SAA6B5f,EAAE,+BAAgC,qCAC/D,cAAC,GAAD,CAAgBmb,UAAWnb,EAAE,YAAa,MAAOob,WAAYpb,EAAE,aAAc,OACzEkb,QAAO,iBAAEzX,QAAF,IAAEA,OAAF,EAAEA,EAAO+3B,kBAAT,SAA8B7xB,SAAU,SAAAuR,GAAO,OAAI3K,EAAO,CAAEirB,WAAYtgB,eAK/F,eAACwE,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,WAAf,SAA2B5f,EAAE,6BAA8B,cAC3D,cAAC,KAAD,CAAgBY,KAAK,WAAW0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOvD,gBAAT,QAAqB,GAAIyJ,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAErQ,SAAU2I,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,SAASC,iBAAkBA,GAAgB,UAG3M,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAEQqmB,GAAwBjmC,EAAE,6BAA8B,YAClDA,EAAE,8BAA+B,eAI/C,cAACq9B,GAAA,EAAD,CAAWt8B,UAAU,OAAOu8B,MAAO2I,GAAnC,SAEQ5B,EAAqB5gC,MAAMtG,KAAI,SAAA2N,GAAI,OAC/B,cAAC,GAAD,CACIq3B,WAAY8D,GACZxiC,MAAOqH,EACPyF,OAAQ,SAAAF,GAAO,OAAIg0B,EAAqBpyB,UAAUnH,EAAK2Q,GAAIpL,IAC3Dgb,OAAQ,kBAAMgZ,EAAqBjyB,UAAUtH,EAAK2Q,KAClDsD,SAAU,kBAAMwmB,GAAiBz6B,IACjCkU,iBAAkBwmB,GAAyB16B,EAAK2Q,IAChD0W,UAAS,OAAE2R,QAAF,IAAEA,IAA0B,IAPtBh5B,EAAK2Q,SAYpC,cAAC5Z,EAAA,EAAD,CAAQnB,KAAK,KAAKoB,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,wBAAMo7B,EAAqBlyB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAe,iBAAEjvB,QAAF,IAAEA,OAAF,EAAEA,EAAOgY,UAAT,QAAe,MAAzI,SACKzb,EAAE,oCAAqC,6BAKhD,eAAC0f,GAAA,EAAD,WACI,cAAC,IAAD,CAAqBhe,QAASskC,GAA9B,SACI,cAACrmB,GAAA,EAAD,CAAOC,QAAQ,YAAf,SAA4B5f,EAAE,8BAA+B,aAGjE,cAACq9B,GAAA,EAAD,CAAWt8B,UAAU,OAAOu8B,MAAO0I,GAAnC,SAEQtB,GAAiBjhC,MAAMtG,KAAI,SAAA2N,GAAI,OAC3B,cAAC,GAAD,CACIq3B,WAAY6D,GACZviC,MAAOqH,EACPyF,OAAQ,SAAAF,GAAO,OAAIq0B,GAAiBzyB,UAAUnH,EAAK2Q,GAAIpL,IACvDgb,OAAQ,kBAAMqZ,GAAiBtyB,UAAUtH,EAAK2Q,KAC9CsD,SAAU,kBAAM4mB,GAAiB76B,IACjCkU,iBAAkB4mB,GAAyB96B,EAAK2Q,KANrC3Q,EAAK2Q,SAWhC,cAAC5Z,EAAA,EAAD,CAAQnB,KAAK,KAAKoB,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,wBAAMy7B,GAAiBvyB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAe,iBAAEjvB,QAAF,IAAEA,OAAF,EAAEA,EAAOgY,UAAT,QAAe,GAAIoS,MAAOtP,OAAS6P,QAAQ,OAAO5P,cAAesP,IAAKvP,OAAS6P,QAAQ,OAAO5P,cAAemP,UAAU,KAA7O,SACK3tB,EAAE,gCAAiC,yBAI5C,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,OAAhB,SACI,eAAC7B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UAAQ3f,EAAE,gCAAiC,iBAC3C,cAAC,GAAD,CAAa2b,MAAK,iBAAE6c,QAAF,IAAEA,OAAF,EAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,eAAfA,EAAGgW,kBAA5B,QAAyD,GACvErB,WAAY,SAAAH,GAAE,QAAMspB,GAAgBthC,MAAMuD,MAAK,SAAAC,GAAE,OAAIA,EAAGizB,YAAcze,MACtElb,OAAQ,SAACkb,GAAD,OAAQ2pB,GAAc3pB,WAG1C,cAAChM,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,OAAhB,SACI,eAAC7B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UAAQ3f,EAAE,iCAAkC,mBAC5C,cAAC,GAAD,CAAa2b,MAAK,iBAAE6c,QAAF,IAAEA,OAAF,EAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,gBAAfA,EAAGgW,kBAA5B,QAA0D,GACxErB,WAAY,SAAAH,GAAE,QAAMspB,GAAgBthC,MAAMuD,MAAK,SAAAC,GAAE,OAAIA,EAAGizB,YAAcze,MACtElb,OAAQ,SAACkb,GAAD,OAAQ2pB,GAAc3pB,WAG1C,cAAChM,GAAA,EAAD,CAAKC,GAAI,GAAIgiB,GAAG,GAAhB,SACI,eAAChS,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UAAQ3f,EAAE,6BAA8B,cACxC,cAAC,GAAD,CAAa2b,MAAK,iBAAE6c,QAAF,IAAEA,OAAF,EAAEA,EAAUj7B,QAAO,SAAA0J,GAAE,MAAmB,UAAfA,EAAGgW,kBAA5B,QAAoD,GAClErB,WAAY,SAAAH,GAAE,QAAMspB,GAAgBthC,MAAMuD,MAAK,SAAAC,GAAE,OAAIA,EAAGizB,YAAcze,MACtElb,OAAQ,SAACkb,GAAD,OAAQ2pB,GAAc3pB,cAM9C,eAACiE,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,uBAAf,SAAuC5f,EAAE,qCAAsC,uBAE/E,cAAC,GAAD,CAAsBkY,IAAG,iBAAEgnB,SAAF,IAAEA,QAAF,EAAEA,GAAW3iC,WAAb,QAAoB,KAC7C,eAACmwB,GAAA,EAAD,WACI,cAAC,GAAD,CAAkBiS,SAAU,SAAAnrB,GAAK,OAAI6rB,GAAgB7rB,IAAQ1N,YAAaw5B,GACtE1d,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,2CAA4C,iCAEnD,cAAC6B,EAAA,EAAD,CAAQC,MAAM,SAAS+Z,SAAO,EAAC5S,QAASu2B,GAAxC,SACKx/B,EAAE,4CAA6C,uBAK5D,eAAC0f,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,oCAAqC,iBACzE,cAAC,GAAD,CAAY0J,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAOkuB,uBAAT,QAA4B,GAAIhoB,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAEohB,gBAAiBjoB,UAGlG,eAACgW,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,0BAA2B,WAErD,cAACq9B,GAAA,EAAD,CAAWt8B,UAAU,OAAOu8B,MAAO4I,GAAnC,SAEQlC,EAAYvgC,MAAMtG,KAAI,SAAA2N,GAAI,OACtB,cAAC,GAAD,CACIq3B,WAAY+D,GACZziC,MAAOqH,EACPyF,OAAQ,SAAAF,GAAO,OAAI2zB,EAAY/xB,UAAUnH,EAAK2Q,GAAIpL,IAClDgb,OAAQ,kBAAM2Y,EAAY5xB,UAAUtH,EAAK2Q,KACzCsD,SAAU,kBAAM0mB,GAAY36B,IAC5BkU,iBAAkB0mB,GAAoB56B,EAAK2Q,KANhC3Q,EAAK2Q,SAWhC,cAAC5Z,EAAA,EAAD,CAAQnB,KAAK,KAAKoB,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,wBAAM+6B,EAAY7xB,OAAO,CAAEsJ,GAAIxG,KAAKC,UAAWwd,gBAAe,iBAAEjvB,QAAF,IAAEA,OAAF,EAAEA,EAAOgY,UAAT,QAAe,GAAI7a,KAAM,GAAIrE,IAAK,GAAIwpC,SAAU,WAAjK,SACK/lC,EAAE,2BAA4B,yBAKvC,eAAC,GAAD,WACI,cAAC,IAAD,CAAqB0B,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,GACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBYvczC,I,GCdMmmC,GAAyC,CAClD,CAAEn7B,KAAM,yBAA0BnD,OAAO,EAAMN,U5BmBjB,WAAO,IAAD,EAC5BvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,E6BdG,WAAoJ,IAAD,QAA3G9sB,EAA2G,uDAA5D,GAE1F,EAAiFsZ,aAC7EpF,aADyF,miCAsCvF0e,GACAze,GACAwe,IAEF,CAEIpZ,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MArDpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA4D9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,I7B7E6C0pB,CAA+B,CAAErpB,cAAU/hB,IAAhHgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GACnDthB,EAAKikB,UAAUnuB,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,GAChEthB,EAAKqnB,UAAU50B,QAAO,SAAA0J,GAAE,OAAIA,EAAGpE,SAASjC,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,KAAG5uB,QAC5FsN,EAAKmkB,UAAU1xB,QAAO,SAAA0J,GAAE,OAAIqmB,GAAoBrmB,GAAIolB,oBAAoBpS,QAAQmS,IAAgB,KAAG5uB,YAE3G,CAACwuB,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,6BAA8B,cAEzC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,eAACgd,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAG,6BAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,yBAA0B,eAIvE,oBAAGe,UAAU,kBAAkB4G,KAAK,6BAA6BqlB,UAAQ,EAAzE,UACI,cAAC,IAAD,CAAiB1rB,KAAK,aAAa,yCAAItB,EAAE,4BAA6B,sCAQ9F,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,2BAA4B,WACtE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,0BAA2B,UACrE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,2BAA4B,UACtE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,mBAC1E,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,+BAAgC,eAC1E,oBAAIe,UAAU,GAAd,kBACA,2CAGR,yCAEQ4a,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAS,IAAD,IACTm2B,EAAO,sCAAkCn2B,EAAK2Q,IAGpD,OACI,cAAC,WAAD,UACI,qBAAIgR,cAJU,kBAAMpjB,EAAQtM,KAAKkkC,IAIjC,UACI,qBAAIlgC,UAAU,yBAAd,UACI,8BAAM+J,EAAKlK,OACX,eAAC4O,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAOgJ,EAAKikB,UAAUjtB,UAE/C,cAAC2N,GAAA,EAAD,UACK3E,EAAKikB,UAAUnuB,UAGxB,qBAAKG,UAAU,aAAf,SAEQ+J,EAAKmkB,UAAU9xB,KAAI,SAAA2N,GAAI,OACnB,8BACKwiB,GAAoBxiB,IADfA,EAAK2Q,YAO/B,oBAAI1a,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,yBAAd,SAEQ+J,EAAKmkB,UAAU9xB,KAAI,SAAA2N,GAAI,OACnB,8BACKwiB,GAAoBxiB,IADfA,EAAK2Q,SAM3B,oBAAI1a,UAAU,yBAAd,SACI,eAACyO,GAAA,EAAD,CAAK+L,WAAS,EAAd,UACI,cAAC9L,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAqB5N,MAAOgJ,EAAKikB,UAAUjtB,UAE/C,cAAC2N,GAAA,EAAD,UACK3E,EAAKikB,UAAUnuB,YAI5B,oBAAIG,UAAU,yBAAd,SAEQ+J,EAAKqnB,UAAUh1B,KAAI,SAAA2N,GAAI,OACnB,8BACKA,EAAKjI,SAASjC,MADTkK,EAAK2Q,SAM3B,oBAAI1a,UAAU,GAAd,SACI,cAAC,GAAD,CAAsBL,KAAK,KAAK8H,MAAO,CAAEm3B,SAAU,SAAWznB,IAAG,oBAAEpN,EAAKunB,0BAAP,aAAE,EAAyB91B,WAA3B,QAAkC,OAEvG,6BACI,cAAC,GAAD,UACI,eAACmwB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,sCAAiCyJ,EAAK2Q,IAAvD,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,wCAAmCyJ,EAAK2Q,IAAzD,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kCAvEtC8K,EAAK2Q,OA+FtC,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QA1Jf,EA0JW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QA7Jf,EA6JW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QAlKf,EAkKW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wB4B5NuBH,WAAW,EAAMpE,YAAaoB,IAC5G,CAAEiD,KAAM,kCAAmCzD,UAAWo8B,GAAmB54B,WAAW,EAAMpE,YAAaoB,IACvG,CAAEiD,KAAM,6BAA8BzD,Ub8CP,kBAAO,cAAC,GAAD,CAAmB0d,UAAU,Ka9CGla,WAAW,EAAMpE,YAAaoB,IACpG,CAAEiD,KAAM,oCAAqCzD,UDUd,WAAO,IAAD,EAC7BvH,EAAMC,cAAND,EAER,EGTG,SAA0Byb,GAAqG,IAAD,EAArExc,EAAqE,uDAAzC,GAExF,EAAkDsZ,aAC9CpF,aAD0D,mNAQxD0e,IAEF,CACIrZ,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAlBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAyBrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IH/B8BiqC,CAD5C5c,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EIdG,WACH,MAAoCsX,aAChClK,aAD2C,sPAQrC0e,KARV,mBAAOvU,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IJPjC+oB,GAA3C,mBAAOjb,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAUtD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,8BAA+B,qBAE1C,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,gBAMvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,2BAA4B,UACrD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC5DiC+K,WAAW,EAAMpE,YAAaoB,KIKxG,SAASw+B,KAA2I,IAAD,QAA3GtnC,EAA2G,uDAA5D,GAE1F,EAAiFsZ,aAC7EpF,aADyF,ipCAwCvF0gB,GACAjC,IAEF,CAEIpZ,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACf+a,SAAU74B,EAAQ64B,SAClBC,OAAQ94B,EAAQ84B,OAChBhJ,UAAW9vB,EAAQ8vB,WAEvBtW,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAxDpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA+D9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,I,4BCzFtC8pB,GAAqB,SAACjgC,GAC/B,IAAQvG,EAAMC,cAAND,EAGJpC,EAIA2I,EAJA3I,KACA6oC,EAGAlgC,EAHAkgC,YACAp7B,EAEA9E,EAFA8E,MACAq7B,EACAngC,EADAmgC,OAIEC,EAASznC,WAAc,iBAAM,CAAC,CAChC0B,KAAMZ,EAAE,iCAAkC,UAC1CpC,KAAMA,EAAKT,KAAI,SAAA2N,GAAI,MAAK,CACpB87B,EAAG97B,EAAK8H,KACRi0B,EAAG/7B,EAAKgiB,MAERga,MAAOh8B,UAEX,CAAClN,EAAMoC,IAELf,EAAUC,WAAc,iBAAO,CACjC6nC,MAAO,CACHC,QAAS,CACLC,MAAM,GAEVroC,OAAQ,CACJsoC,mBAAoB,SAACr+B,EAAGk+B,EAAOxxB,GAE3B,IAAI4xB,sBAAY5xB,EAAO6xB,kBAAmBD,sBAAY5xB,EAAO8xB,cAKzDZ,EAAa,CAAC,IAAD,EACPa,EAAY,UAAG/xB,EAAOgyB,EAAEhyB,OAAOoxB,OAAOpxB,EAAO8xB,aAAazpC,KAAK2X,EAAO6xB,uBAA1D,aAAG,EAAwEN,MACzFQ,GACAb,EAAYa,OAMhCE,MAAO,CACHl/B,KAAM,eAEgB,CAACm+B,IAIzBxhC,EAAM/F,WAAc,kBAAM8Q,KAAKC,UAAUhR,KAAU,CAACA,IAE1D,OACI,cAAC,KAAD,CAAiBA,QAASA,EAAS0nC,OAAQA,EAAQr+B,KAAK,MAAM+C,MAAOA,EAAOq7B,OAAQA,GAAxEzhC,I,UCpEPwiC,GAAyC,CAClD,CAAEz8B,KAAM,iDAAkDnD,OAAO,EAAMN,UCqBxB,WAAO,IAAD,EAC7CvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KAEA,EAAgC7sB,YAAuB,kBAAMqf,OAAS6P,QAAQ,SAAS5P,iBAAvF,mBAAOsZ,EAAP,KAAiB4P,EAAjB,KACA,EAA4BxoC,YAAuB,kBAAMqf,OAAS6P,QAAQ,SAASO,IAAI,EAAG,SAASnQ,iBAAnG,mBAAOuZ,EAAP,KAAe4P,EAAf,KAEA,EAA4FpB,GAA+B,CAAExpB,cAAU/hB,EAAW88B,SAAUA,EAAUC,OAAQA,EAAQhJ,UAAW,sBAA1K/C,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAG1Ef,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,uCACvBA,EAAKvO,IAAI8vB,oBAAoBpS,QAAQmS,IAAgB,IAClD,+BAACthB,EAAK3P,YAAN,aAAC,EAAW0F,aAAZ,QAAqB,IAAIwrB,2BAAzB,eAA8CpS,QAAQmS,KAAgB,IACtE,+BAACthB,EAAKgkB,qBAAN,aAAC,EAAoBluB,YAArB,QAA6B,IAAIyrB,2BAAjC,eAAsDpS,QAAQmS,KAAgB,IAC9E,+BAACthB,EAAK88B,wBAAN,iBAAC,EAAuB9Y,qBAAxB,aAAC,EAAsCluB,YAAvC,QAA+C,IAAIyrB,2BAAnD,eAAwEpS,QAAQmS,KAAgB,GAChGpsB,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMlP,KAAOzT,EAAK+8B,aAAcxb,oBAAoBpS,QAAQmS,IAAgB,GAChIthB,EAAKg9B,wBAAyB,UAAAxa,GAAoBxiB,EAAKg9B,uBAAuBzb,2BAAhD,eAAqEpS,QAAQmS,KAAgB,IAL/H,UAMGthB,EAAKgkB,qBANR,iBAMG,EAAoBqD,iBANvB,iBAMG,EAA+B50B,QAAO,SAAA0J,GAAE,OAAIA,EAAGpE,SAASjC,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,YAN5G,aAMG,EAA6G5uB,aAErH,CAACwuB,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAGvC,IAAMoC,EAASnQ,WAAc,WACzB,IAAKyc,EACD,MAAO,GAGX,IAL+B,EAK3BvQ,EAGC,GAR0B,cAUZuQ,GAVY,yBAUpB7Q,EAVoB,QAW3B,IAAKA,EAAKgkB,cACN,iBAGJ,IAAIxf,EAAQlE,EAAIpE,MAAK,SAAAC,GAAE,OAAIA,EAAG6nB,cAAcrT,KAAO3Q,EAAK4nB,mBACnDpjB,IACDA,EAAQ,CACJwf,cAAehkB,EAAKgkB,cACpBnT,MAAO,IAEXvQ,EAAIrO,KAAKuS,IAGbA,EAAMqM,MAAM5e,KAAK+N,IAdrB,2BAA0B,IAVK,8BAsC/B,OAVAM,EAAI28B,MAAK,SAAC9sC,EAAG+sC,GACT,OAAI/sC,EAAE0gB,MAAMne,SAAWwqC,EAAErsB,MAAMne,OACpB,EACAvC,EAAE0gB,MAAMne,OAASwqC,EAAErsB,MAAMne,QACxB,EAED,KAIR4N,IACR,CAACuQ,IAEEssB,EAAY/oC,WAAc,kBAAMmQ,EAAOlS,KAAI,SAAAmS,GAAK,YAAK,CACvDmM,GAAInM,EAAMwf,cAAcrT,GACxB7I,KAAI,UAAEtD,EAAMwf,qBAAR,aAAE,EAAqBluB,KAC3BksB,MAAOxd,EAAMqM,MAAMne,aAClB,CAAC6R,IAGN,EAAgDnQ,gBAAmClE,GAAnF,mBAAOktC,EAAP,KAAyBC,EAAzB,KAGA,EAAuClc,YAA4B,IAAnE,mBAAOmc,EAAP,KAAoBC,EAApB,KAIA,OACI,qCACI,eAAC,GAAD,CAAQr+B,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,8CAA+C,4BAE1D,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,eAACC,GAAA,EAAD,CAAKC,GAAI,EAAG6R,GAAG,OAAf,UACI,sBAAMxgB,UAAU,UAAhB,SAA2Bf,EAAE,2CAA4C,UACzE,cAAC,GAAD,CAAkB0J,MAAOouB,EAAUnuB,SAAU,SAAAd,GAAC,OAAI6+B,EAAY7+B,EAAEe,cAAcF,aAElF,eAAC+F,GAAA,EAAD,CAAKC,GAAI,EAAG6R,GAAG,OAAf,UACI,sBAAMxgB,UAAU,UAAhB,SAA2Bf,EAAE,yCAA0C,QACvE,cAAC,GAAD,CAAkB0J,MAAOquB,EAAQpuB,SAAU,SAAAd,GAAC,OAAI8+B,EAAU9+B,EAAEe,cAAcF,aAE9E,cAAC+F,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,SACI,cAAC,GAAD,CAAa7X,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,oBAMrF,eAAC,GAAD,CAAeM,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IAEvB,cAAC,GAAD,CAAoBviB,KAAMqqC,EAAWvB,OAAQ,IAAKD,YAAa,SAAA6B,GAE3DH,EAAoBG,EAAS7sB,IAGxB2sB,EAAYE,EAAS7sB,KACtB4sB,EAAgBC,EAAS7sB,OAIjC,eAAC6Q,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,GAAd,SAAkBf,EAAE,2CAA4C,oBAChE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,2CAA4C,eACtF,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,4CAA6C,WACjE,oBAAIe,UAAU,GAAd,uBAGR,yCAEQsO,QAFR,IAEQA,OAFR,EAEQA,EAAQlS,KAAI,SAAAmS,GACR,OACI,eAAC,WAAD,WACI,qBAAI9G,MAAO,CAAEmH,OAAQ,WAAa1G,QAAS,kBAAMo/B,EAAgB/4B,EAAMwf,cAAcrT,KAArF,UACI,qBAAI1a,UAAU,GAAd,UACI,cAAC,KAAD,CAAUwnC,eAAgBL,IAAqB54B,EAAMwf,cAAcrT,KAClEnM,EAAMwf,cAAcluB,QAEzB,oBAAIG,UAAU,yBAAd,SAEQuO,EAAMwf,cAAcqD,UAAUh1B,KAAI,SAAA2N,GAAI,OAClC,8BACKA,EAAKjI,SAASjC,MADTkK,EAAK2Q,SAM3B,oBAAI1a,UAAU,GAAd,SAAkBf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAO4F,EAAMqM,MAAMne,WAC7E,oBAAIuD,UAAU,aAAd,SACI,cAAC,IAAD,CAAiBO,KAAM8mC,EAAY94B,EAAMwf,cAAcrT,IAAK,WAAY,oBAGhF,eAAC,IAAD,CAAqB/Z,OAAQ0mC,EAAY94B,EAAMwf,cAAcrT,IAA7D,UACI,6BACI,oBAAIoR,QAhF1B,EAgFkDrkB,MAAO,CAAEyB,QAAS,YAIlD,6BACI,oBAAI4iB,QArF1B,EAqFkDrkB,MAAO,CAAE04B,eAAgB,QAArD,SACI,cAAC/D,GAAA,EAAD,CAAU78B,OAAQ8nC,EAAY94B,EAAMwf,cAAcrT,IAAlD,SAEI,eAAC6Q,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,GAAd,SAAkBf,EAAE,2CAA4C,UAChE,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,2CAA4C,UAChE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,4CAA6C,WACvF,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,gDAAiD,eAC3F,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,+CAAgD,mBAG5E,gCAEQsP,EAAMqM,MAAMxe,KAAI,SAAA2N,GAAS,IAAD,MACpB,OACI,cAAC,WAAD,UACI,+BACI,oBAAI/J,UAAU,GAAd,SAAkBf,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMlP,KAAOzT,EAAK+8B,eACzF,oBAAI9mC,UAAU,GAAd,mBAAkB+J,EAAK3P,YAAvB,aAAkB,EAAW0F,QAC7B,oBAAIE,UAAU,yBAAd,SACI,cAAC,OAAD,CAAMM,GAAE,uCAAqC,OAAJyJ,QAAI,IAAJA,GAAA,UAAAA,EAAMgkB,qBAAN,eAAqBrT,KAAM,IAApE,gBACK3Q,QADL,IACKA,GADL,UACKA,EAAMgkB,qBADX,aACK,EAAqBluB,SAG9B,oBAAIG,UAAU,yBAAd,SAEQuO,EAAMwf,cAAcqD,UAAUh1B,KAAI,SAAA2N,GAAI,OAClC,8BACKA,EAAKjI,SAASjC,MADTkK,EAAK2Q,SAM3B,oBAAI1a,UAAU,GAAd,SAEQ+J,EAAKg9B,sBAAwBxa,GAAoBxiB,EAAKg9B,uBAChD,WArBDh9B,EAAK2Q,uBA5C7CnM,EAAMwf,cAAcrT,OAoFrD,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QA/IV,EA+IM,SAA4B,cAAC,GAAD,CAAkB3hB,WAAS,UAE/D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAlJV,EAkJM,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QAvJV,EAuJM,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDpQgEH,WAAW,EAAMpE,YAAaoB,IACrJ,CAAEiD,KAAM,wCAAyCnD,OAAO,EAAMN,UEqBvB,WAAO,IAAD,EACrCvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KAEA,EAAgC7sB,YAAuB,kBAAMqf,OAAS6P,QAAQ,SAAS5P,iBAAvF,mBAAOsZ,EAAP,KAAiB4P,EAAjB,KACA,EAA4BxoC,YAAuB,kBAAMqf,OAAS6P,QAAQ,SAASO,IAAI,EAAG,SAASnQ,iBAAnG,mBAAOuZ,EAAP,KAAe4P,EAAf,KAEA,EAA4FpB,GAA+B,CAAExpB,cAAU/hB,EAAW88B,SAAUA,EAAUC,OAAQA,EAAQhJ,UAAW,cAA1K/C,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAG1Ef,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,+BACvBA,EAAKvO,IAAI8vB,oBAAoBpS,QAAQmS,IAAgB,IAClD,+BAACthB,EAAK3P,YAAN,aAAC,EAAW0F,aAAZ,QAAqB,IAAIwrB,2BAAzB,eAA8CpS,QAAQmS,KAAgB,IACtE,+BAACthB,EAAK88B,wBAAN,aAAC,EAAuBhnC,YAAxB,QAAgC,IAAIyrB,2BAApC,eAAyDpS,QAAQmS,KAAgB,IACjF,+BAACthB,EAAK88B,wBAAN,iBAAC,EAAuB9Y,qBAAxB,aAAC,EAAsCluB,YAAvC,QAA+C,IAAIyrB,2BAAnD,eAAwEpS,QAAQmS,KAAgB,GAChGpsB,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMlP,KAAOzT,EAAK+8B,aAAcxb,oBAAoBpS,QAAQmS,IAAgB,OAEzI,CAACJ,EAAU/e,EAAQjN,IAEtBqoB,GAA6B,CAAEpb,OAAQA,IAGvC,IAAMoC,EAASnQ,WAAc,WACzB,IAAKyc,EACD,MAAO,GAGX,IAL+B,EAK3BvQ,EAIC,GAT0B,cAWZuQ,GAXY,yBAoBpB,IATA7Q,EAXoB,QAYvBwE,EAAQlE,EAAIpE,MAAK,SAAAC,GAAE,OAAIA,EAAG1K,MAAQuO,EAAKvO,OACtC+S,GASG,UAAAA,EAAMs4B,wBAAN,eAAwBnsB,OAAxB,UAA+B3Q,EAAK88B,wBAApC,aAA+B,EAAuBnsB,MACtDnM,EAAMs4B,sBAAmB5sC,IAT7BsU,EAAQ,CACJ/S,IAAKuO,EAAKvO,IACVqrC,iBAAkB98B,EAAK88B,iBACvBjsB,MAAO,IAEXvQ,EAAIrO,KAAKuS,IAQbA,EAAMqM,MAAM5e,KAAK+N,IAhBrB,2BAA2B,IAXI,8BAyC/B,OAVAM,EAAI28B,MAAK,SAAC9sC,EAAG+sC,GACT,OAAI/sC,EAAE0gB,MAAMne,SAAWwqC,EAAErsB,MAAMne,OACpB,EACAvC,EAAE0gB,MAAMne,OAASwqC,EAAErsB,MAAMne,QACxB,EAED,KAIR4N,IACR,CAACuQ,IAEEssB,EAAY/oC,WAAc,kBAAMmQ,EAAOlS,KAAI,SAAAmS,GAAK,YAAK,CACvDmM,GAAInM,EAAM/S,IACVqW,MAAM,UAAAtD,EAAMs4B,wBAAN,eAAwBhnC,MAAxB,UAAkC0O,EAAMs4B,iBAAiBhnC,KAAzD,aAAkE0O,EAAM/S,IAAxE,KAAiF+S,EAAM/S,IAC7FuwB,MAAOxd,EAAMqM,MAAMne,aAClB,CAAC6R,IAGN,EAAgDnQ,gBAAmClE,GAAnF,mBAAOktC,EAAP,KAAyBC,EAAzB,KAGA,EAAuClc,YAA4B,IAAnE,mBAAOmc,EAAP,KAAoBC,EAApB,KAIA,OACI,qCACI,eAAC,GAAD,CAAQr+B,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,sCAAuC,mBAElD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,eAACC,GAAA,EAAD,CAAKC,GAAI,EAAG6R,GAAG,OAAf,UACI,sBAAMxgB,UAAU,UAAhB,SAA2Bf,EAAE,mCAAoC,UACjE,cAAC,GAAD,CAAkB0J,MAAOouB,EAAUnuB,SAAU,SAAAd,GAAC,OAAI6+B,EAAY7+B,EAAEe,cAAcF,aAElF,eAAC+F,GAAA,EAAD,CAAKC,GAAI,EAAG6R,GAAG,OAAf,UACI,sBAAMxgB,UAAU,UAAhB,SAA2Bf,EAAE,iCAAkC,QAC/D,cAAC,GAAD,CAAkB0J,MAAOquB,EAAQpuB,SAAU,SAAAd,GAAC,OAAI8+B,EAAU9+B,EAAEe,cAAcF,aAE9E,cAAC+F,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,SACI,cAAC,GAAD,CAAa7X,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,oBAMrF,eAAC,GAAD,CAAeM,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IAEvB,cAAC,GAAD,CAAoBviB,KAAMqqC,EAAWvB,OAAQ,IAAKD,YAAa,SAAA6B,GAE3DH,EAAoBG,EAAS7sB,IAGxB2sB,EAAYE,EAAS7sB,KACtB4sB,EAAgBC,EAAS7sB,OAIjC,eAAC6Q,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,GAAd,SAAkBf,EAAE,mCAAoC,UACxD,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,oCAAqC,WACzD,oBAAIe,UAAU,GAAd,uBAGR,yCAEQsO,QAFR,IAEQA,OAFR,EAEQA,EAAQlS,KAAI,SAAAmS,GAAU,IAAD,oBACjB,OACI,eAAC,WAAD,WACI,qBAAI9G,MAAO,CAAEmH,OAAQ,WAAa1G,QAAS,kBAAMo/B,EAAgB/4B,EAAM/S,MAAvE,UACI,qBAAIwE,UAAU,GAAd,UACI,cAAC,KAAD,CAAUwnC,eAAgBL,IAAqB54B,EAAM/S,MACrD,cAAC,IAAD,CAAqBmF,UAAS,OAAC4N,QAAD,IAACA,GAAD,UAACA,EAAOs4B,wBAAR,aAAC,EAAyBhnC,MAAxD,SACI,cAAC,GAAD,CACI+G,KAAM4qB,GAAU,UAACjjB,EAAM/S,WAAP,QAAc,IAC9Bk2B,mBAAkB,OAAEnjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,aAAE,EAAyBnsB,GAC7CiX,gBAAe,OAAEpjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,iBAAE,EAAyB9Y,qBAA3B,aAAE,EAAwCrT,GACzDlR,IAAI,aACJD,OAAO,SACPvJ,UAAS,0BANb,mBAQKuO,EAAMs4B,wBARX,aAQK,EAAwBhnC,SAGjC,8BACI,cAAC,GAAD,CACI+G,KAAM4qB,GAAU,UAACjjB,EAAM/S,WAAP,QAAc,IAC9Bk2B,mBAAkB,OAAEnjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,aAAE,EAAyBnsB,GAC7CiX,gBAAe,OAAEpjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,iBAAE,EAAyB9Y,qBAA3B,aAAE,EAAwCrT,GACzDlR,IAAI,aACJD,OAAO,SALX,SAOKgF,EAAM/S,WAInB,oBAAIwE,UAAU,GAAd,SAAkBf,EAAE,iBAAkB,iBAAkB,CAAE0J,MAAO4F,EAAMqM,MAAMne,WAC7E,oBAAIuD,UAAU,aAAd,SACI,cAAC,IAAD,CAAiBO,KAAM8mC,EAAY94B,EAAM/S,KAAM,WAAY,oBAGnE,eAAC,IAAD,CAAqBmF,OAAQ0mC,EAAY94B,EAAM/S,KAA/C,UACI,6BACI,oBAAIswB,QA5F1B,EA4FkDrkB,MAAO,CAAEyB,QAAS,YAIlD,6BACI,oBAAI4iB,QAjG1B,EAiGkDrkB,MAAO,CAAE04B,eAAgB,QAArD,SACI,cAAC/D,GAAA,EAAD,CAAU78B,OAAQ8nC,EAAY94B,EAAM/S,KAApC,SAEI,eAAC+vB,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,GAAd,SAAkBf,EAAE,mCAAoC,UACxD,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,mCAAoC,UACxD,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,oCAAqC,WACzD,oBAAIe,UAAU,GAAd,SAAkBf,EAAE,mCAAoC,eAGhE,gCAEQsP,EAAMqM,MAAMxe,KAAI,SAAA2N,GAAS,IAAD,8BACpB,OACI,cAAC,WAAD,UACI,+BACI,oBAAI/J,UAAU,GAAd,SAAkBf,EAAE,kBAAmB,6BAA8B,CAAEytB,KAAMlP,KAAOzT,EAAK+8B,eACzF,oBAAI9mC,UAAU,GAAd,mBAAkB+J,EAAK3P,YAAvB,aAAkB,EAAW0F,QAC7B,oBAAIE,UAAU,GAAd,SACI,cAAC,IAAD,CAAqBW,UAAS,UAACoJ,EAAK88B,wBAAN,aAAC,EAAuB9Y,eAAtD,SACI,cAAC,OAAD,CAAMztB,GAAE,gDAAiCyJ,EAAK88B,wBAAtC,aAAiC,EAAuB9Y,cAAcrT,IAA9E,gBACK3Q,QADL,IACKA,GADL,UACKA,EAAM88B,wBADX,iBACK,EAAwB9Y,qBAD7B,aACK,EAAuCluB,WAIpD,qBAAIG,UAAU,GAAd,UACI,cAAC,IAAD,CAAqBW,UAAS,OAACoJ,QAAD,IAACA,GAAD,UAACA,EAAM88B,wBAAP,aAAC,EAAwBhnC,MAAvD,SACI,cAAC,GAAD,CACI+G,KAAM4qB,GAAU,UAACznB,EAAKvO,WAAN,QAAa,IAC7Bk2B,mBAAkB,OAAE3nB,QAAF,IAAEA,GAAF,UAAEA,EAAM88B,wBAAR,aAAE,EAAwBnsB,GAC5CiX,gBAAe,OAAEpjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,iBAAE,EAAyB9Y,qBAA3B,aAAE,EAAwCrT,GACzDlR,IAAI,aACJD,OAAO,SACPvJ,UAAS,0BANb,mBAQK+J,EAAK88B,wBARV,aAQK,EAAuBhnC,SAGhC,8BACI,cAAC,GAAD,CACI+G,KAAM4qB,GAAU,UAACznB,EAAKvO,WAAN,QAAa,IAC7Bk2B,mBAAkB,OAAE3nB,QAAF,IAAEA,GAAF,UAAEA,EAAM88B,wBAAR,aAAE,EAAwBnsB,GAC5CiX,gBAAe,OAAEpjB,QAAF,IAAEA,GAAF,UAAEA,EAAOs4B,wBAAT,iBAAE,EAAyB9Y,qBAA3B,aAAE,EAAwCrT,GACzDlR,IAAI,aACJD,OAAO,SALX,SAOKQ,EAAKvO,eAhCLuO,EAAK2Q,uBAxD7CnM,EAAM/S,QA4GvC,cAAC,IAAD,CAAqBmF,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAtKV,EAsKM,SAA4B,cAAC,GAAD,CAAkB3hB,WAAS,UAE/D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAzKV,EAyKM,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA9KV,EA8KM,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBF5R+CH,WAAW,EAAMpE,YAAaoB,KGDjI,I,SAAMygC,GAA2B,WACpC,IAAQxoC,EAAMC,cAAND,EAER,OACI,cAACuP,GAAA,EAAD,CAAOzN,MAAM,UAAb,SACK9B,EAAE,6CAA8C,qTCAtD,SAASyoC,KACZ,MAAoCprB,aAChClK,aAD2C,6PAQrCE,KARV,mBAAOiK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASmrB,KACZ,MAAoCrrB,aAChClK,aAD2C,6PAQrCE,KARV,mBAAOiK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICdzE,SAASorB,GAAWltB,GAAuG,IAAD,EAAtExc,EAAsE,uDAAnC,GAE1F,EAAkDsZ,aAC9CpF,aAD0D,4NAQxDE,IAEF,CACImF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,KAAc,OAAPxc,QAAO,IAAPA,OAAA,EAAAA,EAAS2B,WAAM5F,EAAWia,KAAKsP,MAC1C3jB,KAAI,OAAE3B,QAAF,IAAEA,OAAF,EAAEA,EAAS2B,MAEnB6X,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAnBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA0BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IC5B1B,I,GAKMwsC,GAAc,SAACriC,GAA6B,IAAD,IAC5C0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EAAuE2oC,GADxDlf,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAoBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,GAAI0W,KAAM,IAAQ,IAApH7T,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,ECjCG,WAAoF,IAApDpR,EAAmD,uDAAJ,GAClF,EAAgCwpC,KAAhC,mBAAO/iB,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA6BiiB,EAAQjiB,KAA8B,CAACiiB,IAErG,EAAgCgjB,KAAhC,mBAAO9iB,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA2CuV,EAAQnK,EAAIpL,KAAgC,CAACuV,IAEzH,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GDuBmC4pC,GAAvC,mBAAOzjB,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAEhB,EAAqCmV,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAA2D,GAApDZ,EAAE,2BAA4B,sBAG7D0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IANJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KAQA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,4BAA6B,kBAE9B,mCAAGA,EAAE,0BAA2B,uBAKpD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,KAEpD,eAAC7D,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,mBAAoB,UAC7C,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAG/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,mBAAoB,UAC7C,cAAC,GAAD,CAAY0J,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO6T,YAAT,QAAiB,GAAI3N,SAAU,SAAAD,GAAK,OAAI6G,EAAO,CAAE+G,KAAM5N,UAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBhI,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBE1FzC,I,GCfM8oC,GAAmC,CAC5C,CAAE99B,KAAM,4BAA6BnD,OAAO,EAAMN,UCkB1B,WAAO,IAAD,EACtBvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,ECXG,WAAwG,IAAD,QAAlF9sB,EAAkF,uDAAzC,GAEjE,EAAiFsZ,aAC7EpF,aADyF,0SAQvFE,IAEF,CAEImF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MArBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UA4B9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IDhD6CqsB,CAAY,CAAEhsB,cAAU/hB,IAA7FgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,OAE3D,CAACJ,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,uBAAwB,gBAEnC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,IAEA,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,gCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,mBAAoB,2BASrF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,wBAAyB,cACnE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,oBAAqB,UAC/D,2CAGR,yCAEQ2b,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GACP,IAAMm2B,EAAO,yCAAqCn2B,EAAK2Q,IACjDgR,EAAgB,kBAAMpjB,EAAQtM,KAAKkkC,IAEzC,OACI,eAAC,WAAD,WACI,qBAAIxU,cAAeA,EAAnB,UACI,oBAAI1rB,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,6BACI,cAAC,GAAD,UACI,eAAC8rB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,yCAAoCyJ,EAAK2Q,IAA1D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,2CAAsCyJ,EAAK2Q,IAA5D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,cAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,iCASvD,oBAAIysB,cAAeA,EAAnB,SACI,oBAAII,QArF3B,EAqF8CrkB,MAAO,CAAEyB,QAAS,YAI7C,oBAAIwiB,cAAeA,EAAnB,SACI,oBAAII,QA1F3B,EA0F8CrkB,MAAO,CAAE04B,eAAgB,QAAhD,SACI,cAAChoB,GAAA,EAAD,CAAM/V,MAAI,EAAV,SACI,cAAC,GAAD,CAAamU,KAAMxM,EAAKwM,eAxCnBxM,EAAK2Q,OAiDtC,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QAtGf,EAsGW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QAzGf,EAyGW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QA9Gf,EA8GW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBDpKoBH,WAAW,EAAMpE,YAAaoB,IACzG,CAAEiD,KAAM,qCAAsCzD,UAAWqhC,GAAa79B,WAAW,EAAMpE,YAAaoB,IACpG,CAAEiD,KAAM,gCAAiCzD,UHsBhB,kBAAO,cAAC,GAAD,CAAa0d,UAAU,KGtBYla,WAAW,EAAMpE,YAAaoB,IACjG,CAAEiD,KAAM,uCAAwCzD,UDWvB,WAAO,IAAD,EACvBvH,EAAMC,cAAND,EAER,EAA2D2oC,GAD5Clf,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EIfG,WACH,MAAoCsX,aAChClK,aAD2C,oOAQrCE,KARV,mBAAOiK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IJNjCyrB,GAA3C,mBAAO3d,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAUtD,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,wBAAyB,wBAEpC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,qBAAsB,UAC/C,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACwL,WAAS,EAACliB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG5E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC9D8B+K,WAAW,EAAMpE,YAAaoB,K,OIMrG,I,MCXMkhC,GAAoC,CAC7C,CAAEj+B,KAAM,SAAUnD,OAAO,EAAMN,UDUV,WACrB,IAAQvH,EAAMC,cAAND,EAER,EELG,WAA0G,IAAD,EAA1Ef,EAA0E,uDAA9C,GAE9D,EAAkDsZ,aAC9CpF,aAD0D,22BAgCxDD,GACAE,GACAC,IAEF,CACImF,UAAW,GAEXC,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA3CpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAkDrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IF5DoE8sC,GAAjG,IAAQtrC,KAAQob,EAAhB,EAAgBA,MAAOmwB,EAAvB,EAAuBA,SAAUC,EAAjC,EAAiCA,SAA8CC,EAA/E,EAAuEtjC,OAEvE,OACI,eAAC,GAAD,CAAYhF,UAAU,aAAtB,UACI,qBAAKA,UAAU,uBAAf,SACI,eAACgJ,EAAA,EAAD,WACI,cAAC,GAAD,CAAehE,OAAQsjC,IAEvB,eAAC75B,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAKC,GAAI,GAAI6R,GAAG,GAAhB,SACI,cAAC,GAAD,CAAoB9d,MAAO0lC,MAE/B,cAAC15B,GAAA,EAAD,UACI,cAAC,GAAD,CAAiBhM,MAAOuV,SAGhC,cAAC,GAAD,CAAoB5R,qBAAqB,EAAzC,SACI,gCACI,6BACKpH,EAAE,4BAA6B,yBAEpC,4BACKA,EAAE,yBAA0B,8JAEjC,eAACwP,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,OAAD,CAAMpO,GAAE,iBAAR,SACKrB,EAAE,kBAAmB,+CAG9B,cAACyP,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,gBAAD,CAAerO,GAAG,oBAAlB,SACI,cAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,SACK9B,EAAE,2BAA4B,iDAS/D,qBAAKe,UAAU,uBAAf,SACI,cAACgJ,EAAA,EAAD,UACI,cAAC,GAAD,CAAoBtG,MAAO2lC,YCzDUr+B,WAAW,GAChE,CAAEC,KAAM,kBAAmBnD,OAAO,EAAMN,UEKX,WAC7B,IAAQvH,EAAMC,cAAND,EAER,EAA4D2oC,QAAW3tC,EAAW,CAAE4F,KAAM,mBAAnE0oC,EAAvB,EAAQ1rC,KAAQ6F,MAA0B4lC,EAA1C,EAAkCtjC,OAElC,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,6BACK/F,EAAE,2BAA4B,sBAGvC,eAAC,GAAD,WACI,cAAC,GAAD,CAAe+F,OAAQsjC,IAEvB,cAAC,GAAD,CAAoB5lC,MAAO6lC,WFpB+Bv+B,WAAW,GACjF,CAAEC,KAAM,wBAAyBnD,OAAO,EAAMN,UGIZ,WAClC,IAAQvH,EAAMC,cAAND,EAER,EAA4D2oC,QAAW3tC,EAAW,CAAE4F,KAAM,yBAAnE0oC,EAAvB,EAAQ1rC,KAAQ6F,MAA0B4lC,EAA1C,EAAkCtjC,OAElC,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,6BACK/F,EAAE,iCAAkC,4BAG7C,eAAC,GAAD,WACI,cAAC,GAAD,CAAe+F,OAAQsjC,IAEvB,cAAC,GAAD,CAAoB5lC,MAAO6lC,WHnB0Cv+B,WAAW,IILnFw+B,GAAiC,CAC1C,CAAEv+B,KAAM,iBAAkBnD,OAAO,EAAMN,UCMb,WAC1B,IAAQhL,EAAQktB,cAARltB,IACR,EAGIksB,KAFAiK,EADJ,EACIA,gBACAD,EAFJ,EAEIA,mBAGJ,EAA8BqB,KAAvB6H,EAAP,oBACA,EAA0Cz8B,YAAwB,GAAlE,mBAAOsqC,EAAP,KAAsBC,EAAtB,KAuBA,OAtBAvqC,aAAgB,WACRsqC,IAIJC,GAAiB,GAEjB,sBAAC,4BAAAxuC,EAAA,6DACSyuC,EAAUC,mBAAmBptC,GADtC,SAGSo/B,EAAoB,CACtBlgB,GAAIxG,KAAKC,UACT6Z,UAAW,YACX2D,gBAAiBA,EACjBD,mBAAoBA,EACpBl2B,IAAKmtC,IARZ,OAWGllC,OAAOtE,SAASyH,KAAO+hC,EAX1B,0CAAD,MAaD,CAACF,EAAeC,EAAkB9N,EAAqBp/B,EAAKm2B,EAAiBD,IAG5E,cAAC,GAAD,CAAkBvnB,WAAS,KDtCmCH,WAAW,IEDpE6+B,GAAyBz2B,aAAH,oMCsB5B,I,SCdA,SAAS02B,KACZ,MAAoCxsB,aAChClK,aAD2C,iQAQrCy2B,KARV,mBAAOtsB,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASusB,KACZ,MAAoCzsB,aAChClK,aAD2C,iQAQrCy2B,KARV,mBAAOtsB,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICEzE,I,MAKMwsB,GAAe,SAACxjC,GAA8B,IAAD,IAC9C0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EC9BG,SAAkCyb,GAA6G,IAAD,EAA7Exc,EAA6E,uDAAjD,GAEhG,EAAkDsZ,aAC9CpF,aAD0D,gUAYxDy2B,GACAx2B,IAEF,CACIoF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAvBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA8BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDf0C4tC,CADxDvgB,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAqBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,IAAQ,IAA3G6C,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EEpCG,WAAsF,IAArDpR,EAAoD,uDAAJ,GACpF,EAAgC4qC,KAAhC,mBAAOnkB,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA8BiiB,EAAQjiB,KAA+B,CAACiiB,IAEvG,EAAgCokB,KAAhC,mBAAOlkB,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA4CuV,EAAQnK,EAAIpL,KAAiC,CAACuV,IAE3H,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GF0BmCgrC,GAAvC,mBAAO7kB,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAGhB,EAAkCpK,aAAlC,mBAAOggC,EAAP,KAAkBC,EAAlB,KACAjgC,aAAgB,kBAAMigC,EAAY,OAAChZ,QAAD,IAACA,OAAD,EAACA,EAAY+jB,iBAAgB,CAAC/jB,IAEhE,MAAqByY,KAAdQ,EAAP,oBACA,EAAgGx5B,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACxGuY,EADwG,iEAM1F4rB,EAAW5rB,GAN+E,UAMvGW,EANuG,wDAY7G5D,EAAO,CAAE45B,gBAAiBh2B,EAAKsH,KAG/B0jB,EAAahrB,GAfgG,2CAAD,sDAgB7G,CAACirB,EAAY7uB,EAAQ4uB,IAhBxB,mBAAOE,EAAP,YAAuCC,EAAvC,EAA0Bx5B,YAA2Cy5B,EAArE,EAA6Dx5B,OAkB7D,EAAqC0Y,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAA4D,GAArDZ,EAAE,4BAA6B,qBAC1DmqC,gBAAiB,kBAAMl1B,KAAKqwB,QAAL,OAAa7hC,QAAb,IAAaA,OAAb,EAAaA,EAAO0mC,iBAAmBnqC,EAAE,qCAAsC,iCAAmC,KAG7I0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IAPJ,mBAAOsb,EAAP,KAAiBC,EAAjB,KASA,EAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,IAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,EAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,mBAAOsd,EAAP,YAAgCtB,EAAhC,EAAmBvf,YAA+BolB,EAAlD,EAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,6BAA8B,mBAE/B,mCAAGA,EAAE,2BAA4B,wBAKrD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,EAAgB5F,EAAYia,KAEhE,eAAC9d,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,KAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,oBAAqB,UAC9C,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,EAAS,SAASC,iBAAkBA,EAAgB,UAG/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,kBAAf,SAAkC5f,EAAE,qBAAsB,WAE1D,cAAC,GAAD,CAAsBkY,IAAG,iBAAEgnB,QAAF,IAAEA,OAAF,EAAEA,EAAW3iC,WAAb,QAAoB,KAC7C,cAAC,KAAD,CAAuBqE,KAAK,kBAAkBoe,iBAAkBA,EAAgB,kBAEhF,cAAC,GAAD,CAAkB2f,SAAU,SAAAnrB,GAAK,OAAI6rB,EAAgB7rB,IAAQ1N,YAAaw5B,EACtE1d,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,2BAA4B,wBAIvC,eAAC,GAAD,WACI,cAAC,IAAD,CAAqB0B,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,EACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBG7HzC,I,GCfMoqC,GAAoC,CAC7C,CAAEp/B,KAAM,6BAA8BnD,OAAO,EAAMN,UPkB1B,WAAO,IAAD,EACvBvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EQdG,WAAqI,IAAD,QAAjG9sB,EAAiG,uDAAvD,GAEhF,EAAiFsZ,aAC7EpF,aADyF,yaAYvFy2B,GACAx2B,IAEF,CAEIoF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA1BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UAiC9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IRlD6C2tB,CAA0B,CAAEttB,cAAU/hB,IAA3GgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,OAE3D,CAACJ,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,wBAAyB,kBAEpC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,IACA,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,iCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,oBAAqB,2BAStF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,yBAA0B,eACpE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,qBAAsB,UAChE,oBAAIe,UAAU,GAAd,kBACA,2CAGR,yCAEQ4a,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAS,IAAD,IACTm2B,EAAO,0CAAsCn2B,EAAK2Q,IAGxD,OACI,qBAAkBgR,cAHA,kBAAMpjB,EAAQtM,KAAKkkC,IAGrC,UACI,oBAAIlgC,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,IAAd,SACI,cAAC,GAAD,CAAsBL,KAAK,KAAK8H,MAAO,CAAEm3B,SAAU,SAAWznB,IAAG,oBAAEpN,EAAKo/B,qBAAP,aAAE,EAAoB3tC,WAAtB,QAA6B,OAElG,6BACI,cAAC,GAAD,UACI,eAACmwB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,0CAAqCyJ,EAAK2Q,IAA3D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,4CAAuCyJ,EAAK2Q,IAA7D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,eAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAzB9C8K,EAAK2Q,OAsC1B,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QA3Ff,EA2FW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QA9Ff,EA8FW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QAnGf,EAmGW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBOzJsBH,WAAW,EAAMpE,YAAaoB,IAC3G,CAAEiD,KAAM,sCAAuCzD,UAAWwiC,GAAch/B,WAAW,EAAMpE,YAAaoB,IACtG,CAAEiD,KAAM,iCAAkCzD,UJyBhB,kBAAO,cAAC,GAAD,CAAc0d,UAAU,KIzBYla,WAAW,EAAMpE,YAAaoB,IACnG,CAAEiD,KAAM,wCAAyCzD,UDWvB,WAAO,IAAD,EACxBvH,EAAMC,cAAND,EAER,EGNG,SAAqByb,GAAyG,IAAD,EAAxExc,EAAwE,uDAApC,GAE5F,EAAkDsZ,aAC9CpF,aAD0D,+NAQxDy2B,IAEF,CACIpxB,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,KAAc,OAAPxc,QAAO,IAAPA,OAAA,EAAAA,EAAS2B,WAAM5F,EAAWia,KAAKsP,MAC1C3jB,KAAI,OAAE3B,QAAF,IAAEA,OAAF,EAAEA,EAAS2B,MAEnB6X,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAnBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA0BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IHnC8BkuC,CAD5C7gB,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EIfG,WACH,MAAoCsX,aAChClK,aAD2C,uOAQrCy2B,KARV,mBAAOtsB,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IJNjCgtB,GAA3C,mBAAOlf,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAUtD,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,yBAA0B,yBAErC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,sBAAuB,UAChD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACoqB,YAAU,EAAC9gC,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG7E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC9DgC+K,WAAW,EAAMpE,YAAaoB,KIevG,I,SCdA,SAAS0iC,KACZ,MAAoCptB,aAChClK,aAD2C,iQAQrCD,KARV,mBAAOoK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAOnC,GAAP,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAOA,KADW,YAC/DlB,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICrBzE,SAASmtB,KACZ,MAAoCrtB,aAChClK,aAD2C,iQAQrCD,KARV,mBAAOoK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,EAAYhY,GAAnB,eAAAxI,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAE/U,MAAM,2BAAMA,GAAP,IAAcgY,GAAIA,OADL,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,wDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,ICCzE,I,MAKMotB,GAAe,SAACpkC,GAA8B,IAAD,MAC9C0e,EAAa1e,EAAb0e,SAEAjlB,EAAMC,cAAND,EAER,EC7BG,SAAkCyb,GAA6G,IAAD,EAA7Exc,EAA6E,uDAAjD,GAEhG,EAAkDsZ,aAC9CpF,aAD0D,gbAgBxDD,GACAE,IAEF,CACIoF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,IAAMxG,KAAKsP,OAEnB9L,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA3BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAkCrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IDpB0CwuC,CADxDnhB,cAAPhO,IACe0K,EAAvB,EAAQvoB,KAAQ6F,MAAqB2B,EAArC,EAAqCA,UAAmB6T,EAAxD,EAAgDlT,OAChD,EAAmCmK,GAAqBiW,EAAYlB,EAAW,CAAExJ,GAAIxG,KAAKC,UAAWtU,KAAM,IAAQ,IAA3G6C,EAAR,EAAQA,MAAO8M,EAAf,EAAeA,OAAQF,EAAvB,EAAuBA,QACvB,EEnCG,WAAsF,IAArDpR,EAAoD,uDAAJ,GACpF,EAAgCwrC,KAAhC,mBAAO/kB,EAAP,KAAgBC,EAAhB,KACMhB,EAASzlB,eAAkB,SAACuE,GAAD,OAA8BiiB,EAAQjiB,KAA+B,CAACiiB,IAEvG,EAAgCglB,KAAhC,mBAAO9kB,EAAP,KAAgBC,EAAhB,KACMf,EAAS5lB,eAAkB,SAACuc,EAAYpL,GAAb,OAA4CuV,EAAQnK,EAAIpL,KAAiC,CAACuV,IAE3H,OAAOpB,GACH,CAACG,EAAQgB,GACT,CAACb,EAAQe,GACT5mB,GFyBmC4rC,GAAvC,mBAAOzlB,EAAP,KAAuBE,EAAvB,KAAevf,OACTsD,EAAUC,cAGhB,EAAkCpK,aAAlC,mBAAO4rC,EAAP,KAAkBC,EAAlB,KACA7rC,aAAgB,kBAAM6rC,EAAY,OAAC5kB,QAAD,IAACA,OAAD,EAACA,EAAYhO,sBAAqB,CAACgO,IAErE,MAAqByY,KAAdQ,EAAP,oBACA,EAAgGx5B,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACxGuY,EADwG,iEAM1F4rB,EAAW5rB,GAN+E,UAMvGW,EANuG,wDAY7G5D,EAAO,CAAEy6B,qBAAsB72B,EAAKsH,KAGpCsvB,EAAa52B,GAfgG,2CAAD,sDAgB7G,CAACirB,EAAY7uB,EAAQw6B,IAhBxB,mBAAOE,EAAP,YAAuCC,EAAvC,EAA0BplC,YAA2CqlC,EAArE,EAA6DplC,OAmB7D,EAA0C7G,aAA1C,mBAAOksC,EAAP,KAAsBC,EAAtB,KACAnsC,aAAgB,kBAAMmsC,EAAgB,OAACllB,QAAD,IAACA,OAAD,EAACA,EAAY9N,0BAAyB,CAAC8N,IAE7E,MAA4GvgB,YAAgB,uCAAC,WAAO4N,GAAP,eAAAvY,EAAA,yDACpHuY,EADoH,iEAMtG4rB,EAAW5rB,GAN2F,UAMnHW,EANmH,wDAYzH5D,EAAO,CAAE+6B,yBAA0Bn3B,EAAKsH,KAGxC4vB,EAAiBl3B,GAfwG,2CAAD,sDAgBzH,CAACirB,EAAY7uB,EAAQ86B,IAhBxB,mBAAOE,EAAP,YAA2CC,EAA3C,EAA8B1lC,YAA+C2lC,EAA7E,EAAqE1lC,OAkBrE,EAAqC0Y,cAAqB,SAACC,EAAYC,GACnE,IAAMC,EAAQ,CACVhe,KAAM,kBAAM,OAAC6C,QAAD,IAACA,OAAD,EAACA,EAAO7C,MAA4D,GAArDZ,EAAE,4BAA6B,qBAC1DgrC,qBAAsB,kBAAM/1B,KAAKqwB,QAAL,OAAa7hC,QAAb,IAAaA,OAAb,EAAaA,EAAOunC,sBAAwBhrC,EAAE,0CAA2C,iCAAmC,IACxJsrC,yBAA0B,kBAAMr2B,KAAKqwB,QAAL,OAAa7hC,QAAb,IAAaA,OAAb,EAAaA,EAAO6nC,0BAA4BtrC,EAAE,8CAA+C,2CAA6C,KAGlL0e,EAAWI,WAAWF,EAAOD,KAC9B,CAAClb,IARJ,mBAAOsb,GAAP,KAAiBC,GAAjB,KAUA,GAAsEpZ,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC9E8jB,KAD8E,iEAK7EqG,EAAK3hB,EAAMgY,GAAIpL,IAAW4U,GALmD,OAOnF5b,EAAQ4hB,SAP2E,2CAQpF,CAAClM,GAAUqG,EAAM3hB,EAAO4M,EAAS4U,EAAU5b,IAR9C,qBAAOsd,GAAP,eAAgCtB,GAAhC,GAAmBvf,YAA+BolB,GAAlD,GAA0CnlB,OAU1C,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAEQwV,EACI,mCAAGjlB,EAAE,6BAA8B,mBAE/B,mCAAGA,EAAE,2BAA4B,wBAKrD,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAYiS,GAAgB5F,EAAY6lB,EAAuBM,KAEvF,eAAChqB,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkBgF,MAA3C,UACI,eAACjH,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,oBAAqB,UAC9C,cAAC,KAAD,CAAgBY,KAAK,OAAO0H,KAAK,OAAOoB,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,GAAI+I,SAAU,SAAAd,GAAC,OAAI0H,EAAO,CAAE3P,KAAMiI,EAAEe,cAAcF,SAAUsL,OAAQ,SAAAnM,GAAC,OAAIkW,GAAS,SAASC,iBAAkBA,GAAgB,UAG/L,eAACU,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,QAAf,SAAwB5f,EAAE,qBAAsB,WAEhD,qBAAKe,UAAU,+CAAf,SACI,uBACImX,IAAG,iBAAE4yB,QAAF,IAAEA,OAAF,EAAEA,EAAWvuC,WAAb,QAAoB,GACvB6b,OAAM,iBAAEgzB,QAAF,IAAEA,OAAF,EAAEA,EAAe7uC,WAAjB,QAAwB,GAC9B0b,UAAQ,MAIhB,cAAC,KAAD,CAAuBrX,KAAK,uBAAuBoe,iBAAkBA,GAAgB,uBACrF,cAAC,KAAD,CAAuBpe,KAAK,2BAA2Boe,iBAAkBA,GAAgB,2BAEzF,eAAC0N,GAAA,EAAD,WACI,cAAC,GAAD,CAAkBiS,SAAU,SAAAnrB,GAAK,OAAIy3B,EAAgBz3B,IAAQ1N,YAAaolC,EACtEtpB,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,2BAA4B,qBAEnC,cAAC,GAAD,CAAkB2+B,SAAU,SAAAnrB,GAAK,OAAI+3B,EAAoB/3B,IAAQ1N,YAAa0lC,EAC1E5pB,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAO,yCAAOV,EAAE,mBAAoB,mBAD3E,SAGKA,EAAE,gCAAiC,+BAKhD,eAAC,GAAD,WACI,cAAC,IAAD,CAAqB0B,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,UAAUgE,YAAauf,GACtCzD,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,gBAAiB,gBADnE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBGlKzC,ICfM0rC,GAAoC,CAC7C,CAAE1gC,KAAM,6BAA8BnD,OAAO,EAAMN,UPkB1B,WAAO,IAAD,EACvBvH,EAAMC,cAAND,EACQ8rB,EAAgBrD,KAAxBxb,OACR,EAA4B/N,WAAA,OAAuB4sB,QAAvB,IAAuBA,IAAe,IAAlE,mBAAO7e,EAAP,KAAe8e,EAAf,KACA,EQdG,WAAqI,IAAD,QAAjG9sB,EAAiG,uDAAvD,GAEhF,EAAiFsZ,aAC7EpF,aADyF,kbAYvFD,GACAE,IAEF,CAEIoF,UAAW,CACP8D,OAAQrd,EAAQ4d,YAChBC,MAAO7d,EAAQ8d,SACfC,gBAAiB/d,EAAQ+d,iBAE7BvE,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MA1BpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QAAoBiD,EAAzD,EAA8CM,UAiC9Cnd,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,MAAyCkD,GACrCC,GACA,iBAAC9c,QAAD,IAACA,OAAD,EAACA,EAAS4d,mBAAV,QAAyB,IAAzB,iBAA+Bjf,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAM+d,aAArC,aAA+B,EAAane,cAA5C,QAAsD,IACtD,SAAC0f,EAAaC,GAAd,2BAAC,2BACMD,GACAC,GAFP,IAIIxB,MAAM,GAAD,qCAAOuB,QAAP,IAAOA,OAAP,EAAOA,EAAavB,aAApB,QAA6B,IAA7B,8BAAsCwB,QAAtC,IAAsCA,OAAtC,EAAsCA,EAAYxB,aAAlD,QAA2D,UAEpE,SAACwB,GAAD,oBAAgBA,QAAhB,IAAgBA,GAAhB,UAAgBA,EAAYxB,aAA5B,aAAgB,EAAmBne,UAT/B6e,EAAR,EAAQA,UAAoBF,EAA5B,EAAmBO,QAWbA,EAAUxd,eAAkB,mBAAOD,EAAQ8d,UAAmBZ,MAAY,CAACld,EAAQ8d,SAAUZ,IAG7FtW,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,EACRigB,UAAWA,EACXK,QAASA,KACT,CAAC9e,EAAMiI,EAASgT,EAASzc,EAAOigB,EAAWK,IRlD6CivB,CAA0B,CAAE5uB,cAAU/hB,IAA3GgxB,EAAvB,EAAQpuB,KAAQ+d,MAAmBvW,EAAnC,EAAmCA,UAAmB+a,EAAtD,EAA8Cpa,OAAuBsW,EAArE,EAAqEA,UAAWK,EAAhF,EAAgFA,QAChF,EAA0Cxd,WAA8B,IAAxE,mBAAOk/B,EAAP,KAAsBC,EAAtB,KACMnS,EAAahtB,eAAkB,SAACuc,GAAD,QAAgB2iB,EAAcp3B,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,OAAoB,CAAC2iB,IACpGjS,EAAiBjtB,eAAkB,SAACuc,GACtC4iB,GAAiB,SAAA34B,GACb,OAAIA,EAAUsB,MAAK,SAAAC,GAAE,OAAIA,IAAOwU,KACrB/V,EAAUnI,QAAO,SAAA0J,GAAE,OAAIA,IAAOwU,KAE/B,GAAN,oBAAW/V,GAAX,CAAsB+V,SAG/B,CAAC4iB,IACEh1B,EAAUC,cAGVqS,EAAQzc,WAAc,WACxB,IAAK8sB,IAAa/e,EACd,OAAO+e,EAGX,IAAII,EAAcnf,EAAOof,oBAGzB,OAAOL,EAASzuB,QAAO,SAAAuN,GAAI,OACvBA,EAAKlK,KAAKyrB,oBAAoBpS,QAAQmS,IAAgB,OAE3D,CAACJ,EAAU/e,IAEdob,GAA6B,CAAEpb,OAAQA,IAIvC,OACI,qCACI,eAAC,GAAD,CAAQjD,OAAK,EAAb,UACI,eAACwF,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,wBAAyB,kBAEpC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,IACA,cAAC,GAAD,UACI,eAAC8O,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,cAAC,GAAD,CAAa/F,MAAOuD,EAAQtD,SAAU,SAAAd,GAAC,OAAIkjB,EAAUljB,EAAEe,cAAcF,YAEzE,cAAC+F,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAACgd,GAAA,EAAD,UACI,cAAC,gBAAD,CAAerrB,GAAG,iCAAlB,SACI,eAACQ,EAAA,EAAD,CAAQC,MAAM,UAAd,UACI,cAAC,IAAD,CAAiBR,KAAK,SAAS,yCAAItB,EAAE,oBAAqB,2BAStF,eAAC,GAAD,CAAegK,OAAK,EAApB,UACI,cAAC,GAAD,CAAejE,OAAQoa,IACvB,eAACmM,GAAA,EAAD,CAAOC,YAAU,EAACC,SAAO,EAAzB,UACI,gCACI,+BACI,oBAAIzrB,UAAU,yBAAd,SAAwCf,EAAE,yBAA0B,eACpE,oBAAIe,UAAU,yBAAd,SAAwCf,EAAE,qBAAsB,UAChE,oBAAIe,UAAU,GAAd,kBACA,2CAGR,yCAEQ4a,QAFR,IAEQA,OAFR,EAEQA,EAAOxe,KAAI,SAAA2N,GAAS,IAAD,IACTm2B,EAAO,0CAAsCn2B,EAAK2Q,IAGxD,OACI,qBAAkBgR,cAHA,kBAAMpjB,EAAQtM,KAAKkkC,IAGrC,UACI,oBAAIlgC,UAAU,yBAAd,SACI,8BAAM+J,EAAKlK,SAEf,oBAAIG,UAAU,yBAAd,SAAwC+J,EAAKlK,OAC7C,oBAAIG,UAAU,IAAd,SACI,cAAC,GAAD,CAAsBL,KAAK,KAAK8H,MAAO,CAAEm3B,SAAU,SAAWznB,IAAG,oBAAEpN,EAAKuN,8BAAP,aAAE,EAA6B9b,WAA/B,QAAsC,OAE3G,6BACI,cAAC,GAAD,UACI,eAACmwB,GAAA,EAAD,WACI,cAAC,gBAAD,CAAerrB,GAAE,0CAAqCyJ,EAAK2Q,IAA3D,SACI,eAAC5Z,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAA/B,UACI,cAAC,IAAD,CAAiBva,KAAK,SACtB,yCAAItB,EAAE,cAAe,gBAG7B,eAAC2sB,GAAA,EAAD,CAAgBrsB,OAAQ4rB,EAAWphB,EAAK2Q,IAAKlb,OAAQ,kBAAM4rB,EAAerhB,EAAK2Q,KAA/E,UACI,cAAChb,EAAA,EAAD,CAAgBqB,MAAM,UAAU+Z,SAAO,EAAC+Q,OAAK,EAA7C,SACI,sBAAM7rB,UAAU,UAAhB,SAA2Bf,EAAE,sBAAuB,YAExD,cAACgB,EAAA,EAAD,UACI,cAAC,gBAAD,CAAeK,GAAE,4CAAuCyJ,EAAK2Q,IAA7D,SACI,eAACva,EAAA,EAAD,CAAcH,UAAU,eAAxB,UACI,cAAC,IAAD,CAAiBO,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,gCAzB9C8K,EAAK2Q,OAsC1B,cAAC,IAAD,CAAqB/Z,OAAQ0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,QAAlD,SACI,6BAAI,oBAAIqvB,QA3Ff,EA2FW,SAAuB,cAAC,GAAD,CAAkB3hB,WAAS,UAE1D,cAAC,IAAD,CAAqBxJ,QAAS0D,KAAa,OAACuW,QAAD,IAACA,OAAD,EAACA,EAAOne,UAAWkf,IAA9D,SACI,6BAAI,oBAAImQ,QA9Ff,EA8FW,SACA,cAAC,GAAD,CAAgB5f,OAAQA,UAGhC,cAAC,IAAD,CAAqBvL,QAAS0D,GAAasX,IAA3C,SACI,6BAAI,qBAAImQ,QAnGf,EAmGW,UACA,cAAC,KAAD,CAAmC3D,QAAS7M,GAA5C,iBAAeV,QAAf,IAAeA,OAAf,EAAeA,EAAOne,cAAtB,QAAgC,GAChC,cAAC,GAAD,CAAkB0N,WAAS,wBOzJsBH,WAAW,EAAMpE,YAAaoB,IAC3G,CAAEiD,KAAM,sCAAuCzD,UAAWojC,GAAc5/B,WAAW,EAAMpE,YAAaoB,IACtG,CAAEiD,KAAM,iCAAkCzD,UJwBhB,kBAAO,cAAC,GAAD,CAAc0d,UAAU,KIxBYla,WAAW,EAAMpE,YAAaoB,IACnG,CAAEiD,KAAM,wCAAyCzD,UDWvB,WAAO,IAAD,EACxBvH,EAAMC,cAAND,EAER,EGNG,SAAqByb,GAAyG,IAAD,EAAxExc,EAAwE,uDAApC,GAE5F,EAAkDsZ,aAC9CpF,aAD0D,+NAQxDD,IAEF,CACIsF,UAAW,CACPiD,GAAE,OAAEA,QAAF,IAAEA,KAAc,OAAPxc,QAAO,IAAPA,OAAA,EAAAA,EAAS2B,WAAM5F,EAAWia,KAAKsP,MAC1C3jB,KAAI,OAAE3B,QAAF,IAAEA,OAAF,EAAEA,EAAS2B,MAEnB6X,YAAW,UAAExZ,EAAQwZ,mBAAV,QAAyBxF,GACpCyF,aAAczZ,EAAQyZ,aACtBC,YAAa,SAAC/a,GACNqB,EAAQ0Z,aACR1Z,EAAQ0Z,YAAY/a,MAnBpC,mBAAOgb,EAAP,YAAehb,EAAf,EAAeA,KAAMib,EAArB,EAAqBA,QAASzc,EAA9B,EAA8BA,MAAO0c,EAArC,EAAqCA,QA0BrC5Z,aAAgB,WACPD,EAAQ+G,MACT4S,MAEL,CAAC3Z,EAAQ+G,KAAM4S,IAGlB,IAAM/S,EAAU3G,cAAA,sBAAkB,sBAAAjE,EAAA,yDAAe6d,EAAf,gCAA+BF,IAA/B,6CAA8CE,IAA9C,2CAA4D,CAACA,EAASF,IACxG,OAAO1Z,WAAc,iBAAO,CACxBtB,KAAI,OAAEA,QAAF,IAAEA,IAAS,GACfiI,QAASA,EACTT,UAAWyT,EACX9S,OAAQ3J,KACR,CAACwB,EAAMiI,EAASgT,EAASzc,IHnC8BwvC,CAD5CniB,cAAPhO,IACQhY,EAAhB,EAAQ7F,KAAQ6F,MAAS2B,EAAzB,EAAyBA,UAAmB6T,EAA5C,EAAoClT,OACpC,EIfG,WACH,MAAoCsX,aAChClK,aAD2C,uOAQrCD,KARV,mBAAOoK,EAAP,KAAyBlhB,EAAzB,KAAyBA,MAazB,EAAwDwJ,YAAgB,uCAAC,WAAO6V,GAAP,eAAAxgB,EAAA,sEAChDqiB,EAAe,CAAE9E,UAAW,CAAEiD,GAAIA,KADc,YAC/DlZ,EAD+D,QAE1DwD,SAAUxD,EAAOwD,OAAOvI,OAFkC,sBAG3D+E,EAAOwD,OAHoD,2CAAD,sDAKrE,CAACuX,IALJ,mBAAOra,EAAP,YAAiB6C,EAAjB,EAAiBA,YAAqByX,EAAtC,EAA8BxX,OAO9B,MAAO,CAAC9C,EAAQ,CAAE6C,YAAaA,EAAaC,OAAQ3J,EAAQA,EAAMD,QAAUohB,IJNjCsuB,GAA3C,mBAAOxgB,EAAP,KAAyBC,EAAzB,KAAiBvlB,OACXsD,EAAUC,cAEhB,EAAoF1D,YAAgB,sBAAC,sBAAA3K,EAAA,yDAC5FwI,EAD4F,iEAK3F4nB,EAAO5nB,EAAMgY,IAL8E,OAOjGpS,EAAQ4hB,SAPyF,2CAQlG,CAACI,EAAQ5nB,EAAO4F,IARnB,mBAAOoiB,EAAP,YAA0CC,EAA1C,EAA6B5lB,YAAiC6lB,EAA9D,EAAsD5lB,OAUtD,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACyJ,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,UACI,6BAAKzP,EAAE,yBAA0B,yBAErC,cAAC,IAAD,CAAqB0B,OAAQ0D,EAA7B,SACI,cAACqK,GAAA,EAAD,CAAKC,GAAG,OAAR,SACI,cAAC,GAAD,CAAkBhP,KAAK,cAInC,cAAC,GAAD,OAGJ,eAAC,GAAD,WACI,cAAC,GAAD,CAAeqF,OAAQ,CAACkT,EAAY0S,EAAkBL,KAEtD,eAAC7J,GAAA,EAAD,CAAMC,SAAU,SAAA7Y,GAAOA,EAAE8Y,iBAAkB8J,KAA3C,UACI,eAAC/L,GAAA,EAAD,WACI,cAACC,GAAA,EAAD,CAAOC,QAAQ,OAAf,SAAuB5f,EAAE,sBAAuB,UAChD,cAAC2I,GAAA,EAAD,CAAO/H,KAAK,OAAO0H,KAAK,OAAO8X,UAAQ,EAACoqB,YAAU,EAAC9gC,MAAK,iBAAEjG,QAAF,IAAEA,OAAF,EAAEA,EAAO7C,YAAT,QAAiB,QAG7E,eAAC,GAAD,WACI,cAAC,IAAD,CAAqBc,QAAS0D,EAA9B,SACI,eAAC,KAAD,CAAatD,MAAM,SAASgE,YAAa4lB,EACrC9J,kBAAmB,qCAAE,cAACrW,GAAA,EAAD,CAAS7K,KAAK,OAAhB,IAAyBV,EAAE,kBAAmB,kBADrE,UAEI,cAAC,IAAD,CAAiBsB,KAAK,UACtB,yCAAItB,EAAE,gBAAiB,kBAG/B,cAAC6B,EAAA,EAAD,CAAQyG,KAAK,SAASxG,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,SAAAJ,GAAC,OAAIQ,EAAQ4hB,UAApE,SACKjrB,EAAE,gBAAiB,yBC9DgC+K,WAAW,EAAMpE,YAAaoB,KIcjG+jC,GAA4B,uBAClC19B,IADkC,aAElCiS,IAFkC,aAGlC4M,IAHkC,aAIlCrF,IAJkC,aAKlCiE,IALkC,aAOlC4b,IAPkC,aAQlCra,IARkC,aASlCmQ,IATkC,aAUlCW,IAVkC,aAWlCuB,IAXkC,aAYlCsB,IAZkC,aAalCoF,IAbkC,aAclC8C,IAdkC,aAelCmB,IAfkC,aAgBlCtB,IAhBkC,aAiBlC4C,IAjBkC,aAkBlCnC,IAlBkC,aAmBlC5H,IAnBkC,aAoBlCE,IApBkC,aAqBlCE,IArBkC,CAuBrC,CAAE/2B,UAAMhQ,EAAWuM,UCpCC,WACpB,IAAQvH,EAAMC,cAAND,EACFqJ,EAAUC,cAEhB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,6BAAKtJ,EAAE,2BAA4B,yDAEvC,eAAC,GAAD,WACI,4BACKA,EAAE,oBAAqB,kKAG5B,cAAC6B,EAAA,EAAD,CAAQC,MAAM,UAAU+Z,SAAO,EAAC5S,QAAS,kBAAMI,EAAQ4hB,UAAvD,SACKjrB,EAAE,kBAAmB,4CDwB7B+rC,GAAgC,aACtC1e,IEzCM2e,GAAU,WACnB,OACI,eAAC,IAAD,CAAYliC,OAAK,EAACG,QAAQ,KAA1B,UACI,cAAC,IAAD,IACA,cAAC,IAAD,IAEA,eAAC,GAAD,WACI,cAACE,EAAA,EAAD,CAAKpJ,UAAU,WAAf,SACI,cAAC,GAAD,MAGJ,cAACoJ,EAAA,EAAD,CAAKpJ,UAAU,gBAAf,SACI,cAAC,GAAD,CAAW8J,OAAQkhC,UAI3B,cAAC,IAAD,IACA,cAAC,IAAD,QCVCE,GAAS,SAAC1lC,GACnB,OACI,sBAAKxF,UAAU,MAAf,UACI,cAAC,GAAD,IACA,sBAAKA,UAAU,WAAf,UACI,cAAC,GAAD,IACA,sBAAMA,UAAU,OAAhB,SAEI,cAAC,WAAD,CAAgBmrC,SAAU,cAAC,GAAD,IAA1B,SACK3lC,EAAMW,gBAInB,cAAC,GAAD,Q,2CCrBCilC,GAAiB,SAACC,GAC3BA,EAAQzd,IAEJ0d,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MAGAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,O,kDC7EFC,GAAQ,IAAIC,KAGLC,GAAuB,IAAIC,kBAAe,CACnDH,SACAI,QAAUtsC,OAAOiwB,eAErBmc,GAAqBG,UAErB,IAAMxW,GAAO,IAAIyW,KAAS,CACtBC,IAAKh+B,GACL3Q,YAAa,gBAGJ4uC,GAAe,IAAIC,KAAa,CACzC5W,KAAMA,GACNmW,MAAOA,K,mDCHEU,I,cAAqB,CAC9B,CAAEnxB,KAAM,QAASrf,KAAM,qBAAsBywC,gBAAiB,KAAMC,aAAc,KAAMC,cAAe,MACvG,CAAEtxB,KAAM,QAASrf,KAAM,oBAAqBywC,gBAAiB,KAAMC,aAAc,QAASC,cAAe,W,cCD7G,IAAMC,GCXK,IAAIC,MAAgB,SAACC,GAAD,MAAsD,CAC7E5sC,eAAgB4sC,EAAQC,WAAU,SAAA9sC,GAAQ,OAAI,IAAI9C,KAClDwR,SAAUm+B,EAAQC,WAAU,SAAA9sC,GAAQ,OAAI,IAAIN,WDYpD/J,EAAYkF,WAAU,Y7JHf,WAA+B,IAAD,IAC3B,QAAN,EAAA8E,cAAA,mBAAQiwB,oBAAR,SAAsBmd,WAAW7d,I6JGjC8d,GACAjB,GAAqBkB,WHlBrB3F,GAAeC,MGyBnB,IAAMvyB,IElBFA,KAGKk4B,IAAIC,MAGJD,IAAIE,MAEJF,IAAIG,MAGJt+B,KAAK,CACFu+B,YAAa,QAGbC,cAAe,CACXC,aAAa,EAEbz8B,OAAQ,SAAUlM,EAAOkM,EAAQ7F,GAE7B,OAAIrG,aAAiB4oC,MAEVC,oBAAS7oC,GADT6U,KAAO7U,GAAOkM,OAAOA,GAM5BlM,aAAiB8oC,QAEVC,mBAAS/oC,GADTgpC,KAAQhpC,GAAOkM,OAAOA,GAK1BlM,MAMvBmQ,KAAK84B,GAAG,mBAAmB,SAACC,GAAS,IAAD,SAGG,KAA/B,oBAACA,SAAD,aAAC,EAAK34B,QAAQ,aAAd,QAAuB,KACvB24B,EAAM,SAGV,IAAMC,EAAezB,GAAmBpqC,MAAK,SAAA8D,GAAI,OAAIA,EAAKmV,OAAS2yB,KAEnEr0B,KAAOu0B,OAAP,iBAAcD,QAAd,IAAcA,OAAd,EAAcA,EAAcvB,oBAA5B,QAA4CsB,GAC5CF,KAAQI,OAAR,iBAAeD,QAAf,IAAeA,OAAf,EAAeA,EAActB,qBAA7B,QAA8CqB,MAG3C/4B,MnSvDPtL,GoSH+B,CAE3B,SAACnS,GAAW,IAAD,IACH22C,GAAe,EACf52C,EAAO,2BAAGC,QAAH,IAAGA,OAAH,EAAGA,EAAOD,eAAV,eAAqBC,QAArB,IAAqBA,OAArB,EAAqBA,EAAO8S,kBAA5B,QAA0C,GACjD8jC,EAA4B,GAChC,OAAQ72C,GAEJ,IAAK,iCACDA,EAAUyxB,KAAQ5tB,EAAE,yCAA0C,qDAC9D+yC,GAAe,EAwBvB,OAjB2C,IAAvC52C,EAAQ8d,QAAQ,qBAC+D,IAA3E9d,EAAQ8d,QAAQ,uDAChB9d,EAAUyxB,KAAQ5tB,EAAE,sCAAuC,wEACW,IAA/D7D,EAAQ8d,QAAQ,6CACvB9d,EAAUyxB,KAAQ5tB,EAAE,qCAAsC,4DAG9D+yC,GAAe,IAInB,OAAI32C,QAAJ,IAAIA,OAAJ,EAAIA,EAAO42C,iBACPA,EAAa,OAAG52C,QAAH,IAAGA,OAAH,EAAGA,EAAO42C,cACvBD,GAAe,GAIdA,EAMDC,EAAcx1C,OACPw1C,EAAc71C,KAAI,SAAA2N,GAAI,MAAK,CAC9B3O,QAASA,EACT2T,QAAS8d,KAAQ5tB,EAAE,qCAAsC,qCAAsC,CAAE7D,QAAS2O,EAAK3O,QAAS+D,SAAU4K,EAAK5K,WACvI9D,MAAOA,MAKR,CAAED,UAASC,UAddN,QAAQC,IAAIK,GACL,OAkBf,SAACA,GAAW,IAAD,EACP,cAAQA,QAAR,IAAQA,OAAR,EAAQA,EAAOD,SAEX,IAAK,4CACD,OAAOyxB,KAAQ5tB,EAAE,wCAAyC,6CAC9D,IAAK,gDACD,OAAO4tB,KAAQ5tB,EAAE,qCAAsC,iDAC3D,IAAK,6DACD,OAAO4tB,KAAQ5tB,EAAE,oCAAqC,8DAC1D,IAAK,oCACD,OAAO4tB,KAAQ5tB,EAAE,4CAA6C,qCAClE,IAAK,eACD,OAAO4tB,KAAQ5tB,EAAE,sCAAuC,gBAI5D,IAAK,mBACD,OAAO4tB,KAAQ5tB,EAAE,yCAA0C,oBAE/D,IAAK,gEACD,OAAO4tB,KAAQ5tB,EAAE,iDAAkD,iEAEvE,IAAK,4CACD,OAAO4tB,KAAQ5tB,EAAE,8EAA+E,6CAEpG,IAAK,oGACD,OAAO4tB,KAAQ5tB,EAAE,oBAAqB,qGAE1C,IAAK,+BACD,OAAO4tB,KAAQ5tB,EAAE,qDAAsD,gCAE3E,IAAK,wBACD,OAAO4tB,KAAQ5tB,EAAE,sCAAuC,yBAE5D,IAAK,mCACD,OAAO4tB,KAAQ5tB,EAAE,4CAA6C,oCAClE,IAAK,yCACD,OAAO4tB,KAAQ5tB,EAAE,iDAAkD,0CAEvE,IAAK,iCACD,OAAO4tB,KAAQ5tB,EAAE,+CAAgD,kCAMzE,GAAkE,KAAzD,OAAL5D,QAAK,IAALA,GAAA,UAAAA,EAAOD,eAAP,eAAgB8d,QAAQ,mCAAyC,CACjE,IAAMg5B,EAAwB72C,EAAMD,QAAQ+2C,OAAO,IACnD,OAAOtlB,KAAQ5tB,EAAE,+DAAgE,0CAA2C,CAAE5D,MAAO62C,IAGzI,OAAO,OHzEZ,IAAME,GAAM,WACf,OACI,cAAC,KAAD,UACI,cAACC,GAAA,EAAD,CAAiBv5B,KAAMA,GAAvB,SACI,cAAC,IAAuBw5B,SAAxB,CAAiC3pC,MAAO8nC,GAAxC,SACI,cAAC,aAAD,UACI,cAAC8B,GAAA,EAAD,CAAgBC,OAAQrC,GAAxB,SACI,cAAC,WAAD,CAAgBhF,SAAU,cAAC,GAAD,CAAkBhhC,WAAW,IAAvD,SACI,eAAC,GAAD,CAAQ4gC,UAAWA,GAAnB,UACI,cAAC,KAAD,CAAQ0H,aAAc35B,GAAK7Z,EAAE,iBAAkByzC,cAAe55B,GAAK7Z,EAAE,wBAErE,cAAC,GAAD,CAAW6K,OAAQihC,qBItCjD4H,GAAcC,QACa,cAA7BnvC,OAAOtE,SAAS0zC,UAEa,UAA7BpvC,OAAOtE,SAAS0zC,UAEhBpvC,OAAOtE,SAAS0zC,SAASj9B,MACrB,2DA6BR,SAASk9B,GAAgBC,GACrBte,UAAUue,cACLvxC,SAASsxC,GACTx/B,MAAK,SAAA0/B,GACFA,EAAaC,cAAgB,WACzB,IAAMC,EAAwBF,EAAaG,WAC3CD,EAAiBE,cAAgB,WACE,cAA3BF,EAAiB14C,QACbg6B,UAAUue,cAAcM,WAKxBv4C,QAAQC,IAAI,6CAKZD,QAAQC,IAAI,4CAM/Bu4C,OAAM,SAAAl4C,GACHN,QAAQM,MAAM,4CAA6CA,MCtEvE,IAYem4C,GAZS,SAACC,GACnBA,GAAeA,aAAuBC,UACxC,8BAAqBngC,MAAK,YAAkD,IAA/CogC,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,O,mBCGRO,GAAUhyC,SAASkU,qBAAqB,QAAQ,GAAGG,aAAa,cAAWpc,EAC3Eg6C,GAAcjyC,SAASkyC,eAAe,QAGtC5rC,GAAU6rC,aAAqB,CAAEC,SAAsB,MAAXJ,GAAkB,IAAOA,KAC3EK,KAAQC,WAAW,iBACnBhsC,GAAQisC,QAAO,SAAAp1C,GAAa,IAAD,IAEnBq1C,EAAQ,UAAG/6C,EAAYI,aAAf,aAAG,EAAmBQ,QAClCg6C,KAAQ7sB,IAAI,CAAErJ,OAAM,iBAAEq2B,QAAF,IAAEA,OAAF,EAAEA,EAAU10C,aAAZ,QAAqB,KAEzCu0C,KAAQ7sB,IAAI,CAAEitB,KAAMt1C,EAASsB,WAC7B4zC,KAAQK,SAASv1C,EAASsB,aAG9Bk0C,SACI,cAAC,IAAD,CAAQrsC,QAASA,GAAjB,SACI,cAAC,GAAD,MAEN2rC,IFTa,WACX,GAA6C,kBAAmBxf,UAAW,CAGvE,GADkB,IAAIvC,IAAI0iB,GAAwBnxC,OAAOtE,SAASyH,MACpDlD,SAAWD,OAAOtE,SAASuE,OAIrC,OAGJD,OAAO8xB,iBAAiB,QAAQ,WAC5B,IAAMwd,EAAK,UAAM6B,GAAN,sBAEPjC,GAwChB,SAAiCI,GAE7B51C,MAAM41C,GACDx/B,MAAK,SAAC1X,GAGqB,MAApBA,EAASiB,SACuD,IAAhEjB,EAASiX,QAAQlR,IAAI,gBAAgBsX,QAAQ,cAG7Cub,UAAUue,cAAc6B,MAAMthC,MAAK,SAAA0/B,GAC/BA,EAAa6B,aAAavhC,MAAK,WAC3B9P,OAAOtE,SAAS41C,eAKxBjC,GAAgBC,MAGvBQ,OAAM,WACHx4C,QAAQC,IACJ,oEA5DAg6C,CAAwBjC,GAGxBD,GAAgBC,OERhCkC,GAKAzB,O","file":"static/js/main.c281493d.chunk.js","sourcesContent":["export const apiAuthorizationConfig = {\r\n endpoint: '/',\r\n applicationName: 'TheSchoolYear',\r\n};","import { UserManager, WebStorageStateStore, User, Profile } from 'oidc-client';\r\nimport { apiAuthorizationConfig } from '../../configure/apiAuthorizationConfig';\r\n\r\nexport interface AuthenticationResult {\r\n status: string,\r\n message?: string,\r\n state?: any,\r\n}\r\n\r\nexport class AuthorizeService {\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n _callbacks: Array<{ callback: () => void, subscription: number }>;\r\n _nextSubscriptionId: number;\r\n _user: User | null;\r\n _isAuthenticated: boolean = false;\r\n _userManager: UserManager | undefined;\r\n\r\n\r\n\r\n constructor() {\r\n this._callbacks = [];\r\n this._nextSubscriptionId = 0;\r\n this._user = null;\r\n this._isAuthenticated = false;\r\n this._userManager = undefined;\r\n }\r\n\r\n async isAuthenticated(): Promise {\r\n const user = await this.getUser();\r\n return !!user;\r\n }\r\n\r\n async getUser(): Promise {\r\n let user = this._user;\r\n\r\n if (user && user.profile) {\r\n return user.profile;\r\n }\r\n\r\n const userManager = await this.ensureUserManagerInitialized();\r\n user = await userManager.getUser();\r\n return user?.profile ?? null;\r\n }\r\n\r\n async getAccessToken(): Promise {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n const user = await userManager.getUser();\r\n return user?.access_token ?? null;\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state: any): Promise {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log(\"Silent authentication error: \", silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n const popUpUser = await userManager.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError) {\r\n if (popUpError.message === \"Popup window closed\") {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error(\"The user closed the window.\");\r\n } else if (!this._popUpDisabled) {\r\n console.log(\"Popup authentication error: \", popUpError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await userManager.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log(\"Redirect authentication error: \", redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url: string): Promise {\r\n try {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n const user = await userManager.signinCallback(url);\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state: any) {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.ts:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n await userManager.signoutPopup(this.createArguments());\r\n this.updateState(null);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log(\"Popup signout error: \", popupSignOutError);\r\n try {\r\n await userManager.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log(\"Redirect signout error: \", redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url: string) {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await userManager.signoutCallback(url);\r\n this.updateState(null);\r\n return this.success(response && response.state);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n updateState(user: User | null) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback: () => void): number {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId: number) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => element.subscription === subscriptionId ? { found: true, index } : { found: false })\r\n .filter(element => element.found === true);\r\n if (subscriptionIndex.length === 1) {\r\n this._callbacks = this._callbacks.splice(subscriptionIndex[0].index as number, 1);\r\n } else {\r\n //throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state?: any) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message: string) : AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state: any): AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect(): AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized(): Promise {\r\n if (this._userManager !== undefined) {\r\n return this._userManager;\r\n }\r\n\r\n let response = await fetch(`${apiAuthorizationConfig.endpoint}_configuration/${apiAuthorizationConfig.applicationName}`);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${apiAuthorizationConfig.applicationName}'`);\r\n }\r\n\r\n let settings = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n settings.userStore = new WebStorageStateStore({\r\n prefix: apiAuthorizationConfig.applicationName\r\n });\r\n\r\n this._userManager = new UserManager(settings);\r\n\r\n this._userManager.events.addUserSignedOut(async () => {\r\n await (this._userManager as UserManager).removeUser();\r\n this.updateState(null);\r\n });\r\n\r\n return this._userManager;\r\n }\r\n\r\n static get instance() { return authService }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n\r\nexport const AuthenticationResultStatus = {\r\n Redirect: 'redirect',\r\n Success: 'success',\r\n Fail: 'fail'\r\n};\r\n","import authService, { AuthorizeService } from './AuthorizeService';\r\n\r\n/**\r\n * Hook to return the authentication service.\r\n */\r\nexport function useAuthorizeService(): AuthorizeService {\r\n return authService;\r\n}\r\n","import * as React from 'react';\r\nimport { useAuthorizeService } from './useAuthorizeService';\r\nimport { Profile } from 'oidc-client';\r\n\r\nexport interface UseAuthenticationStateOptions {\r\n /**\r\n * By default we don't load the user details as they are often unused and require extra loading. When this is set to true we'll load the user record and return it as well.\r\n */\r\n includeUser?: boolean,\r\n}\r\n\r\n/**\r\n * Hook to return the authenticated state of the user. The hook subscribes to authenticate changes by authService and will update the state in components whenever that changes.\r\n * @param onStateChanged\r\n */\r\nexport function useAuthenticatedState(options: UseAuthenticationStateOptions = {}): { isAuthenticated: boolean | null, user: Profile | null } {\r\n const authService = useAuthorizeService();\r\n const [isAuthenticated, setIsAuthenticated] = React.useState(null);\r\n const [user, setUser] = React.useState(null);\r\n\r\n const stateChanged = React.useCallback(async () => {\r\n const authenticated = await authService.isAuthenticated();\r\n\r\n let userResult: Profile | null = null;\r\n if (options.includeUser) {\r\n userResult = await authService.getUser();\r\n setUser(userResult);\r\n }\r\n\r\n setIsAuthenticated(authenticated);\r\n }, [authService, options.includeUser]);\r\n\r\n // Subscribe to changes to the authService state.\r\n React.useEffect(() => {\r\n const subscription = authService.subscribe(() => { stateChanged(); });\r\n stateChanged();\r\n return () => { authService.unsubscribe(subscription); };\r\n }, [authService, stateChanged]);\r\n\r\n return { isAuthenticated: isAuthenticated, user: user };\r\n}\r\n","import './userNav.scss';\r\n\r\nimport * as React from 'react';\r\nimport { DropdownToggle, DropdownMenu, DropdownItem, Dropdown, NavItem, Button } from 'reactstrap';\r\nimport Avatar from 'react-avatar';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useToggleState } from 'use-toggle-state';\r\nimport { useLocation } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\n\r\n/**\r\n * Navbar area that is for the current user. \r\n */\r\nexport const UserNav = () => {\r\n const { isAuthenticated, user } = useAuthenticatedState({ includeUser: true });\r\n const [dropdownOpen, toggleDropdown] = useToggleState();\r\n\r\n const { t } = useTranslation();\r\n const location = useLocation();\r\n\r\n\r\n // Render the UI\r\n //\r\n\r\n // If the user is not logged in, then give them the login and register options.\r\n if (!isAuthenticated) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // User is logged in so show their options.\r\n return (\r\n toggleDropdown()} nav>\r\n \r\n \r\n \r\n {user?.name ?? ''}\r\n \r\n \r\n \r\n {t('userNav.account', 'Account')}\r\n \r\n \r\n \r\n <> {t('userNav.profile', 'Profile')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n <> {t('userNav.signOut', 'Sign out')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { ApiFetch } from \"apifetch-json\";\r\n\r\n/**\r\n * Class that provides a service for managing an account on the server.\r\n * \r\n * NOTE: not to be confused with AuthoriazationService which manages the authorised state of the current user.\r\n * \r\n * The login() and logout() method here are usually invoked through components used by AuthorizationService's routing to share the authorisation state with the server.\r\n */\r\nexport class AccountService {\r\n api: ApiFetch;\r\n\r\n constructor(api?: ApiFetch) {\r\n this.api = api ?? new ApiFetch();\r\n }\r\n\r\n /**\r\n * Attempt to login to the account with an email and password.\r\n */\r\n loginWithPassword = async (request: LoginWithPasswordRequest, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/login?returnUrl=${encodeURIComponent(returnUrl ?? '')}`,\r\n request,\r\n {\r\n credentials: 'include',\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Register the user with a new password based account.\r\n */\r\n register = async (request: RegisterRequest, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/register?returnUrl=${encodeURIComponent(returnUrl || defaultRegisterReturnUrl)}`,\r\n request,\r\n {\r\n credentials: 'include'\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a list of all external authentication schemes registered for use with accounts on this server.\r\n */\r\n getExternalAuthenticationSchemes = async (): Promise> => {\r\n const result = await this.api.get>('/api/account/getExternalAuthenticationSchemes');\r\n return result;\r\n }\r\n\r\n /**\r\n * Start the process of logging in with an external provider.\r\n */\r\n startExternalLogin = (provider: string, returnUrl: string = '') => {\r\n // We want to post the whole page to the action as it needs to return a redirect. To acheive this we create and post a form.\r\n let form = document.createElement('form');\r\n form.action = `/api/account/startExternalLogin?provider=${encodeURIComponent(provider)}&returnUrl=${encodeURIComponent(returnUrl ?? '')}`;\r\n form.method = 'post';\r\n document.body.append(form);\r\n form.submit();\r\n }\r\n\r\n /**\r\n * Complete the external login process.\r\n */\r\n completeExternalLogin = async (returnUrl: string = '', remoteError: string = '') => {\r\n const result = await this.api.get(`/api/account/completeExternalLogin?returnUrl=${encodeURIComponent(returnUrl ?? '')}&remoteError=${encodeURIComponent(remoteError ?? '')}`);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an account linked to the current external login with the additional details passed in.\r\n */\r\n createAccountForExternalLogin = async (model: CreateExternalLoginAccountDetails, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/createAccountForExternalLogin?returnUrl=${encodeURIComponent(returnUrl ?? '')}`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Send a password reset email.\r\n */\r\n sendPasswordResetEmail = async (email: string) => {\r\n const result = await this.api.post(`/api/account/sendPasswordResetEmail`, { email: email });\r\n return result;\r\n }\r\n\r\n /**\r\n * Reset password (using an emailed code as varification).\r\n */\r\n resetPassword = async (model: ResetPasswordRequest) => {\r\n const result = await this.api.post(`/api/account/resetPassword`, model);\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm email (using an emailed code as varification).\r\n */\r\n confirmEmail = async (model: ConfirmEmailRequest) => {\r\n const result = await this.api.post(`/api/account/confirmEmail`, model);\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm email change (using an emailed code as varification).\r\n */\r\n confirmEmailChange = async (model: ConfirmEmailChangeRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/confirmEmailChange`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the IdentityRoles names of the current user.\r\n */\r\n currentUserRoles = async (): Promise => {\r\n const result = await this.api.get(\r\n '/api/account/currentUserRoles',\r\n {\r\n credentials: 'include'\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Change password of the logged in user.\r\n */\r\n changePassword = async (model: ChangePasswordRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changePassword`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Change email of the logged in user.\r\n */\r\n changeEmail = async (model: ChangeEmailRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changeEmail`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Resent the email verification email.\r\n */\r\n resendConfirmEmail = async (email: string) => {\r\n const result = await this.api.post(\r\n `/api/account/resendConfirmEmail`,\r\n { email: email }\r\n );\r\n return result;\r\n }\r\n\r\n\r\n /**\r\n * Change email of the logged in user.\r\n */\r\n invite = async (model: InviteRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/invite`,\r\n model,\r\n {\r\n credentials: 'include'\r\n }\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Resent the invite email.\r\n */\r\n resendInviteEmail = async (email: string) => {\r\n const result = await this.api.post(\r\n `/api/account/resendInviteEmail`,\r\n { email: email }\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm an invite and set a password (will also perform a login).\r\n */\r\n confirmInvite = async (model: ConfirmInviteRequest, returnUrl: string = '') => {\r\n const result = await this.api.post(\r\n `/api/account/confirmInvite?returnUrl=${encodeURIComponent(returnUrl || defaultRegisterReturnUrl)}`,\r\n model\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Change email of another user (as an administrator)\r\n */\r\n changeAccountEmail = async (model: ChangeAccountEmailRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changeAccountEmail`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Lockout a user.\r\n */\r\n lockout = async (model: LockoutRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/lockout`,\r\n model,\r\n {\r\n credentials: 'include'\r\n }\r\n );\r\n return result;\r\n }\r\n}\r\n\r\nconst defaultRegisterReturnUrl = `/authentication/login?returnUrl=${encodeURIComponent(window.origin + '/')}`;\r\n\r\nexport interface LoginWithPasswordRequest\r\n{\r\n email: string,\r\n password: string,\r\n rememberMe: boolean,\r\n}\r\n\r\nexport interface LoginResult {\r\n succeeded: boolean,\r\n requiresTwoFactor: boolean,\r\n requiresEmailConfirmation: boolean,\r\n returnUrl: string\r\n}\r\n\r\nexport interface RegisterResult extends LoginResult {\r\n userId: string,\r\n}\r\n\r\nexport interface ExternalAuthenticationScheme {\r\n name: string,\r\n displayName: string\r\n}\r\n\r\nexport interface Claim {\r\n type: string,\r\n properties: { [id: string]: string },\r\n originalIssuer: string,\r\n issuer: string,\r\n valueType: string,\r\n value: string,\r\n}\r\n\r\nexport interface CompleteExternalLoginResult {\r\n isNewUser: boolean,\r\n returnUrl: string,\r\n loginProvider: string,\r\n claims: Array,\r\n}\r\n\r\nexport interface CreateExternalLoginAccountDetails {\r\n email: string\r\n}\r\n\r\nexport interface RegisterRequest {\r\n email: string,\r\n password: string,\r\n}\r\n\r\nexport interface ResetPasswordRequest {\r\n userId: string,\r\n code: string,\r\n password: string,\r\n}\r\n\r\nexport interface ConfirmEmailRequest {\r\n userId: string,\r\n code: string,\r\n}\r\n\r\nexport interface CurrentUserRolesResult {\r\n userId: string,\r\n roles: Array,\r\n}\r\n\r\nexport interface ChangePasswordRequest {\r\n currentPassword: string,\r\n newPassword: string,\r\n}\r\n\r\nexport interface ChangeEmailRequest {\r\n newEmail: string,\r\n}\r\n\r\nexport interface ConfirmEmailChangeRequest {\r\n userId: string,\r\n code: string,\r\n email: string,\r\n}\r\n\r\nexport interface InviteRequest {\r\n email: string,\r\n sendEmail: boolean,\r\n}\r\n\r\nexport interface InviteResult {\r\n userId: string,\r\n}\r\n\r\n\r\nexport interface ChangeAccountEmailRequest {\r\n currentEmail: string,\r\n newEmail: string,\r\n}\r\n\r\nexport interface ConfirmInviteRequest {\r\n userId: string,\r\n code: string,\r\n password: string,\r\n}\r\n\r\nexport interface LockoutRequest {\r\n email: string,\r\n endDate?: string,\r\n}\r\n","/**\r\n * URIs of common claim types. \r\n */\r\nexport const ClaimTypes = {\r\n /**\r\n * The URI for a claim that specifies the actor.\r\n */\r\n actor: 'http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor',\r\n /**\r\n * The URI for a claim that specifies the postal code of an entity.\r\n */\r\n postalCode: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode',\r\n /**\r\n * The URI for a claim that specifies an RSA key.\r\n */\r\n rsa: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa',\r\n /**\r\n * The URI for a claim that specifies a security identifier (SID).\r\n */\r\n sid: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid',\r\n /**\r\n * The URI for a claim that specifies a service principal name (SPN) claim.\r\n */\r\n spn: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn',\r\n /**\r\n * The URI for a claim that specifies the state or province in which an entity resides.\r\n */\r\n stateOrProvince: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince',\r\n /**\r\n * The URI for a claim that specifies the street address of an entity.\r\n */\r\n streetAddress: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress',\r\n /**\r\n * The URI for a claim that specifies the surname of an entity.\r\n */\r\n surname: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname',\r\n /**\r\n * The URI for a claim that identifies the system entity.\r\n */\r\n system: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/system',\r\n /**\r\n * The URI for a claim that specifies a thumbprint. A thumbprint is a globally unique SHA-1 hash of an X.509 certificate.\r\n */\r\n thumbprint: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/thumbprint',\r\n /**\r\n * The URI for a claim that specifies a user principal name (UPN).\r\n */\r\n upn: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn',\r\n /**\r\n * The URI for a claim that specifies a URI.\r\n */\r\n uri: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri',\r\n /**\r\n * The URI for a claim that specifies the webpage of an entity.\r\n */\r\n webpage: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage',\r\n /**\r\n * The URI for a claim that specifies the alternative phone number of an entity.\r\n */\r\n otherPhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone',\r\n /**\r\n * The URI for a claim that specifies the name of an entity.\r\n */\r\n nameIdentifier: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier',\r\n /**\r\n * The URI for a claim that specifies the name of an entity.\r\n */\r\n name: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',\r\n /**\r\n * The URI for a claim that specifies the mobile phone number of an entity.\r\n */\r\n mobilePhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone',\r\n /**\r\n * The URI for a claim that specifies the anonymous user.\r\n */\r\n anonymous: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous',\r\n /**\r\n * The URI for a claim that specifies details about whether an identity is authenticated.\r\n */\r\n authentication: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authentication',\r\n /**\r\n * The URI for a claim that specifies an authorization decision on an entity.\r\n */\r\n authorizationDecision: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision',\r\n /**\r\n * The URI for a claim that specifies the country/region in which an entity resides,\r\n */\r\n country: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country',\r\n /**\r\n * The URI for a claim that specifies the date of birth of an entity.\r\n */\r\n dateOfBirth: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth',\r\n /**\r\n * The URI for a claim that specifies a deny-only security identifier (SID) for\r\n * an entity. A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlySid: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid',\r\n /**\r\n * The URI for a claim that specifies the email address of an entity.\r\n */\r\n email: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress',\r\n /**\r\n * The URI for a claim that specifies the gender of an entity.\r\n */\r\n gender: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender', \r\n /**\r\n * The URI for a claim that specifies the given name of an entity.\r\n */\r\n givenName: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname',\r\n /**\r\n * The URI for a claim that specifies a hash value.\r\n */\r\n hash: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash',\r\n /**\r\n * The URI for a claim that specifies the home phone number of an entity.\r\n */\r\n homePhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone',\r\n /**\r\n * The URI for a claim that specifies the locale in which an entity resides.\r\n */\r\n locality: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality',\r\n /**\r\n * The URI for a claim that specifies the DNS name associated with the computer\r\n * name or with the alternative name of either the subject or issuer of an X.509\r\n * certificate.\r\n */\r\n dns: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns',\r\n /**\r\n * The URI for an X.500 distinguished name claim, such as the subject of an X.509\r\n * Public Key Certificate or an entry identifier in a directory services Directory\r\n * Information Tree.\r\n */\r\n x500DistinguishedName: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname',\r\n}\r\n\r\n/**\r\n * URIs of common Microsoft specific claim types. \r\n */\r\nexport const MicrosoftClaimTypes = {\r\n /**\r\n * The URI for a claim that specifies the primary group SID of an entity.\r\n */\r\n primaryGroupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid',\r\n /**\r\n * The URI for a claim that specifies the primary SID of an entity.\r\n */\r\n primarySid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid',\r\n /**\r\n * The URI for a claim that specifies the role of an entity.\r\n */\r\n role: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role',\r\n /**\r\n * The URI for a claim that specifies a serial number.\r\n */\r\n serialNumber: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber',\r\n /**\r\n * The URI for a claim that specifies the user data.\r\n */\r\n userData: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata',\r\n /**\r\n * The URI for a claim that specifies the version.\r\n */\r\n version: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/version',\r\n /**\r\n * The URI for a claim that specifies the Windows domain account name of an entity.\r\n */\r\n windowsAccountName: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname',\r\n /**\r\n * The URI for a claim that specifies the Windows device.\r\n */\r\n windowsDeviceClaim: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdeviceclaim',\r\n /**\r\n * The URI for a claim that specifies the Windows group SID of the device.\r\n */\r\n windowsDeviceGroup: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup',\r\n /**\r\n * \r\n */\r\n windowsFqbnVersion: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsfqbnversion',\r\n /**\r\n * \r\n */\r\n windowsSubAuthority: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowssubauthority',\r\n /**\r\n * The URI for a claim that specifies the instant at which an entity was authenticated,\r\n */\r\n authenticationInstant: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant',\r\n /**\r\n * The URI for a claim that specifies the method with which an entity was authenticated,\r\n */\r\n authenticationMethod: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod',\r\n /**\r\n * The URI for a claim that specifies the cookie path.\r\n */\r\n cookiePath: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath',\r\n /**\r\n * The URI for a claim that specifies the deny-only primary group SID on an entity,\r\n * A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlyPrimaryGroupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid',\r\n /**\r\n * The URI for a claim that specifies the deny-only primary SID on an entity.\r\n * A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlyPrimarySid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid',\r\n /**\r\n * \r\n */\r\n windowsUserClaim: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsuserclaim',\r\n /**\r\n * The URI for a claim that specifies the Windows deny-only group SID of the device,\r\n */\r\n denyOnlyWindowsDeviceGroup: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlywindowsdevicegroup',\r\n /**\r\n */\r\n dsa: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa',\r\n /**\r\n * \r\n */\r\n expiration: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration',\r\n /**\r\n * \r\n */\r\n expired: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/expired',\r\n /**\r\n * The URI for a claim that specifies the SID for the group of an entity.\r\n */\r\n groupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid',\r\n /**\r\n * \r\n */\r\n isPersistent: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent',\r\n}\r\n","import { AccountService } from \"./AccountService\";\r\nimport { useServices } from \"inject-typesafe-react\";\r\nimport { AppServices } from \"../../configure/configureServices\";\r\n\r\n/**\r\n * Hook to return the AccountService from the context (via useService).\r\n */\r\nexport function useAccountService(): AccountService {\r\n return useServices((services: AppServices) => services.accountService());\r\n}\r\n","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\n\r\nexport interface CurrentUserRolesCache {\r\n isLoading: boolean,\r\n isAuthenticated: boolean,\r\n roles: Array,\r\n}\r\n\r\nexport const currentUserRolesCacheState = atom({\r\n key: 'currentUserRolesCacheState',\r\n default: { isAuthenticated: false, roles: [], isLoading: false },\r\n //effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Hook that provides access to the Global search text from the global search text state while abstracting the global stage provider from the calling code.\r\n */\r\nexport function useCurrentUserRolesCache(): [CurrentUserRolesCache, React.Dispatch>] {\r\n const [value, setValue] = useRecoilState(currentUserRolesCacheState);\r\n return [value, setValue];\r\n}","import * as React from \"react\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { AccountService } from \"./AccountService\";\r\nimport { CurrentUserRolesCache, useCurrentUserRolesCache } from \"../../globalState/currentUserDetails/useCurrentUserRolesCache\";\r\n\r\n\r\n/**\r\n * Refresh the current user state using the accountService.\r\n * @param isAuthenticated\r\n */\r\nconst refreshCurrentUserRoles = async (isAuthenticated: boolean | null, accountService: AccountService, setRoles: (value: React.SetStateAction) => void): Promise => {\r\n // Do nothing if we don't know our authentication state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return;\r\n }\r\n\r\n // If we are not authenticated then we have no roles.\r\n if (!isAuthenticated) {\r\n setRoles({ isAuthenticated: false, roles: [], isLoading: false });\r\n return;\r\n }\r\n\r\n // Otherwise we are authenticated, so load our roles.\r\n setRoles(prevState => ({ ...prevState, isLoading: true }));\r\n let result = await accountService.currentUserRoles();\r\n setRoles({ isAuthenticated: true, roles: result.roles, isLoading: false });\r\n};\r\n\r\n/**\r\n * Returns the list of roles for the current user.\r\n */\r\nexport function useCurrentUserRoles(options: AsyncLoadOptions = {}): AsyncLoadResult<{ roles: Array | null }> {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const [roles, setRoles] = useCurrentUserRolesCache();\r\n const accountService = useAccountService();\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n // Don't trigger more than one attempt at loading the roles at once.\r\n if (roles.isLoading) {\r\n return;\r\n }\r\n\r\n await refreshCurrentUserRoles(isAuthenticated, accountService, setRoles);\r\n }, [accountService, isAuthenticated, setRoles, roles]);\r\n\r\n React.useEffect(() => {\r\n if (options.lazy) {\r\n return;\r\n }\r\n\r\n // Refresh from the store if we need to.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return;\r\n }\r\n\r\n if (!roles || roles.isAuthenticated !== isAuthenticated) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy, isAuthenticated, roles]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: { roles: roles?.roles ?? null },\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Clear the cached user roles.\r\n */\r\nexport function useResetCurrentUserRolesCallback() {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const [/*roles*/, setRoles] = useCurrentUserRolesCache();\r\n const accountService = useAccountService();\r\n\r\n const [refresh] = useAsyncCallback(async () => {\r\n await refreshCurrentUserRoles(isAuthenticated, accountService, setRoles);\r\n }, [accountService, isAuthenticated]);\r\n\r\n return React.useCallback(() => {\r\n refresh();\r\n }, [refresh]);\r\n}\r\n","import * as React from \"react\";\r\nimport { ExternalAuthenticationScheme } from \"./AccountService\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Use the store to return a list of external authentication schemes for the app.\r\n */\r\nexport function useExternalAuthenticationSchemes(options: AsyncLoadOptions = {}): AsyncLoadResult<{ externalAuthenticationSchemes: Array }> {\r\n const [externalAuthenticationSchemes, setExternalAuthenticationSchemes] = React.useState>([]);\r\n\r\n const accountService = useAccountService();\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n let result = await accountService.getExternalAuthenticationSchemes();\r\n setExternalAuthenticationSchemes(result);\r\n }, [accountService, setExternalAuthenticationSchemes]);\r\n\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: { externalAuthenticationSchemes: externalAuthenticationSchemes },\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to resend the email confirmation email.\r\n */\r\nexport function useResendConfirmationEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.resendConfirmEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Start the external login process for a provider.\r\n */\r\nexport function useStartExternalLoginCallback(): [(provider: string, returnUrl?: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (provider: string, returnUrl?: string): Promise => {\r\n accountService.startExternalLogin(provider, returnUrl);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useCurrentUserRoles } from '../../api/account';\r\n\r\nexport interface AuthorizeContainerProps {\r\n requireRole?: string | Array,\r\n /**\r\n * When set to true, the containers children will only show if authorization fails.\r\n */\r\n showIfNotAuthorized?: boolean,\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Container component that will check for authorization before showing its children.\r\n * @param props\r\n */\r\nexport const AuthorizeContainer = (props: AuthorizeContainerProps) => {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const { data: { roles: usersRoles } } = useCurrentUserRoles();\r\n const [ hasRequiredRole, setHasRequiredRole ] = React.useState(); \r\n\r\n // Load the roles only if we need to.\r\n React.useEffect(() => {\r\n if (props.requireRole && !isNullOrUndefined(usersRoles)) {\r\n const requireRoles = [props.requireRole].flat(2);\r\n let hasRole = false;\r\n for (let roleToCheck of requireRoles) {\r\n if (usersRoles.find(it => it === roleToCheck)) {\r\n hasRole = true;\r\n break;\r\n }\r\n }\r\n setHasRequiredRole(hasRole);\r\n }\r\n }, [props.requireRole, usersRoles, setHasRequiredRole, isAuthenticated]);\r\n\r\n // Render the UI\r\n //\r\n const { children } = props;\r\n\r\n // Show nothing until we have a defined authenticated state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return (<>);\r\n }\r\n\r\n let failedCheck = false;\r\n\r\n // Check if we are not authenticted.\r\n if (!isAuthenticated) {\r\n failedCheck = true;\r\n }\r\n\r\n // If we need to check a role but don't have the roles to check yet, show nothing.\r\n if (isAuthenticated && props.requireRole && isNullOrUndefined(usersRoles)) {\r\n return (<>);\r\n }\r\n\r\n // If we checked a role and didn't have one we were looking for, show nothing.\r\n if (hasRequiredRole === false) {\r\n failedCheck = true;\r\n }\r\n\r\n // If we get here then we can render the children or not based on if the check failed or succeeded.\r\n if (failedCheck) {\r\n if (props.showIfNotAuthorized) {\r\n return (<>{children});\r\n }\r\n\r\n return (<>);\r\n }\r\n\r\n if (props.showIfNotAuthorized) {\r\n return (<>);\r\n }\r\n\r\n return (<>{children});\r\n};\r\n","import * as React from 'react';\r\nimport { Route, Redirect, RouteProps } from 'react-router-dom';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useCurrentUserRoles } from '../../api/account';\r\n\r\nexport interface AuthorizeRouteProps extends RouteProps {\r\n requireRole?: string | Array,\r\n}\r\n\r\n/**\r\n * Route component that will check for authorization before showing its component.\r\n * \r\n * NOTE this was originally based on AuthorizeRoute from Microsoft's template but converted to typescript and React hooks and to support more than just the component prop.\r\n * @param props\r\n */\r\nexport const AuthorizeRoute = (props: AuthorizeRouteProps) => {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const { data: { roles: usersRoles } } = useCurrentUserRoles();\r\n const [ hasRequiredRole, setHasRequiredRole ] = React.useState(); \r\n\r\n // Load the roles only if we need to.\r\n React.useEffect(() => {\r\n if (props.requireRole && !isNullOrUndefined(usersRoles)) {\r\n const requireRoles = [props.requireRole].flat(2);\r\n let hasRole = false;\r\n for (let roleToCheck of requireRoles) {\r\n if (usersRoles.find(it => it === roleToCheck)) {\r\n hasRole = true;\r\n break;\r\n }\r\n }\r\n setHasRequiredRole(hasRole);\r\n }\r\n }, [props.requireRole, usersRoles, setHasRequiredRole, isAuthenticated]);\r\n\r\n // Render the UI\r\n //\r\n const { component: Component, render, children, ...rest } = props;\r\n\r\n // Show nothing until we have a defined authenticated state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return (<>);\r\n }\r\n \r\n // If we need to check a role, but can't yet return nothing.\r\n if (props.requireRole && isNullOrUndefined(usersRoles)) {\r\n return (<>);\r\n }\r\n\r\n // If we don't have the role we require, show text saying so.\r\n if (hasRequiredRole === false) {\r\n return (<>Sorry you do not have permission to access this area.);\r\n }\r\n\r\n return (\r\n {\r\n if (isAuthenticated) {\r\n if (Component) {\r\n return ;\r\n } else if (render) {\r\n return render(props);\r\n } else {\r\n return children;\r\n }\r\n } else {\r\n const redirectUrl = `/authentication/login?returnUrl=${encodeURIComponent(window.location.href)}`\r\n return \r\n }\r\n }} />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { NavLink, NavLinkProps } from 'react-router-dom';\r\n\r\nexport interface NavLinkTrackActiveProps extends NavLinkProps {\r\n}\r\n\r\n/**\r\n * NavLink from react-router configured to track the active component with the active class. \r\n * \r\n * This simply returns a that is preconfigured with activeClassName=\"active\".\r\n */\r\nexport const NavLinkTrackActive = (props: NavLinkTrackActiveProps) => {\r\n const { to, exact, activeClassName, ...rest } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n * Constants for the available roles.\r\n */\r\nexport const IdentityRoles = {\r\n Administration: 'Administration'\r\n};\r\n\r\n///**\r\n// * Constants (enum) for the available Roles.\r\n// */\r\n//export enum IdentityRoles {\r\n// Administration = 'Administration'\r\n//}\r\n","import * as React from 'react';\r\nimport { NavItem, NavLink } from 'reactstrap';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { NavLinkTrackActive } from '../shared/NavLinkTrackActive';\r\nimport { IdentityRoles } from '../../configure/security/IdentityRoles';\r\n\r\n/**\r\n * Primary navigation menu for the app. \r\n */\r\nexport const Navigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n <> {t('navigation.calendar', 'Calendar')}\r\n \r\n \r\n\r\n {/* Even though About doesn't need authentication to be accesed, we only show it in the main navigation if we are logged in, otherwise its all alone for people outside (and accessible by clicking the logo/automatically) */}\r\n \r\n \r\n \r\n <> {t('navigation.calendar', 'About')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <> {t('navigation.administration', 'Administration')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import './appNavbarBrand.scss';\r\n\r\nimport * as React from 'react';\r\n//import { NavbarBrand } from 'reactstrap'; // Not used as it renders a / and we want to control our / elsewhere.\r\n\r\n/**\r\n * Navbar brand image for the app. \r\n */\r\nexport const AppNavbarBrand = () => {\r\n return (\r\n
\r\n {/*
\r\n
\r\n
\r\n
*/}\r\n
\r\n );\r\n};","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\n\r\nexport const globalSearchTextState = atom({\r\n key: 'globalSearchTextState',\r\n default: '',\r\n // NOTE not persisted as its unique to the session.\r\n});\r\n\r\n/**\r\n * Hook that provides access to the Global search text from the global search text state while abstracting the global stage provider from the calling code.\r\n */\r\nexport function useGlobalSearchText(): [string, React.Dispatch>] {\r\n const [value, setValue] = useRecoilState(globalSearchTextState);\r\n return [value, setValue];\r\n}","import './searchInput.scss';\r\nimport * as React from 'react';\r\nimport { Input, InputGroup, InputGroupAddon, Button, InputProps } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface SearchInputProps extends InputProps {\r\n onSearchButtonClick?: () => void,\r\n}\r\n\r\n/**\r\n * Input that is hooked up for searching as the user types, by introducing an appropriate delay before raising the onSearch event.\r\n */\r\nexport const SearchInput = (props: SearchInputProps) => {\r\n const { type, placeholder, className, style, onSearchButtonClick, ...rest } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {\r\n // When the user presses enter, trigger a click on the search button.\r\n if (e.charCode === 13) {\r\n if (onSearchButtonClick) {\r\n onSearchButtonClick();\r\n }\r\n }\r\n }}\r\n {...rest} />\r\n \r\n \r\n \r\n \r\n );\r\n};","import * as React from 'react';\r\nimport { useHistory } from 'react-router';\r\nimport { useGlobalSearchText } from '../../../globalState/globalSearchText/useGlobalSearchText';\r\nimport { SearchInput } from '../../shared/searchInput/SearchInput';\r\nimport './headerSearchInput.scss';\r\n\r\n\r\n/**\r\n * Search bar that is always available in the header for searching calendar items.\r\n */\r\nexport const HeaderSearchInput = () => {\r\n // Use global state to store the search text.\r\n const [searchText, setSearchText] = useGlobalSearchText();\r\n\r\n // When the user completes a search trigger the appropriate routing.\r\n const history = useHistory();\r\n const performSearch = React.useCallback(() => {\r\n const cleanSearchText = searchText.trim();\r\n if (!cleanSearchText) {\r\n history.push('/calendar');\r\n } else {\r\n history.push(`/calendar/search/${encodeURIComponent(cleanSearchText)}`);\r\n }\r\n }, [history, searchText]);\r\n \r\n return (\r\n setSearchText(e.currentTarget.value)} onSearchButtonClick={() => performSearch()} />\r\n );\r\n};","import './header.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Nav, Container } from 'reactstrap';\r\nimport { AppHeader, AppSidebarToggler } from '@coreui/react';\r\nimport { UserNav } from './UserNav';\r\nimport { Link } from 'react-router-dom';\r\nimport { Navigation } from './Navigation';\r\n//import { LanguageSelect } from './LanguageSelect';\r\nimport { AppNavbarBrand } from './appNavbarBrand/AppNavbarBrand';\r\nimport { HeaderSearchInput } from './headerSearchInput/HeaderSearchInput';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\n\r\nexport const Header = () => {\r\n return (\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {/**/}\r\n\r\n {/* Special copy of the search box for xs displays */}\r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { NavItem, NavLink } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { NavLinkTrackActive } from '../shared/NavLinkTrackActive';\r\n\r\n/**\r\n * Footer navigation menu for the app. \r\n */\r\nexport const FooterNavigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n {t('footerNavigation.about', 'About TheSchoolYear')}\r\n \r\n \r\n \r\n \r\n {t('footerNavigation.theSchoolBus', 'TheSchoolBus')}\r\n \r\n \r\n \r\n \r\n {t('footerNavigation.termsAndConditions', 'Terms and conditions')}\r\n \r\n \r\n \r\n \r\n {t('footerNavigation.privacyPolicy', 'Privacy policy')}\r\n \r\n \r\n \r\n );\r\n};\r\n","import './footer.scss';\r\nimport * as React from 'react';\r\nimport { AppFooter } from '@coreui/react';\r\nimport { Nav } from 'reactstrap';\r\nimport { FooterNavigation } from './FooterNavigation';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const Footer = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n
\r\n {t('footer.companyText', 'Hub4Leaders Ltd. Elmswood Court, Springwood Close, Tytherington Business Park, Macclesfield, SK10 2XF | Registered Number: 836837')}\r\n
\r\n
\r\n );\r\n};\r\n\r\n","import * as React from 'react';\r\nimport PerfectScrollbar from 'react-perfect-scrollbar';\r\n\r\nexport const SidebarNav = (props: any) => {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n","import './sidebarNavTitle.scss';\r\n\r\nimport * as React from 'react';\r\nimport { NavItem } from 'reactstrap';\r\n\r\nexport interface SidebarNavTitleProps {\r\n className?: string,\r\n child?: boolean,\r\n children?: React.ReactNode,\r\n}\r\n\r\nexport const SidebarNavTitle = (props: SidebarNavTitleProps) => {\r\n const { className, child, children } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Route, Switch } from 'react-router';\r\nimport { RouteEntry } from '../../shared/routes';\r\nimport { AuthorizeRoute } from '../../shared/authorizeRoute';\r\n\r\nexport interface AppRoutesProps {\r\n routes: Array,\r\n}\r\n\r\nexport const AppRoutes = (props: AppRoutesProps) => {\r\n const { routes } = props;\r\n\r\n return (\r\n \r\n {\r\n routes.map((item, index) => {\r\n // If we need to authorize for this route then use an AuthorizeRoute.\r\n if (item.authorize || item.requireRole) {\r\n return ();\r\n }\r\n\r\n // Otherwise a simple Route will do.\r\n return ();\r\n })\r\n }\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Spinner } from 'reactstrap';\r\n\r\nexport interface LoadingIndicatorProps {\r\n className?: string,\r\n fullWidth?: boolean,\r\n size?: 'sm' | 'md' | 'lg',\r\n inline?: boolean,\r\n}\r\n\r\n/**\r\n * Simple spinner that can be shown during loading.\r\n */\r\nexport const LoadingIndicator = (props: LoadingIndicatorProps) => {\r\n const { className, fullWidth, size, inline } = props;\r\n\r\n const style = React.useMemo(() => {\r\n let ret: React.CSSProperties = {};\r\n if (fullWidth) {\r\n ret.width = '100%';\r\n ret.textAlign = 'center';\r\n }\r\n\r\n if (inline) {\r\n ret.display = 'inline';\r\n }\r\n\r\n return ret;\r\n }, [inline, fullWidth])\r\n\r\n return (\r\n
\r\n \r\n Loading\r\n
\r\n );\r\n};\r\n\r\n","import './background.scss';\r\n\r\nimport * as React from 'react';\r\n\r\nexport interface BackgroundProps {\r\n children?: React.ReactNode,\r\n className?: string,\r\n centerChildren?: 'vertically' | 'horizontally',\r\n}\r\n\r\n/**\r\n * Background for making the back of screens look nicer.\r\n * @param props\r\n */\r\nexport const Background = (props: BackgroundProps) => {\r\n const { children, className, centerChildren } = props;\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};","import './accountBackground.scss';\r\n\r\nimport * as React from 'react';\r\nimport { BackgroundProps, Background } from '../shared/background/Background';\r\n\r\nexport interface AccountBackgroundProps extends BackgroundProps {\r\n}\r\n\r\nexport const AccountBackground = (props: AccountBackgroundProps) => {\r\n const { className, ...rest } = props;\r\n\r\n return ();\r\n};","import * as React from 'react';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { AccountBackground } from '../account/AccountBackground';\r\n\r\nexport interface LoginWaitingProps {\r\n waiting: boolean,\r\n message: string\r\n}\r\n\r\n/**\r\n * Component that is shown during waiting of any login or logout options.\r\n * \r\n * If you want to change the \"waiting\" screen between redirects for all login actions, this is where to do it.\r\n */\r\nexport const LoginWaiting = (props: LoginWaitingProps) => {\r\n const { waiting, message } = props;\r\n\r\n return (\r\n \r\n {/**/}\r\n\r\n {\r\n waiting ? (\r\n <>\r\n \r\n
\r\n {message}\r\n
\r\n \r\n ) : (\r\n <>\r\n {\r\n !!message ? (
{message}
) : null\r\n }\r\n \r\n )\r\n }\r\n
\r\n );\r\n};","export const QueryParameterNames = {\r\n ReturnUrl: 'returnUrl',\r\n Message: 'message'\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out'\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register'\r\n};\r\n\r\nconst prefix = '/authentication';\r\n\r\nexport const ApplicationPaths = {\r\n DefaultLoginRedirectPath: '/',\r\n ApiAuthorizationPrefix: prefix,\r\n Login: `${prefix}/${LoginActions.Login}`,\r\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\r\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\r\n Register: `${prefix}/${LoginActions.Register}`,\r\n Profile: `${prefix}/${LoginActions.Profile}`,\r\n LogOut: `${prefix}/${LogoutActions.Logout}`,\r\n LoggedOut: `${prefix}/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\r\n IdentityRegisterPath: '/account/register',\r\n IdentityManagePath: '/profile'\r\n};\r\n","import * as React from 'react'\r\nimport { LoginWaiting } from './LoginWaiting';\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport authService, { AuthenticationResultStatus } from '../../api/api-authorization/AuthorizeService';\r\n\r\nexport interface LoginProps {\r\n action: string,\r\n}\r\n\r\nexport interface LoginState {\r\n message: string | undefined | null,\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class Login extends React.Component {\r\n constructor(props: LoginProps) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(this.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n switch (action) {\r\n case LoginActions.Login:\r\n return ();\r\n case LoginActions.LoginCallback:\r\n return ();\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return ();\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n async login(returnUrl: string) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${result.status}.`);\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeSignIn finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid authentication result status '${result.status}'.`);\r\n }\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURIComponent(ApplicationPaths.Login)}`);\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath: string) {\r\n const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser he gets sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { LogoutActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport { LoginWaiting } from './LoginWaiting';\r\nimport authService, { AuthenticationResultStatus } from '../../api/api-authorization/AuthorizeService';\r\nimport { Redirect } from 'react-router';\r\n\r\nexport interface LogoutProps {\r\n action: string,\r\n}\r\n\r\nexport interface LogoutState {\r\n message: string | undefined,\r\n isReady: boolean,\r\n authenticated: boolean,\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends React.Component {\r\n constructor(props: LogoutProps) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to /authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.setState({ isReady: true, message: \"You successfully logged out!\" });\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return ();\r\n }\r\n\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return ();\r\n case LogoutActions.LogoutCallback:\r\n return ();\r\n case LogoutActions.LoggedOut:\r\n return ();\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n } }\r\n\r\n async logout(returnUrl: string) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Login } from './Login'\r\nimport { Logout } from './Logout'\r\nimport { RouteEntry } from '../../shared/routes';\r\n\r\nexport const apiAuthorizationRoutes: Array = [\r\n { path: '/authentication/login', render: () => loginAction('login') },\r\n { path: '/authentication/login-callback', render: () => loginAction('login-callback') },\r\n { path: '/authentication/login-failed', render: () => loginAction('login-failed') },\r\n { path: '/authentication/profile', render: () => loginAction('profile') },\r\n { path: '/authentication/register', render: () => loginAction('register') },\r\n\r\n { path: '/authentication/logout', render: () => logoutAction('logout') },\r\n { path: '/authentication/logout-callback', render: () => logoutAction('logout-callback') },\r\n { path: '/authentication/logged-out', render: () => logoutAction('logged-out') },\r\n];\r\n\r\nfunction loginAction(name: string){\r\n return ();\r\n}\r\n\r\nfunction logoutAction(name: string) {\r\n return ();\r\n}\r\n","import { ErrorMessageConverter } from \"./ErrorMessageConverter\";\r\n\r\n/**\r\n * Register all converters to use for error messages when calling userFriendlyErrorMessage().\r\n * \r\n * Convters will be run in array order, with the first non-null/undefined result being returned as the error message.\r\n * \r\n * @param converters\r\n */\r\nexport function registerErrorMessageConverters(converters: Array): void {\r\n configuredErrorMessageConverters = converters;\r\n}\r\n\r\n/**\r\n * Currently registered ErrorMessageConvters set by registerErrorMessageConverters().\r\n */\r\nexport let configuredErrorMessageConverters: Array = [];","import * as React from 'react';\r\nimport { Alert, AlertProps, Row, Col, Badge } from 'reactstrap';\r\nimport { userFriendlyErrorMessage, FriendlyErrorMessage } from '../userFriendlyErrorMessage';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\n\r\n\r\nexport interface AlertOnErrorsProps extends AlertProps {\r\n errors?: any,\r\n children?: any,\r\n simple?: boolean,\r\n}\r\n\r\n/**\r\n * Alert that shows an if error is set.\r\n * @param props\r\n */\r\nexport const AlertOnErrors = (props: AlertOnErrorsProps) => {\r\n const { errors, color, simple, ...rest } = props;\r\n\r\n const [openErrors, setOpenErrors] = React.useState>([]);\r\n const isOpen = React.useCallback((key: string) => !!openErrors.find(it => it === key), [openErrors]);\r\n const toggleOpen = React.useCallback((key: string) => {\r\n setOpenErrors(prevState => {\r\n if (prevState.find(it => it === key)) {\r\n return prevState.filter(it => it !== key);\r\n } else {\r\n return [...prevState, key];\r\n }\r\n });\r\n }, [setOpenErrors]);\r\n\r\n // Get the friendly version of each error.\r\n const friendlyErrors = React.useMemo(() => {\r\n // Flatten up to three levels of errors (wrapping in our own array first) and removing any\r\n // empty items (e.g. null, undefined, '').\r\n let flatErrors = [errors].flat(4).filter(item => item ? true : false);\r\n\r\n // Make friendly versions of all the error messages.\r\n const ret: Array = [flatErrors.map(error => userFriendlyErrorMessage(error))].flat(2);\r\n return ret;\r\n }, [errors])\r\n\r\n // Group errors with the same message together.\r\n const errorGroups = React.useMemo(() => {\r\n let groups: Array<{ message: string, errors: Array }> = [];\r\n\r\n for (const error of friendlyErrors) {\r\n let group = groups.find(item => item.message === error.message);\r\n if (!group) {\r\n group = { message: error.message, errors: [] };\r\n groups.push(group);\r\n }\r\n\r\n group.errors.push(error);\r\n }\r\n\r\n return groups;\r\n }, [friendlyErrors]);\r\n \r\n // If we have no errors, return nothing.\r\n if (!friendlyErrors.length) {\r\n return null;\r\n }\r\n\r\n // If we are in simple mode, return a list of friendly messages with no grouping or options to expand for more details.\r\n if (!!simple) {\r\n return (\r\n \r\n {props.children}\r\n\r\n {\r\n friendlyErrors.map((item, index) => (\r\n
\r\n {item.message}\r\n
\r\n ))\r\n }\r\n
\r\n );\r\n }\r\n\r\n // If we are not in simple mode (the default) then provide an interactive list of errors with grouping and the ability to expand for more\r\n // details if the user wants to.\r\n return (\r\n \r\n {props.children}\r\n {\r\n errorGroups.map(item => (\r\n
\r\n \r\n \r\n
toggleOpen(item.message)} style={{ cursor: 'pointer' }}>\r\n \r\n <> {\r\n item.errors.length > 1 ? (\r\n \r\n {item.errors.length}\r\n \r\n ) : (\r\n \r\n \r\n \r\n )\r\n }\r\n 1}>\r\n <> \r\n \r\n
\r\n \r\n \r\n
\r\n {item.message}\r\n
\r\n \r\n {\r\n item.errors.map((error, index) => (\r\n
\r\n \r\n
\r\n {error.details}\r\n
\r\n
\r\n \r\n {JSON.stringify(error?.error, null, 4)}\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 { isNullOrUndefined } from \"util\";\r\nimport { configuredErrorMessageConverters } from \"./registerErrorMessageConverters\";\r\nimport { FriendlyErrorMessage } from \"./FriendlyErrorMessage\";\r\n\r\n/**\r\n * Translate an error message into a user friendly message, also giving the option for wrapping the message for translation if required\r\n * and seperating out additional details from the core error message.\r\n * \r\n * @param error the original error.\r\n */\r\nexport function userFriendlyErrorMessage(error: any): FriendlyErrorMessage | Array {\r\n // Give each converter in order a chance to handle the error until one does.\r\n for (const converter of configuredErrorMessageConverters) {\r\n const friendly = converter(error);\r\n if (!isNullOrUndefined(friendly)) {\r\n if (Array.isArray(friendly)) {\r\n return friendly as Array;\r\n } else if ((friendly as FriendlyErrorMessage)?.error) {\r\n return friendly as FriendlyErrorMessage;\r\n } else {\r\n return { message: friendly as string, error: error };\r\n }\r\n }\r\n }\r\n\r\n // Give up and return the error with a basic wrapper.\r\n return {\r\n message: error?.message ?? error?.toString,\r\n error: error\r\n };\r\n}","import * as React from 'react';\r\nimport { ModelChanges } from './ModelChanges';\r\n\r\n/**\r\n * Hook that makes it easy to apply changes ontop of original data.\r\n */\r\nexport function useChanges(unchanged: T | undefined | null, initialChanges: Partial = {}): ModelChanges {\r\n // Store changes in the state.\r\n const [changes, setChanges] = React.useState>(initialChanges);\r\n\r\n // Provide a method to apply a change or set of changes.\r\n const change = React.useCallback((changes: Partial) => {\r\n setChanges(prevState =>({\r\n ...prevState,\r\n ...changes\r\n }));\r\n }, [setChanges]);\r\n\r\n // Provide a method to reset all changes.\r\n const reset = React.useCallback(() => {\r\n setChanges({});\r\n }, [setChanges]);\r\n\r\n // Combine the initial model with the changes to produce model with its current state.\r\n const model = React.useMemo((): T => {\r\n return {\r\n ...(unchanged ?? {} as T), ...changes\r\n };\r\n }, [unchanged, changes]);\r\n\r\n // Combine everything into a return value and return it (caching it with useMemo()).\r\n const ret = React.useMemo(() => ({\r\n change: change,\r\n changes: changes,\r\n reset: reset,\r\n model: model\r\n }), [changes, change, reset, model]);\r\n\r\n return ret;\r\n}","import * as React from 'react';\r\nimport { ModelArrayChanges } from './ModelArrayChanges';\r\nimport { isNullOrUndefined } from 'util';\r\n\r\n/**\r\n * An item in a changed array.\r\n */\r\ninterface ModelArrayItemChanges {\r\n key: Key,\r\n unchanged: T | undefined | null,\r\n changes: Partial,\r\n isAddition: boolean,\r\n isRemoval: boolean,\r\n hasUnsavedChanges: boolean,\r\n}\r\n\r\n/**\r\n * Hook that makes it easy to apply changes to multiple items in an array ontop of original data.\r\n */\r\nexport function useChangesArray(unchanged: Array | undefined | null, getKey: (item: T) => Key): ModelArrayChanges {\r\n // Store changes to be layered ontop of unchangedRecords in the state.\r\n const [_changes, setChanges] = React.useState>>([]);\r\n\r\n // When unchanged changes, make sure we merge those source changes \"under\" the changes that come from calling change/changeFor and friends.\r\n React.useEffect(() => {\r\n setChanges(prevState => {\r\n // Loop over each unchanged item and see if we need to add it to our list of changes.\r\n // NOTE because out unchanged may have come from a filter() or map() statement we look for changes\r\n // in the array contents not array reference for performance reasons rather than just assuming\r\n // a change to unchanged needs a state change. This is what hasAnythingChanged handles for us.\r\n let ret: Array> = [];\r\n let hasAnythingChanged = false;\r\n\r\n // Update each change in unchangedRecord into the tracked changes.\r\n for (let unchangedItem of unchanged ?? []) {\r\n const unchangedItemKey = getKey(unchangedItem);\r\n let changeRecord = prevState.find(item => item.key === unchangedItemKey);\r\n\r\n // Check if we have the same underlying unchanged object.\r\n if (changeRecord) {\r\n if (changeRecord.unchanged !== unchangedItem) {\r\n // Update the unchanged item.\r\n changeRecord.unchanged = unchangedItem;\r\n hasAnythingChanged = true;\r\n }\r\n\r\n // Push to ret \r\n ret.push(changeRecord);\r\n } else {\r\n // Add a new unchanged record.\r\n ret.push({\r\n key: unchangedItemKey,\r\n unchanged: unchangedItem,\r\n changes: {},\r\n isAddition: false,\r\n isRemoval: false,\r\n hasUnsavedChanges: false,\r\n });\r\n hasAnythingChanged = true;\r\n }\r\n }\r\n\r\n // Loop over all the previous items and if any of those have disapeared from the underlying source, make remove them.\r\n for (const oldItem of prevState) {\r\n // If this item never existed in the unchanged list then we need to add it to ret and continue.\r\n if (!oldItem.unchanged) {\r\n if (!ret.find(item => item === oldItem)) {\r\n ret.push(oldItem);\r\n }\r\n continue;\r\n }\r\n\r\n // Find the item in the old.\r\n const oldItemKey = getKey(oldItem.unchanged);\r\n const existsInUnchanged = !!unchanged?.find(item => getKey(item) === oldItemKey);\r\n if (!existsInUnchanged) {\r\n ret = ret?.filter(it => it !== oldItem);\r\n hasAnythingChanged = true;\r\n }\r\n }\r\n\r\n // If nothing has changed, return the unchanged state.\r\n if (!hasAnythingChanged) {\r\n return prevState;\r\n }\r\n\r\n // Return the updated state.\r\n return ret;\r\n });\r\n }, [unchanged, getKey, setChanges]);\r\n\r\n // Provide a method to apply a change or set of changes.\r\n // NOTE a side effect of this code is that the first time we make any change, we'll be creating a record for everything from unchangedRecords\r\n // into _changes for ease in the future.\r\n // we can't do that before this point as we allow unchanged to be passed in with new values after the state of _changes is originally set.\r\n const change = React.useCallback((newArray: Array) => {\r\n setChanges(prevState => {\r\n let newState = [...prevState];\r\n let keysInNewArray = [];\r\n\r\n // Loop over each item in the array and find its matching changes\r\n for (let newChanges of newArray) {\r\n let key = getKey(newChanges);\r\n keysInNewArray.push(key);\r\n let changeRecord = prevState.find(it => it.key === key);\r\n\r\n // If we don't have a change record for this item, see if we have an unchanged record\r\n if (!changeRecord) {\r\n // Add as an addition.\r\n newState.push({\r\n key: key,\r\n unchanged: null,\r\n changes: newChanges,\r\n isAddition: true,\r\n isRemoval: false,\r\n hasUnsavedChanges: true,\r\n });\r\n } else {\r\n // Update the changes in the change record.\r\n changeRecord.changes = { ...changeRecord.changes, ...newChanges };\r\n changeRecord.hasUnsavedChanges = true;\r\n }\r\n }\r\n\r\n // Loop over anything that wasn't in array and mark it is removed.\r\n for (let changeRecord of newState) {\r\n if (!keysInNewArray.find(it => it === changeRecord.key)) {\r\n changeRecord.isRemoval = true;\r\n changeRecord.hasUnsavedChanges = true;\r\n }\r\n }\r\n\r\n return newState;\r\n });\r\n }, [setChanges, getKey]);\r\n\r\n // Provide a method to reset all changes.\r\n const reset = React.useCallback(() => {\r\n setChanges([]);\r\n }, [setChanges]);\r\n\r\n // Combine the initial model with the changes to produce model with its current state.\r\n const modelFromChanges = React.useCallback((changesToUse: Array>): Array => {\r\n let ret = [];\r\n\r\n for (let item of changesToUse) {\r\n // Merge the original and the change into a model.\r\n ret.push({ ...(item.unchanged ?? {}), ...item.changes } as T);\r\n }\r\n\r\n return ret;\r\n }, []);\r\n\r\n const model = React.useMemo(() => modelFromChanges(_changes.filter(it => !it.isRemoval)), [_changes, modelFromChanges]);\r\n const added = React.useMemo(() => modelFromChanges(_changes.filter(it => it.isAddition && !it.isRemoval && it.hasUnsavedChanges)), [_changes, modelFromChanges]);\r\n const removed = React.useMemo(() => modelFromChanges(_changes.filter(it => it.isRemoval && !it.isAddition && it.hasUnsavedChanges)), [_changes, modelFromChanges]);\r\n const updated = React.useMemo(() => modelFromChanges(_changes.filter(it => !it.isAddition && !it.isRemoval && Object.keys(it.changes).length && it.hasUnsavedChanges)), [_changes, modelFromChanges]);\r\n\r\n // Combine everything into a return value and return it (caching it with useMemo()).\r\n const ret = React.useMemo(() => ({\r\n model: model,\r\n change: change,\r\n reset: reset,\r\n\r\n added: added,\r\n removed: removed,\r\n updated: updated,\r\n \r\n modelFor: (key: Key) => {\r\n const changeRecord = _changes.find(it => it.key === key);\r\n if (!changeRecord) {\r\n return null;\r\n }\r\n\r\n return { ...(changeRecord.unchanged ?? {}), ...changeRecord.changes } as T;\r\n },\r\n changeFor: (key: Key, newChanges: Partial) => {\r\n setChanges(prevState => {\r\n let newState = [...prevState];\r\n\r\n // Find the key in question\r\n let changeRecord = prevState.find(it => it.key === key);\r\n\r\n // If we don't have a change record for this item, add it as an addition.\r\n if (!changeRecord) {\r\n newState.push({\r\n key: key,\r\n unchanged: null,\r\n changes: newChanges,\r\n isAddition: true,\r\n isRemoval: false,\r\n hasUnsavedChanges: true,\r\n });\r\n } else {\r\n // Update the changes in the change record.\r\n changeRecord.changes = { ...changeRecord.changes, ...newChanges };\r\n changeRecord.hasUnsavedChanges = true;\r\n }\r\n\r\n return newState;\r\n });\r\n },\r\n changesFor: (key: Key) => {\r\n const changeRecord = _changes.find(it => it.key === key);\r\n if (!changeRecord) {\r\n return {};\r\n }\r\n\r\n return changeRecord.changes;\r\n },\r\n addFor: (item: Partial) => {\r\n var key = getKey(item as T);\r\n setChanges(prevState => {\r\n let newState = [...prevState];\r\n\r\n // Find the key in question\r\n let changeRecord = prevState.find(it => it.key === key);\r\n if (!changeRecord) {\r\n newState.push({\r\n key: key,\r\n unchanged: null,\r\n changes: item,\r\n isAddition: true,\r\n isRemoval: false,\r\n hasUnsavedChanges: true,\r\n });\r\n } else if (changeRecord.isRemoval) {\r\n // If we are added after being removed then mark ourselves as not removed and reset our changes to the passed in model.\r\n changeRecord.isRemoval = false;\r\n changeRecord.changes = item;\r\n } else {\r\n // We were asked to add something that already exists, silently ignore that.\r\n // TODO would we be better throwing an exception?\r\n }\r\n\r\n return newState;\r\n });\r\n },\r\n removeFor: (key: Key) => {\r\n setChanges(prevState => {\r\n let newState = [...prevState];\r\n\r\n // Find the key in question\r\n let changeRecord = prevState.find(it => it.key === key);\r\n if (changeRecord) {\r\n changeRecord.isRemoval = true;\r\n changeRecord.hasUnsavedChanges = true;\r\n }\r\n\r\n return newState;\r\n });\r\n },\r\n\r\n /**\r\n * Mark the current changes for this model as saved.\r\n */\r\n markAsSaved: (models?: Array) => {\r\n setChanges(prevState => {\r\n let newState: Array> = [...prevState];\r\n let hasChangedSomething = false;\r\n const keysToCheck = models ? models.map(item => getKey(item)) : null;\r\n\r\n for (const item of prevState) {\r\n // If we were passed in an array of items to mark, then make sure this is in the array before marking it as complete\r\n // (if we don't get an array passed in then everything gets marked as complete).\r\n if (!isNullOrUndefined(keysToCheck)) {\r\n if (!keysToCheck.find(it => it === item.key)) {\r\n continue;\r\n }\r\n }\r\n\r\n // Mark as all changes having been saved.\r\n item.hasUnsavedChanges = false;\r\n\r\n // Saved additions should also no longer be marked as additions (but removals are fine to be left marked as removals.)\r\n item.isAddition = false;\r\n\r\n hasChangedSomething = true;\r\n }\r\n\r\n // If we didn't end up changing anything then end without having made any changes.\r\n if (!hasChangedSomething) {\r\n return prevState;\r\n }\r\n\r\n // Otherwise set our new state.\r\n return newState;\r\n });\r\n },\r\n }), [_changes, setChanges, change, reset, model, added, removed, updated, getKey]);\r\n\r\n return ret;\r\n}\r\n","import './externalLoginButton.scss';\r\n\r\nimport * as React from 'react';\r\nimport { ButtonProps, Button } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface ExternalLoginButtonProps extends ButtonProps {\r\n provider: string,\r\n providerDisplayName?: string,\r\n}\r\n\r\ninterface ProviderDisplayOptions {\r\n text: string,\r\n icon: IconProp,\r\n className: string,\r\n}\r\n\r\n/**\r\n * Button for a an external service that can be used to log in. \r\n */\r\nexport const ExternalLoginButton = (props: ExternalLoginButtonProps) => {\r\n const { t } = useTranslation();\r\n const { provider, providerDisplayName, className: propsClassName, ...rest } = props;\r\n\r\n const { text, icon, className } = React.useMemo((): ProviderDisplayOptions => {\r\n switch (provider) {\r\n case 'Microsoft':\r\n return { text: t('externalLoginButton.microsoftAccountProviderText', 'Microsoft Account'), icon: ['fab', 'microsoft'], className: 'microsoft' };\r\n case 'Google':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'google'], className: 'google' };\r\n case 'Facebook':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'facebook'], className: 'facebook' };\r\n case 'Twitter':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'twitter'], className: 'twitter' };\r\n default:\r\n return { text: providerDisplayName ?? provider, icon: 'external-link-alt', className: 'other' };\r\n }\r\n }, [provider, providerDisplayName, t]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import './formButtons.scss';\r\n\r\nimport * as React from 'react';\r\n\r\nexport interface FormButtonsProps {\r\n className?: string,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for buttons (e.g. sumbit) at the bottom of a form. \r\n */\r\nexport const FormButtons = (props: FormButtonsProps) => {\r\n const { className, children } = props;\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};","import './sideContainer.scss'; \r\n\r\nimport * as React from 'react';\r\nimport { Container, ContainerProps } from 'reactstrap';\r\n\r\nexport interface SideContainerProps extends ContainerProps {\r\n side?: 'left' | 'right',\r\n color?: 'dark' | 'transparent',\r\n className?: string,\r\n}\r\n\r\n/**\r\n * Container for items you want to show on a dark panel that appears to be snapped to the side of the screen.\r\n */\r\nexport const SideContainer = (props: SideContainerProps) => {\r\n const {\r\n side = 'left',\r\n color = 'dark',\r\n className,\r\n ...rest\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};","import { WatchQueryFetchPolicy } from \"@apollo/client\";\r\n\r\nexport const mainApiConfig = {\r\n endpoint: '/graphql',\r\n blobUploadEndpoint: '/api/blobs',\r\n defaultFetchPolicy: 'cache-and-network' as WatchQueryFetchPolicy,\r\n //defaultFetchPolicy: 'cache-first' as WatchQueryFetchPolicy,\r\n};","import gql from \"graphql-tag\";\r\nimport { cmsVideoFields } from \"../generated/cmsVideoFields\";\r\n\r\nexport const cmsVideoFieldsFragment = gql`\r\n fragment cmsVideoFields on CmsVideo {\r\n id\r\n name\r\n videoBlobReferenceId\r\n thumbnailBlobReferenceId\r\n archived\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CmsVideo = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { blobReferenceFields } from \"../generated/blobReferenceFields\";\r\n\r\nexport const blobReferenceFieldsFragment = gql`\r\n fragment blobReferenceFields on BlobReference {\r\n id\r\n filename\r\n mimeType\r\n storageReference\r\n archived\r\n createdByUserId\r\n createdDate\r\n url\r\n }\r\n`;\r\n\r\n\r\nexport type BlobReference = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { cmsTextFields } from \"../generated/cmsTextFields\";\r\n\r\nexport const cmsTextFieldsFragment = gql`\r\n fragment cmsTextFields on CmsText {\r\n id\r\n name\r\n html\r\n archived\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CmsText = Omit;\r\n","import { ApiFetch } from 'apifetch-json';\r\nimport { BlobReference } from '../models/BlobReference';\r\n\r\n/**\r\n * Service for handling the uploading of files as blobs.\r\n */\r\nexport class BlobUploadService {\r\n private readonly url: string;\r\n private readonly api: ApiFetch;\r\n\r\n\r\n constructor(url: string, apiFetch?: ApiFetch) {\r\n this.url = url;\r\n this.api = apiFetch || new ApiFetch();\r\n }\r\n\r\n /**\r\n * Upload a single file from a FileList (as provided by input[type=\"file\"])\r\n * @param files\r\n */\r\n async upload(files: FileList): Promise {\r\n let response = await this.uploadMultiple(files);\r\n\r\n if (!response || !response.length) {\r\n return null;\r\n }\r\n\r\n return response[0];\r\n }\r\n\r\n /**\r\n * Upload a single file that is provided as a File rather than a FileList.\r\n * @param file\r\n */\r\n async uploadFile(file: File): Promise {\r\n let response = await this.uploadMultiple([file]);\r\n\r\n if (!response || !response.length) {\r\n return null;\r\n }\r\n\r\n return response[0];\r\n }\r\n\r\n /**\r\n * Upload multiple items.\r\n * @param files\r\n */\r\n async uploadMultiple(files: FileList | Array): Promise> {\r\n var data = new FormData();\r\n for (let i = 0; i < files.length; ++i) {\r\n let file = files[i];\r\n data.append('files', file, file.name);\r\n }\r\n\r\n // We use fetch() rather than post() here as we want full control over headers and body.\r\n let result = await this.api.fetch>(\r\n `${this.url}/upload`,\r\n (init) => {\r\n let { headers, ...rest } = init;\r\n\r\n // Make sure we don't pass 'Content-Type' as that will break the way browsers\r\n // pass file uploads. They require it to be blank so the browser can handle\r\n // it with an appropriate boundry set etc.\r\n let newHeaders = new Headers(headers);\r\n newHeaders.delete('Content-Type');\r\n\r\n return {\r\n ...rest,\r\n method: 'POST',\r\n headers: newHeaders,\r\n body: data\r\n };\r\n });\r\n\r\n return result;\r\n }\r\n\r\n async uploadDataUrl(filename: string, dataUrl: string): Promise {\r\n let result = await this.api.post(`${this.url}/uploadDataUrl?filename=${encodeURIComponent(filename)}`, dataUrl);\r\n return result;\r\n }\r\n\r\n async uploadBlobObject(filename: string, blob: globalThis.Blob): Promise {\r\n var data = new FormData();\r\n data.append('files', blob, filename);\r\n\r\n // We use fetch() rather than post() here as we want full control over headers and body.\r\n let result = await this.api.fetch>(\r\n `${this.url}/upload`,\r\n (init) => {\r\n let { headers, ...rest } = init;\r\n\r\n // Make sure we don't pass 'Content-Type' as that will break the way browsers\r\n // pass file uploads. They require it to be blank so the browser can handle\r\n // it with an appropriate boundry set etc.\r\n let newHeaders = new Headers(headers);\r\n newHeaders.delete('Content-Type');\r\n\r\n return {\r\n ...rest,\r\n method: 'POST',\r\n headers: newHeaders,\r\n body: data\r\n };\r\n });\r\n\r\n return result[0];\r\n }\r\n}\r\n","import { ApiFetch } from \"apifetch-json\";\r\nimport { BlobUploadService } from \"../../api/main/blobReferences/BlobUploadService\";\r\nimport { mainApiConfig } from \"../../configure/mainApiConfig\";\r\n\r\n/**\r\n * File upload adapter for CKEdtior5 that hooks the image upload capabilities up to our BlobReferences for storing the blobs and generating the URLs.\r\n */\r\nexport class BlobReferenceUploadAdapter {\r\n loader: any;\r\n apiFetch: ApiFetch;\r\n\r\n constructor(loader: any, apiFetch?: ApiFetch) {\r\n // The file loader instance to use during the upload.\r\n this.loader = loader;\r\n\r\n this.apiFetch = apiFetch ?? new ApiFetch();\r\n }\r\n\r\n // Starts the upload process.\r\n upload() {\r\n return this.loader.file\r\n .then((file: File) => new Promise((resolve, reject) => {\r\n const blobService = new BlobUploadService(mainApiConfig.blobUploadEndpoint, this.apiFetch);\r\n\r\n // Upload as a blob reference.\r\n return blobService\r\n .uploadFile(file)\r\n .then(blob => {\r\n if (blob && blob.url) {\r\n resolve({\r\n default: blob.url,\r\n });\r\n } else {\r\n reject(`Could not upload ${file.name}`);\r\n }\r\n });\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Plugin to create the adapter (using default ApiFetch).\r\n * @param editor\r\n */\r\nexport function BlobReferenceUploadAdapterPlugin(editor: any) {\r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\r\n // Configure the URL to the upload script in your back-end here!\r\n return new BlobReferenceUploadAdapter(loader);\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport { CKEditor } from '@ckeditor/ckeditor5-react';\r\nimport ClassicEditor from '@ckeditor/ckeditor5-build-classic';\r\nimport { Guid } from 'guid-string';\r\nimport { BlobReferenceUploadAdapterPlugin } from './BlobReferenceUploadAdapter';\r\n\r\nexport interface HtmlEditorProps {\r\n value?: string,\r\n onChange?: (value: string) => void,\r\n onBlur?: () => void,\r\n}\r\n\r\n/**\r\n * Html editor component that abstracts the editor actually being used from the code using it where its unimportant.\r\n * \r\n * This version uses CKEditor 5 internally.\r\n * \r\n * @param props\r\n */\r\nexport const HtmlEditor = (props: HtmlEditorProps) => {\r\n const { value, onChange, onBlur } = props;\r\n\r\n // Calculate a key that only changes when the value is changed external to the editor itself as we need to update the key\r\n // of the componentto force a re-render whenever that does happen as CKEditor doesn't cope with it otherwise which means\r\n // we would otherwise not update when we've loaded data from the database and would therefore keep showing as blank.\r\n const [key, setKey] = React.useState(() => Guid.newGuid());\r\n const trackedValue = React.useRef(value ?? '');\r\n React.useEffect(() => {\r\n if (value !== trackedValue.current) {\r\n // value has been changed external to the changes made by the user in the editor.\r\n setKey(Guid.newGuid());\r\n }\r\n }, [value, trackedValue, setKey]);\r\n\r\n return (\r\n {\r\n const data = editor.getData();\r\n\r\n // Keep a track of changes that were performed by the editor itself (so we can check for external changes).\r\n trackedValue.current = data;\r\n\r\n if (onChange) {\r\n onChange(data);\r\n }\r\n }}\r\n onBlur={(event: any, editor: any) => {\r\n if (onBlur) {\r\n onBlur();\r\n }\r\n }}\r\n />\r\n );\r\n};","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * DailyMotion oembed provider.\r\n */\r\nexport const DailyMotionProvider: OEmbedProvider = {\r\n name: 'dailymotion',\r\n type: 'video',\r\n format: 'jsonp',\r\n api: 'https://www.dailymotion.com/services/oembed',\r\n urls: [\r\n \"dailymotion\\\\.com/.+\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * YouTube oembed provider.\r\n */\r\nexport const FacebookProvider: OEmbedProvider = {\r\n name: 'facebook',\r\n type: 'rich',\r\n format: 'json',\r\n api: 'https://TODO',\r\n urls: [\r\n \"facebook.com\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * Flickr oembed provider.\r\n */\r\nexport const FlickrProvider: OEmbedProvider = {\r\n name: 'flickr',\r\n type: 'photo',\r\n format: 'jsonp',\r\n api: 'https://www.flickr.com/services/oembed',\r\n urls: [\r\n \"flickr\\\\.com/photos/.+\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * YouTube oembed provider.\r\n */\r\nexport const GoogleMapsProvider: OEmbedProvider = {\r\n name: 'googleMaps',\r\n type: 'rich',\r\n format: 'json',\r\n api: 'https://TODO',\r\n urls: [\r\n \"TODO\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * Instagram oembed provider.\r\n */\r\nexport const InstagramProvider: OEmbedProvider = {\r\n name: 'instagram',\r\n type: 'photo',\r\n format: 'jsonp',\r\n api: 'https://api.instagram.com/oembed',\r\n urls: [\r\n \"instagr\\\\.?am(\\\\.com)?/.+\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * Spotify oembed provider.\r\n */\r\nexport const SpotifyProvider: OEmbedProvider = {\r\n name: 'spotify',\r\n type: 'rich',\r\n format: 'jsonp',\r\n api: 'https://embed.spotify.com/oembed/',\r\n urls: [\r\n \"open.spotify.com/(track|album|user)/\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * Twitter oembed provider.\r\n */\r\nexport const TwitterProvider: OEmbedProvider = {\r\n name: 'youtube',\r\n type: 'video',\r\n format: 'json',\r\n api: 'https://TODO',\r\n urls: [\r\n \"TODO\",\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * YouTube oembed provider.\r\n */\r\nexport const VimeoProvider: OEmbedProvider = {\r\n name: 'vimeo',\r\n type: 'video',\r\n format: 'json',\r\n api: 'https://vimeo.com/api/oembed.json',\r\n urls: [\r\n \"www\\\\.vimeo\\\\.com\\\\/groups\\\\/.*\\\\/videos\\\\/.*\",\r\n \"www\\\\.vimeo\\\\.com\\\\/.*\",\r\n \"vimeo\\\\.com\\\\/groups\\\\/.*\\\\/videos\\\\/.*\",\r\n \"vimeo\\\\.com\\\\/.*\"\r\n ],\r\n};\r\n","import '../OEmbedProvider';\r\nimport { OEmbedProvider } from '../OEmbedProvider';\r\n\r\n/**\r\n * YouTube oembed provider.\r\n */\r\nexport const YouTubeProvider: OEmbedProvider = {\r\n name: 'youtube',\r\n type: 'video',\r\n format: 'json',\r\n api: 'https://www.youtube.com/oembed',\r\n urls: [\r\n \"youtube\\\\.com/watch.+v=[\\\\w-]+&?\",\r\n \"youtu\\\\.be/[\\\\w-]+\",\r\n \"youtube.com/embed\"\r\n ],\r\n};\r\n","import { OEmbedProvider } from \"./OEmbedProvider\";\r\nimport { OEmbedResult } from \"./OEmbedResult\";\r\nimport { DailyMotionProvider } from \"./providers/DailyMotionProvider\";\r\nimport { FacebookProvider } from \"./providers/FacebookProvider\";\r\nimport { FlickrProvider } from \"./providers/FlickrProvider\";\r\nimport { GoogleMapsProvider } from \"./providers/GoogleMapsProvider\";\r\nimport { InstagramProvider } from \"./providers/InstagramProvider\";\r\nimport { SpotifyProvider } from \"./providers/SpotifyProvider\";\r\nimport { TwitterProvider } from \"./providers/TwitterProvider\";\r\nimport { VimeoProvider } from \"./providers/VimeoProvider\";\r\nimport { YouTubeProvider } from \"./providers/YouTubeProvider\";\r\nimport fetchJsonp from \"fetch-jsonp\";\r\n\r\n/**\r\n * Implementation of an oembed client that only depends on fetch() and fetch-jsonp (for JSONP support).\r\n */\r\nexport class FetchOmbed {\r\n private _providers: Array;\r\n\r\n constructor() {\r\n this._providers = [\r\n DailyMotionProvider,\r\n FacebookProvider,\r\n FlickrProvider,\r\n GoogleMapsProvider,\r\n InstagramProvider,\r\n SpotifyProvider,\r\n TwitterProvider,\r\n VimeoProvider,\r\n YouTubeProvider,\r\n ];\r\n }\r\n\r\n /**\r\n * Get the best provider for handling url.\r\n * @param url\r\n */\r\n getProvider(url: string): OEmbedProvider | null {\r\n for (const provider of this._providers) {\r\n for (const pattern of provider.urls) {\r\n var regExp = new RegExp(pattern);\r\n if (url.match(regExp)) {\r\n return provider;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Return the OEmbedResult for url.\r\n * @param url\r\n */\r\n async getOEmbedData(url: string): Promise {\r\n // Find the right provider to use.\r\n const provider = this.getProvider(url);\r\n if (!provider) {\r\n console.error(`getOEmbedData could not find a registered provider to handle url: ${url}`);\r\n return null;\r\n }\r\n\r\n try {\r\n if (provider.format === 'jsonp') {\r\n // Special handling of JSONP which uses a script tab to return the json wrapped in a javascript callback function.\r\n const response = await fetchJsonp(`${provider.api}?format=json&url=${escape(url)}`);\r\n const result = await response.json();\r\n return result as OEmbedResult;\r\n } else {\r\n const response = await fetch(`${provider.api}?format=${escape(provider.format)}&url=${escape(url)}` /*, { mode: 'no-cors' } */);\r\n const result = await response.json();\r\n return result as OEmbedResult;\r\n }\r\n } catch (error) {\r\n console.error(`getOEmbedData failed when contacting provider: ${error}`);\r\n return null;\r\n }\r\n }\r\n\r\n\r\n}","import { FetchOmbed } from \"./FetchOEmbed\";\r\n\r\n/**\r\n * Scan element and its children looking for oembed elements. If we find any, then we load the oembed data we have providers for within them.\r\n * @param element\r\n */\r\nexport async function processOEmbedElements(element: Element): Promise {\r\n // Find all the oembed elements.\r\n const elements: Array = [\r\n ...(element.tagName.toLowerCase() === 'oembed'? [element]: []),\r\n ...element.getElementsByTagName('oembed')\r\n ];\r\n\r\n // If we didn't find any elements to process, return doing nothing.\r\n if (!elements.length) {\r\n return;\r\n }\r\n\r\n // Process each oembed element we find.\r\n const service = new FetchOmbed();\r\n for (const theElement of elements) {\r\n // Need a URL to work with.\r\n const url = theElement.getAttribute('url');\r\n if (!url) {\r\n continue;\r\n }\r\n\r\n // Load the data using our trusted oembed providers.\r\n const data = await service.getOEmbedData(url);\r\n if (!data || !data.html) {\r\n continue;\r\n }\r\n\r\n // Update the innerHTML of the element based on the result.\r\n theElement.innerHTML = data.html;\r\n }\r\n}","import './htmlDisplay.scss';\r\nimport * as React from 'react';\r\nimport { processOEmbedElements } from '../fetch-oembed';\r\n\r\nexport interface HtmlDisplayProps {\r\n html: string,\r\n}\r\n\r\n/**\r\n * Component that shows Html created by the user in HtmlEditor.\r\n * @param props\r\n */\r\nexport const HtmlDisplay = (props: HtmlDisplayProps) => {\r\n const { html } = props;\r\n\r\n const elementRef = React.useRef(null);\r\n\r\n // Initialize any oembed content.\r\n React.useEffect(() => {\r\n setTimeout(() => {\r\n if (!elementRef.current) {\r\n return;\r\n }\r\n\r\n processOEmbedElements(elementRef.current);\r\n }, 100);\r\n }, [html]);\r\n\r\n return (\r\n
\r\n
\r\n );\r\n};","import { CmsText } from \"../../../api/main/models/CmsText\";\r\nimport * as React from 'react';\r\nimport { HtmlDisplay } from \"../../../shared/htmlEditor\";\r\n\r\nexport interface CmsTextHtmlDisplayProps {\r\n model: CmsText | undefined | null,\r\n}\r\n\r\n/**\r\n * Spealised HtmlDisplay that lets us consitantly present CmsText within components or pages.\r\n * @param props\r\n */\r\nexport const CmsTextHtmlDisplay = (props: CmsTextHtmlDisplayProps) => {\r\n const { model } = props;\r\n\r\n return (\r\n \r\n );\r\n};","import * as React from 'react';\r\nimport { BlobReference } from \"../../../api/main/models/BlobReference\";\r\n\r\nexport interface CmsVideoDisplayModel {\r\n id: string,\r\n name: string,\r\n videoBlobReference: BlobReference | undefined | null,\r\n thumbnailBlobReference: BlobReference | undefined | null,\r\n}\r\n\r\nexport interface CmsVideoDisplayProps extends React.DetailedHTMLProps, HTMLVideoElement> {\r\n model: CmsVideoDisplayModel | undefined | null,\r\n controls?: boolean,\r\n}\r\n\r\n/**\r\n * Spealised video tag that lets us consitantly present a CmsVideo within components or pages.\r\n * @param props\r\n */\r\nexport const CmsVideoDisplay = (props: CmsVideoDisplayProps) => {\r\n const {\r\n model,\r\n className,\r\n controls = true,\r\n ...rest\r\n } = props;\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};","import './loginPartialPage.scss';\r\nimport * as React from 'react';\r\nimport { useLoginPartialPageViewModel } from '../../api/main/cmsPages/viewModels/useLoginPartialPageViewModel';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { CmsTextHtmlDisplay } from '../cms/cmsTexts/CmsTextHtmlDisplay';\r\nimport { CmsVideoDisplay } from '../cms/cmsVideos/CmsVideoDisplay';\r\nimport { Card } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link } from 'react-router-dom';\r\n\r\n/**\r\n * Cms based partial page shown on the Login and other Account pages. \r\n */\r\nexport const LoginPartialPage = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { video, text }, errors: loadErrors } = useLoginPartialPageViewModel();\r\n\r\n return (\r\n
\r\n \r\n

\r\n {t('loginPartialPage.heading', 'What is TheSchoolYear?')}\r\n

\r\n\r\n \r\n\r\n \r\n \r\n\r\n

\r\n \r\n {t('loginPartialPage.findOutMore', 'Find out more')}\r\n \r\n

\r\n
\r\n
\r\n );\r\n};","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { loginPartialPageViewModelQuery } from '../../generated/loginPartialPageViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsVideoFieldsFragment } from '../../models/CmsVideo';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { cmsTextFieldsFragment } from '../../models/CmsText';\r\n\r\n/**\r\n * View model for LoginPartialPage that loads all cms data needed for the page at once.\r\n * @param options\r\n */\r\nexport function useLoginPartialPageViewModel(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query loginPartialPageViewModelQuery {\r\n video: cmsVideo(name: \"Login.Video\") {\r\n ...cmsVideoFields\r\n\r\n videoBlobReference {\r\n ...blobReferenceFields\r\n }\r\n\r\n thumbnailBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n\r\n text: cmsText(name: \"Login.VideoText\") {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n ${cmsTextFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","\r\n/**\r\n * Rules for a password.\r\n * \r\n * This is designed to mirror PasswordOptions from ASP.NET Core Identity.\r\n */\r\nexport interface PasswordOptions {\r\n requireDigit: boolean,\r\n requiredLength: number,\r\n requireLowercase: boolean,\r\n requireNonAlphanumeric: boolean,\r\n requiredUniqueChars: number,\r\n requireUppercase: boolean\r\n}\r\n\r\n/**\r\n * Default PasswordOptions used when no custom options are supplied.\r\n * \r\n * The default rules match those for ASP.NET Core Identity to make it out-of-the-box compatible with backends using\r\n * ASP.NET Core identity, however there is no dependency on it and it can be used with any backend.\r\n */\r\nexport const defaultPasswordOptions = {\r\n requireDigit: true,\r\n requiredLength: 6,\r\n requireLowercase: true,\r\n requireNonAlphanumeric: true,\r\n requiredUniqueChars: 1,\r\n requireUppercase: true\r\n} as PasswordOptions;\r\n","import i18n from 'i18next';\r\nimport { PasswordOptions, defaultPasswordOptions } from './PasswordOptions';\r\n\r\n/**\r\n * Enforce and describe PasswordOptions.\r\n */\r\nexport class PasswordValidation {\r\n private readonly passwordOptions: PasswordOptions;\r\n\r\n constructor(passwordOptions?: PasswordOptions) {\r\n this.passwordOptions = passwordOptions ?? defaultPasswordOptions;\r\n }\r\n\r\n /**\r\n * Check password against the PasswordOptions and return a success indicator and an array of any errors, and a friendly description of all errors.\r\n * @param password\r\n */\r\n check(password: string): PasswordCheckResults {\r\n let ok = true;\r\n let errors: Array = [];\r\n\r\n if (this.passwordOptions.requiredLength > password.length) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requiredLengthError', 'must be at least {{requiredLength}} characters long', { requiredLength: this.passwordOptions.requiredLength }));\r\n }\r\n\r\n if (this.passwordOptions.requiredUniqueChars > 1) {\r\n let charMap = Array();\r\n for (let i = 0; i < password.length; ++i) {\r\n let char = password.charAt(i);\r\n if (charMap.indexOf(char) !== -1) {\r\n charMap.push(char);\r\n\r\n // Break if we know enough to let the password pass on this rule.\r\n if (charMap.length > this.passwordOptions.requiredUniqueChars) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requiredUniqueChars > charMap.length) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requiredUniqueCharsError', 'must contain at least {{requiredUniqueChars}} unique characters', { requiredUniqueChars: this.passwordOptions.requiredUniqueChars }));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireDigit) {\r\n let regExp = new RegExp('.*[0-9].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireDigitError', 'must contain a number'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireLowercase) {\r\n let regExp = new RegExp('.*[a-z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireLowercaseError', 'must contain a lowercase letter'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireUppercase) {\r\n let regExp = new RegExp('.*[A-Z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireUppercaseError', 'must contain an uppercase letter'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireNonAlphanumeric) {\r\n let regExp = new RegExp('.*[^0-9a-zA-Z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireNonAlphanumericError', 'must contain a symbol (such as !$%&*@#)'));\r\n }\r\n }\r\n\r\n // Generate a textual description of all errors, or blank if there are no errors for errorDescription.\r\n let errorDescription: string = '';\r\n if (errors.length) {\r\n errorDescription = i18n.t('passwordValidation.errorDescription', 'Password {{errors}}', { errors: errors.join(', ') });\r\n }\r\n\r\n return { valid: ok, errors, errorDescription };\r\n }\r\n}\r\n\r\nexport interface PasswordCheckResults {\r\n valid: boolean,\r\n errors: Array,\r\n errorDescription: string,\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { PasswordCheckResults, PasswordValidation } from './PasswordValidation';\r\nimport { generatePasswordRulesDescrption } from './generatePasswordRulesDescription';\r\n\r\nexport interface PasswordValidationResult {\r\n checkPassword: (password: string) => PasswordCheckResults,\r\n passwordRequirements: string,\r\n}\r\n\r\n/**\r\n * Hook for password validation.\r\n */\r\nexport function usePasswordValidation(): PasswordValidationResult {\r\n let passwordValidation = React.useMemo(() => new PasswordValidation(), []);\r\n let checkPassword = React.useCallback((password: string) => {\r\n return passwordValidation.check(password);\r\n }, [passwordValidation]);\r\n let passwordRequirements = React.useMemo(() => {\r\n return generatePasswordRulesDescrption(passwordValidation);\r\n }, [passwordValidation])\r\n\r\n return {\r\n checkPassword,\r\n passwordRequirements\r\n };\r\n}","import i18n from 'i18next';\r\nimport { PasswordValidation } from \"./PasswordValidation\";\r\n\r\n/**\r\n * Generates a plain text description of the password rules for passwordValidation.\r\n * @param passwordValidation\r\n */\r\nexport function generatePasswordRulesDescrption(passwordValidation: PasswordValidation): string {\r\n const { valid, errors: passwordErrors } = passwordValidation.check('');\r\n if (valid) {\r\n return '';\r\n }\r\n\r\n return i18n.t('generatePasswordRulesDescription.passwordRequirements', 'Your password {{requirements}}.', { requirements: passwordErrors.join(', ')});\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { roleGroupFields } from \"../generated/roleGroupFields\";\r\n\r\nexport const roleGroupFieldsFragment = gql`\r\n fragment roleGroupFields on RoleGroup {\r\n id\r\n name\r\n }\r\n`;\r\n\r\n\r\nexport type RoleGroup = Omit;","import gql from \"graphql-tag\";\r\nimport { userFields } from \"../generated/userFields\";\r\nimport { roleGroupFieldsFragment } from \"./RoleGroup\";\r\n\r\nexport const userFieldsFragment = gql`\r\n fragment userFields on User {\r\n id\r\n userName\r\n email\r\n emailConfirmed\r\n phoneNumberConfirmed\r\n twoFactorEnabled\r\n lockoutEnd\r\n lockoutEnabled\r\n accessFailedCount\r\n roleGroup {\r\n ...roleGroupFields\r\n }\r\n }\r\n\r\n ${roleGroupFieldsFragment}\r\n`;\r\n\r\n\r\nexport type User = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { profileFields } from \"../generated/profileFields\";\r\nimport { userFieldsFragment } from \"./User\";\r\n\r\nexport const profileFieldsFragment = gql`\r\n fragment profileFields on Profile {\r\n id\r\n userId\r\n firstName\r\n lastName\r\n archived\r\n organisationName\r\n organisationType\r\n isSubscribedToDailyNewsLetter\r\n isSubscribedToWeeklyNewsLetter\r\n isIntrestedInWorkingTogether\r\n urn\r\n jobTitle\r\n registrationSchoolPhasesJson\r\n registeredDate\r\n\r\n user {\r\n ...userFields,\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n`;\r\n\r\n\r\nexport type Profile = Omit;\r\n","import * as React from 'react';\r\nimport { Row, Col, CustomInput } from 'reactstrap';\r\nimport { Guid } from 'guid-string';\r\n\r\nexport interface TwoValueSwitchProps {\r\n leftLabel: string,\r\n rightLabel: string,\r\n checked: boolean,\r\n onChange?: (checked: boolean) => void,\r\n disabled?: boolean,\r\n}\r\n\r\n/**\r\n * A switch component that lets the user select between two values leftLabel (false), rightLabel (true).\r\n */\r\nexport const TwoValueSwitch = (props: TwoValueSwitchProps) => {\r\n const { checked, onChange, leftLabel, rightLabel, disabled } = props;\r\n const [uniqueName] = React.useState(Guid.newGuid());\r\n\r\n return (\r\n \r\n \r\n {leftLabel}\r\n \r\n \r\n { if (onChange) { onChange(e.currentTarget.checked); } }} disabled={disabled} />\r\n \r\n \r\n {rightLabel}\r\n \r\n \r\n );\r\n};","import * as React from 'react';\r\nimport { Button } from 'reactstrap';\r\nimport { ItemTag } from '../../api/main/models/ItemTag';\r\n\r\nimport './tagSelector.scss';\r\n\r\nexport interface TagSelectorProps {\r\n items: Array,\r\n isSelected: (id: string) => boolean,\r\n toggle: (id: string) => void,\r\n color?: 'primary' | 'secondary',\r\n}\r\n\r\n/**\r\n * Component that lets the user select tags on and off.\r\n * @param props\r\n */\r\nexport const TagSelector = (props: TagSelectorProps) => {\r\n const {\r\n items,\r\n isSelected,\r\n toggle,\r\n color = 'secondary',\r\n } = props;\r\n\r\n return (\r\n
\r\n {\r\n items.map(item => (\r\n \r\n ))\r\n }\r\n
\r\n );\r\n};","import * as React from 'react';\r\n\r\n/**\r\n * Returns a hook based callback that can be used to fetch more data in a controlled way and will automatically stop fetching when it reaches the end,\r\n * which it identifies by a call that returns less data than we are expecting.\r\n * \r\n * You can check if there is more using the hasMore() function returned in its state.\r\n */\r\nexport function useFetchMoreCallback(\r\n fetchMoreFromStore: any,// (...args: any) => Promise<{ data: T }>,\r\n currentEndOffset: number | undefined | null,\r\n merge: (prevResult: T | undefined | null, newResult: T | undefined | null) => T | undefined | null,\r\n newResultLength: (newResult: T | undefined | null) => number | undefined | null\r\n): { fetchMore: () => void, hasMore: () => boolean }\r\n{\r\n const [_hasMore, setHasMore] = React.useState(true);\r\n\r\n // Read more data.\r\n const fetchMore = React.useCallback(() => {\r\n fetchMoreFromStore({\r\n variables: { offset: currentEndOffset ?? 0 },\r\n updateQuery: (previousQueryResult: T | undefined | null, { fetchMoreResult }: { fetchMoreResult: (T | undefined | null) }) => {\r\n if (!fetchMoreResult) {\r\n return previousQueryResult;\r\n }\r\n\r\n // If we didn't read any extra results, tell the cursor its reached the end.\r\n if (!newResultLength(fetchMoreResult)) {\r\n setHasMore(false);\r\n }\r\n\r\n // Merge everything together.\r\n return merge(previousQueryResult, fetchMoreResult);\r\n\r\n }\r\n });\r\n }, [fetchMoreFromStore, currentEndOffset, merge, newResultLength]);\r\n\r\n // Is there any more data available? True until fetchMore reads past the end of the data.\r\n const hasMore = React.useCallback(() => _hasMore, [_hasMore]);\r\n\r\n return React.useMemo(() => ({\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [fetchMore, hasMore]);\r\n} ","import gql from \"graphql-tag\";\r\nimport { itemTagFields } from \"../generated/itemTagFields\";\r\n\r\nexport const itemTagFieldsFragment = gql`\r\n fragment itemTagFields on ItemTag {\r\n id\r\n name\r\n color\r\n archived\r\n displayOrder\r\n createdByUserId\r\n createdDate\r\n tagType\r\n }\r\n`;\r\n\r\n\r\nexport type ItemTag = Omit;\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { itemTagsQuery, itemTagsQueryVariables } from '../generated/itemTagsQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { itemTagFieldsFragment } from '../models/ItemTag';\r\nimport { TagType } from '../models/codeOnly/TagType';\r\n\r\nexport interface ItemTagsAsyncLoadPagedOptions extends AsyncLoadPagedOptions {\r\n includeArchived?: boolean,\r\n tagType?: TagType,\r\n}\r\n\r\n/**\r\n * Get a list of itemTags from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useItemTags(options: ItemTagsAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query itemTagsQuery ($offset: Int, $first: Int, $includeArchived: Boolean, $tagType: String) {\r\n items: itemTags (offset: $offset, first: $first, includeArchived: $includeArchived, tagType: $tagType) {\r\n ...itemTagFields\r\n }\r\n }\r\n\r\n ${itemTagFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n tagType: options.tagType,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from \"react\";\r\nimport { Col, FormGroup, Label, Row } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback, ValidateCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Guid } from \"guid-string\";\r\nimport { Profile as ProfileModel } from '../../api/main/models/Profile';\r\nimport { useRegisterProfileCallback } from \"../../api/main/profiles/useRegisterProfileCallback\";\r\nimport { ProfileCreateInput } from \"../../api/main/generated/globalTypes\";\r\nimport { ValidationErrors } from \"pojo-validator\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { TwoValueSwitch } from \"../shared/TwoValueSwitch\";\r\nimport { TagSelector } from \"../tags/TagSelector\";\r\nimport { useItemTags } from \"../../api/main/itemTags/useItemTags\";\r\nimport moment from 'moment';\r\n\r\nexport interface RegisterProfileDetailsProps {\r\n // Public\r\n registerProfile: (userId: string) => Promise,\r\n isRegisteringProfile: boolean,\r\n registerProfileErrors: any,\r\n\r\n validate: ValidateCallback,\r\n validationErrors: ValidationErrors\r\n\r\n // Private\r\n model: ProfileModel,\r\n change: (changes: Partial) => void,\r\n changes: Partial\r\n}\r\n\r\n/**\r\n * Custom hook that lets users of RegisterProfileDetails own the state of the Profile without being aware of its format.\r\n * @param userId\r\n */\r\nexport function useRegisterProfileDetailsProps(): RegisterProfileDetailsProps {\r\n const { t } = useTranslation();\r\n\r\n const [_registerProfile, { isExecuting: isRegisteringProfile, errors: registerProfileErrors }] = useRegisterProfileCallback();\r\n const { model, change, changes } = useChanges(null, { id: Guid.newGuid(), firstName: '', lastName: '', organisationName: '', organisationType: 'School', isSubscribedToDailyNewsLetter: false, isSubscribedToWeeklyNewsLetter: false, isIntrestedInWorkingTogether: false, urn: '', jobTitle: '', registrationSchoolPhasesJson: '[]', registeredDate: moment().toISOString(), });\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n firstName: () => !model.firstName ? t('registerProfileDetails.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model.lastName ? t('registerProfileDetails.lastNameRequired', 'Last name is required') : '',\r\n organisationName: () => !model.organisationName ? t('registerProfileDetails.organisationName', 'Organisation name is required') : '',\r\n organsiationType: () => !model.organisationType ? t('registerProfileDetails.organisationType', 'Organisation type is required') : '',\r\n\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const registerProfile = React.useCallback(async (userId: string) => {\r\n await _registerProfile({ ...model, userId: userId } as ProfileCreateInput);\r\n }, [_registerProfile, model]);\r\n\r\n return {\r\n registerProfile: registerProfile,\r\n isRegisteringProfile: isRegisteringProfile,\r\n registerProfileErrors: registerProfileErrors,\r\n\r\n validate: validate,\r\n validationErrors: validationErrors,\r\n\r\n model: model,\r\n change: change,\r\n changes: changes,\r\n };\r\n};\r\n\r\n\r\n/**\r\n * Allow the user to set their personal details on their profile during registration.\r\n */\r\nexport const RegisterProfileDetails = (props: RegisterProfileDetailsProps & { children?: React.ReactNode }) => {\r\n const { model, change, validate, validationErrors, children, } = props;\r\n const { t } = useTranslation();\r\n\r\n const { data: { items: schoolPhaseTags }} = useItemTags({ tagType: 'SchoolPhase' });\r\n\r\n // Check if a school phase has been selected by the user.\r\n const isSchoolPhaseSelected = React.useCallback((id: string) => {\r\n if (!model?.registrationSchoolPhasesJson) {\r\n return false;\r\n }\r\n\r\n if (!schoolPhaseTags) {\r\n return false;\r\n }\r\n\r\n const selectedNames = JSON.parse(model.registrationSchoolPhasesJson || '[]') as Array;\r\n const tag = schoolPhaseTags.find(it => it.id === id);\r\n if (!tag) {\r\n return false;\r\n }\r\n\r\n const ret = selectedNames.find(it => it === tag.name);\r\n return !!ret;\r\n }, [model, schoolPhaseTags]);\r\n\r\n // Toggle the selection of a school phase.\r\n const toggleSchoolPhase = React.useCallback((id: string) => {\r\n if (!model || !schoolPhaseTags) {\r\n return;\r\n }\r\n\r\n let selectedNames = JSON.parse(model.registrationSchoolPhasesJson || '[]') as Array;\r\n const tag = schoolPhaseTags.find(it => it.id === id);\r\n if (!tag) {\r\n return false;\r\n }\r\n\r\n const existing = selectedNames.find(it => it === tag.name);\r\n if (existing) {\r\n selectedNames = selectedNames.filter(it => it !== tag.name);\r\n } else {\r\n selectedNames = [...selectedNames, tag.name];\r\n }\r\n\r\n change({ registrationSchoolPhasesJson: JSON.stringify(selectedNames) });\r\n }, [model, change, schoolPhaseTags])\r\n\r\n // Render the UI.\r\n //\r\n return (\r\n <>\r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n \r\n \r\n change({ organisationType: e.currentTarget.value })} onBlur={e => validate('organisationType')} validationErrors={validationErrors['organisationType']}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ organisationName: e.currentTarget.value })} onBlur={e => validate('organisationName')} validationErrors={validationErrors['organisationName']} />\r\n \r\n\r\n \r\n \r\n \r\n change({ urn: e.currentTarget.value })} onBlur={e => validate('urn')} validationErrors={validationErrors['urn']} />\r\n \r\n\r\n \r\n \r\n isSchoolPhaseSelected(id)}\r\n toggle={(id) => toggleSchoolPhase(id)} />\r\n \r\n\r\n \r\n\r\n \r\n \r\n change({ jobTitle: e.currentTarget.value })} onBlur={e => validate('jobTitle')} validationErrors={validationErrors['jobTitle']} />\r\n \r\n\r\n {children}\r\n\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToDailyNewsLetter: value })} />\r\n \r\n \r\n
\r\n {t('registerProfileDetails.subscribeToDailyNewsletter.description', 'Subscribe to daily update emails to receive the need-to-know sector information for your school straight to your inbox every morning.')}\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToWeeklyNewsLetter: value })} />\r\n \r\n \r\n
\r\n {t('registerProfileDetails.subscribeToDailyWeekly.description', 'Subscribe to This Week on TheSchoolBus to receive a weekly summary of what\\'s happening in education to your inbox every week.')}\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n change({ isIntrestedInWorkingTogether: value })} />\r\n \r\n \r\n
\r\n {t('registerProfileDetails.isIntrestedInWorkingTogether.description', 'If you work in education or education consultancy and are interested in having your events on TheSchoolYear or working with us on TheSchoolYear or TheSchoolBus let us know and we\\'ll get in touch with you to arrange a good time to chat.')}\r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n","import { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileCreateInput } from '../generated/globalTypes';\r\nimport { registerProfileMutation, registerProfileMutationVariables } from '../generated/registerProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { useMutation } from '@apollo/react-hooks';\r\nimport gql from 'graphql-tag';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\n\r\n/**\r\n * Get a callback to create a Profile in the store during registration.\r\n */\r\nexport function useRegisterProfileCallback(): [(model: ProfileCreateInput) => Promise, AsyncActionStatus] {\r\n //throw new Error('Users cannot self register for this app.');\r\n\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation registerProfileMutation ($model: ProfileCreateInput!) {\r\n registerProfile(model: $model) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ProfileCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import './mainContainer.scss'; \r\n\r\nimport * as React from 'react';\r\nimport { Container, ContainerProps } from 'reactstrap';\r\n\r\nexport interface MainContainerProps extends ContainerProps {\r\n color?: 'main' | 'transparent',\r\n}\r\n\r\n/**\r\n * Input that is hooked up for searching as the user types, by introducing an appropriate delay before raising the onSearch event.\r\n */\r\nexport const MainContainer = (props: MainContainerProps) => {\r\n const {\r\n className,\r\n children,\r\n color = 'main',\r\n ...rest } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};","import './banner.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Container } from 'reactstrap';\r\n\r\nexport interface BannerProps {\r\n children?: React.ReactNode,\r\n className?: string,\r\n fluid?: boolean,\r\n}\r\n\r\n/**\r\n * Banner to show title and toolbars at the top of pages.\r\n * @param props\r\n */\r\nexport const Banner = (props: BannerProps) => {\r\n const { children, className, fluid } = props;\r\n\r\n return (\r\n
\r\n \r\n {children}\r\n \r\n
\r\n );\r\n};","import * as React from \"react\";\r\nimport { FormGroup, Label, Input } from \"reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useProfileForInvite } from \"../../api/main/profiles/useProfileForInvite\";\r\n\r\n/**\r\n * Allow the user to set their personal details on their profile during registration.\r\n */\r\nexport const ConfirmInviteProfileDetails = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { model }, errors: loadingErrors } = useProfileForInvite();\r\n\r\n // Render the UI.\r\n //\r\n return (\r\n <>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { profileForInviteQuery, profileForInviteQueryVariables } from '../generated/profileForInviteQuery';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a Profile from the store using the information available when confirming an invite.\r\n * \r\n * This exists because useProfile() is secured to only load information for authenticated users. This method exists to use the details of an invite as\r\n * permission to load the details of the related profile.\r\n * \r\n * This version gets its details from the query string invite code.\r\n * \r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfileForInvite(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Get the details from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileForInviteQuery ($userId: ID!, $code: String!) {\r\n model: profileForInvite(userId: $userId, code: $code) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n userId: userId,\r\n code: code\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { Login } from \"./Login\";\r\nimport { Register } from \"./Register\";\r\nimport { ExternalLoginCallback } from \"./ExternalLoginCallback\";\r\nimport { ConfirmEmail } from \"./ConfirmEmail\";\r\nimport { ForgotPassword } from './ForgotPassword';\r\nimport { ResetPassword } from \"./ResetPassword\";\r\nimport { ConfirmEmailChange } from \"./ConfirmEmailChange\";\r\nimport { ConfirmInvite } from \"./ConfirmInvite\";\r\n\r\nexport const accountRoutes: Array = [\r\n { path: '/account/login', component: Login },\r\n { path: '/account/register', component: Register },\r\n { path: '/account/externalLogin', component: ExternalLoginCallback },\r\n { path: '/account/forgotPassword', component: ForgotPassword },\r\n { path: '/account/resetPassword', component: ResetPassword },\r\n { path: '/account/confirmEmail', component: ConfirmEmail },\r\n { path: '/account/confirmEmailChange', component: ConfirmEmailChange },\r\n { path: '/account/confirmInvite', component: ConfirmInvite },\r\n];\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, CustomInput, Spinner, Row, Col, Button } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { useExternalAuthenticationSchemes, useLoginWithPasswordCallback, useStartExternalLoginCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { Login as LoginModel } from '../../api/account/models/Login';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ExternalLoginButton } from \"./ExternalLoginButton\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Login screen.\r\n */\r\nexport const Login = () => {\r\n const { t } = useTranslation();\r\n const { data: { externalAuthenticationSchemes }, isLoading, errors: loadErrors } = useExternalAuthenticationSchemes();\r\n const [login, { isExecuting: isLoggingIn, errors: loginErrors }] = useLoginWithPasswordCallback();\r\n const [startExternalLogin] = useStartExternalLoginCallback();\r\n const [isPendingEmailConfirmation, setIsPendingEmailConfirmation] = React.useState(false);\r\n const history = useHistory();\r\n\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const [hasSentConfirmationEmail, setHasSentConfirmationEmail] = React.useState(false);\r\n\r\n const { model, change } = useChanges({ email: '', password: '', rememberMe: true });\r\n\r\n // Need the URL to pass on to registration or 2faif we redirect to it.\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n\r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n email: () => !model.email ? t('login.emailRequired', 'Email is required') : '',\r\n password: () => !model.password ? t('login.passwordRequired', 'Password is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performLogin = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n let result = await login(model);\r\n\r\n if (result) {\r\n setIsPendingEmailConfirmation(result.requiresEmailConfirmation);\r\n\r\n if (result.requiresTwoFactor) {\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [login, model, setIsPendingEmailConfirmation, history, validate, setIsDoingFullPageRedirect]);\r\n\r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('login.signInHeading', 'Sign in')}\r\n

\r\n
{ e.preventDefault(); await performLogin(); }}>\r\n \r\n {\r\n isPendingEmailConfirmation ?\r\n hasSentConfirmationEmail ? (\r\n \r\n <>{t('login.confirmationEmailHasBeenResent', 'Confirmation link to verify the email for this account has been resent. Please check your email to confirm.')} \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : (\r\n \r\n <>{t('login.mustConfirmEmailBeforeLogin', 'You need to confirm your account before you can sign in. Please check your email.')} \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n \r\n change({ rememberMe: e.currentTarget.checked })} />\r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('login.forgotYourPassword', 'Forgotten your password?')}\r\n \r\n \r\n \r\n {t('login.loggingIn', 'Signing in...')}}>\r\n {t('login.signIn', 'Sign in')}\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 isLoading ? (\r\n \r\n ) : (\r\n <>\r\n
\r\n {\r\n !externalAuthenticationSchemes ? null\r\n : externalAuthenticationSchemes.length !== 0 ? (\r\n <>\r\n
{t('login.useExternalService', 'Or sign in using an identity provider')}
\r\n {\r\n externalAuthenticationSchemes.map((item) => (\r\n startExternalLogin(item.name, returnUrl)} />\r\n ))\r\n }\r\n \r\n )\r\n : null\r\n }\r\n
\r\n \r\n )\r\n }\r\n
\r\n\r\n

\r\n {t('login.registerHeading', 'Not registered yet?')}\r\n

\r\n

\r\n {t('login.registerText', 'Register for your free TheSchoolYear account and keep yourself and your calendar up to date with everything thats happening in education, all the time.')}\r\n

\r\n
\r\n \r\n \r\n \r\n <> \r\n {t('login.or', 'or')}\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","import * as React from \"react\";\r\nimport { LoginResult } from \"../../api/account\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { LoginWithPasswordRequest } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Login using a password.\r\n */\r\nexport function useLoginWithPasswordCallback(): [(model: LoginWithPasswordRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: LoginWithPasswordRequest) => {\r\n let result = await accountService.loginWithPassword(model, returnUrl);\r\n\r\n // If we have additional steps to take before we are completely signed in, handle those now.\r\n if (result.requiresTwoFactor || result.requiresEmailConfirmation) {\r\n // Don't want to redirect to returnUrl.\r\n return result;\r\n }\r\n\r\n // If we get here we have a successful login\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Row, Col, Form, Alert, FormGroup, Label, Spinner, FormText } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { useExternalAuthenticationSchemes, useStartExternalLoginCallback, useRegisterAccountCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { Register as RegisterModel } from '../../api/account/models/Register';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ExternalLoginButton } from \"./ExternalLoginButton\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { RegisterProfileDetails, useRegisterProfileDetailsProps } from \"../profiles/RegisterProfileDetails\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Register screen.\r\n */\r\nexport const Register = () => {\r\n const { t } = useTranslation();\r\n const { data: { externalAuthenticationSchemes }, isLoading, errors: loadErrors } = useExternalAuthenticationSchemes();\r\n const [register, { isExecuting: isRegistering, errors: registerErrors }] = useRegisterAccountCallback();\r\n const [startExternalLogin] = useStartExternalLoginCallback();\r\n const [isPendingEmailConfirmation, setIsPendingEmailConfirmation] = React.useState(false);\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const history = useHistory();\r\n\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ email: '', password: '', confirmPassword: '' });\r\n\r\n const registerProfileDetailsProps = useRegisterProfileDetailsProps();\r\n\r\n // Need the URL to pass on to registration or 2faif we redirect to it.\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n \r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n email: () => !model.email ? t('register.emailRequired', 'Email is required') : '',\r\n password: () => !model.password ? t('register.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('register.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n\r\n // Check the profile details as well (ensuring an error reflects in our error state).\r\n validation.singleCheck('profileDetails', !registerProfileDetailsProps.validate(fieldsToCheck), 'Profile details has some validation errors');\r\n }, [model, registerProfileDetailsProps.validate]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performRegister = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await register(model);\r\n\r\n if (result) {\r\n setIsPendingEmailConfirmation(result.requiresEmailConfirmation);\r\n\r\n // Save the profile.\r\n await registerProfileDetailsProps.registerProfile(result.userId);\r\n\r\n // Now send the initial email confirmation as we have the profile saved, so can address the user by name.\r\n await resendConfirmationEmail(model.email);\r\n\r\n if (result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [register, model, setIsPendingEmailConfirmation, history, validate, registerProfileDetailsProps, setIsDoingFullPageRedirect, resendConfirmationEmail]);\r\n \r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('register.registerNewAccountHeading', 'Sign up for free')}\r\n

\r\n \r\n \r\n
{ e.preventDefault(); await performRegister(); }}>\r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('register.confirmationEmailHasBeenResent', 'Please check your email to confirm your account. You won\\'t be able to login until you have confirmed your account.')}\r\n \r\n \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n \r\n\r\n\r\n {/* Repeated because the height of the form on screen is too long for the user to see this at the top */}\r\n \r\n \r\n \r\n \r\n {t('register.confirmationEmailHasBeenResent', 'Please check your email to confirm your account. You won\\'t be able to login until you have confirmed your account.')}\r\n \r\n \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('register.login', 'Already have an account? Sign in instead.')}\r\n \r\n \r\n \r\n {t('register.registering', 'Registering...')}}>\r\n {t('register.register', 'Register')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n isLoading ? (\r\n \r\n ) : (\r\n <>\r\n
{t('register.useExternalService', 'Or register using an identity provider')}
\r\n
\r\n {\r\n !externalAuthenticationSchemes ? null\r\n : externalAuthenticationSchemes.length !== 0 ? (\r\n <>\r\n {\r\n externalAuthenticationSchemes.map((item) => (\r\n
\r\n startExternalLogin(item.name, returnUrl)} />\r\n
\r\n ))\r\n }\r\n \r\n ) : null\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","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { RegisterRequest, RegisterResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Register an account.\r\n */\r\nexport function useRegisterAccountCallback(): [(model: RegisterRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: RegisterRequest) => {\r\n let result = await accountService.register(model, returnUrl);\r\n\r\n // If we have additional steps to take before we are completely signed in, handle those now.\r\n if (result.requiresTwoFactor || result.requiresEmailConfirmation) {\r\n // Don't want to redirect to returnUrl.\r\n return result;\r\n }\r\n\r\n // If we get here we have a successful login\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { useCompletedExternalLoginDetails, useCreateAccountForExternalLoginCallback } from \"../../api/account\";\r\nimport { ClaimTypes } from \"../../api/account\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { FormGroup, Label, Form, Spinner } from \"reactstrap\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ExternalLoginCallback as ExternalLoginCallbackModel } from \"../../api/account/models/ExternalLoginCallback\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { RegisterProfileDetails, useRegisterProfileDetailsProps } from \"../profiles/RegisterProfileDetails\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { Banner } from \"../shared/Banner\";\r\n\r\n/**\r\n * Complete an the external login.\r\n */\r\nexport const ExternalLoginCallback = () => {\r\n const { t } = useTranslation();\r\n const { data: { isNewUser, loginProvider, returnUrl, claims }, isLoading, errors: loadErrors } = useCompletedExternalLoginDetails();\r\n const [createAccount, { isExecuting: isCreatingAccount, errors: createAccountErrors }] = useCreateAccountForExternalLoginCallback();\r\n\r\n const registerProfileDetailsProps = useRegisterProfileDetailsProps();\r\n\r\n const { model, change } = useChanges({ email: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n email: () => !model.email ? t('externalLoginCallback.emailRequired', 'Email is required') : '',\r\n };\r\n validation.checkRules(rules, fieldsToCheck);\r\n\r\n // Check the profile details as well (ensuring an error reflects in our error state).\r\n validation.singleCheck('profileDetails', !registerProfileDetailsProps.validate(fieldsToCheck), 'Profile details has some validation errors');\r\n }, [model]);\r\n\r\n // When the data returned by the external login changes, we want to use it to either default some changes or redirect away from the page.\r\n React.useEffect(() => {\r\n // If this is not a new user just redirect to their target page.\r\n if (!isNewUser) {\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n window.location.href = returnUrl || '/';\r\n } else {\r\n // Default the email in the model for new users (if the external login provided one).\r\n let emailClaim = claims.find(item => item.type === ClaimTypes.email);\r\n if (emailClaim && emailClaim.value) {\r\n change({ email: emailClaim.value });\r\n }\r\n }\r\n }, [isNewUser, returnUrl, claims, change]);\r\n\r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (isLoading || !isNewUser) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // Render the external login registration view.\r\n return (\r\n \r\n \r\n

{t('externalLoginCallback.registerAccountHeading', 'Register with your {{loginProvider}} account', { context: loginProvider, loginProvider: loginProvider })}

\r\n\r\n

\r\n {t('externalLOginCallback.registerHelpText', 'You\\'ve successfully authenticated with {loginProvider}. Please enter an email address for this site below and click the Register button to finish logging in.')}\r\n

\r\n
\r\n \r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await createAccount(model)\r\n if (result) {\r\n // Save the profile.\r\n await registerProfileDetailsProps.registerProfile(result.userId);\r\n }\r\n }}>\r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n {t('externalLoginCallback.registring', 'Registering...')}}>\r\n {t('externalLoginCallback.register', 'Register')}\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\n","import * as React from \"react\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { CompleteExternalLoginResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Details of the external login that has just completed and invoked our callback.\r\n */\r\nexport function useCompletedExternalLoginDetails(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n const [data, setData] = React.useState({ claims: [], isNewUser: false, loginProvider: '', returnUrl: '' });\r\n\r\n const accountService = useAccountService();\r\n\r\n // Get the details from the external login off the query string.\r\n const { returnUrl, remoteError } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n const remoteError = params.get('remoteError') ?? params.get('RemoteError') ?? '';\r\n return { returnUrl, remoteError};\r\n }, []);\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n let result = await accountService.completeExternalLogin(returnUrl, remoteError);\r\n setData(result);\r\n }, [accountService, returnUrl, remoteError, setData]);\r\n\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: data,\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { CreateExternalLoginAccountDetails, RegisterResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Register an account for an authenticated external login.\r\n */\r\nexport function useCreateAccountForExternalLoginCallback(): [(model: CreateExternalLoginAccountDetails) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: CreateExternalLoginAccountDetails) => {\r\n let result = await accountService.createAccountForExternalLogin(model, returnUrl);\r\n\r\n // If we get here everything went well so redirect to the returnUrl.\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n window.location.href = result.returnUrl;\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, Row, Col, Button } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { useSendPasswordResetEmailCallback } from \"../../api/account\";\r\nimport { ForgotPassword as ForgotPasswordModel } from '../../api/account/models/ForgotPassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Request a password reset emai because the user has forgotten their password.\r\n */\r\nexport const ForgotPassword = () => {\r\n const { t } = useTranslation();\r\n const [emailSent, setEmailSent] = React.useState(false);\r\n const [sendResetEmail, { isExecuting: isSendingResetEmail, errors: sendResetEmailErrors }] = useSendPasswordResetEmailCallback();\r\n\r\n const { model, change } = useChanges({ email: '' });\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n email: () => !model.email ? t('forgotPassword.emailRequired', 'Email is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

{t('forgotPassword.forgotPasswordHeading', 'Forgot your password?')}

\r\n

\r\n {t('forgotPassword.helpText', 'Enter your email and we\\'ll send you a link you can use to recover your account and set a new password.')}\r\n

\r\n
{\r\n e.preventDefault();\r\n const ok = await sendResetEmail(model.email);\r\n setEmailSent(ok);\r\n }}>\r\n\r\n \r\n {\r\n emailSent ? (\r\n \r\n \r\n \r\n {t('forgotPassword.emailHasBeenSent', 'Please check your email and follow the link to reset your password.')}\r\n \r\n \r\n {t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n ) : null\r\n }\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {t('common.sending', 'Sending...')}}>\r\n {t('forgottenPassword.send', 'Send password reset email')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n

\r\n {t('forgottenPassword.otherOptionsHeading', 'Need to login or sign up instead?')}\r\n

\r\n

\r\n {t('forgottenPassword.otherOptionsText', 'If you don\\'t need to reset your password but already have an account or want to create one you can sign in or sign up instead.')}\r\n

\r\n
\r\n \r\n \r\n \r\n <> \r\n {t('forgottenPassword.or', 'or')}\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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Send a password reset email.\r\n */\r\nexport function useSendPasswordResetEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.sendPasswordResetEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, Button, FormText, Row, Col } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { useResetPasswordCallback } from \"../../api/account\";\r\nimport { ResetPassword as ResetPasswordModel } from '../../api/account/models/ResetPassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Reset the password (after following a unique link from an email).\r\n */\r\nexport const ResetPassword = () => {\r\n const { t } = useTranslation();\r\n const [hasResetPassword, setHasResetPassword] = React.useState(false);\r\n const [resetPassword, { isExecuting: isResettingPassword, errors: resetPasswordErrors }] = useResetPasswordCallback();\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ password: '', confirmPassword: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n password: () => !model.password ? t('resetPassword.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('register.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (!model) {\r\n return ();\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('resetPassword.resetPasswordHeading', 'Reset Password')}

\r\n

\r\n {t('resetPassword.thanksForConfirmingEmail', 'Thanks for confirming your email. You can now set a new password.')}\r\n

\r\n\r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await resetPassword(model.password);\r\n setHasResetPassword(ok);\r\n }}>\r\n {\r\n resetPasswordErrors ? (\r\n \r\n {resetPasswordErrors}\r\n \r\n ) : null\r\n }\r\n {\r\n hasResetPassword ? (\r\n \r\n \r\n \r\n {t('resetPassword.passwordHasBeenReset', 'Your password has been reset.')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {t('resetPassword.resetting', 'Resetting password...')}}>\r\n {t('resetPassword.reset', 'Reset password')}\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","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to reset the password of an account using a unique URL from an email as authorization.\r\n */\r\nexport function useResetPasswordCallback(): [(password: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the code from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (password: string) => {\r\n return await accountService.resetPassword({ userId: userId, code: code, password: password });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Alert, Button, Col, Row } from \"reactstrap\";\r\nimport { useConfirmEmailCallback } from \"../../api/account\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Confirm an email address for an account using a unique link included in the email. \r\n */\r\nexport const ConfirmEmail = () => {\r\n const { t } = useTranslation();\r\n const [emailConfirmed, setEmailConfirmed] = React.useState(false);\r\n const [confirmEmail, { errors: confirmEmailErrors }] = useConfirmEmailCallback();\r\n\r\n // Trigger the email confirmation on page load.\r\n React.useEffect(() => {\r\n (async () => {\r\n if (!emailConfirmed) {\r\n const ok = await confirmEmail();\r\n setEmailConfirmed(ok);\r\n }\r\n })();\r\n }, [confirmEmail, setEmailConfirmed, emailConfirmed]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n confirmEmailErrors ? t('confirmEmail.confirmEmailFailureHeading', 'Sorry we cannot confirm your email using this code')\r\n : emailConfirmed ? t('confirmEmail.confirmEmailSuccessHeading', 'Thanks for confirming your email')\r\n : ()\r\n }\r\n

\r\n\r\n \r\n \r\n {confirmEmailErrors}\r\n \r\n \r\n \r\n {/**/}\r\n {/* {t('confirmEmail.thankYouForConfirming', 'Thank you for confirming your email. You account setup is now complete.')}*/}\r\n {/**/}\r\n

\r\n {t('confirmEmail.thankYouForConfirming', 'Thank you for confirming your email. You account setup is now complete.')}\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","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Confirm an email address.\r\n */\r\nexport function useConfirmEmailCallback(): [() => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async () => {\r\n return await accountService.confirmEmail({ userId: userId, code: code });\r\n }, [accountService, userId, code]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Alert, Button, Col, Row } from \"reactstrap\";\r\nimport { useConfirmEmailChangeCallback } from \"../../api/account\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Confirm an email address change for an account using a unique link included in the email. \r\n */\r\nexport const ConfirmEmailChange = () => {\r\n const { t } = useTranslation();\r\n const [emailConfirmed, setEmailConfirmed] = React.useState(false);\r\n const [confirmEmail, { errors: confirmEmailErrors }] = useConfirmEmailChangeCallback();\r\n\r\n // Trigger the email confirmation on page load.\r\n React.useEffect(() => {\r\n (async () => {\r\n if (!emailConfirmed) {\r\n const ok = await confirmEmail();\r\n setEmailConfirmed(ok);\r\n }\r\n })();\r\n }, [confirmEmail, setEmailConfirmed, emailConfirmed]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n confirmEmailErrors ? t('confirmEmailChange.confirmEmailChangeFailureHeading', 'Sorry we cannot confirm your change of email using this code')\r\n : emailConfirmed ? t('confirmEmailChange.confirmEmailChangeSuccessHeading', 'Thank you for confirming your change of email.')\r\n : ()\r\n }\r\n

\r\n\r\n \r\n \r\n {confirmEmailErrors}\r\n \r\n \r\n \r\n {/**/}\r\n {/* <>{t('confirmEmailChange.thankYouForConfirming', 'Thank you for confirming your change of email. We\\'ve swapped that over for you.')} */}\r\n {/**/}\r\n

\r\n {t('confirmEmailChange.thankYouForConfirming', 'Thank you for confirming your change of email. We\\'ve swapped that over for you.')}\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","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Confirm an email address.\r\n */\r\nexport function useConfirmEmailChangeCallback(): [() => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const { userId, code, email } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n const email = params.get('email') ?? params.get('Email') ?? '';\r\n return { userId, code, email };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async () => {\r\n return await accountService.confirmEmailChange({ userId: userId, code: code, email: email });\r\n }, [accountService, userId, code, email]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, FormGroup, Label, FormText, Spinner, Row, Col } from \"reactstrap\";\r\nimport { useConfirmInviteCallback } from \"../../api/account\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { ConfirmInvite as ConfirmInviteModel } from \"../../api/account/models/ConfirmInvite\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { useHistory } from \"react-router\";\r\nimport { ConfirmInviteProfileDetails } from \"../profiles/ConfirmInviteProfileDetails\";\r\nimport { AccountBackground } from \"./AccountBackground\";\r\nimport { SideContainer } from \"../shared/sideContainer/SideContainer\";\r\nimport { LoginPartialPage } from \"../cmsPages/LoginPartialPage\";\r\n\r\n/**\r\n * Confirm an email address and provide registration details as part of an invite.\r\n */\r\nexport const ConfirmInvite = () => {\r\n const { t } = useTranslation();\r\n const [confirmInvite, { isExecuting: isConfirmingInvite, errors: confirmInviteErrors }] = useConfirmInviteCallback();\r\n const { model, change } = useChanges({ password: '', confirmPassword: '' });\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n const history = useHistory();\r\n\r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n password: () => !model.password ? t('confirmInvite.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('confirmInvite.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performRegister = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await confirmInvite(model);\r\n\r\n if (result) {\r\n if (result.requiresTwoFactor) {\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [confirmInvite, model, history, validate, setIsDoingFullPageRedirect]);\r\n\r\n\r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('confirmInvite.finishRegistrationHeading', 'Register your account')}\r\n

\r\n

\r\n {t('confirmInvite.thanksForAccepting', 'Thanks for accepting the invite. You can now set a password to finish your account creation.')}\r\n

\r\n\r\n
{ e.preventDefault(); await performRegister(); }}>\r\n \r\n\r\n \r\n\r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n {t('confirmInvite.registering', 'Registering...')}}>\r\n {t('confirmInvite.register', 'Register')}\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","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\nimport { RegisterResult } from \"./AccountService\";\r\n\r\n/**\r\n * Confirm an invite and set a password.\r\n */\r\nexport function useConfirmInviteCallback(): [(model: { password: string }) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the details from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: { password: string }) => {\r\n return await accountService.confirmInvite({ userId: userId, code: code, password: model.password });\r\n }, [accountService, userId, code]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { profileQuery, profileQueryVariables } from '../generated/profileQuery';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\nexport interface ProfileOptions extends AsyncLoadOptions {\r\n isUserId?: boolean,\r\n}\r\n\r\n/**\r\n * Get a Profile from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfile(id: string | undefined | null, options: ProfileOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileQuery ($id: ID, $userId: ID) {\r\n model: profile(id: $id, userId: $userId) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: !options.isUserId ? id ?? Guid.empty : null,\r\n userId: options.isUserId ? id ?? Guid.empty : null\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import * as React from 'react';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { AsyncActionStatus } from '../abstractStore';\r\n\r\n/**\r\n * Options for saiving store data. \r\n */\r\nexport interface SaveInStoreOptions {\r\n beforeSaving?: (id: TId, changes: Partial, isCreate: boolean) => void,\r\n afterSaving?: (id: TId, changes: Partial, isCreate: boolean) => void,\r\n}\r\n\r\n/**\r\n * Hook to give us a save method that can cope with creating or updating the store as appropriate.\r\n */\r\nexport function useSaveInStore(\r\n createDataStore: [(model: T) => Promise, AsyncActionStatus],\r\n updateDataStore: [(id: TId, model: Partial) => Promise, AsyncActionStatus],\r\n options?: SaveInStoreOptions\r\n)\r\n : [(id: TId, changes: Partial, isCreate: boolean) => Promise, AsyncActionStatus]\r\n{\r\n\r\n const [create, { isExecuting: isCreating, errors: createErrors }] = createDataStore;\r\n const [update, { isExecuting: isUpdating, errors: updateErrors }] = updateDataStore;\r\n const [save, { isExecuting: isSaving, errors: saveErrors }] = useAsyncCallback(async (id: TId, changes: Partial, isCreate: boolean) => {\r\n // Run the pre-save option.\r\n if (options && options.beforeSaving) {\r\n options.beforeSaving(id, changes, isCreate);\r\n } \r\n\r\n // Create or update the item in the store.\r\n if (isCreate) {\r\n await create(changes as T);\r\n } else {\r\n await update(id, changes);\r\n }\r\n\r\n // Run the post-save option.\r\n if (options && options.afterSaving) {\r\n options.afterSaving(id, changes, isCreate);\r\n } \r\n }, [create, update, options]);\r\n\r\n // Combine errors from all sources into a single errors result.\r\n const errors = React.useMemo(() => {\r\n let ret = [];\r\n if (createErrors) {\r\n ret.push(createErrors);\r\n }\r\n if (updateErrors) {\r\n ret.push(updateErrors);\r\n }\r\n if (saveErrors) {\r\n ret.push(saveErrors);\r\n }\r\n\r\n if (ret.length === 0) {\r\n return undefined;\r\n }\r\n\r\n if (ret.length === 1) {\r\n return ret[0];\r\n }\r\n\r\n return ret;\r\n }, [createErrors, updateErrors, saveErrors]);\r\n\r\n return [save, { isExecuting: isSaving || isCreating || isUpdating, errors: errors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileCreateInput } from '../generated/globalTypes';\r\nimport { createProfileMutation, createProfileMutationVariables } from '../generated/createProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to create a Profile in the store.\r\n */\r\nexport function useCreateProfileCallback(): [(model: ProfileCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createProfileMutation ($model: ProfileCreateInput!) {\r\n createProfile(model: $model) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ProfileCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileUpdateInput } from '../generated/globalTypes';\r\nimport { updateProfileMutation, updateProfileMutationVariables } from '../generated/updateProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to update a Profile in the store.\r\n */\r\nexport function useUpdateProfileCallback(): [(id: string, model: ProfileUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateProfileMutation ($model: ProfileUpdateInput!) {\r\n updateProfile(model: $model) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: ProfileUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { ProfileCreateInput, ProfileUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateProfileCallback } from './useCreateProfileCallback';\r\nimport { useUpdateProfileCallback } from './useUpdateProfileCallback';\r\nimport { Profile } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to save a Profile in the store using either a create or update.\r\n */\r\nexport function useSaveProfileCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateProfileCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as ProfileCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateProfileCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as ProfileUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { Row, Col, Form, FormGroup, Label, Spinner, Alert, FormText } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { Guid } from \"guid-string\";\r\nimport { useProfile } from \"../../api/main/profiles/useProfile\";\r\nimport { useSaveProfileCallback } from \"../../api/main/profiles/useSaveProfileCallback\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { TwoValueSwitch } from \"../shared/TwoValueSwitch\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { isNullOrUndefined } from \"util\";\r\n\r\n/**\r\n * Allow the user to change their personal details on their profile.\r\n */\r\nexport const ProfileDetails = () => {\r\n const { t } = useTranslation();\r\n const [hasSaved, setHasSaved] = React.useState(false);\r\n const [isCreate, setIsCreate] = React.useState(false);\r\n const { user } = useAuthenticatedState({ includeUser: true});\r\n const { data: { model: storeModel, }, isLoading, errors: loadErrors, refresh: refreshProfile } = useProfile(user?.sub ?? '', {\r\n isUserId: true,\r\n lazy: true,\r\n onCompleted: (data) => {\r\n // If we don't find a record in the database, create one ready to save.\r\n if (!data) {\r\n setIsCreate(true);\r\n change({ id: Guid.newGuid(), userId: user?.sub ?? '' });\r\n }\r\n } });\r\n const { model, change, changes } = useChanges(storeModel);\r\n const [save, { isExecuting: isSaving, errors: saveErrors }] = useSaveProfileCallback({ afterSaving: () => setIsCreate(false) })\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n firstName: () => !model.firstName ? t('profileDetails.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model.lastName ? t('profileDetails.lastNameRequired', 'Last name is required') : '',\r\n organisationName: () => !model.organisationName ? t('profileDetails.organisationName', 'Organisation name is required') : '',\r\n organsiationType: () => !model.organisationType ? t('profileDetails.organisationType', 'Organisation type is required') : '',\r\n\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Only load the profile once we know the user.\r\n React.useEffect(() => {\r\n if (!user) {\r\n return;\r\n }\r\n\r\n refreshProfile();\r\n }, [user, refreshProfile]);\r\n\r\n // Locking of the daily and weekly email toggles.\r\n const [lockDailyEmail, setLockDailyEmail] = React.useState(false);\r\n const [lockWeeklyEmail, setLockWeeklyEmail] = React.useState(false);\r\n const [hasDefaultedLockState, setHasDefaultedLockState] = React.useState(false);\r\n React.useEffect(() => {\r\n if (!model || isNullOrUndefined(model?.id) || hasDefaultedLockState) {\r\n return;\r\n }\r\n\r\n setLockDailyEmail(model.isSubscribedToDailyNewsLetter);\r\n setLockWeeklyEmail(model.isSubscribedToWeeklyNewsLetter);\r\n setHasDefaultedLockState(true);\r\n }, [model, hasDefaultedLockState, setHasDefaultedLockState, setLockDailyEmail, setLockWeeklyEmail]);\r\n\r\n const [saveForm] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, isCreate);\r\n\r\n setHasSaved(true);\r\n\r\n setLockDailyEmail(model.isSubscribedToDailyNewsLetter);\r\n setLockWeeklyEmail(model.isSubscribedToWeeklyNewsLetter);\r\n }, [save, setLockDailyEmail, setLockWeeklyEmail, model, setHasSaved, validate, isCreate, changes]);\r\n\r\n\r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (isLoading || !user || !model) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n
{ e.preventDefault(); await saveForm(); }}>\r\n \r\n\r\n {\r\n hasSaved ? (\r\n \r\n {t('profileDetails.hasSaved', 'Your details have been updated.')}\r\n \r\n ): null\r\n }\r\n\r\n \r\n \r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n change({ organisationType: e.currentTarget.value })} onBlur={e => validate('organisationType')} validationErrors={validationErrors['organisationType']}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ organisationName: e.currentTarget.value })} onBlur={e => validate('organisationName')} validationErrors={validationErrors['organisationName']} />\r\n \r\n\r\n \r\n \r\n \r\n change({ urn: e.currentTarget.value })} onBlur={e => validate('urn')} validationErrors={validationErrors['urn']} />\r\n \r\n \r\n\r\n \r\n \r\n change({ jobTitle: e.currentTarget.value })} onBlur={e => validate('jobTitle')} validationErrors={validationErrors['jobTitle']} />\r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToDailyNewsLetter: value })}\r\n disabled={lockDailyEmail}\r\n />\r\n \r\n \r\n
\r\n {t('profileDetails.subscribeToDailyNewsletter.description', 'Subscribe to daily update emails to receive the need-to-know sector information for your school straight to your inbox every morning.')}\r\n
\r\n \r\n
\r\n \r\n \r\n {t('profileDetails.unsubscribeDailyText', 'To unsubscribe from the daily update emails please use the unsubscribe link in the emails you receive.')}\r\n \r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToWeeklyNewsLetter: value })}\r\n disabled={lockWeeklyEmail}\r\n />\r\n \r\n \r\n
\r\n {t('profileDetails.subscribeToDailyWeekly.description', 'Subscribe to This Week on TheSchoolBus to receive a weekly summary of what\\'s happening in education to your inbox every week.')}\r\n
\r\n \r\n
\r\n \r\n \r\n {t('profileDetails.unsubscribeDailyText', 'To unsubscribe from the This Week on TheSchoolBus please use the unsubscribe link in the emails you receive.')}\r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n \r\n change({ isIntrestedInWorkingTogether: value })} />\r\n \r\n \r\n
\r\n {t('profileDetails.isIntrestedInWorkingTogether.description', 'If you work in education or education consultancy and are interested in having your events on TheSchoolYear or working with us on TheSchoolYear or TheSchoolBus let us know and we\\'ll get in touch with you to arrange a good time to chat.')}\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, FormText } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ChangePassword as ChangePasswordModel } from '../../api/account/models/ChangePassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChangePasswordCallback } from \"../../api/account\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\n\r\n/**\r\n * Change the logged in user's password.\r\n */\r\nexport const ChangePassword = () => {\r\n const { t } = useTranslation();\r\n const [hasChangedPassword, setHasChangedPassword] = React.useState(false);\r\n const [changePassword, { isExecuting: isChangingPassword, errors: changePasswordErrors }] = useChangePasswordCallback();\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ currentPassword: '', newPassword: '', confirmPassword: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n currentPassword: () => !model.currentPassword ? t('changePassword.currentPasswordRequred', 'Current password is required'): '',\r\n newPassword: () => !model.newPassword ? t('changePassword.newPasswordRequired', 'Password is required')\r\n : checkPassword(model.newPassword).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.newPassword ? t('changePassword.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (!model) {\r\n return ();\r\n }\r\n\r\n return (\r\n <>\r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await changePassword(model.currentPassword, model.newPassword);\r\n setHasChangedPassword(ok);\r\n }}>\r\n \r\n\r\n {\r\n hasChangedPassword ? (\r\n \r\n {t('changePassword.passwordHasBeenChanged', 'Your password has been changed.')}\r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ currentPassword: e.currentTarget.value })} onBlur={e => validate('currentPassword')} validationErrors={validationErrors['currentPassword']} />\r\n \r\n \r\n \r\n change({ newPassword: e.currentTarget.value })} onBlur={e => validate('newPassword')} validationErrors={validationErrors['newPassword']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n {t('changePassword.updatingPassword', 'Updating password...')}}>\r\n {t('changePassword.updatePassword', 'Update password')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the password of the current user..\r\n */\r\nexport function useChangePasswordCallback(): [(currentPassword: string, newPassword: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (currentPassword: string, newPassword: string) => {\r\n return await accountService.changePassword({ currentPassword: currentPassword, newPassword: newPassword });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ChangeEmail as ChangeEmailModel } from '../../api/account/models/ChangeEmail';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChangeEmailCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { useUser } from \"../../api/main/users/useUser\";\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\n\r\n/**\r\n * Change the logged in user's email.\r\n */\r\nexport const ChangeEmail = () => {\r\n const { t } = useTranslation();\r\n const { user } = useAuthenticatedState({ includeUser: true });\r\n const { data: { model: storeModel, }, errors: loadErrors, refresh: refreshUserModel } = useUser(user?.sub ?? '', { lazy: true });\r\n\r\n const [changeEmail, { isExecuting: isChangingPassword, errors: changeEmailErrors }] = useChangeEmailCallback();\r\n const [hasSentEmail, setHasSentEmail] = React.useState(false);\r\n\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const [hasSentConfirmationEmail, setHasSentConfirmationEmail] = React.useState(false);\r\n\r\n const { model, change } = useChanges({ newEmail: storeModel?.email ?? '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n newEmail: () => !model.newEmail ? t('changeEmail.newEmailRequired', 'Email is required')\r\n : storeModel && storeModel.email === model.newEmail ? t('changeEmail.newEmailMatchesOldEmail', 'Your new email is the same as your old email and so does not need to go through an email update process.')\r\n : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Only load the user model once we know the user id.\r\n React.useEffect(() => {\r\n if (!user) {\r\n return;\r\n }\r\n\r\n refreshUserModel();\r\n }, [user, refreshUserModel]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (!model) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await changeEmail(model.newEmail);\r\n setHasSentEmail(ok);\r\n }}>\r\n \r\n\r\n {\r\n hasSentEmail ? (\r\n \r\n <>{t('changeEmail.emailHasBeenSent', 'Confirmation link to change email sent. Please check your email to confirm.')} \r\n { e.preventDefault(); await changeEmail(model.newEmail); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n {\r\n hasSentConfirmationEmail ? (\r\n \r\n <>{t('login.confirmationEmailHasBeenResent', 'Confirmation link to verify the email for this account has been resent. Please check your email to confirm.')} \r\n { e.preventDefault(); await resendConfirmationEmail(storeModel?.email ?? model.newEmail); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ newEmail: e.currentTarget.value })} onBlur={e => validate('newEmail')} validationErrors={validationErrors['newEmail']} />\r\n {\r\n storeModel && !storeModel.emailConfirmed && model.newEmail === storeModel.email ? (\r\n
\r\n { e.preventDefault(); await resendConfirmationEmail(model.newEmail); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.resendingEmail', 'Resending email...')}}>\r\n {t('changeEmail.resendVerificationEmail', 'Resend verification email')}\r\n \r\n
\r\n ): null\r\n }\r\n
\r\n\r\n \r\n {t('changeEmail.updatingEmail', 'Updating email...')}}>\r\n {t('changeEmail.updateEmail', 'Update email')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { userQuery, userQueryVariables } from '../generated/userQuery';\r\nimport { userFieldsFragment } from '../models/User';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a User from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useUser(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need from the API.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query userQuery ($id: ID!) {\r\n model: user(id: $id) {\r\n ...userFields\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n `,\r\n {\r\n variables: { id: id ?? Guid.empty },\r\n pollInterval: options.pollInterval,\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the email of the current user..\r\n */\r\nexport function useChangeEmailCallback(): [(newEmail: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (newEmail: string) => {\r\n return await accountService.changeEmail({ newEmail: newEmail });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { Profile } from \"./Profile\";\r\n\r\nexport const profileRoutes: Array = [\r\n { path: '/profile', exact: true, component: Profile, authorize: true },\r\n];\r\n","import * as React from \"react\";\r\nimport { Nav, NavItem, NavLink, TabContent, TabPane } from \"reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ProfileDetails } from \"./ProfileDetails\";\r\nimport { ChangePassword } from \"./ChangePassword\";\r\nimport { ChangeEmail } from \"./ChangeEmail\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Banner } from \"../shared/Banner\";\r\nimport { Background } from \"../shared/background/Background\";\r\n\r\n/**\r\n * Allow the user to change their profile.\r\n */\r\nexport const Profile = () => {\r\n const { t } = useTranslation();\r\n const [activeTab, setActiveTab] = React.useState('profile');\r\n\r\n return (\r\n \r\n \r\n

{t('profile..heading', 'Profile')}

\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","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { profilesQuery, profilesQueryVariables } from '../generated/profilesQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a list of profiles from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfiles(options: AsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query profilesQuery ($offset: Int, $first: Int) {\r\n items: profiles (offset: $offset, first: $first) {\r\n id\r\n firstName\r\n lastName\r\n organisationName\r\n user {\r\n id\r\n email\r\n roleGroup {\r\n id\r\n name\r\n }\r\n }\r\n }\r\n }\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLocation } from \"react-router\";\r\n\r\n/**\r\n * Hook to get the URLSearchParams from the current or passed in location.\r\n * @param search\r\n */\r\nexport function useURLSearchParams(search?: string) {\r\n const location = useLocation();\r\n return React.useMemo(() => new URLSearchParams(search ?? location?.search ?? ''), [search, location]);\r\n}","import * as React from 'react';\r\nimport { useURLSearchParams } from \"./useURLSearchParams\";\r\nimport { useHistory, useLocation } from \"react-router\";\r\n\r\n/**\r\n * Replace the Search params in the browser using history.replace().\r\n * @param name name of the Query param to return the value of.\r\n */\r\nexport function useReplaceSearchParamsEffect(changes: T): void {\r\n const location = useLocation();\r\n const params = useURLSearchParams();\r\n const history = useHistory();\r\n\r\n const url = React.useMemo(() => {\r\n for (let key in changes) {\r\n\r\n // Make sure we treat undefined, null, and empty strings the same to avoid potentially infinate rerenders\r\n // if an empty string is passed in to changes.\r\n let changesValue = changes[key] ?? '';\r\n let paramsValeue = params.get(key) ?? '';\r\n\r\n if (changesValue === paramsValeue) {\r\n continue;\r\n }\r\n\r\n if (!changesValue) {\r\n params.delete(key);\r\n } else {\r\n params.set(key, changesValue);\r\n }\r\n }\r\n\r\n return `${location.pathname}?${params}${location.hash}`;\r\n }, [changes, location, params]);\r\n\r\n // If we have changed the url because of a parameter, apply it with history.replace().\r\n React.useEffect(() => {\r\n if (!url) {\r\n return;\r\n }\r\n\r\n history.replace(url);\r\n }, [url, history]);\r\n}","import * as React from 'react';\r\nimport { useURLSearchParams } from \"./useURLSearchParams\";\r\n\r\n\r\n/**\r\n * Hook to get the value of specific search parameters using deconstruction.\r\n * @param name name of the Query param to return the value of.\r\n */\r\nexport function useSearchParams(): { [key: string]: string | null } {\r\n const params = useURLSearchParams();\r\n const deconstructionObject = React.useMemo(() => {\r\n let ret = {};\r\n params.forEach((value, key) => {\r\n ret = {\r\n ...ret,\r\n [key]: value\r\n }\r\n });\r\n return ret;\r\n }, [params]);\r\n\r\n return deconstructionObject;\r\n}","import './noResultsFound.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\n\r\nexport interface NoResultsFoundProps {\r\n className?: string,\r\n search?: string,\r\n children?: React.ReactNode,\r\n icon?: IconProp,\r\n}\r\n\r\n/**\r\n * Component to show when a search or query returned no results.\r\n */\r\nexport const NoResultsFound = (props: NoResultsFoundProps) => {\r\n const {\r\n className,\r\n search,\r\n children,\r\n icon\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Otherwise render th default contents.\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {\r\n children ? children\r\n : (\r\n

\r\n {\r\n search ?\r\n t('notResultsFound.nothingMatchedSearch', 'Sorry there were no matches for \"{{search}}.\"', { search: search })\r\n : t('notResultsFound.nothingFound', 'Sorry there is nothing to show you here yet.')\r\n }\r\n

\r\n )\r\n }\r\n
\r\n );\r\n};","import './tableRowButtons.scss';\r\n\r\nimport * as React from 'react';\r\n\r\nexport interface TableRowButtonsProps {\r\n className?: string,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for buttons used in a table's row.\r\n */\r\nexport const TableRowButtons = (props: TableRowButtonsProps) => {\r\n const { className, children } = props;\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};","import './stickyToolbar.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { Container } from 'reactstrap';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\n\r\nexport interface StickyToolbarProps {\r\n className?: string,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for a toolbar that sticks to the top of the screen when its scrolled off the screen.\r\n * \r\n * NOTE Some code here is specific to the layout rather than the overall functionality. Namely:\r\n * 1. The use of the \"main\" class when top-toolbar-stuck which is used to make sure available margins are kept in sync with the
element\r\n * during sidebar states.\r\n * 2. The topOffset=\"\" which is used to ensure the triggering happens when we would move behind the fixed nav header.\r\n * \r\n * If you want to use this code elsewhere, you will likely need to tweak these values.\r\n */\r\nexport const StickyToolbar = (props: StickyToolbarProps) => {\r\n const [isStuck, setIsStuck] = React.useState(false);\r\n const { className, children } = props;\r\n\r\n return (\r\n <>\r\n setIsStuck(false)} onLeave={() => setIsStuck(true)} />\r\n\r\n \r\n
\r\n \r\n {children}\r\n \r\n
\r\n
\r\n\r\n {/* Render the unstuck version even when we render the stuck version as well (prevents screen jitter when the screen is only just big enough to \"stick\" but removing the Sticky elements from the flow causes there to be enough virticle space again */}\r\n
\r\n {children}\r\n
\r\n \r\n );\r\n};","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ChangeUserRoleGroupInput } from '../generated/globalTypes';\r\nimport { userFieldsFragment } from \"../models/User\";\r\nimport { changeUserRoleGroupMutationVariables, changeUserRoleGroupMutation } from \"../generated/changeUserRoleGroupMutation\";\r\nimport { useResetCurrentUserRolesCallback } from \"../../account\";\r\n\r\n/**\r\n * Get a callback to change the role grup of a user in the store.\r\n */\r\nexport function useChangeUserRoleGroupCallback(): [(model: ChangeUserRoleGroupInput) => Promise, AsyncActionStatus] {\r\n const resetCurrentUserRoles = useResetCurrentUserRolesCallback();\r\n\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation changeUserRoleGroupMutation ($model: ChangeUserRoleGroupInput!) {\r\n changeUserRoleGroup(model: $model) {\r\n ...userFields\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n `,\r\n {\r\n update: () => resetCurrentUserRoles()\r\n }\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ChangeUserRoleGroupInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Row, Col, Form, Label, FormGroup, Spinner, FormText, Alert } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useProfile } from '../../api/main/profiles/useProfile';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useSaveProfileCallback } from '../../api/main/profiles/useSaveProfileCallback';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useInviteCallback, useChangeAccountEmailCallback, useResendInviteEmailCallback } from '../../api/account';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useChangeUserRoleGroupCallback } from '../../api/main/users/useChangeUserRoleGroupCallback';\r\nimport { Guid } from 'guid-string';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useProfileSupportingData } from '../../api/main/profiles/useProfileSupportingData';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { TwoValueSwitch } from '../shared/TwoValueSwitch';\r\nimport moment from 'moment';\r\n\r\ninterface EditUserProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create and invite a new user.\r\n */\r\nexport const CreateUser = () => ();\r\n\r\n/**\r\n * Edit a user (actually a profile).\r\n */\r\nexport const EditUser = (props: EditUserProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading: _isLoading, errors: loadErrors } = useProfile(id);\r\n const { data: { roleGroups }, isLoading: isLoadingSupportingData, errors: loadSupportingDataErrors } = useProfileSupportingData();\r\n const isLoading = _isLoading || isLoadingSupportingData;\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), firstName: '', lastName: '', organisationName: '', organisationType: 'School', isSubscribedToDailyNewsLetter: false, isSubscribedToWeeklyNewsLetter: false, isIntrestedInWorkingTogether: false, urn: '', jobTitle: '', registrationSchoolPhasesJson: '', registeredDate: moment().toISOString() } : undefined);\r\n const { model: userModel, change: changeUserModel } = useChanges(storeModel?.user);\r\n const { model: roleGroupModel, change: changeRoleGroupModel } = useChanges<{ id: string }>({ id: storeModel?.user?.roleGroup?.id ?? '' }, isCreate? { id: 'Administrator'}: undefined);\r\n const [save, { errors: saveErrors }] = useSaveProfileCallback();\r\n const [invite, { errors: inviteErrors }] = useInviteCallback();\r\n const [resendInviteEmail, { isExecuting: isResendingInviteEmail, errors: resendInviteEmailErrors }] = useResendInviteEmailCallback();\r\n const [hasResentInviteEmail, setHasResentInviteEmail] = React.useState(false);\r\n const [changeAccountEmail, { errors: changeEmailErrors }] = useChangeAccountEmailCallback();\r\n const [changeUserRoleGroupInStore, { errors: changeUserRoleGroupInStoreErrors }] = useChangeUserRoleGroupCallback();\r\n const history = useHistory();\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n firstName: () => !model?.firstName ? t('editUser.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model?.lastName ? t('editUser.lastNameRequired', 'Last name is required') : '',\r\n email: () => !userModel?.email ? t('editUser.emailRequired', 'Email is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model, userModel]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n // If we are creating this user, make sure we save the user and get its id before continuing with saving the profile.\r\n let userId = model.userId;\r\n if (isCreate) {\r\n // Create an invited user but don't send the invite yet, we'll send it after the profile has been saved to so we can include their name\r\n // and make it more personal for higher engagement.\r\n const result = await invite({ ...userModel, sendEmail: false });\r\n userId = result.userId;\r\n changeUserModel({ id: userId });\r\n change({ userId: userId});\r\n }\r\n\r\n await save(model.id, { ...changes, userId: userId }, !!isCreate);\r\n\r\n // If we created a user invite, send the email now the profile has been saved so it can include more personal information (e.g. their name).\r\n if (isCreate) {\r\n await resendInviteEmail(userModel.email);\r\n }\r\n\r\n // Handle changes to the email address of existing users.\r\n if (!isCreate && storeModel && storeModel.user.email !== userModel.email) {\r\n await changeAccountEmail(storeModel.user.email, userModel.email);\r\n }\r\n\r\n // Handle the role group change.\r\n if (isCreate || storeModel?.user.roleGroup?.id !== roleGroupModel.id) {\r\n await changeUserRoleGroupInStore({ userId: userId, roleGroupId: roleGroupModel.id });\r\n }\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history, userModel, invite, changeUserModel, change, changeAccountEmail, resendInviteEmail]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editUser.createHeading', 'Add user')}\r\n ) : (\r\n <>{t('editUser.editHeading', 'Edit user')}\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 hasResentInviteEmail ? (\r\n \r\n <>{t('editUser.confirmationEmailHasBeenResent', 'Invite email for this user has been resent. Please ask the user to check their email to confirm.')} \r\n { e.preventDefault(); await resendInviteEmail(storeModel?.user?.email ?? userModel.email); }}\r\n isExecuting={isResendingInviteEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n\r\n
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n changeUserModel({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n {\r\n storeModel && !storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n { e.preventDefault(); await resendInviteEmail(userModel.email); setHasResentInviteEmail(true); }}\r\n isExecuting={isResendingInviteEmail}\r\n executingChildren={<>{t('common.resendingEmail', 'Resending invite...')}}>\r\n \r\n <> {t('editUser.resendInvite', 'Resend invite')}\r\n \r\n \r\n ): null\r\n }\r\n \r\n {\r\n storeModel && !storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n {t('editUser.userHasNotAcceptedInvite', 'This user has not accepted the invite. You can change their email if required or resend the invite.')}\r\n \r\n ) : storeModel && !storeModel.user.emailConfirmed && userModel.email !== storeModel.user.email ? (\r\n \r\n {t('editUser.userHasNotAcceptedInviteAndEmailChanged', 'This user has not yet accepted the invite, a new invite will be sent to the new email you have supplied.')}\r\n \r\n ) : storeModel && storeModel.user.emailConfirmed && userModel.email !== storeModel.user.email ? (\r\n \r\n {t('editUser.userHasNotAcceptedInviteAndEmailChanged', 'This user will be asked to confirm the email change before it takes affect. The old email address will be shown in the system until the change has been confirmed.')}\r\n \r\n ) : storeModel && storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n {t('editUser.userHasNotAcceptedInviteAndEmailChanged', 'If you change this user\\'s email they will be sent an email to confirm the change before it takes affect.')}\r\n \r\n ): null\r\n }\r\n \r\n\r\n \r\n \r\n changeRoleGroupModel({ id: e.currentTarget.value })} onBlur={e => validate('roleGroup')} validationErrors={validationErrors['roleGroup']}>\r\n {\r\n roleGroups?.map(item => (\r\n \r\n ))\r\n }\r\n \r\n \r\n\r\n \r\n \r\n \r\n change({ organisationType: e.currentTarget.value })} onBlur={e => validate('organisationType')} validationErrors={validationErrors['organisationType']}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ organisationName: e.currentTarget.value })} onBlur={e => validate('organisationName')} validationErrors={validationErrors['organisationName']} />\r\n \r\n\r\n \r\n \r\n \r\n change({ urn: e.currentTarget.value })} onBlur={e => validate('urn')} validationErrors={validationErrors['urn']} />\r\n \r\n \r\n\r\n \r\n \r\n change({ jobTitle: e.currentTarget.value })} onBlur={e => validate('jobTitle')} validationErrors={validationErrors['jobTitle']} />\r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToDailyNewsLetter: value })} />\r\n \r\n \r\n
\r\n {t('editUser.subscribeToDailyNewsletter.description', 'Subscribe to daily update emails to receive the need-to-know sector information for your school straight to your inbox every morning.')}\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n change({ isSubscribedToWeeklyNewsLetter: value })} />\r\n \r\n \r\n
\r\n {t('editUser.subscribeToDailyWeekly.description', 'Subscribe to This Week on TheSchoolBus to receive a weekly summary of what\\'s happening in education to your inbox every week.')}\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n change({ isIntrestedInWorkingTogether: value })} />\r\n \r\n \r\n
\r\n {t('editUser.isIntrestedInWorkingTogether.description', 'If you work in education or education consultancy and are interested in having your events on TheSchoolYear or working with us on TheSchoolYear or TheSchoolBus let us know and we\\'ll get in touch with you to arrange a good time to chat.')}\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { profileSupportingDataQuery } from '../generated/profileSupportingDataQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\nexport interface ProfileOptions extends AsyncLoadOptions {\r\n isUserId?: boolean,\r\n}\r\n\r\n/**\r\n * Get a the supporting data needed to interactivly edit an Profile.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfileSupportingData(options: ProfileOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileSupportingDataQuery {\r\n roleGroups {\r\n id\r\n name\r\n }\r\n }\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { InviteRequest, InviteResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Invite an account to register.\r\n */\r\nexport function useInviteCallback(): [(model: InviteRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: InviteRequest) => {\r\n let result = await accountService.invite(model);\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to resend the inviten email.\r\n */\r\nexport function useResendInviteEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.resendInviteEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the email of another user as an administrator.\r\n */\r\nexport function useChangeAccountEmailCallback(): [(currentEmail: string, newEmail: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (currentEmail: string, newEmail: string) => {\r\n return await accountService.changeAccountEmail({ currentEmail: currentEmail, newEmail: newEmail });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useProfile } from '../../api/main/profiles/useProfile';\r\nimport { useLockoutCallback } from '../../api/account';\r\nimport { useDeleteProfileCallback } from '../../api/main/profiles/useDeleteProfileCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a user (profile) by locking them out permanently.\r\n */\r\nexport const DeleteUser = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useProfile(id);\r\n const [remove, { errors: removeErrors }] = useDeleteProfileCallback();\r\n const [lockout, { errors: lockoutErrors }] = useLockoutCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model || !model.user) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n await lockout({ email: model.user.email });\r\n\r\n history.goBack();\r\n }, [lockout, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteUser.heading', 'Are you sure you want to delete this user?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\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 {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteProfileMutation, deleteProfileMutationVariables } from '../generated/deleteProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to delete a Profile in the store.\r\n */\r\nexport function useDeleteProfileCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteProfileMutation ($id: ID!) {\r\n deleteProfile(id: $id) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { LockoutRequest } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to lockout an account.\r\n */\r\nexport function useLockoutCallback(): [(model: LockoutRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: LockoutRequest) => {\r\n let result = await accountService.lockout(model);\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { AdministratorsUsersList } from './AdministratorsUserList';\r\nimport { EditUser, CreateUser } from \"./EditUser\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { DeleteUser } from \"./DeleteUser\";\r\nimport { RegisteredUsersList } from \"./RegisteredUsersList\";\r\n\r\nexport const userRoutes: Array = [\r\n { path: '/administration/users/administrators', exact: true, component: AdministratorsUsersList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/administrators/edit/:id', component: EditUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/administrators/add', component: CreateUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/administrators/delete/:id', component: DeleteUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n\r\n\r\n { path: '/administration/users/registered', exact: true, component: RegisteredUsersList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/registered/edit/:id', component: EditUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/registered/add', component: CreateUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/users/registered/delete/:id', component: DeleteUser, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useProfiles } from '../../api/main/profiles/useProfiles';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\n\r\n\r\n/**\r\n * List of administrtors users.\r\n */\r\nexport const AdministratorsUsersList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useProfiles({ pageSize: undefined });\r\n const [isMenuOpen, toggleMenuOpen] = useToggleStateArray();\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n // Only want to show administrators.\r\n let ret = (allItems ?? [])\r\n .filter(item => item.user?.roleGroup?.id === 'Administrator');\r\n\r\n if (!allItems || !search) {\r\n return ret;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return ret.filter(item =>\r\n item.firstName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.lastName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.user.email.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.user?.roleGroup?.name?.toLocaleLowerCase()?.indexOf(lowerSearch) ?? -1) >= 0\r\n || `${item.firstName} ${item.lastName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"first last\"\r\n || `${item.lastName} ${item.firstName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"last first\"\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 5;\r\n\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('administratorsUserList.heading', 'Administrators')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/users/administrators/edit/${item.id}`)}>\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
{t('administratorsUserList.user', 'User')}{t('administratorsUserList.firstName', 'First name')}{t('administratorsUserList.lastName', 'Last name')}{t('administratorsUserList.email', 'Email')}{t('administratorsUserList.securityGroup', 'Security group')} 
\r\n
{item.firstName} {item.lastName}
\r\n
{item.user.email}
\r\n
{item.firstName}{item.lastName}{item.user.email}{item.user.roleGroup?.name ?? ''}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useProfiles } from '../../api/main/profiles/useProfiles';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\n\r\n\r\n/**\r\n * List of registered users.\r\n */\r\nexport const RegisteredUsersList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useProfiles({ pageSize: undefined });\r\n const [isMenuOpen, toggleMenuOpen] = useToggleStateArray();\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n // Only want to show non-administrators.\r\n let ret = (allItems ?? [])\r\n .filter(item => item.user?.roleGroup?.id !== 'Administrator');\r\n\r\n if (!allItems || !search) {\r\n return ret;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return ret.filter(item =>\r\n item.firstName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.lastName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.user.email.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.organisationName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.user?.roleGroup?.name?.toLocaleLowerCase()?.indexOf(lowerSearch) ?? -1) >= 0\r\n || `${item.firstName} ${item.lastName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"first last\"\r\n || `${item.lastName} ${item.firstName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"last first\"\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 5;\r\n\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

\r\n {t('registeredUserList.heading', 'Registered users')}\r\n \r\n \r\n <> \r\n {t('registeredUserList.headingCount', '({{ count }}{{hasMorePlus}} users)', { count: items?.length ?? 0, hasMorePlus: hasMore()? '+': '' })}\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 setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n <> {t('registeredUserList.export', 'Export to Excel')}\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 items?.map(item => (\r\n history.push(`/administration/users/registered/edit/${item.id}`)}>\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
{t('registeredUserList.user', 'User')}{t('registeredUserList.firstName', 'First name')}{t('registeredUserList.lastName', 'Last name')}{t('registeredUserList.email', 'Email')}{t('registeredUserList.organisationName', 'School / Academy / Organisation')} 
\r\n
{item.firstName} {item.lastName}
\r\n
{item.user.email}
\r\n
{item.firstName}{item.lastName}{item.user.email}{item.organisationName}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import { RouteEntry } from \"../../shared/routes\";\r\nimport { Home } from \"./Home\";\r\n\r\nexport const homeRoutes: Array = [\r\n { path: '/', exact: true, component: Home, authorize: true },\r\n];\r\n","import * as React from 'react';\r\nimport { Redirect } from 'react-router';\r\nimport { useSearchParams } from '../../shared/useURLSearchParams';\r\n\r\n/**\r\n * Default / home page.\r\n */\r\nexport const Home = () => {\r\n // If we have a redirect URL on the query string redirect there.\r\n var { redirectUrl } = useSearchParams();\r\n\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};","import './sidebarRequired.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\n/**\r\n * Component that shows the sidebr if it is required/recommended for the screensize.\r\n */\r\nexport const SidebarRequired = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { AdministrationNavigation } from \"./AdministrationNavigation\";\r\nimport { AdministrationHome } from \"./AdministrationHome\";\r\n\r\nexport const administrationRoutes: Array = [\r\n { path: '/administration', exact: true, component: AdministrationHome },\r\n];\r\n\r\nexport const administrationSidebarRoutes: Array = [\r\n { path: '/administration', component: AdministrationNavigation },\r\n];\r\n","import * as React from 'react';\r\nimport { Redirect } from 'react-router';\r\n\r\n/**\r\n * Default Administration home page.\r\n */\r\nexport const AdministrationHome = () => {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};","import * as React from 'react';\r\nimport { NavItem, NavLink } from 'reactstrap';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { NavLinkTrackActive } from '../shared/NavLinkTrackActive';\r\nimport { IdentityRoles } from '../../configure/security/IdentityRoles';\r\nimport { SidebarNavTitle } from '../../shared/sidebarNav';\r\nimport { SidebarRequired } from '../shared/SidebarRequired';\r\n\r\n/**\r\n * Administration navigation menu for the app. \r\n */\r\nexport const AdministrationNavigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t('administrationNavigation.calendarTitle', 'Calendar management')}\r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.events', 'Events')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.headlines', 'Headlines')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.providers', 'Providers')}\r\n \r\n \r\n\r\n \r\n {t('administrationNavigation.tagsTitle', 'Analytics')}\r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.calendarEventOpens', 'Events opened')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.linkClicks', 'Link clicks')}\r\n \r\n \r\n\r\n \r\n {t('administrationNavigation.tagsTitle', 'Tag management')}\r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.eventTypes', 'Event types')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.schoolTypes', 'School types')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.schoolPhases', 'School phases')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.keywords', 'Keywords')}\r\n \r\n \r\n\r\n \r\n {t('administrationNavigation.cmsTitle', 'CMS-like features')}\r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.cmsTexts', 'CMS text')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.cmsVideos', 'CMS videos')}\r\n \r\n \r\n {/**/}\r\n {/* */}\r\n {/* */}\r\n {/* <> {t('administrationNavigation.cmsImages', 'CMS images')}*/}\r\n {/* */}\r\n {/**/}\r\n\r\n \r\n {t('administrationNavigation.usersTitle', 'User management')}\r\n \r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.registerdUsers', 'Registered users')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.administrators', 'Administrators')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { CalendarEventSchedule } from '../api/main/models/CalendarEventSchedule';\r\nimport i18next from \"i18next\";\r\nimport moment from 'moment';\r\n\r\n/**\r\n * Return a localized description of a schedule.\r\n */\r\nexport function scheduleDescription(schedule: CalendarEventSchedule, options?: { timeOnly?: boolean }): string {\r\n const formatDate = (date: string) => {\r\n if (options?.timeOnly) {\r\n // Only interested in the time element.\r\n if (schedule.isAllDay) {\r\n return i18next.t('scheduleDescription.allDay', 'All day');\r\n } else {\r\n return i18next.t('common.datetime', '{{date, HH:mm}}', { date: moment(date) });\r\n }\r\n } else {\r\n // Include date and time if required.\r\n if (schedule.isAllDay) {\r\n return i18next.t('common.date', '{{date, DD/MM/YYYY}}', { date: moment(date) });\r\n } else {\r\n return i18next.t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(date) });\r\n }\r\n }\r\n }\r\n\r\n // If the start and end date are the same then return only the one date, otherwise return as a range.\r\n if (schedule.start === schedule.end) {\r\n return formatDate(schedule.start);\r\n }\r\n\r\n return i18next.t('scheduleDescription.dateRange', '{{start}} to {{end}}', { start: formatDate(schedule.start), end: formatDate(schedule.end), });\r\n}","import * as React from 'react';\r\n\r\nimport './eventTypeColorBlock.scss'\r\n\r\nexport interface EventTypeColorBlockProps {\r\n color: string,\r\n className?: string,\r\n /**\r\n * When true is passed, we render as a fully transparent block of the right size rather than a colour block.\r\n */\r\n transparent?: boolean,\r\n}\r\n\r\n/**\r\n * Standard way to show colors \r\n * @param props\r\n */\r\nexport const EventTypeColorBlock = (props: EventTypeColorBlockProps) => {\r\n const { color, className, transparent = false, } = props;\r\n\r\n return (\r\n
\r\n
\r\n );\r\n};","import './calendarDayEvent.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { scheduleDescription } from '../../../utilities/scheduleDescription';\r\nimport { Col, Row } from 'reactstrap';\r\nimport { EventTypeColorBlock } from './EventTypeColorBlock';\r\nimport { CalendarHomeScheduleViewModel } from '../../calendar/CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarDayEventProps {\r\n date: Moment,\r\n schedule: CalendarHomeScheduleViewModel,\r\n onClick?: React.MouseEventHandler,\r\n}\r\n\r\n/**\r\n * Event showing within a CalendarDay.\r\n */\r\nexport const CalendarDayEvent = (props: CalendarDayEventProps) => {\r\n const { date, schedule, onClick } = props;\r\n\r\n // Work out where we fit in multi-day events.\r\n const {\r\n startsBeforeThisDay,\r\n endsAfterThisDay,\r\n isMultiDayEvent,\r\n isDayTwoOfMultiDayEvent,\r\n isDayBeforeEndOfMultiDayEvent,\r\n isMonday,\r\n } = React.useMemo(() => {\r\n const startOfDay = moment(date).startOf('day').toISOString();\r\n const endOfDay = moment(date).endOf('day').toISOString();\r\n\r\n const startsBeforeThisDay = (moment(schedule.start).toISOString() < startOfDay);\r\n const endsAfterThisDay = (moment(schedule.end).toISOString() > endOfDay);\r\n const isMultiDayEvent = startsBeforeThisDay || endsAfterThisDay;\r\n const isDayTwoOfMultiDayEvent = startsBeforeThisDay && moment(schedule.start).add(1, 'day').toISOString() >= startOfDay;\r\n const isDayBeforeEndOfMultiDayEvent = endsAfterThisDay && moment(schedule.end).add(-1, 'day').toISOString() <= startOfDay;\r\n const isMonday = date.format('dddd').toLocaleLowerCase() === 'monday';\r\n\r\n return {\r\n startsBeforeThisDay,\r\n endsAfterThisDay,\r\n isMultiDayEvent,\r\n isDayTwoOfMultiDayEvent,\r\n isDayBeforeEndOfMultiDayEvent,\r\n isMonday,\r\n };\r\n }, [date, schedule]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n {scheduleDescription(schedule, { timeOnly: (!startsBeforeThisDay && !endsAfterThisDay) })}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {schedule.calendarEvent?.name}\r\n
\r\n \r\n
\r\n
\r\n );\r\n};","import './calendarDay.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { CalendarDayEvent } from './CalendarDayEvent';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CalendarHomeScheduleViewModel } from '../../calendar/CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarDayProps {\r\n date: Moment,\r\n schedules?: Array,\r\n onEventClick?: (schedule: { id: string, calendarEventId: string }) => void,\r\n}\r\n\r\n/**\r\n * Component to show a single day in a calendar.\r\n */\r\nexport const CalendarDay = (props: CalendarDayProps) => {\r\n const { date, schedules, onEventClick } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const daySettings = React.useMemo(() => {\r\n const today = moment().startOf('day');\r\n\r\n return {\r\n dayNumber: date.format('DD'),\r\n dayName: date.format('dddd'),\r\n isToday: today.diff(moment(date).startOf('day')) === 0 ? true : false,\r\n isPast: today.diff(moment(date).startOf('day')) > 0 ? true : false,\r\n };\r\n }, [date]);\r\n\r\n // Work out the schedules that actually need showing on this date (as we'll just have the full set as schesules right now)\r\n const mySchedules = React.useMemo(() => {\r\n const startOfDay = moment(date).startOf('day').toISOString();\r\n const endOfDay = moment(date).endOf('day').toISOString();\r\n\r\n const ret = schedules?.filter(it => moment(it.start).toISOString() <= endOfDay && moment(it.end).toISOString() >= startOfDay);\r\n return ret;\r\n }, [schedules, date]);\r\n\r\n return (\r\n
\r\n
\r\n {date.format('DD')}\r\n \r\n <> \r\n {t('common.dates.weekday', '{{date, dddd}}', { date })}\r\n \r\n
\r\n
\r\n {\r\n mySchedules?.map(item => (\r\n {\r\n if (onEventClick) {\r\n onEventClick(item);\r\n }\r\n }}\r\n />\r\n ))\r\n }\r\n
\r\n
\r\n );\r\n};","import './calendarWeek.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { Row, Col } from 'reactstrap';\r\nimport { CalendarDay } from './CalendarDay';\r\nimport { CalendarHomeScheduleViewModel } from '../../calendar/CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarWeekProps {\r\n date: Moment,\r\n schedules?: Array,\r\n onEventClick?: (schedule: { id: string, calendarEventId: string }) => void,\r\n}\r\n\r\n/**\r\n * Component showing a week in a calendar.\r\n */\r\nexport const CalendarWeek = (props: CalendarWeekProps) => {\r\n const { date, schedules, onEventClick } = props;\r\n\r\n // Work out the start and end of the week containing the passed in date.\r\n const { startDate, endDate } = React.useMemo(() => {\r\n // Find the start of the week (based on a Monday week start).\r\n const startDate = moment(date).startOf('week');\r\n // And the end of the week.\r\n const endDate = moment(date).endOf('week');\r\n\r\n return {\r\n startDate,\r\n endDate,\r\n };\r\n }, [date]);\r\n\r\n // Render all days to show for the calendar.\r\n const renderDays = React.useCallback((options: { includeWeekdays: boolean, includeWeekend: boolean }) => {\r\n let ret: Array = [];\r\n\r\n for (let day = moment(startDate); day <= endDate; day = moment(day).add(1, 'day')) {\r\n // Special logic to put weekends on a seperate row on xs screens so the days don't get too compact.\r\n const dayOfWeek = day.format('E');\r\n const isWeekend = dayOfWeek === '6' /* Saturday */ || dayOfWeek === '7' /* Sunday */ ? true : false;\r\n\r\n if (isWeekend) {\r\n if (!options.includeWeekend) {\r\n continue;\r\n }\r\n } else {\r\n if (!options.includeWeekdays) {\r\n continue;\r\n }\r\n }\r\n\r\n ret.push((\r\n \r\n \r\n \r\n ));\r\n }\r\n\r\n return ret;\r\n }, [startDate, endDate, schedules, onEventClick]);\r\n\r\n\r\n return (\r\n
\r\n \r\n {renderDays({ includeWeekdays: true, includeWeekend: true, })}\r\n \r\n
\r\n );\r\n};","import './calendarWeekdayNames.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { Row, Col } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface CalendarWeekdayNamesProps {\r\n date: Moment,\r\n}\r\n\r\n/**\r\n * Component showing a weekday names aligned with the display of CalendarWeek (often shown on-top of it).\r\n */\r\nexport const CalendarWeekdayNames = (props: CalendarWeekdayNamesProps) => {\r\n const { date } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Work out the start and end of the week containing the passed in date.\r\n const { startDate, endDate } = React.useMemo(() => {\r\n // Find the start of the week (based on a Monday week start).\r\n const startDate = moment(date).startOf('week');\r\n // And the end of the week.\r\n const endDate = moment(date).endOf('week');\r\n\r\n return {\r\n startDate,\r\n endDate,\r\n };\r\n }, [date]);\r\n\r\n // Render all days to show for the calendar.\r\n const renderDays = React.useCallback((options: { includeWeekdays: boolean, includeWeekend: boolean }) => {\r\n let ret: Array = [];\r\n\r\n for (let day = moment(startDate); day <= endDate; day = moment(day).add(1, 'day')) {\r\n // Special logic to hide the names of weekends on a seperate row on xs screens so the days don't get too compact (as they\r\n // are shown on a seperate row inside CalendarWeek.\r\n const dayOfWeek = day.format('E');\r\n const isWeekend = dayOfWeek === '6' /* Saturday */ || dayOfWeek === '7' /* Sunday */ ? true : false;\r\n\r\n if (isWeekend) {\r\n if (!options.includeWeekend) {\r\n continue;\r\n }\r\n } else {\r\n if (!options.includeWeekdays) {\r\n continue;\r\n }\r\n }\r\n\r\n ret.push((\r\n \r\n
\r\n {t('common.dates.weekday', '{{date, dddd}}', { date: day })}\r\n
\r\n \r\n ));\r\n }\r\n\r\n return ret;\r\n }, [startDate, endDate, t]);\r\n\r\n\r\n return (\r\n \r\n {renderDays({ includeWeekdays: true, includeWeekend: true, })}\r\n \r\n );\r\n};","import './calendarMonth.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { CalendarWeek } from './CalendarWeek';\r\nimport { CalendarWeekdayNames } from './CalendarWeekdayNames';\r\nimport { CalendarHomeScheduleViewModel } from '../../calendar/CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarMonthProps {\r\n date: Moment,\r\n schedules?: Array,\r\n onEventClick?: (schedule: { id: string, calendarEventId: string }) => void,\r\n}\r\n\r\n/**\r\n * Component showing a calendar for a month (always shown in full weeks to emulate a paper calendar).\r\n */\r\nexport const CalendarMonth = (props: CalendarMonthProps) => {\r\n const { date, schedules, onEventClick } = props;\r\n\r\n // Work out the start and end date we are to show for the month (may extend before and after the calendar month to make a full week).\r\n const { startDate, endDate } = React.useMemo(() => {\r\n const monthStart = moment(date).startOf('month');\r\n const monthEnd = moment(date).endOf('month');\r\n\r\n // Find the start of the week (based on a Monday week start).\r\n const startDate = moment(monthStart).startOf('week');\r\n\r\n // And the end of the week.\r\n const endDate = moment(monthEnd).endOf('week');\r\n\r\n return {\r\n monthStart,\r\n monthEnd,\r\n startDate,\r\n endDate,\r\n };\r\n }, [date]);\r\n\r\n // Render all weeks to show for the calendar.\r\n const renderWeeks = React.useCallback(() => {\r\n let ret: Array = [];\r\n\r\n for (let day = moment(startDate); day <= endDate; day = moment(day).add(1, 'week')) {\r\n ret.push((\r\n \r\n ));\r\n }\r\n\r\n return ret;\r\n }, [startDate, endDate, schedules, onEventClick]);\r\n\r\n\r\n return (\r\n
\r\n \r\n
\r\n {renderWeeks()}\r\n
\r\n
\r\n );\r\n};","import './calendarMonthHeadline.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { Row, Col, Button } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CalendarHeadline } from '../../api/main/models/CalendarHeadline';\r\nimport { HtmlDisplay } from '../../shared/htmlEditor';\r\nimport { BlobReference } from '../../api/main/models/BlobReference';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { CalendarMode } from '../../globalState/calendarPreferences/useCalendarPreferencesCalendarMode';\r\n\r\nexport interface CalendarMonthHeadlineProps {\r\n date: Moment,\r\n changeDate?: (date: Moment) => void,\r\n headlines: Array,\r\n images: Array,\r\n calendarMode?: CalendarMode\r\n}\r\n\r\n/**\r\n * Component a headline with a picture, summary, and any other children (e.g. navigation) provided.\r\n */\r\nexport const CalendarMonthHeadline = (props: CalendarMonthHeadlineProps) => {\r\n const { date, changeDate, headlines, images, calendarMode, } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // We want to work out some dates relative to the date so we can show sensible navigation.\r\n const { previousMonth, nextMonth } = React.useMemo(() => {\r\n return {\r\n previousMonth: moment(date).add(-1, 'month'),\r\n nextMonth: moment(date).add(1, 'month'),\r\n }\r\n }, [date]);\r\n\r\n // Wrapper around changeDate to let us handle undefined events.\r\n const onChangeDate = React.useCallback((date) => {\r\n if (!changeDate) {\r\n return;\r\n }\r\n\r\n changeDate(date);\r\n }, [changeDate]);\r\n\r\n // Work out the current best headline to use based on the date.\r\n const currentHeadline = React.useMemo(() => {\r\n // Reverse the headlines so they run newest to oldest.\r\n let orderedHeadlines = [...headlines];\r\n orderedHeadlines.reverse();\r\n\r\n // Work out the to show the headline for. For most months that will be the start of the month, but\r\n // if the current date falls within the month in question, we base things off that instead.\r\n let isoDate = date.toISOString();\r\n const today = moment().startOf('day');\r\n const endOfMonth = moment(date).add(1, 'month');\r\n if (today >= date && today < endOfMonth) {\r\n isoDate = today.toISOString();\r\n }\r\n\r\n // Find the headline with the latest date that is not in the future and has not expired.\r\n const ret = orderedHeadlines.find(it => {\r\n const theEndDate = moment(it.start).add(1, 'month').toISOString();\r\n return it.start <= isoDate && theEndDate > isoDate\r\n });\r\n return ret;\r\n }, [headlines, date]);\r\n\r\n const currentHeadlineImage = React.useMemo(() => {\r\n if (!currentHeadline || !images) {\r\n return undefined;\r\n }\r\n\r\n const ret = images.find(it => it.id === currentHeadline.imageBlobReferenceId);\r\n return ret;\r\n }, [images, currentHeadline]);\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

{currentHeadline?.name ?? t('calendarMonthHeadline.defaultTitle', '{{date, MMMM}} headlines', { date })}

\r\n {\r\n currentHeadline?.descriptionHtml ? (\r\n \r\n ) : (\r\n

\r\n {t('calendarMonthHeadline.defaultText', 'There are no dates you need to know yet - check back again soon!')}\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 {t('common.date.monthAndYear', '{{date, MMMM}} {{date, YYYY}}', { date: date })}\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 gql from \"graphql-tag\";\r\nimport { calendarEventScheduleFields } from \"../generated/calendarEventScheduleFields\";\r\n\r\nexport const calendarEventScheduleFieldsFragment = gql`\r\n fragment calendarEventScheduleFields on CalendarEventSchedule {\r\n id\r\n calendarEventId\r\n start\r\n end\r\n isAllDay\r\n recurringType\r\n recurringInterval\r\n recurringOffset\r\n archived\r\n createdByUserId\r\n createdDate\r\n recurrenceOfCalendarEventScheduleId\r\n subscriptionSequenceNumber\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEventSchedule = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { calendarEventFields } from \"../generated/calendarEventFields\";\r\n\r\nexport const calendarEventFieldsFragment = gql`\r\n fragment calendarEventFields on CalendarEvent {\r\n id\r\n name\r\n descriptionHtml\r\n imageBlobReferenceId,\r\n archived\r\n calendarEventTypeId\r\n createdByUserId\r\n createdDate\r\n isPaidPromotion\r\n isFeatured\r\n location\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEvent = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { calendarEventUrlFields } from \"../generated/calendarEventUrlFields\";\r\n\r\nexport const calendarEventUrlFieldsFragment = gql`\r\n fragment calendarEventUrlFields on CalendarEventUrl {\r\n id\r\n calendarEventId\r\n name\r\n url\r\n linkType\r\n displayOrder\r\n archived\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEventUrl = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { itemTagLinkFields } from \"../generated/itemTagLinkFields\";\r\n\r\nexport const itemTagLinkFieldsFragment = gql`\r\n fragment itemTagLinkFields on ItemTagLink {\r\n id\r\n itemTagId\r\n targetId\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type ItemTagLink = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { calendarEventCalendarEventProviderFields } from \"../generated/calendarEventCalendarEventProviderFields\";\r\n\r\nexport const calendarEventCalendarEventProviderFieldsFragment = gql`\r\n fragment calendarEventCalendarEventProviderFields on CalendarEventCalendarEventProvider {\r\n id\r\n calendarEventId\r\n calendarEventProviderId\r\n displayOrder\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEventCalendarEventProvider = Omit;\r\n","import './calendarEventCardItem.scss';\r\n\r\nimport * as React from 'react';\r\nimport moment, { Moment } from 'moment';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { scheduleDescription } from '../../utilities/scheduleDescription';\r\nimport { Col, ListGroupItem, Row } from 'reactstrap';\r\nimport { EventTypeColorBlock } from '../shared/calendar/EventTypeColorBlock';\r\nimport { CalendarHomeScheduleViewModel } from './CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarEventCardItemProps {\r\n date: Moment,\r\n schedule: CalendarHomeScheduleViewModel,\r\n onClick?: React.MouseEventHandler,\r\n}\r\n\r\n/**\r\n * Event showing within a CalendarDay.\r\n */\r\nexport const CalendarEventCardItem = (props: CalendarEventCardItemProps) => {\r\n const { date, schedule, onClick, } = props;\r\n\r\n // Work out where we fit in multi-day events.\r\n const { startsBeforeThisDay, endsAfterThisDay } = React.useMemo(() => {\r\n const startOfDay = moment(date).startOf('day').toISOString();\r\n const endOfDay = moment(date).endOf('day').toISOString();\r\n\r\n const startsBeforeThisDay = (moment(schedule.start).toISOString() < startOfDay);\r\n const endsAfterThisDay = (moment(schedule.end).toISOString() > endOfDay);\r\n\r\n return {\r\n startsBeforeThisDay,\r\n endsAfterThisDay,\r\n };\r\n }, [date, schedule]);\r\n\r\n return (\r\n \r\n \r\n
\r\n {scheduleDescription(schedule, { timeOnly: (!startsBeforeThisDay && !endsAfterThisDay) })}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {schedule.calendarEvent?.name}\r\n
\r\n \r\n \r\n {\r\n schedule.calendarEvent?.providers?.map(providerLink => {\r\n // Only show providers with logos.\r\n if (!providerLink.provider?.imageBlobReference) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {providerLink.provider?.name\r\n \r\n );\r\n })\r\n }\r\n\r\n \r\n
\r\n
\r\n );\r\n};","/**\r\n * Get a full URL from a string that may be a partial url (e.g. may be \"bing.com\" rather than \"https://bing.com\").\r\n * @param url\r\n*/\r\nexport function getFullUrl(url: string): string\r\n{\r\n if (url.indexOf(':/') >= 0) {\r\n return url;\r\n }\r\n\r\n return `http://${url}`;\r\n}","import * as React from 'react';\r\nimport { generateTrackedUrl } from \"../../../utilities/generateTrackedUrl\";\r\n\r\n\r\nexport interface TrackedLinkProps extends React.DetailedHTMLProps, HTMLAnchorElement> {\r\n calendarEventUrlId?: string,\r\n calendarEventId?: string,\r\n}\r\n\r\n/**\r\n * An link that replaces the href provided with a url that includes tracking of the users click and redirecting to the original href.\r\n * @param props\r\n */\r\nexport const TrackedLink = (props: TrackedLinkProps) => {\r\n const {\r\n href,\r\n calendarEventUrlId,\r\n calendarEventId,\r\n children,\r\n ...rest\r\n } = props;\r\n\r\n const trackingUrl = React.useMemo(() => generateTrackedUrl(href ?? '', calendarEventUrlId, calendarEventId), [href, calendarEventUrlId, calendarEventId]);\r\n\r\n return (\r\n {children}\r\n );\r\n};","/**\r\n * Generate a URL that will launch the passed in URL but also track it as a AnalyticEvent in the database.\r\n */\r\nexport function generateTrackedUrl(url: string, calendarEventUrlId?: string, calendarEventId?: string) {\r\n return `/link/to/${encodeURIComponent(url)}/${calendarEventUrlId ? `?calendarEventUrlId=${encodeURIComponent(calendarEventUrlId ?? '')}&calendarEventId=${encodeURIComponent(calendarEventId ?? '')}` : ''}`;\r\n}\r\n","import './calendarEventModal.scss';\r\nimport * as React from 'react';\r\nimport { Modal, ModalHeader, ModalBody, Row, Col } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { EventTypeColorBlock } from '../shared/calendar/EventTypeColorBlock';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { HtmlDisplay } from '../../shared/htmlEditor';\r\nimport { scheduleDescription } from '../../utilities/scheduleDescription';\r\nimport { getFullUrl } from '../../utilities/getFullUrl';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { TrackedLink } from '../shared/trackedLink/TrackedLink';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { CalendarHomeScheduleViewModel } from './CalendarHomeScheduleViewModel';\r\n\r\nexport interface CalendarEventModalProps {\r\n model: CalendarHomeScheduleViewModel,\r\n\r\n isOpen: boolean,\r\n toggle: () => void,\r\n}\r\n\r\n\r\n/**\r\n * Edit a CalendarEvent.\r\n */\r\nexport const CalendarEventModal = (props: CalendarEventModalProps) => {\r\n const { model, isOpen, toggle } = props;\r\n\r\n const { t } = useTranslation();\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 {model?.calendarEvent?.name}\r\n

\r\n \r\n
\r\n {model?.calendarEvent?.location}\r\n
\r\n
\r\n \r\n
\r\n \r\n {/**/}\r\n {/* */}\r\n {/**/}\r\n \r\n {model?.calendarEvent?.eventType?.name}\r\n \r\n \r\n \r\n <> \r\n {\r\n model ? (<>{scheduleDescription(model)})\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 {model?.calendarEvent?.name}\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {t('calendarEventModal.nextSteps', 'Next steps:')}\r\n
\r\n {\r\n model?.calendarEvent?.urls?.map((item, index) => (\r\n \r\n {item.name}\r\n \r\n ))\r\n }\r\n
\r\n \r\n
\r\n
\r\n {t('calendarEventModal.providersHeading', 'Organisation:')}\r\n
\r\n
\r\n \r\n {\r\n model?.calendarEvent?.providers?.map(item => (\r\n \r\n \r\n {\r\n item?.provider?.imageBlobReference ? ({item.provider?.name)\r\n : (
{item.provider?.name ?? ''}
)\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 * Generate a route URL for a calendar event (trying to make the URL as user friendly as possible).\r\n */\r\nexport function generateCalendarEventRouteUrl(schedule: GenerateClendarEventRouteScheduleModel | undefined | null) {\r\n // If we have no schedule passed in, just return /calendar.\r\n if (!schedule) {\r\n return '/calendar';\r\n }\r\n\r\n // If our schedule has no calendar event (or that has no name) then return /calendar/event/${id}\r\n if (!schedule?.calendarEvent?.name) {\r\n return `/calendar/event/${schedule.id}`;\r\n }\r\n\r\n // If we have a name for the calendar event, try use it in the URL so it looks nicer (even though its actually ignored in all code).\r\n const nameUrlComponent = encodeURIComponent(\r\n schedule.calendarEvent.name\r\n .replace(' ', '-')\r\n .replace('/', '-')\r\n .replace('\\\\', '-')\r\n .toLocaleLowerCase()\r\n );\r\n\r\n return `/calendar/${nameUrlComponent}/${schedule.id}`;\r\n}\r\n\r\n\r\nexport interface GenerateClendarEventRouteScheduleModel {\r\n id: string,\r\n calendarEvent?: {\r\n id: string,\r\n name: string,\r\n },\r\n}\r\n","import './calendarHomeStickyToolbar.scss';\r\n\r\nimport * as React from 'react';\r\nimport { StickyToolbar, StickyToolbarProps } from '../shared/StickyToolbar';\r\n\r\nexport interface CalendarHomeStickyToolbarProps extends StickyToolbarProps {\r\n}\r\n\r\n/**\r\n * Specialised version of StickyToolbar for use on the CalendarHome screen.\r\n * \r\n * This is mostly about formatting and hiding/showing items as appropriate. Its paired tightly with CalendarHome.\r\n */\r\nexport const CalendarHomeStickyToolbar = (props: CalendarHomeStickyToolbarProps) => {\r\n const { className, ...rest } = props;\r\n\r\n return (\r\n \r\n );\r\n};","import './calendarDayCard.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Card, CardBody, CardTitle } from 'reactstrap';\r\nimport moment, { Moment } from 'moment';\r\n\r\nexport interface CalendarDayCardProps {\r\n date: Moment,\r\n title?: string,\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Card\r\n */\r\nexport const CalendarDayCard = (props: CalendarDayCardProps) => {\r\n const { date, title, children } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const daySettings = React.useMemo(() => {\r\n const today = moment().startOf('day');\r\n\r\n return {\r\n //dayNumber: date.format('DD'),\r\n //dayName: date.format('dddd'),\r\n isToday: today.diff(moment(date).startOf('day')) === 0 ? true : false,\r\n isPast: today.diff(moment(date).startOf('day')) > 0 ? true : false,\r\n };\r\n }, [date]);\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n title? title\r\n : t('calendarDayCard.defaultTitle', '{{date, dddd Do MMMM}}', { date: date })}\r\n \r\n {children}\r\n \r\n \r\n );\r\n};","import gql from \"graphql-tag\";\r\nimport { calendarEventTypeFields } from \"../generated/calendarEventTypeFields\";\r\n\r\nexport const calendarEventTypeFieldsFragment = gql`\r\n fragment calendarEventTypeFields on CalendarEventType {\r\n id\r\n name\r\n color\r\n archived\r\n displayOrder\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEventType = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { calendarEventProviderFields } from \"../generated/calendarEventProviderFields\";\r\n\r\nexport const calendarEventProviderFieldsFragment = gql`\r\n fragment calendarEventProviderFields on CalendarEventProvider {\r\n id\r\n name\r\n descriptionHtml\r\n imageBlobReferenceId\r\n color\r\n archived\r\n displayOrder\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarEventProvider = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { calendarHeadlineFields } from \"../generated/calendarHeadlineFields\";\r\n\r\nexport const calendarHeadlineFieldsFragment = gql`\r\n fragment calendarHeadlineFields on CalendarHeadline {\r\n id\r\n start\r\n end\r\n name\r\n descriptionHtml\r\n imageBlobReferenceId\r\n archived\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CalendarHeadline = Omit;\r\n","import * as React from 'react';\r\nimport { Button, Row, Col } from 'reactstrap';\r\nimport { CalendarEventType } from '../../api/main/models/CalendarEventType';\r\nimport { EventTypeColorBlock } from '../shared/calendar/EventTypeColorBlock';\r\n\r\nimport './eventTypeSelector.scss';\r\n\r\nexport interface EventTypeSelectorProps {\r\n items: Array,\r\n isSelected: (id: string) => boolean,\r\n toggle: (id: string) => void,\r\n}\r\n\r\n/**\r\n * Component that lets the user select event types on and off, modeled after TagSelector to provider a very similar API to the consuming code.\r\n * @param props\r\n */\r\nexport const EventTypeSelector = (props: EventTypeSelectorProps) => {\r\n const {\r\n items,\r\n isSelected,\r\n toggle,\r\n } = props;\r\n\r\n return (\r\n
\r\n {\r\n items.map(item => (\r\n \r\n ))\r\n }\r\n
\r\n );\r\n};","import gql from \"graphql-tag\";\r\nimport { analyticEventFields } from \"../generated/analyticEventFields\";\r\n\r\nexport const analyticEventFieldsFragment = gql`\r\n fragment analyticEventFields on AnalyticEvent {\r\n id\r\n userId\r\n eventDate\r\n eventType\r\n calendarEventId\r\n calendarEventUrlId\r\n url\r\n }\r\n`;\r\n\r\n\r\nexport type AnalyticEvent = Omit;\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { AnalyticEventCreateInput } from '../generated/globalTypes';\r\nimport { createAnalyticEventMutation, createAnalyticEventMutationVariables } from '../generated/createAnalyticEventMutation';\r\nimport { analyticEventFieldsFragment } from '../models/AnalyticEvent';\r\n\r\n/**\r\n * Get a callback to create a AnalyticEvent in the store.\r\n */\r\nexport function useCreateAnalyticEventCallback(): [(model: AnalyticEventCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createAnalyticEventMutation ($model: AnalyticEventCreateInput!) {\r\n createAnalyticEvent(model: $model) {\r\n ...analyticEventFields\r\n }\r\n }\r\n\r\n ${analyticEventFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: AnalyticEventCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { recoilPersist } from 'recoil-persist';\r\n\r\nconst persistKey = 'recoil-persist';\r\n\r\n/**\r\n * Configure persistance of recoil, to use you need to add an effect to any atom you want to be persisted e.g.:\r\n const counterState = atom({\r\n key: 'count',\r\n default: 0,\r\n effects_UNSTABLE: [persistAtom],\r\n })\r\n */\r\nexport const { persistAtom } = recoilPersist({\r\n key: persistKey\r\n});\r\n\r\n/**\r\n * Purge the recoil persistance.\r\n */\r\nexport function purgeRecoilPersist() {\r\n window?.localStorage?.removeItem(persistKey);\r\n}\r\n","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\nimport { persistAtom } from '../../configure/recoilPersistConfig';\r\n\r\n/**\r\n * Mode of the calendar being shown.\r\n */\r\nexport type CalendarMode = 'calendar' | 'list';\r\n\r\nexport const calendarPreferencesCalendarModeState = atom({\r\n key: 'calendarPreferencesCalendarModeState',\r\n default: 'calendar',\r\n effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Manage the CalendarMode global state. \r\n */\r\nexport function useCalendarPreferencesCalendarMode(): [CalendarMode, React.Dispatch>] {\r\n const [value, setValue] = useRecoilState(calendarPreferencesCalendarModeState);\r\n return [value, setValue];\r\n}","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\nimport { persistAtom } from '../../configure/recoilPersistConfig';\r\n\r\nexport const calendarPreferencesExcludedSchoolPhasesState = atom>({\r\n key: 'calendarPreferencesExcludedSchoolPhasesState',\r\n default: [],\r\n effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Manage the toggleable array of excluded school phases.\r\n */\r\nexport function useCalendarPreferencesExcludedSchoolPhases(): [(id: string) => boolean, (id: string) => void] {\r\n const [value, setValue] = useRecoilState(calendarPreferencesExcludedSchoolPhasesState);\r\n const hasItem = React.useCallback((id: string) => !!value.find(it => it === id), [value]);\r\n const toggleItem = React.useCallback((id: string) => {\r\n setValue(prevState => {\r\n const existing = prevState.find(it => it === id);\r\n if (existing) {\r\n return prevState.filter(it => it !== id);\r\n }\r\n\r\n return [...prevState, id];\r\n });\r\n }, [setValue]);\r\n\r\n return [hasItem, toggleItem];\r\n}","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\nimport { persistAtom } from '../../configure/recoilPersistConfig';\r\n\r\nexport const calendarPreferencesExcludedEventTypesState = atom>({\r\n key: 'calendarPreferencesExcludedEventTypesState',\r\n default: [],\r\n effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Manage the toggleable array of excluded event types. \r\n */\r\nexport function useCalendarPreferencesExcludedEventTypes(): [(id: string) => boolean, (id: string) => void] {\r\n const [value, setValue] = useRecoilState(calendarPreferencesExcludedEventTypesState);\r\n const hasItem = React.useCallback((id: string) => !!value.find(it => it === id), [value]);\r\n const toggleItem = React.useCallback((id: string) => {\r\n setValue(prevState => {\r\n const existing = prevState.find(it => it === id);\r\n if (existing) {\r\n return prevState.filter(it => it !== id);\r\n }\r\n\r\n return [...prevState, id];\r\n });\r\n }, [setValue]);\r\n\r\n return [hasItem, toggleItem];\r\n}","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\nimport { persistAtom } from '../../configure/recoilPersistConfig';\r\n\r\nexport const calendarPreferencesExcludedSchoolTypesState = atom>({\r\n key: 'calendarPreferencesExcludedSchoolTypesState',\r\n default: [],\r\n effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Manage the toggleable array of excluded school types.\r\n */\r\nexport function useCalendarPreferencesExcludedSchoolTypes(): [(id: string) => boolean, (id: string) => void] {\r\n const [value, setValue] = useRecoilState(calendarPreferencesExcludedSchoolTypesState);\r\n const hasItem = React.useCallback((id: string) => !!value.find(it => it === id), [value]);\r\n const toggleItem = React.useCallback((id: string) => {\r\n setValue(prevState => {\r\n const existing = prevState.find(it => it === id);\r\n if (existing) {\r\n return prevState.filter(it => it !== id);\r\n }\r\n\r\n return [...prevState, id];\r\n });\r\n }, [setValue]);\r\n\r\n return [hasItem, toggleItem];\r\n}","import { useState } from 'react';\r\nimport moment from 'moment';\r\n\r\nconst getInstallPromptLastSeenAt = (promptName: string): string | null => window.localStorage.getItem(promptName);\r\n\r\nconst setInstallPromptSeenToday = (promptName: string): void => {\r\n const today = moment().toISOString();\r\n localStorage.setItem(promptName, today);\r\n};\r\n\r\nfunction getUserShouldBePromptedToInstall(promptName: string, daysToWaitBeforePromptingAgain: number): boolean {\r\n const lastPrompt = moment(getInstallPromptLastSeenAt(promptName));\r\n const daysSinceLastPrompt = moment().diff(lastPrompt, 'days');\r\n return isNaN(daysSinceLastPrompt) || daysSinceLastPrompt > daysToWaitBeforePromptingAgain;\r\n}\r\n\r\nexport const useShouldShowPrompt = (promptName: string, daysToWaitBeforePromptingAgain = 30): [boolean, () => void] => {\r\n const [userShouldBePromptedToInstall, setUserShouldBePromptedToInstall] = useState(\r\n getUserShouldBePromptedToInstall(promptName, daysToWaitBeforePromptingAgain)\r\n );\r\n\r\n const handleUserSeeingInstallPrompt = () => {\r\n setUserShouldBePromptedToInstall(false);\r\n setInstallPromptSeenToday(promptName);\r\n };\r\n\r\n return [userShouldBePromptedToInstall, handleUserSeeingInstallPrompt];\r\n};\r\n","import { useShouldShowPrompt } from './useShouldShowPrompt';\r\n\r\nconst iosInstallPromptedAt = 'iosInstallPromptedAt';\r\n\r\nconst isIOS = (): boolean => {\r\n // @ts-ignore\r\n if (navigator.standalone) {\r\n //user has already installed the app\r\n return false;\r\n }\r\n const ua = window.navigator.userAgent;\r\n const isIPad = !!ua.match(/iPad/i);\r\n const isIPhone = !!ua.match(/iPhone/i);\r\n return isIPad || isIPhone;\r\n};\r\n\r\nexport const useIosInstallPrompt = (): [boolean, () => void] => {\r\n const [userShouldBePromptedToInstall, handleUserSeeingInstallPrompt] = useShouldShowPrompt(iosInstallPromptedAt);\r\n\r\n return [isIOS() && userShouldBePromptedToInstall, handleUserSeeingInstallPrompt];\r\n};\r\n","import React from 'react';\r\nimport { Button, Card, CardText, CardBody, CardTitle, Row, Col } from 'reactstrap';\r\nimport { useIosInstallPrompt } from './useIosInstallPrompt';\r\nimport { useWebInstallPrompt } from './useWebInstallPrompt';\r\nimport './installPwaPrompt.scss';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useToggleState } from 'use-toggle-state';\r\n\r\nexport const InstallPwaPrompt = () => {\r\n let [iosInstallPrompt, handleIOSInstallDeclined] = useIosInstallPrompt();\r\n const [webInstallPrompt, handleWebInstallDeclined, handleWebInstallAccepted] = useWebInstallPrompt();\r\n\r\n const [isHidden, toggleHidden] = useToggleState(false);\r\n\r\n const { t } = useTranslation();\r\n\r\n // If we can't be installed then don't show the prompt (NOTE disable this to force the prompt for development purposes).\r\n if (!iosInstallPrompt && !webInstallPrompt) {\r\n return null;\r\n }\r\n\r\n // If user has closed the prompt directly, don't show it regardless of anything else.\r\n if (isHidden) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n {t('installPwaPrompt.TheSchoolYear', 'TheSchoolYear')}\r\n \r\n
\r\n
\r\n

\r\n {t('installPwaPrompt.body', 'TheSchoolYear can be installed as an app on your phone, tablet, or PC so you always have every date available whenever and wherever you need it.')}\r\n

\r\n\r\n {\r\n iosInstallPrompt ? (\r\n <>\r\n \r\n {t('installPwaPrompt.iosInstall.beforeIcon', 'Tap ')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('installPwaPrompt.iosInstall.afterIcon', ' then \"Add to Home Screen\"')}\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};","import { useState, useEffect } from 'react';\r\nimport { useShouldShowPrompt } from './useShouldShowPrompt';\r\n\r\nconst webInstallPromptedAt = 'webInstallPromptedAt';\r\n\r\nexport const useWebInstallPrompt = (): [any, () => void, () => void] => {\r\n const [installPromptEvent, setInstallPromptEvent] = useState();\r\n const [userShouldBePromptedToInstall, handleUserSeeingInstallPrompt] = useShouldShowPrompt(webInstallPromptedAt);\r\n\r\n useEffect(() => {\r\n const beforeInstallPromptHandler = (event: any) => {\r\n event.preventDefault();\r\n\r\n // check if user has already been asked\r\n if (userShouldBePromptedToInstall) {\r\n // store the event for later use\r\n setInstallPromptEvent(event);\r\n }\r\n };\r\n window.addEventListener('beforeinstallprompt', beforeInstallPromptHandler);\r\n return () => window.removeEventListener('beforeinstallprompt', beforeInstallPromptHandler);\r\n }, [userShouldBePromptedToInstall]);\r\n\r\n const handleInstallDeclined = () => {\r\n handleUserSeeingInstallPrompt();\r\n setInstallPromptEvent(null);\r\n };\r\n\r\n const handleInstallAccepted = () => {\r\n // show native prompt\r\n installPromptEvent.prompt();\r\n\r\n // decide what to do after the user chooses\r\n installPromptEvent.userChoice.then((choice: { outcome: string }) => {\r\n // if the user declined, we don't want to show the prompt again\r\n if (choice.outcome !== 'accepted') {\r\n handleUserSeeingInstallPrompt();\r\n }\r\n setInstallPromptEvent(null);\r\n });\r\n };\r\n return [installPromptEvent, handleInstallDeclined, handleInstallAccepted];\r\n};\r\n","import './calendarHome.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, ButtonGroup, Card, Col, Collapse, ListGroup, Row } from 'reactstrap';\r\nimport { CalendarMonth } from '../shared/calendar/CalendarMonth';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport moment, { Moment } from 'moment';\r\nimport { CalendarMonthHeadline } from './CalendarMonthHeadline';\r\nimport { useCalendarHomeViewModel } from '../../api/main/calendarEventSchedules/viewModels/useCalendarHomeViewModel';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { CalendarEventCardItem } from './CalendarEventCardItem';\r\nimport { useToggleState } from 'use-toggle-state';\r\nimport { CalendarEventModal } from './CalendarEventModal';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { scheduleDescription } from '../../utilities/scheduleDescription';\r\nimport { useGlobalSearchText } from '../../globalState/globalSearchText/useGlobalSearchText';\r\nimport { generateCalendarEventRouteUrl } from '../../utilities/generateCalendarEventRouteUrl';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { CalendarHomeStickyToolbar } from './CalendarHomeStickyToolbar';\r\nimport { CalendarDayCard } from './CalendarDayCard';\r\nimport { useCalendarHomeSupportingData } from '../../api/main/calendarEventSchedules/viewModels/useCalendarHomeSupportingData';\r\nimport { TagSelector } from '../tags/TagSelector';\r\nimport { EventTypeSelector } from '../calendarEventTypes/EventTypeSelector';\r\nimport { Guid } from 'guid-string';\r\nimport { useCreateAnalyticEventCallback } from '../../api/main/analyticEvents/useCreateAnalyticEventCallback';\r\nimport { CalendarMode, useCalendarPreferencesCalendarMode } from '../../globalState/calendarPreferences/useCalendarPreferencesCalendarMode';\r\nimport { useCalendarPreferencesExcludedSchoolPhases } from '../../globalState/calendarPreferences/useCalendarPreferencesExcludedSchoolPhases';\r\nimport { useCalendarPreferencesExcludedEventTypes } from '../../globalState/calendarPreferences/useCalendarPreferencesExcludedEventTypes';\r\nimport { useCalendarPreferencesExcludedSchoolTypes } from '../../globalState/calendarPreferences/useCalendarPreferencesExcludedSchoolTypes';\r\nimport { InstallPwaPrompt } from '../shared/pwaInstall/InstallPwaPrompt';\r\nimport { generateCalendarHomeScheduleViewModel } from './generateCalendarHomeScheduleViewModel';\r\nimport { CalendarHomeScheduleViewModel } from './CalendarHomeScheduleViewModel';\r\nimport { useBlobReferences } from '../../api/main/blobReferences/useBlobReferences';\r\n\r\nexport interface CalendarHomeProps {\r\n /**\r\n * When set, the calendar will start in this mode regardless of the user's saved mode (without overwriting the saved mode).\r\n */\r\n startInCalendarMode?: CalendarMode,\r\n}\r\n\r\n/**\r\n * Main Calendar page showing the calendar of events.\r\n */\r\nexport const CalendarHome = (props: CalendarHomeProps) => {\r\n const { startInCalendarMode } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Get the calendar event from the route if one is provided as the default event to open.\r\n const {\r\n calendarEventScheduleId: _calendarEventScheduleId\r\n } = useParams<{ calendarEventScheduleId: string | undefined}>();\r\n const [calendarEventScheduleId, setCalendarEventScheduleId] = React.useState(_calendarEventScheduleId);\r\n\r\n // Current date being shown in the calendar.\r\n const [calendarDate, setCalendarDate] = React.useState(() => moment().startOf('month'));\r\n\r\n // Get the data we need from the apis.\r\n const { data: { schedules: _schedules, calendarEvents, calendarEventCalendarEventProviders, calendarEventUrls, itemTagLinks }, isLoading, errors: loadErrors } = useCalendarHomeViewModel();\r\n const { data: { calendarEventTypes, itemTags, headlines, providers }, errors: loadSupportingDataErrors } = useCalendarHomeSupportingData();\r\n\r\n // Load the images seperatly as we don't want any delay related to loading them to impact the display of everything else.\r\n const { data: { items: imageBlobReferences } } = useBlobReferences();\r\n\r\n // Get the search text from the gobal state.\r\n const [search, setSearch] = useGlobalSearchText();\r\n\r\n // Users preference for including/excluding Event types, School Phases, and School Types.\r\n const [isEventTypeExcluded, toggleEventTypeExcluded] = useCalendarPreferencesExcludedEventTypes();\r\n const [isSchoolPhaseExcluded, toggleSchoolPhaseExcluded] = useCalendarPreferencesExcludedSchoolPhases();\r\n const [isSchoolTypeExcluded, toggleSchoolTypeExcluded] = useCalendarPreferencesExcludedSchoolTypes();\r\n\r\n // Generate data in the structure of the view model expected by most of our child components.\r\n const schedulesViewModel = React.useMemo((): Array | undefined => {\r\n if (!_schedules) {\r\n return undefined;\r\n }\r\n\r\n const ret = _schedules.map(item => generateCalendarHomeScheduleViewModel(\r\n item, {\r\n calendarEvents,\r\n calendarEventProviderLinks: calendarEventCalendarEventProviders,\r\n calendarEventUrls,\r\n itemTagLinks,\r\n eventTypes: calendarEventTypes,\r\n providers,\r\n itemTags,\r\n blobReferences: imageBlobReferences,\r\n }));\r\n return ret;\r\n }, [_schedules, calendarEvents, calendarEventCalendarEventProviders, calendarEventUrls,\r\n itemTagLinks, calendarEventTypes, providers, itemTags, imageBlobReferences]);\r\n\r\n // Filter the schedules.\r\n const schedules = React.useMemo(() => {\r\n if (!schedulesViewModel) {\r\n return schedulesViewModel;\r\n }\r\n\r\n let ret = schedulesViewModel;\r\n\r\n // Filter by the user's search.\r\n if (search) {\r\n const lowerSearch = search.toLocaleLowerCase();\r\n ret = ret.filter(item =>\r\n scheduleDescription(item).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.calendarEvent?.name ?? '').toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.calendarEvent?.eventType?.name ?? '').toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.calendarEvent?.providers ?? []).filter(it => (it.provider?.name ?? '').toLocaleLowerCase().indexOf(lowerSearch) >= 0).length\r\n || (item.calendarEvent?.tagLinks ?? []).filter(it => (it.itemTag?.name ?? '').toLocaleLowerCase().indexOf(lowerSearch) >= 0).length\r\n );\r\n }\r\n\r\n // Apply the tags and event type filters.\r\n ret = ret.filter(item => {\r\n // If the event type is excluded, exclude the item.\r\n if (isEventTypeExcluded(item.calendarEvent?.calendarEventTypeId ?? '')) {\r\n return false;\r\n }\r\n\r\n // If the item is flagged with school types, it needs to have at least one school type selected that is not\r\n // excluded in the users filter.\r\n const schoolTypeLinks = (item.calendarEvent?.tagLinks ?? []).filter(it => it.itemTag?.tagType === 'SchoolType');\r\n if (schoolTypeLinks.length) {\r\n let notExcludedCount = 0;\r\n for (const link of schoolTypeLinks) {\r\n if (!isSchoolTypeExcluded(link.itemTag?.id ?? '')) {\r\n ++notExcludedCount;\r\n }\r\n }\r\n\r\n // If all the school types were excluded, don't show this item.\r\n if (notExcludedCount <= 0) {\r\n return false;\r\n }\r\n }\r\n\r\n // If the item is flagged with school phases, it needs to have at least one school phase selected that is not\r\n // excluded in the users filter.\r\n const schoolPhaseLinks = (item.calendarEvent?.tagLinks ?? []).filter(it => it.itemTag?.tagType === 'SchoolPhase');\r\n if (schoolPhaseLinks.length) {\r\n let notExcludedCount = 0;\r\n for (const link of schoolPhaseLinks) {\r\n if (!isSchoolPhaseExcluded(link.itemTag?.id ?? '')) {\r\n ++notExcludedCount;\r\n }\r\n }\r\n\r\n // If all the school types were excluded, don't show this item.\r\n if (notExcludedCount <= 0) {\r\n return false;\r\n }\r\n }\r\n\r\n // If we get here we can show this item.\r\n return true;\r\n });\r\n\r\n return ret;\r\n }, [schedulesViewModel, search, isSchoolTypeExcluded, isSchoolPhaseExcluded, isEventTypeExcluded]);\r\n\r\n // Get the schedules grouped by day as shown in the list view for the current month.\r\n const { schedules: listViewGroupedSchedules, pastEventsCount, futureEventsCount, } = React.useMemo(() => {\r\n if (!schedules) {\r\n return {\r\n schedules: [],\r\n pastEventsCount: 0,\r\n futureEventsCount: 0,\r\n };\r\n }\r\n\r\n let ret: Array<{\r\n monthStart: Moment,\r\n days: Array<{ date: Moment, isPast: boolean, items: Array }>\r\n }> = [];\r\n let pastEventsCount: number = 0;\r\n let futureEventsCount: number = 0;\r\n\r\n const today = moment().startOf('day').toISOString();\r\n\r\n for (const schedule of schedules) {\r\n const monthStart = moment(schedule.start).startOf('month');\r\n const dayStart = moment(schedule.start).startOf('day');\r\n\r\n // Find or create the month entry to put ourselves into.\r\n let monthEntry = ret.find(it => it.monthStart.toISOString() === monthStart.toISOString());\r\n if (!monthEntry) {\r\n monthEntry = { monthStart: monthStart, days: [] };\r\n ret.push(monthEntry);\r\n }\r\n\r\n // Find or create the day entry to put ourselves into\r\n let dayEntry = monthEntry.days.find(it => it.date.toISOString() === dayStart.toISOString());\r\n if (!dayEntry) {\r\n dayEntry = {\r\n date: dayStart,\r\n isPast: (dayStart.toISOString() < today)? true: false,\r\n items: []\r\n };\r\n monthEntry.days.push(dayEntry);\r\n }\r\n\r\n dayEntry.items.push(schedule);\r\n\r\n // Count how many past events we've got (because we hide them in the list view).\r\n if (dayEntry.isPast) {\r\n ++pastEventsCount;\r\n } else {\r\n ++futureEventsCount;\r\n }\r\n }\r\n\r\n return {\r\n schedules: ret,\r\n pastEventsCount,\r\n futureEventsCount,\r\n };\r\n }, [schedules]);\r\n\r\n\r\n // Get the schedules for this week, grouped by day.\r\n const thisWeekSchedules = React.useMemo(() => {\r\n if (!schedules) {\r\n return [];\r\n }\r\n\r\n const weekStart = moment().startOf('week');\r\n const weekEnd = moment().add(1, 'week');\r\n\r\n let ret: Array<{ date: Moment, items: Array }> = [];\r\n\r\n for (const schedule of schedules) {\r\n const date = moment(schedule.start).startOf('day');\r\n\r\n if (date < weekStart || date >= weekEnd) {\r\n continue;\r\n }\r\n\r\n let entry = ret.find(it => it.date.toISOString() === date.toISOString());\r\n if (!entry) {\r\n entry = { date: date, items: [] };\r\n ret.push(entry);\r\n }\r\n\r\n entry.items.push(schedule);\r\n }\r\n\r\n return ret;\r\n }, [schedules]);\r\n\r\n // Get the featured event schedules for planning ahead.\r\n const featuredSchedules = React.useMemo(() => {\r\n if (!schedules) {\r\n return [];\r\n }\r\n\r\n const thisWeekEnd = moment().endOf('week');\r\n const planAheadEnd = moment().startOf('day').add(6, 'month');\r\n\r\n let ret: Array<{ date: Moment, items: Array }> = [];\r\n\r\n // Filter to show only featured items.\r\n const featuredSechedules = schedules.filter(item => item.calendarEvent?.isFeatured);\r\n\r\n // Filter out anything too with a date we're not interested in and group by day.\r\n for (const schedule of featuredSechedules) {\r\n const date = moment(schedule.start).startOf('day');\r\n\r\n if (date < thisWeekEnd || date >= planAheadEnd) {\r\n continue;\r\n }\r\n\r\n let entry = ret.find(it => it.date.toISOString() === date.toISOString());\r\n if (!entry) {\r\n entry = { date: date, items: [] };\r\n ret.push(entry);\r\n }\r\n\r\n entry.items.push(schedule);\r\n }\r\n\r\n return ret;\r\n }, [schedules]);\r\n\r\n // Showing of an event as a modal based on it's schedule.\r\n const [calendarEventModalIsOpen, toggleCalendarEvetModal] = useToggleState(!!calendarEventScheduleId);\r\n const history = useHistory();\r\n const [createAnalyticEvent] = useCreateAnalyticEventCallback();\r\n const openEvent = React.useCallback((schedule: { id: string, calendarEventId: string, }) => {\r\n setCalendarEventScheduleId(schedule.id);\r\n toggleCalendarEvetModal(true);\r\n history.push(generateCalendarEventRouteUrl(schedule));\r\n\r\n // Log the opening of the event in the analytics.\r\n createAnalyticEvent({\r\n id: Guid.newGuid(),\r\n eventType: 'CalendarEventOpen',\r\n calendarEventScheduleId: schedule.id,\r\n calendarEventId: schedule.calendarEventId,\r\n });\r\n }, [setCalendarEventScheduleId, toggleCalendarEvetModal, history, createAnalyticEvent]);\r\n const closeEvent = React.useCallback(() => {\r\n toggleCalendarEvetModal(false);\r\n history.push(generateCalendarEventRouteUrl(undefined));\r\n }, [toggleCalendarEvetModal, history]);\r\n\r\n // Automatically open the event modal when we are loaded with an event passed in the route.\r\n const [previousCalendarEventScheduleId, setPreviousCalendarEventScheduleId] = React.useState(calendarEventScheduleId);\r\n React.useEffect(() => {\r\n // If the id hasn't changed in the route, do nothing.\r\n if (calendarEventScheduleId === previousCalendarEventScheduleId) {\r\n return;\r\n }\r\n\r\n // Otherwise we'll want to open the modal automatically.\r\n toggleCalendarEvetModal(!isNullOrUndefined(calendarEventScheduleId));\r\n setPreviousCalendarEventScheduleId(calendarEventScheduleId);\r\n }, [calendarEventScheduleId, previousCalendarEventScheduleId, setPreviousCalendarEventScheduleId, toggleCalendarEvetModal]);\r\n\r\n const eventModelForModal = schedules?.find(item => item.id === calendarEventScheduleId);\r\n\r\n // User can switch between two views.\r\n const [_calendarMode, _setCalendarMode] = useCalendarPreferencesCalendarMode();\r\n const [useStartInCalendarMode, setUseStartInCalendarMode] = React.useState(!!startInCalendarMode);\r\n const calendarMode = startInCalendarMode && useStartInCalendarMode ? startInCalendarMode : _calendarMode;\r\n const setCalendarMode = React.useCallback(value => {\r\n setUseStartInCalendarMode(false);\r\n _setCalendarMode(value);\r\n }, [_setCalendarMode, setUseStartInCalendarMode]);\r\n\r\n // User can toggle showing older items in the list or not.\r\n const [isShowingPastItemsInList, toggleShowingPastItemsInList] = useToggleState(false);\r\n\r\n // Check that lets us customise the expierence for the current month\r\n const isCalendarDateCurrentMonth = React.useMemo(() => {\r\n return (calendarDate.startOf('month').toISOString() === moment().startOf('month').toISOString());\r\n }, [calendarDate]);\r\n\r\n // Filter\r\n const [isFilterOpen, toggleFilter] = useToggleState(false);\r\n const filterSummary = React.useMemo(() => { \r\n // Work out details needed to let us show a useful summary of the applied filter.\r\n return {\r\n includedEventTypes: calendarEventTypes?.filter(it => !isEventTypeExcluded(it.id)) ?? [],\r\n excludedEventTypes: calendarEventTypes?.filter(it => isEventTypeExcluded(it.id)) ?? [],\r\n includedSchoolTypes: itemTags?.filter(it => it.tagType === 'SchoolType')?.filter(it => !isSchoolTypeExcluded(it.id)) ?? [],\r\n excludedSchoolTypes: itemTags?.filter(it => it.tagType === 'SchoolType')?.filter(it => isSchoolTypeExcluded(it.id)) ?? [],\r\n includedSchoolPhases: itemTags?.filter(it => it.tagType === 'SchoolPhase')?.filter(it => !isSchoolPhaseExcluded(it.id)) ?? [],\r\n excludedSchoolPhases: itemTags?.filter(it => it.tagType === 'SchoolPhase')?.filter(it => isSchoolPhaseExcluded(it.id)) ?? [],\r\n }\r\n }, [isSchoolPhaseExcluded, isSchoolTypeExcluded, isEventTypeExcluded, calendarEventTypes, itemTags]);\r\n\r\n // Render the UI.\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 search ? (\r\n <>\r\n {t('calendarHome.main.searchingTitle', 'Events matching \"{{ search }}\"', { search })}\r\n <> \r\n \r\n ): (\r\n <>\r\n {t('calendarHome.main.title', 'What\\'s coming up')}\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 \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {t('calendarHome.filter.eventTypes', 'Types of event:')}\r\n \r\n \r\n !isEventTypeExcluded(id)} toggle={id => toggleEventTypeExcluded(id)} />\r\n \r\n \r\n \r\n \r\n {t('calendarHome.filter.schoolTypes', 'School type:')}\r\n \r\n \r\n it.tagType === 'SchoolType') ?? []} isSelected={id => !isSchoolTypeExcluded(id)} toggle={id => toggleSchoolTypeExcluded(id)} />\r\n \r\n \r\n \r\n \r\n {t('calendarHome.filter.schoolTypes', 'School phase:')}\r\n \r\n \r\n it.tagType === 'SchoolPhase') ?? []} isSelected={id => !isSchoolPhaseExcluded(id)} toggle={id => toggleSchoolPhaseExcluded(id)} />\r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n setCalendarDate(date)}\r\n headlines={headlines ?? []}\r\n images={imageBlobReferences ?? []}\r\n calendarMode={calendarMode}\r\n />\r\n openEvent(schedule)} />\r\n \r\n\r\n \r\n 0}>\r\n
toggleShowingPastItemsInList()}>\r\n {\r\n isShowingPastItemsInList ?\r\n t('common.showingPastEventsMessage', 'We\\'re including {{ count, #, 0}} historical events. Click here to hide these historical events.', { count: pastEventsCount })\r\n : t('common.hiddingPastEventsMessage', 'We\\'ve hidden {{count, #,0}} historical events for you to show you only future events. Click here to view these historical events.', { count: pastEventsCount })\r\n }\r\n <> \r\n \r\n
\r\n
\r\n\r\n {\r\n listViewGroupedSchedules.map(month => {\r\n // Only show months with only past items if the user has asked for it.\r\n if (!isShowingPastItemsInList && !month.days.filter(day => !day.isPast).length) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n setCalendarDate(date)}\r\n headlines={headlines ?? []}\r\n images={imageBlobReferences ?? []}\r\n calendarMode={calendarMode}\r\n />\r\n
\r\n {/* Need some space between the headline and the items in list mode */}\r\n
\r\n {\r\n month.days?.map(day => {\r\n // Only show past items if the user has asked for it.\r\n if (!isShowingPastItemsInList && day.isPast) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {\r\n day.items.map(item => (\r\n openEvent(item)}\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 !listViewGroupedSchedules?.length ? (\r\n \r\n

\r\n {\r\n search ?\r\n t('calendarHome.nothingMatchedSearch', 'Sorry there were no events matching your search of \"{{search}}.\"', { date: calendarDate, search: search })\r\n : t('calendarHome.nothingFound', 'There are no events listed at the moment.', { date: calendarDate, })\r\n }\r\n

\r\n
\r\n )\r\n : !isShowingPastItemsInList && futureEventsCount === 0 && pastEventsCount > 0 ? (\r\n \r\n

\r\n {\r\n search ?\r\n t('calendarHome.nothingMatchedSearchFuture', 'Sorry there were no future events matching your search for \"{{search}}.\"', { date: calendarDate, search: search })\r\n : t('calendarHome.nothingFoundFuture', 'There are no future events listed at the moment.', { date: calendarDate, })\r\n }\r\n

\r\n

\r\n \r\n

\r\n
\r\n )\r\n : null\r\n }\r\n \r\n
\r\n
\r\n \r\n \r\n

\r\n {t('calendarHome.thisWeek.title', 'This week')}\r\n

\r\n\r\n {\r\n thisWeekSchedules.map(day => (\r\n \r\n \r\n {\r\n day.items.map(item => (\r\n openEvent(item)}\r\n />\r\n ))\r\n }\r\n \r\n \r\n ))\r\n }\r\n\r\n

\r\n {t('calendarHome.planAhead.title', 'Plan ahead')}\r\n

\r\n {\r\n featuredSchedules.map(day => (\r\n \r\n \r\n {\r\n day.items.map(item => (\r\n openEvent(item)}\r\n />\r\n ))\r\n }\r\n \r\n \r\n ))\r\n }\r\n \r\n
\r\n
\r\n \r\n closeEvent()}\r\n model={eventModelForModal as CalendarHomeScheduleViewModel /* We know its not undefined at this point so can safely cast. */}\r\n />\r\n \r\n\r\n \r\n
\r\n );\r\n};","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadOptions, AsyncLoadResult } from '../../../../shared/abstractStore';\r\nimport { calendarHomeViewModelQuery, calendarHomeViewModelQueryVariables } from '../../generated/calendarHomeViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventScheduleFieldsFragment } from '../../models/CalendarEventSchedule';\r\nimport { calendarEventFieldsFragment } from '../../models/CalendarEvent';\r\nimport { calendarEventUrlFieldsFragment } from '../../models/CalendarEventUrl';\r\nimport { itemTagLinkFieldsFragment } from '../../models/ItemTagLink';\r\nimport { calendarEventCalendarEventProviderFieldsFragment } from '../../models/CalendarEventCalendarEventProvider';\r\n\r\nexport interface CalendarHomeViewModelAsyncLoadOptions extends AsyncLoadOptions {\r\n fromDate?: string,\r\n toDate?: string,\r\n}\r\n\r\n/**\r\n * View model for Calendar that loads the scheduled events and related data.\r\n * @param options\r\n */\r\nexport function useCalendarHomeViewModel(options: CalendarHomeViewModelAsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, }] = useLazyQuery(\r\n gql`\r\n query calendarHomeViewModelQuery ($fromDate: DateTimeOffset, $toDate: DateTimeOffset) {\r\n schedules: calendarEventSchedules (fromDate: $fromDate, toDate: $toDate) {\r\n ...calendarEventScheduleFields\r\n }\r\n\r\n calendarEvents {\r\n ...calendarEventFields\r\n }\r\n\r\n calendarEventCalendarEventProviders {\r\n ...calendarEventCalendarEventProviderFields\r\n }\r\n\r\n itemTagLinks {\r\n ...itemTagLinkFields\r\n }\r\n\r\n calendarEventUrls {\r\n ...calendarEventUrlFields\r\n }\r\n }\r\n\r\n ${calendarEventScheduleFieldsFragment}\r\n ${calendarEventScheduleFieldsFragment}\r\n ${calendarEventFieldsFragment}\r\n ${calendarEventCalendarEventProviderFieldsFragment}\r\n ${calendarEventUrlFieldsFragment}\r\n ${itemTagLinkFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { calendarHomeSupportingDataQuery } from '../../generated/calendarHomeSupportingDataQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventTypeFieldsFragment } from '../../models/CalendarEventType';\r\nimport { itemTagFieldsFragment } from '../../models/ItemTag';\r\nimport { calendarEventProviderFieldsFragment } from '../../models/CalendarEventProvider';\r\nimport { calendarHeadlineFieldsFragment } from '../../models/CalendarHeadline';\r\n\r\n/**\r\n * Supporting data for CalendarHome that loads static data (e.g. dropdowns) that are not changed by the model being used.\r\n * @param options\r\n */\r\nexport function useCalendarHomeSupportingData(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query calendarHomeSupportingDataQuery {\r\n calendarEventTypes {\r\n ...calendarEventTypeFields\r\n }\r\n\r\n itemTags {\r\n ...itemTagFields\r\n }\r\n\r\n providers: calendarEventProviders {\r\n ...calendarEventProviderFields\r\n }\r\n\r\n headlines: calendarHeadlines {\r\n ...calendarHeadlineFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n ${itemTagFieldsFragment}\r\n ${calendarEventProviderFieldsFragment}\r\n ${calendarHeadlineFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { blobReferencesQuery, blobReferencesQueryVariables } from '../generated/blobReferencesQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { blobReferenceFieldsFragment } from '../models/BlobReference';\r\n\r\n/**\r\n * Get a list of blobReferences from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useBlobReferences(options: AsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query blobReferencesQuery ($offset: Int, $first: Int) {\r\n items: blobReferences (offset: $offset, first: $first) {\r\n ...blobReferenceFields\r\n }\r\n }\r\n\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import { BlobReference } from \"../../api/main/models/BlobReference\";\r\nimport { CalendarEvent } from \"../../api/main/models/CalendarEvent\";\r\nimport { CalendarEventCalendarEventProvider } from \"../../api/main/models/CalendarEventCalendarEventProvider\";\r\nimport { CalendarEventProvider } from \"../../api/main/models/CalendarEventProvider\";\r\nimport { CalendarEventSchedule } from \"../../api/main/models/CalendarEventSchedule\";\r\nimport { CalendarEventType } from \"../../api/main/models/CalendarEventType\";\r\nimport { CalendarEventUrl } from \"../../api/main/models/CalendarEventUrl\";\r\nimport { ItemTag } from \"../../api/main/models/ItemTag\";\r\nimport { ItemTagLink } from \"../../api/main/models/ItemTagLink\";\r\nimport { CalendarHomeScheduleViewModel } from \"./CalendarHomeScheduleViewModel\";\r\n\r\n/**\r\n * Create a CalendarHomeScheduleViewModel for schedule.\r\n * @param schedule\r\n */\r\nexport function generateCalendarHomeScheduleViewModel(schedule: CalendarEventSchedule, optionalData: {\r\n calendarEvents: Array | undefined | null,\r\n calendarEventProviderLinks: Array | undefined | null,\r\n calendarEventUrls: Array | undefined | null,\r\n itemTagLinks: Array | undefined | null,\r\n providers: Array | undefined | null,\r\n eventTypes: Array | undefined | null,\r\n itemTags: Array | undefined | null,\r\n blobReferences: Array | undefined | null,\r\n}): CalendarHomeScheduleViewModel {\r\n const {\r\n calendarEvents,\r\n calendarEventProviderLinks,\r\n calendarEventUrls,\r\n itemTagLinks,\r\n providers,\r\n eventTypes,\r\n itemTags,\r\n blobReferences,\r\n } = optionalData;\r\n\r\n const calendarEvent = calendarEvents?.find(it => it.id === schedule.calendarEventId);\r\n const eventType = eventTypes?.find(it => it.id === calendarEvent?.calendarEventTypeId);\r\n const myCalendarEventProviderLinks = calendarEventProviderLinks?.filter(it => it.calendarEventId === calendarEvent?.id) ?? [];\r\n const myCalendarEventUrls = calendarEventUrls?.filter(it => it.calendarEventId === calendarEvent?.id) ?? [];\r\n const myItemTagLinks = itemTagLinks?.filter(it => it.targetId === calendarEvent?.id) ?? [];\r\n const imageBlobReference = blobReferences?.find(it => it.id === calendarEvent?.imageBlobReferenceId);\r\n\r\n return {\r\n ...schedule,\r\n calendarEvent: !calendarEvent? undefined : {\r\n ...calendarEvent,\r\n providers: myCalendarEventProviderLinks.map(item => {\r\n const provider = providers?.find(it => it.id === item.calendarEventProviderId);\r\n const image = blobReferences?.find(it => it.id === provider?.imageBlobReferenceId);\r\n return {\r\n ...item,\r\n provider: !provider? undefined: {\r\n ...provider,\r\n imageBlobReference: image,\r\n },\r\n };\r\n }),\r\n tagLinks: myItemTagLinks.map(item => {\r\n const tagLinks = itemTags?.find(it => it.id === item.itemTagId);\r\n return {\r\n ...item,\r\n itemTag: tagLinks,\r\n };\r\n }),\r\n urls: myCalendarEventUrls,\r\n eventType: eventType,\r\n imageBlobReference: imageBlobReference,\r\n }\r\n };\r\n}","import { RouteEntry } from \"../../shared/routes\";\r\nimport { CalendarHome } from \"./CalendarHome\";\r\nimport { SearchCalendar } from \"./SearchCalendar\";\r\n\r\nexport const calendarRoutes: Array = [\r\n { path: '/calendar/search/:searchText?', component: SearchCalendar, authorize: true, },\r\n { path: '/calendar/:ignoredEventName?/:calendarEventScheduleId?', exact: true, component: CalendarHome, authorize: true, },\r\n];\r\n","import * as React from 'react';\r\nimport { useParams } from \"react-router\";\r\nimport { useGlobalSearchText } from \"../../globalState/globalSearchText/useGlobalSearchText\";\r\nimport { CalendarHome } from './CalendarHome';\r\n\r\n/**\r\n * Component that handles routing based searching of the calendar.\r\n */\r\nexport const SearchCalendar = () => {\r\n const {\r\n searchText\r\n } = useParams<{ searchText: string | undefined }>();\r\n const [, setGlobalSearchText] = useGlobalSearchText();\r\n\r\n // Set the global search text to reflect the one we found on the route.\r\n React.useEffect(() => {\r\n setGlobalSearchText(searchText ?? '');\r\n }, [searchText, setGlobalSearchText]);\r\n\r\n // Render the CalendarHome component as our whole UI.\r\n return ();\r\n};","import './colorDisplay.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface ColorDisplayProps {\r\n color: string | undefined,\r\n className?: string,\r\n style?: React.CSSProperties,\r\n}\r\n\r\n/**\r\n * Display of a color (similar to an input of type color but not editable and a div rather than an input).\r\n */\r\nexport const ColorDisplay = (props: ColorDisplayProps) => {\r\n const { color, className, style } = props;\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n {\r\n color ? t('colorDisplay.color', 'Colour: {{color}}', { color })\r\n : t('colorDisplay.noColor', 'No colour')\r\n }\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { calendarEventTypeQuery, calendarEventTypeQueryVariables } from '../generated/calendarEventTypeQuery';\r\nimport { calendarEventTypeFieldsFragment } from '../models/CalendarEventType';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a CalendarEventType from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCalendarEventType(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query calendarEventTypeQuery ($id: ID!) {\r\n model: calendarEventType(id: $id) {\r\n ...calendarEventTypeFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventTypeCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventTypeMutation, createCalendarEventTypeMutationVariables } from '../generated/createCalendarEventTypeMutation';\r\nimport { calendarEventTypeFieldsFragment } from '../models/CalendarEventType';\r\n\r\n/**\r\n * Get a callback to create a CalendarEventType in the store.\r\n */\r\nexport function useCreateCalendarEventTypeCallback(): [(model: CalendarEventTypeCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventTypeMutation ($model: CalendarEventTypeCreateInput!) {\r\n createCalendarEventType(model: $model) {\r\n ...calendarEventTypeFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventTypeCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventTypeUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventTypeMutation, updateCalendarEventTypeMutationVariables } from '../generated/updateCalendarEventTypeMutation';\r\nimport { calendarEventTypeFieldsFragment } from '../models/CalendarEventType';\r\n\r\n/**\r\n * Get a callback to update a CalendarEventType in the store.\r\n */\r\nexport function useUpdateCalendarEventTypeCallback(): [(id: string, model: CalendarEventTypeUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventTypeMutation ($model: CalendarEventTypeUpdateInput!) {\r\n updateCalendarEventType(model: $model) {\r\n ...calendarEventTypeFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventTypeUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useCalendarEventType } from '../../api/main/calendarEventTypes/useCalendarEventType';\r\nimport { useSaveCalendarEventTypeCallback } from '../../api/main/calendarEventTypes/useSaveCalendarEventTypeCallback';\r\nimport { CalendarEventType } from '../../api/main/models/CalendarEventType';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\ninterface EditCalendarEventTypeProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CalendarEventType.\r\n */\r\nexport const CreateCalendarEventType = () => ();\r\n\r\n/**\r\n * Edit a CalendarEventType.\r\n */\r\nexport const EditCalendarEventType = (props: EditCalendarEventTypeProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useCalendarEventType(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', displayOrder: 99, color: '#000000' } : {});\r\n const [save, { errors: saveErrors }] = useSaveCalendarEventTypeCallback();\r\n const history = useHistory();\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCalendarEventType.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCalendarEventType.createHeading', 'Add event type')}\r\n ): (\r\n <>{t('editCalendarEventType.editHeading', 'Edit event type')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n change({ displayOrder: e.currentTarget.valueAsNumber })} onBlur={e => validate('displayOrder')} validationErrors={validationErrors['displayOrder']} />\r\n \r\n \r\n \r\n change({ color: e.currentTarget.value })} onBlur={e => validate('color')} validationErrors={validationErrors['color']} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { CalendarEventTypeCreateInput, CalendarEventTypeUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventTypeCallback } from './useCreateCalendarEventTypeCallback';\r\nimport { useUpdateCalendarEventTypeCallback } from './useUpdateCalendarEventTypeCallback';\r\nimport { CalendarEventType } from '../models/CalendarEventType';\r\n\r\n/**\r\n * Get a callback to save a CalendarEventType in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventTypeCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventTypeCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventTypeCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventTypeCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventTypeUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCalendarEventType } from '../../api/main/calendarEventTypes/useCalendarEventType';\r\nimport { useDeleteCalendarEventTypeCallback } from '../../api/main/calendarEventTypes/useDeleteCalendarEventTypeCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a CalendarEventType.\r\n */\r\nexport const DeleteCalendarEventType = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCalendarEventType(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCalendarEventTypeCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCalendarEventType.heading', 'Delete event type?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { CalendarEventTypesList } from \"./CalendarEventTypesList\";\r\nimport { EditCalendarEventType, CreateCalendarEventType } from \"./EditCalendarEventType\";\r\nimport { DeleteCalendarEventType } from \"./DeleteCalendarEventType\";\r\n\r\nexport const calendarEventTypeRoutes: Array = [\r\n { path: '/administration/event-types', exact: true, component: CalendarEventTypesList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/event-types/edit/:id', component: EditCalendarEventType, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/event-types/add', component: CreateCalendarEventType, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/event-types/delete/:id', component: DeleteCalendarEventType, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useCalendarEventTypes } from '../../api/main/calendarEventTypes/useCalendarEventTypes';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { ColorDisplay } from '../shared/colorDisplay/ColorDisplay';\r\n\r\n\r\n/**\r\n * List of CalendarEventTypes.\r\n */\r\nexport const CalendarEventTypesList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCalendarEventTypes({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.integer', '{{value, #,0}}', { value: item.displayOrder }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 5;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('calendarEventTypesList.heading', 'Event types')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/event-types/edit/${item.id}`)}>\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
{t('calendarEventTypesList.eventType', 'Event type')}{t('calendarEventTypesList.name', 'Name')}{t('calendarEventTypesList.displayOrder', 'Order')}{t('calendarEventTypesList.color', 'Colour')} 
\r\n
{item.name}
\r\n
{item.name}{t('common.integer', '{{value, #,0}}', { value: item.displayOrder })}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { calendarEventTypesQuery, calendarEventTypesQueryVariables } from '../generated/calendarEventTypesQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { calendarEventTypeFieldsFragment } from '../models/CalendarEventType';\r\n\r\nexport interface CalendarEventTypesAsyncLoadPagedOptions extends AsyncLoadPagedOptions {\r\n includeArchived?: boolean,\r\n}\r\n\r\n/**\r\n * Get a list of calendarEventTypes from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCalendarEventTypes(options: CalendarEventTypesAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query calendarEventTypesQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: calendarEventTypes (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...calendarEventTypeFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventTypeMutation, deleteCalendarEventTypeMutationVariables } from '../generated/deleteCalendarEventTypeMutation';\r\nimport { calendarEventTypeFieldsFragment } from '../models/CalendarEventType';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEventType in the store.\r\n */\r\nexport function useDeleteCalendarEventTypeCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventTypeMutation ($id: ID!) {\r\n deleteCalendarEventType(id: $id) {\r\n ...calendarEventTypeFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import './uploadedImagePreview.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\n\r\nexport interface UploadedImagePreviewProps {\r\n src: string,\r\n alt?: string,\r\n\r\n size?: 'sm' | 'lg',\r\n\r\n className?: string,\r\n style?: React.CSSProperties,\r\n}\r\n\r\n/**\r\n * Preview of an image uploaded by a user, suitable for use on an Edit form for example and made to look similar to other controls that would show in that context.\r\n */\r\nexport const UploadedImagePreview = (props: UploadedImagePreviewProps) => {\r\n const {\r\n src,\r\n alt,\r\n size = 'lg',\r\n className,\r\n style,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n \r\n {alt\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n

\r\n {\r\n t('uploadedImagePreview.notImageText', 'No image has been uploaded yet')\r\n }\r\n

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventProviderCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventProviderMutation, createCalendarEventProviderMutationVariables } from '../generated/createCalendarEventProviderMutation';\r\nimport { calendarEventProviderFieldsFragment } from '../models/CalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to create a CalendarEventProvider in the store.\r\n */\r\nexport function useCreateCalendarEventProviderCallback(): [(model: CalendarEventProviderCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventProviderMutation ($model: CalendarEventProviderCreateInput!) {\r\n createCalendarEventProvider(model: $model) {\r\n ...calendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventProviderCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventProviderUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventProviderMutation, updateCalendarEventProviderMutationVariables } from '../generated/updateCalendarEventProviderMutation';\r\nimport { calendarEventProviderFieldsFragment } from '../models/CalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to update a CalendarEventProvider in the store.\r\n */\r\nexport function useUpdateCalendarEventProviderCallback(): [(id: string, model: CalendarEventProviderUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventProviderMutation ($model: CalendarEventProviderUpdateInput!) {\r\n updateCalendarEventProvider(model: $model) {\r\n ...calendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventProviderUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import './fileUploadButton.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Label, Input } from 'reactstrap';\r\n\r\nexport interface FileUploadButtonProps {\r\n color?: string,\r\n outline?: boolean,\r\n onUpload?: (files: FileList | null) => void,\r\n\r\n isExecuting?: boolean;\r\n executingChildren?: React.ReactNode;\r\n\r\n className?: string,\r\n style?: React.CSSProperties,\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Button for uploading files without showing the file input of the browser.\r\n */\r\nexport const FileUploadButton = (props: FileUploadButtonProps) => {\r\n const {\r\n color = 'primary',\r\n outline = true,\r\n className,\r\n style,\r\n children,\r\n onUpload,\r\n isExecuting,\r\n executingChildren,\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { BlobReference } from '../models/BlobReference';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { BlobUploadService } from './BlobUploadService';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { useServices } from 'inject-typesafe-react';\r\nimport { AppServices } from '../../../configure/configureServices';\r\n\r\n/**\r\n * Get a callback to upload blobs in bulk.\r\n */\r\nexport function useBulkUploadBlobsCallback() {\r\n const apiFetch = useServices((services: AppServices) => services.apiFetch());\r\n\r\n return useAsyncCallback(async (files: FileList): Promise> => {\r\n const uploadService = new BlobUploadService(mainApiConfig.blobUploadEndpoint, apiFetch);\r\n const ret = await uploadService.uploadMultiple(files);\r\n return ret ?? [];\r\n }, [apiFetch]);\r\n}\r\n\r\n/**\r\n * Get a callback to upload a blob.\r\n */\r\nexport function useUploadBlobCallback() {\r\n const apiFetch = useServices((services: AppServices) => services.apiFetch());\r\n\r\n return useAsyncCallback(async (files: FileList): Promise => {\r\n const uploadService = new BlobUploadService(mainApiConfig.blobUploadEndpoint, apiFetch);\r\n const ret = await uploadService.upload(files);\r\n return ret;\r\n }, [apiFetch]);\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col, ButtonGroup } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCalendarEventProviderCallback } from '../../api/main/calendarEventProviders/useSaveCalendarEventProviderCallback';\r\nimport { CalendarEventProvider } from '../../api/main/models/CalendarEventProvider';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { HtmlEditor } from '../../shared/htmlEditor';\r\nimport { FileUploadButton } from '../shared/fileUploadButton/FileUploadButton';\r\nimport { useUploadBlobCallback } from '../../api/main/blobReferences/useUploadBlobCallback';\r\nimport { BlobReference } from '../../api/main/models/BlobReference';\r\nimport { useEditCalendarEventProviderViewModel } from '../../api/main/calendarEventProviders/viewModels/useEditCalendarEventProviderViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\n\r\ninterface EditCalendarEventProviderProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CalendarEventProvider.\r\n */\r\nexport const CreateCalendarEventProvider = () => ();\r\n\r\n/**\r\n * Edit a CalendarEventProvider.\r\n */\r\nexport const EditCalendarEventProvider = (props: EditCalendarEventProviderProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useEditCalendarEventProviderViewModel(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', descriptionHtml: '', displayOrder: 99, color: '#000000' } : {});\r\n const [save, { errors: saveErrors }] = useSaveCalendarEventProviderCallback();\r\n const history = useHistory();\r\n\r\n\r\n // Image display and uploading.\r\n const [imageBlob, setImageBlob] = React.useState();\r\n React.useEffect(() => setImageBlob(storeModel?.imageBlobReference), [storeModel]);\r\n\r\n const [uploadBlob] = useUploadBlobCallback();\r\n const [uploadImageBlob, { isExecuting: isUploadingImageBlob, errors: uploadImageBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ imageBlobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setImageBlob(blob);\r\n }, [uploadBlob, change, setImageBlob]);\r\n\r\n const clearImage = React.useCallback(() => {\r\n change({ imageBlobReferenceId: null });\r\n setImageBlob(null);\r\n }, [change]);\r\n\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCalendarEventProvider.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCalendarEventProvider.createHeading', 'Add provider')}\r\n ): (\r\n <>{t('editCalendarEventProvider.editHeading', 'Edit provider')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n uploadImageBlob(files)} isExecuting={isUploadingImageBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCalendarEventProvider.uploadLogo', 'Upload logo...')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ displayOrder: e.currentTarget.valueAsNumber })} onBlur={e => validate('displayOrder')} validationErrors={validationErrors['displayOrder']} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n change({ descriptionHtml: value })} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCalendarEventProviderViewModelQuery, editCalendarEventProviderViewModelQueryVariables } from '../../generated/editCalendarEventProviderViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventProviderFieldsFragment } from '../../models/CalendarEventProvider';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { Guid } from 'guid-string';\r\n\r\n/**\r\n * View model for EditCalendarEventProvider that replaces the call to useCalendarEventProvider() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useEditCalendarEventProviderViewModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCalendarEventProviderViewModelQuery ($id: ID!) {\r\n model: calendarEventProvider(id: $id) {\r\n ...calendarEventProviderFields\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { CalendarEventProviderCreateInput, CalendarEventProviderUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventProviderCallback } from './useCreateCalendarEventProviderCallback';\r\nimport { useUpdateCalendarEventProviderCallback } from './useUpdateCalendarEventProviderCallback';\r\nimport { CalendarEventProvider } from '../models/CalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to save a CalendarEventProvider in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventProviderCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventProviderCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventProviderCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventProviderCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventProviderUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCalendarEventProvider } from '../../api/main/calendarEventProviders/useCalendarEventProvider';\r\nimport { useDeleteCalendarEventProviderCallback } from '../../api/main/calendarEventProviders/useDeleteCalendarEventProviderCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a CalendarEventProvider.\r\n */\r\nexport const DeleteCalendarEventProvider = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCalendarEventProvider(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCalendarEventProviderCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCalendarEventProvider.heading', 'Delete provider?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { CalendarEventProvidersList } from \"./CalendarEventProvidersList\";\r\nimport { EditCalendarEventProvider, CreateCalendarEventProvider } from \"./EditCalendarEventProvider\";\r\nimport { DeleteCalendarEventProvider } from \"./DeleteCalendarEventProvider\";\r\n\r\nexport const calendarEventProviderRoutes: Array = [\r\n { path: '/administration/providers', exact: true, component: CalendarEventProvidersList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/providers/edit/:id', component: EditCalendarEventProvider, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/providers/add', component: CreateCalendarEventProvider, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/providers/delete/:id', component: DeleteCalendarEventProvider, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useCalendarEventProvidersListViewModel } from '../../api/main/calendarEventProviders/viewModels/useCalendarEventProvidersListViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\n\r\n\r\n/**\r\n * List of CalendarEventProviders.\r\n */\r\nexport const CalendarEventProvidersList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCalendarEventProvidersListViewModel({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.integer', '{{value, #,0}}', { value: item.displayOrder }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 5;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('calendarEventProvidersList.heading', 'Providers')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/providers/edit/${item.id}`)}>\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
{t('calendarEventProvidersList.provider', 'Provider')}{t('calendarEventProvidersList.name', 'Name')} {t('calendarEventProvidersList.displayOrder', 'Order')} 
\r\n
{item.name}
\r\n
{item.name}\r\n \r\n {t('common.integer', '{{value, #,0}}', { value: item.displayOrder })}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { calendarEventProvidersListViewModelQuery, calendarEventProvidersListViewModelQueryVariables } from '../../generated/calendarEventProvidersListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventProviderFieldsFragment } from '../../models/CalendarEventProvider';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { CalendarEventProvidersAsyncLoadPagedOptions } from '../useCalendarEventProviders';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\n\r\n/**\r\n * View model for CalendarEventProvidersList that replaces the call to useCalendarEventProviders() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useCalendarEventProvidersListViewModel(options: CalendarEventProvidersAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query calendarEventProvidersListViewModelQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: calendarEventProviders (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...calendarEventProviderFields\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { calendarEventProviderQuery, calendarEventProviderQueryVariables } from '../generated/calendarEventProviderQuery';\r\nimport { calendarEventProviderFieldsFragment } from '../models/CalendarEventProvider';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a CalendarEventProvider from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCalendarEventProvider(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query calendarEventProviderQuery ($id: ID!) {\r\n model: calendarEventProvider(id: $id) {\r\n ...calendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventProviderMutation, deleteCalendarEventProviderMutationVariables } from '../generated/deleteCalendarEventProviderMutation';\r\nimport { calendarEventProviderFieldsFragment } from '../models/CalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEventProvider in the store.\r\n */\r\nexport function useDeleteCalendarEventProviderCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventProviderMutation ($id: ID!) {\r\n deleteCalendarEventProvider(id: $id) {\r\n ...calendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import './calendarMonthHeadline.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Row, Col } from 'reactstrap';\r\nimport { CalendarHeadline } from '../../api/main/models/CalendarHeadline';\r\nimport { BlobReference } from '../../api/main/models/BlobReference';\r\nimport { HtmlDisplay } from '../../shared/htmlEditor';\r\n\r\nexport interface CalendarMonthHeadlinePreviewProps {\r\n model: CalendarHeadline,\r\n image: BlobReference | null | undefined,\r\n}\r\n\r\n/**\r\n * Component that mirrors CalendarMonthHeadline, but shows itself as a preview for the model passed in.\r\n * \r\n * NOTE this class shares the stylessheet from CalenderMonthHeadline\r\n */\r\nexport const CalendarMonthHeadlinePreview = (props: CalendarMonthHeadlinePreviewProps) => {\r\n const { model, image } = props;\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n

{model.name}

\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarHeadlineCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarHeadlineMutation, createCalendarHeadlineMutationVariables } from '../generated/createCalendarHeadlineMutation';\r\nimport { calendarHeadlineFieldsFragment } from '../models/CalendarHeadline';\r\n\r\n/**\r\n * Get a callback to create a CalendarHeadline in the store.\r\n */\r\nexport function useCreateCalendarHeadlineCallback(): [(model: CalendarHeadlineCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarHeadlineMutation ($model: CalendarHeadlineCreateInput!) {\r\n createCalendarHeadline(model: $model) {\r\n ...calendarHeadlineFields\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarHeadlineCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarHeadlineUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarHeadlineMutation, updateCalendarHeadlineMutationVariables } from '../generated/updateCalendarHeadlineMutation';\r\nimport { calendarHeadlineFieldsFragment } from '../models/CalendarHeadline';\r\n\r\n/**\r\n * Get a callback to update a CalendarHeadline in the store.\r\n */\r\nexport function useUpdateCalendarHeadlineCallback(): [(id: string, model: CalendarHeadlineUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarHeadlineMutation ($model: CalendarHeadlineUpdateInput!) {\r\n updateCalendarHeadline(model: $model) {\r\n ...calendarHeadlineFields\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarHeadlineUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { ValidatedInput, ValidatedInputProps } from 'pojo-validator-reactstrap';\r\nimport moment, { MomentInput } from 'moment';\r\n\r\nexport interface ValidatedDateTimeInputProps extends ValidatedInputProps {\r\n onChange?: (event: React.ChangeEvent) => void,\r\n format?: string\r\n}\r\n\r\n/**\r\n * Input with validation support for a datetime picker using moment() to keep our dates straight.\r\n * @param props\r\n */\r\nexport const ValidatedISODateTimeInput = (props: ValidatedDateTimeInputProps) => {\r\n const { type, value, format, onChange, ...rest } = props;\r\n const theType = type || 'datetime-local';\r\n const theFormat = format || (theType === 'datetime' || theType === 'datetime-local'? 'YYYY-MM-DD[T]HH:mm': 'YYYY-MM-DD');\r\n\r\n // Handle the value\r\n const theValue = React.useMemo(() => moment(value as MomentInput).local().format(theFormat), [value, theFormat]);\r\n\r\n // Wrap the real on change event to always return the ISO date string in UTC time.\r\n const onChangeWrapper = React.useCallback((event: React.ChangeEvent) => {\r\n if (onChange) {\r\n const newValue = moment(event.currentTarget.value).utc().toISOString();\r\n const newEvent = {\r\n ...event,\r\n currentTarget: {\r\n ...event.currentTarget,\r\n value: newValue,\r\n },\r\n target: {\r\n ...event.target,\r\n value: newValue,\r\n }\r\n };\r\n\r\n onChange(newEvent);\r\n }\r\n }, [onChange]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col, ButtonGroup } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCalendarHeadlineCallback } from '../../api/main/calendarHeadlines/useSaveCalendarHeadlineCallback';\r\nimport { CalendarHeadline } from '../../api/main/models/CalendarHeadline';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { HtmlEditor } from '../../shared/htmlEditor';\r\nimport { FileUploadButton } from '../shared/fileUploadButton/FileUploadButton';\r\nimport { useUploadBlobCallback } from '../../api/main/blobReferences/useUploadBlobCallback';\r\nimport { BlobReference } from '../../api/main/models/BlobReference';\r\nimport { useEditCalendarHeadlineViewModel } from '../../api/main/calendarHeadlines/viewModels/useEditCalendarHeadlineViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { ValidatedISODateTimeInput } from '../shared/ValidatedISODateTimeInput';\r\nimport moment from 'moment';\r\n\r\ninterface EditCalendarHeadlineProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CalendarHeadline.\r\n */\r\nexport const CreateCalendarHeadline = () => ();\r\n\r\n/**\r\n * Edit a CalendarHeadline.\r\n */\r\nexport const EditCalendarHeadline = (props: EditCalendarHeadlineProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useEditCalendarHeadlineViewModel(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', descriptionHtml: '', start: moment().startOf('month').toISOString(), } : {});\r\n const [save, { errors: saveErrors }] = useSaveCalendarHeadlineCallback();\r\n const history = useHistory();\r\n\r\n\r\n // Image display and uploading.\r\n const [imageBlob, setImageBlob] = React.useState();\r\n React.useEffect(() => setImageBlob(storeModel?.imageBlobReference), [storeModel]);\r\n\r\n const [uploadBlob] = useUploadBlobCallback();\r\n const [uploadImageBlob, { isExecuting: isUploadingImageBlob, errors: uploadImageBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ imageBlobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setImageBlob(blob);\r\n }, [uploadBlob, change, setImageBlob]);\r\n\r\n const clearImage = React.useCallback(() => {\r\n change({ imageBlobReferenceId: null });\r\n setImageBlob(null);\r\n }, [change]);\r\n\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCalendarHeadline.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCalendarHeadline.createHeading', 'Add headline')}\r\n ): (\r\n <>{t('editCalendarHeadline.editHeading', 'Edit headline')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ start: e.currentTarget.value, end: moment(e.currentTarget.value).add(1, 'month').toISOString() /* Headlines expire after a month */ })} onBlur={e => validate('start')} validationErrors={validationErrors['start']} />\r\n \r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n uploadImageBlob(files)} isExecuting={isUploadingImageBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCalendarHeadline.uploadBackgroundImage', 'Upload background image...')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n change({ descriptionHtml: value })} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCalendarHeadlineViewModelQuery, editCalendarHeadlineViewModelQueryVariables } from '../../generated/editCalendarHeadlineViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarHeadlineFieldsFragment } from '../../models/CalendarHeadline';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { Guid } from 'guid-string';\r\n\r\n/**\r\n * View model for EditCalendarHeadline that replaces the call to useCalendarHeadline() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useEditCalendarHeadlineViewModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCalendarHeadlineViewModelQuery ($id: ID!) {\r\n model: calendarHeadline(id: $id) {\r\n ...calendarHeadlineFields\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { CalendarHeadlineCreateInput, CalendarHeadlineUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarHeadlineCallback } from './useCreateCalendarHeadlineCallback';\r\nimport { useUpdateCalendarHeadlineCallback } from './useUpdateCalendarHeadlineCallback';\r\nimport { CalendarHeadline } from '../models/CalendarHeadline';\r\n\r\n/**\r\n * Get a callback to save a CalendarHeadline in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarHeadlineCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarHeadlineCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarHeadlineCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarHeadlineCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarHeadlineUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport moment, { Moment, MomentInput } from 'moment';\r\nimport { InputProps, Input } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface DateTimeInputProps extends InputProps {\r\n onChange?: (event: React.ChangeEvent) => void,\r\n format?: string,\r\n}\r\n\r\n/**\r\n * Input with validation support for a datetime picker using moment() to keep our dates straight.\r\n * @param props\r\n */\r\nexport const ISODateTimeInput = (props: DateTimeInputProps) => {\r\n const {\r\n type = 'datetime-local',\r\n value,\r\n format,\r\n onChange,\r\n plaintext,\r\n ...rest\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const theValue = React.useMemo(() => {\r\n // Use a moment to get the local datetime and format into formats supported by browser input tags.\r\n const theFormat = format || (type === 'datetime' || type === 'datetime-local' ? 'YYYY-MM-DD[T]HH:mm' : 'YYYY-MM-DD');\r\n const valueMoment: Moment = moment(value as MomentInput).local();\r\n let ret = '';\r\n if (valueMoment.isValid()) {\r\n ret = valueMoment.format(theFormat);\r\n }\r\n\r\n // Special handling for plainText rendering, in this case we need to format ready for consumption not for date picker.\r\n if (plaintext) {\r\n if (type === 'datetime' || type === 'datetime-local') {\r\n ret = t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: valueMoment });\r\n } else {\r\n ret = t('common.date', '{{date, DD/MM/YYYY}}', { date: valueMoment });\r\n }\r\n }\r\n\r\n return ret;\r\n }, [value, type, format, plaintext, t]);\r\n\r\n // Wrap the real on change event to always return the ISO date string in UTC time.\r\n const onChangeWrapper = React.useCallback((event: React.ChangeEvent) => {\r\n if (onChange) {\r\n const newValue = moment(event.currentTarget.value).utc().toISOString();\r\n const newEvent = {\r\n ...event,\r\n currentTarget: {\r\n ...event.currentTarget,\r\n value: newValue,\r\n },\r\n target: {\r\n ...event.target,\r\n value: newValue,\r\n }\r\n };\r\n\r\n onChange(newEvent);\r\n }\r\n }, [onChange]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { CalendarHeadlinesList } from \"./CalendarHeadlinesList\";\r\nimport { EditCalendarHeadline, CreateCalendarHeadline } from \"./EditCalendarHeadline\";\r\nimport { DeleteCalendarHeadline } from \"./DeleteCalendarHeadline\";\r\n\r\nexport const calendarHeadlineRoutes: Array = [\r\n { path: '/administration/headlines', exact: true, component: CalendarHeadlinesList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/headlines/edit/:id', component: EditCalendarHeadline, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/headlines/add', component: CreateCalendarHeadline, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/headlines/delete/:id', component: DeleteCalendarHeadline, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useCalendarHeadlinesListViewModel } from '../../api/main/calendarHeadlines/viewModels/useCalendarHeadlinesListViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { CalendarMonthHeadlinePreview } from '../calendar/CalendarMonthHeadlinePreview';\r\nimport moment from 'moment';\r\n\r\n\r\n/**\r\n * List of CalendarHeadlines.\r\n */\r\nexport const CalendarHeadlinesList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCalendarHeadlinesListViewModel({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.date', '{{date, DD/MM/YYYY}}', { date: moment(item.start) }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 5;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('calendarHeadlinesList.heading', 'Headlines')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n \r\n {\r\n items?.map(item => {\r\n const editUrl = `/administration/headlines/edit/${item.id}`;\r\n const onDoubleClick = () => history.push(editUrl);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('calendarHeadlinesList.headline', 'Headline')}{t('calendarHeadlinesList.start', 'Date')}{t('calendarHeadlinesList.name', 'Name')}  
\r\n
{t('common.date', '{{date, DD/MM/YYYY}}', { date: moment(item.start) })}
\r\n
{item.name}
\r\n
{t('common.date', '{{date, DD/MM/YYYY}}', { date: moment(item.start) })}{item.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {/* This row is here for maintaining visible striping in the table only */}\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 * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { calendarHeadlinesListViewModelQuery, calendarHeadlinesListViewModelQueryVariables } from '../../generated/calendarHeadlinesListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarHeadlineFieldsFragment } from '../../models/CalendarHeadline';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { CalendarHeadlinesAsyncLoadPagedOptions } from '../useCalendarHeadlines';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\n\r\n/**\r\n * View model for CalendarHeadlinesList that replaces the call to useCalendarHeadlines() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useCalendarHeadlinesListViewModel(options: CalendarHeadlinesAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query calendarHeadlinesListViewModelQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: calendarHeadlines (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...calendarHeadlineFields\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCalendarHeadline } from '../../api/main/calendarHeadlines/useCalendarHeadline';\r\nimport { useDeleteCalendarHeadlineCallback } from '../../api/main/calendarHeadlines/useDeleteCalendarHeadlineCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { ISODateTimeInput } from '../shared/ISODateTimeInput';\r\n\r\n/**\r\n * Delete a CalendarHeadline.\r\n */\r\nexport const DeleteCalendarHeadline = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCalendarHeadline(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCalendarHeadlineCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCalendarHeadline.heading', 'Delete headline?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { calendarHeadlineQuery, calendarHeadlineQueryVariables } from '../generated/calendarHeadlineQuery';\r\nimport { calendarHeadlineFieldsFragment } from '../models/CalendarHeadline';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a CalendarHeadline from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCalendarHeadline(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query calendarHeadlineQuery ($id: ID!) {\r\n model: calendarHeadline(id: $id) {\r\n ...calendarHeadlineFields\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarHeadlineMutation, deleteCalendarHeadlineMutationVariables } from '../generated/deleteCalendarHeadlineMutation';\r\nimport { calendarHeadlineFieldsFragment } from '../models/CalendarHeadline';\r\n\r\n/**\r\n * Get a callback to delete a CalendarHeadline in the store.\r\n */\r\nexport function useDeleteCalendarHeadlineCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarHeadlineMutation ($id: ID!) {\r\n deleteCalendarHeadline(id: $id) {\r\n ...calendarHeadlineFields\r\n }\r\n }\r\n\r\n ${calendarHeadlineFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { itemTagQuery, itemTagQueryVariables } from '../generated/itemTagQuery';\r\nimport { itemTagFieldsFragment } from '../models/ItemTag';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a ItemTag from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useItemTag(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query itemTagQuery ($id: ID!) {\r\n model: itemTag(id: $id) {\r\n ...itemTagFields\r\n }\r\n }\r\n\r\n ${itemTagFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ItemTagCreateInput } from '../generated/globalTypes';\r\nimport { createItemTagMutation, createItemTagMutationVariables } from '../generated/createItemTagMutation';\r\nimport { itemTagFieldsFragment } from '../models/ItemTag';\r\n\r\n/**\r\n * Get a callback to create a ItemTag in the store.\r\n */\r\nexport function useCreateItemTagCallback(): [(model: ItemTagCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createItemTagMutation ($model: ItemTagCreateInput!) {\r\n createItemTag(model: $model) {\r\n ...itemTagFields\r\n }\r\n }\r\n\r\n ${itemTagFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ItemTagCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ItemTagUpdateInput } from '../generated/globalTypes';\r\nimport { updateItemTagMutation, updateItemTagMutationVariables } from '../generated/updateItemTagMutation';\r\nimport { itemTagFieldsFragment } from '../models/ItemTag';\r\n\r\n/**\r\n * Get a callback to update a ItemTag in the store.\r\n */\r\nexport function useUpdateItemTagCallback(): [(id: string, model: ItemTagUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateItemTagMutation ($model: ItemTagUpdateInput!) {\r\n updateItemTag(model: $model) {\r\n ...itemTagFields\r\n }\r\n }\r\n\r\n ${itemTagFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: ItemTagUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { ItemTagCreateInput, ItemTagUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateItemTagCallback } from './useCreateItemTagCallback';\r\nimport { useUpdateItemTagCallback } from './useUpdateItemTagCallback';\r\nimport { ItemTag } from '../models/ItemTag';\r\n\r\n/**\r\n * Get a callback to save a ItemTag in the store using either a create or update.\r\n */\r\nexport function useSaveItemTagCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateItemTagCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as ItemTagCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateItemTagCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as ItemTagUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useSaveItemTagCallback } from '../../api/main/itemTags/useSaveItemTagCallback';\r\nimport { ItemTag } from '../../api/main/models/ItemTag';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\ninterface EditSchoolPhaseProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new SchoolPhase.\r\n */\r\nexport const CreateSchoolPhase = () => ();\r\n\r\n/**\r\n * Edit a SchoolPhase.\r\n */\r\nexport const EditSchoolPhase = (props: EditSchoolPhaseProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), tagType: 'SchoolPhase', name: '', displayOrder: 99, color: '#000000' } : {});\r\n const [save, { errors: saveErrors }] = useSaveItemTagCallback();\r\n const history = useHistory();\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editSchoolPhase.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editSchoolPhase.createHeading', 'Add school phase')}\r\n ): (\r\n <>{t('editSchoolPhase.editHeading', 'Edit school phase')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n change({ displayOrder: e.currentTarget.valueAsNumber })} onBlur={e => validate('displayOrder')} validationErrors={validationErrors['displayOrder']} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteItemTagMutation, deleteItemTagMutationVariables } from '../generated/deleteItemTagMutation';\r\nimport { itemTagFieldsFragment } from '../models/ItemTag';\r\n\r\n/**\r\n * Get a callback to delete a ItemTag in the store.\r\n */\r\nexport function useDeleteItemTagCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteItemTagMutation ($id: ID!) {\r\n deleteItemTag(id: $id) {\r\n ...itemTagFields\r\n }\r\n }\r\n\r\n ${itemTagFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useDeleteItemTagCallback } from '../../api/main/itemTags/useDeleteItemTagCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a SchoolPhase.\r\n */\r\nexport const DeleteSchoolPhase = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const [remove, { errors: removeErrors }] = useDeleteItemTagCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteSchoolPhase.heading', 'Delete school phase?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { SchoolPhasesList } from \"./SchoolPhasesList\";\r\nimport { EditSchoolPhase, CreateSchoolPhase } from \"./EditSchoolPhase\";\r\nimport { DeleteSchoolPhase } from \"./DeleteSchoolPhase\";\r\n\r\nexport const schoolPhaseRoutes: Array = [\r\n { path: '/administration/school-phases', exact: true, component: SchoolPhasesList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-phases/edit/:id', component: EditSchoolPhase, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-phases/add', component: CreateSchoolPhase, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-phases/delete/:id', component: DeleteSchoolPhase, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useItemTags } from '../../api/main/itemTags/useItemTags';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\n\r\n\r\n/**\r\n * List of SchoolPhases.\r\n */\r\nexport const SchoolPhasesList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useItemTags({ tagType: 'SchoolPhase', pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.integer', '{{value, #,0}}', { value: item.displayOrder }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 4;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('schoolPhasesList.heading', 'School phases')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/school-phases/edit/${item.id}`)}>\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
{t('schoolPhasesList.eventType', 'Event type')}{t('schoolPhasesList.name', 'Name')}{t('schoolPhasesList.displayOrder', 'Order')} 
\r\n
{item.name}
\r\n
{item.name}{t('common.integer', '{{value, #,0}}', { value: item.displayOrder })}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useSaveItemTagCallback } from '../../api/main/itemTags/useSaveItemTagCallback';\r\nimport { ItemTag } from '../../api/main/models/ItemTag';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\ninterface EditSchoolTypeProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new SchoolType.\r\n */\r\nexport const CreateSchoolType = () => ();\r\n\r\n/**\r\n * Edit a SchoolType.\r\n */\r\nexport const EditSchoolType = (props: EditSchoolTypeProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), tagType: 'SchoolType', name: '', displayOrder: 99, color: '#000000' } : {});\r\n const [save, { errors: saveErrors }] = useSaveItemTagCallback();\r\n const history = useHistory();\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editSchoolType.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editSchoolType.createHeading', 'Add school type')}\r\n ): (\r\n <>{t('editSchoolType.editHeading', 'Edit school type')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n change({ displayOrder: e.currentTarget.valueAsNumber })} onBlur={e => validate('displayOrder')} validationErrors={validationErrors['displayOrder']} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { SchoolTypesList } from \"./SchoolTypesList\";\r\nimport { EditSchoolType, CreateSchoolType } from \"./EditSchoolType\";\r\nimport { DeleteSchoolType } from \"./DeleteSchoolType\";\r\n\r\nexport const schoolTypeRoutes: Array = [\r\n { path: '/administration/school-types', exact: true, component: SchoolTypesList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-types/edit/:id', component: EditSchoolType, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-types/add', component: CreateSchoolType, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/school-types/delete/:id', component: DeleteSchoolType, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useItemTags } from '../../api/main/itemTags/useItemTags';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\n\r\n\r\n/**\r\n * List of SchoolTypes.\r\n */\r\nexport const SchoolTypesList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useItemTags({ tagType: 'SchoolType', pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.integer', '{{value, #,0}}', { value: item.displayOrder }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 4;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('schoolTypesList.heading', 'School types')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/school-types/edit/${item.id}`)}>\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
{t('schoolTypesList.eventType', 'Event type')}{t('schoolTypesList.name', 'Name')}{t('schoolTypesList.displayOrder', 'Order')} 
\r\n
{item.name}
\r\n
{item.name}{t('common.integer', '{{value, #,0}}', { value: item.displayOrder })}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useDeleteItemTagCallback } from '../../api/main/itemTags/useDeleteItemTagCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a SchoolType.\r\n */\r\nexport const DeleteSchoolType = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const [remove, { errors: removeErrors }] = useDeleteItemTagCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteSchoolType.heading', 'Delete school type?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useSaveItemTagCallback } from '../../api/main/itemTags/useSaveItemTagCallback';\r\nimport { ItemTag } from '../../api/main/models/ItemTag';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\ninterface EditTagProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new Tag.\r\n */\r\nexport const CreateTag = () => ();\r\n\r\n/**\r\n * Edit a Tag.\r\n */\r\nexport const EditTag = (props: EditTagProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), tagType: 'Other', name: '', displayOrder: 99, color: '#000000' } : {});\r\n const [save, { errors: saveErrors }] = useSaveItemTagCallback();\r\n const history = useHistory();\r\n \r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editTag.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editTag.createHeading', 'Add keyword')}\r\n ): (\r\n <>{t('editTag.editHeading', 'Edit keyword')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n change({ displayOrder: e.currentTarget.valueAsNumber })} onBlur={e => validate('displayOrder')} validationErrors={validationErrors['displayOrder']} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { TagsList } from \"./TagsList\";\r\nimport { EditTag, CreateTag } from \"./EditTag\";\r\nimport { DeleteTag } from \"./DeleteTag\";\r\n\r\nexport const tagRoutes: Array = [\r\n { path: '/administration/keywords', exact: true, component: TagsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/keywords/edit/:id', component: EditTag, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/keywords/add', component: CreateTag, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/keywords/delete/:id', component: DeleteTag, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useItemTags } from '../../api/main/itemTags/useItemTags';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\n\r\n\r\n/**\r\n * List of Tags.\r\n */\r\nexport const TagsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useItemTags({ tagType: 'Other', pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || t('common.integer', '{{value, #,0}}', { value: item.displayOrder }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 4;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('tagsList.heading', 'Keywords')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => (\r\n history.push(`/administration/keywords/edit/${item.id}`)}>\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
{t('tagsList.eventType', 'Event type')}{t('tagsList.name', 'Name')}{t('tagsList.displayOrder', 'Order')} 
\r\n
{item.name}
\r\n
{item.name}{t('common.integer', '{{value, #,0}}', { value: item.displayOrder })}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useItemTag } from '../../api/main/itemTags/useItemTag';\r\nimport { useDeleteItemTagCallback } from '../../api/main/itemTags/useDeleteItemTagCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a Tag.\r\n */\r\nexport const DeleteTag = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useItemTag(id);\r\n const [remove, { errors: removeErrors }] = useDeleteItemTagCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteTag.heading', 'Delete keyword?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useCalendarEventsListViewModel } from '../../api/main/calendarEvents/viewModels/useCalendarEventsListViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { scheduleDescription } from '../../utilities/scheduleDescription';\r\nimport { EventTypeColorBlock } from '../shared/calendar/EventTypeColorBlock';\r\n\r\n\r\n/**\r\n * List of CalendarEvents.\r\n */\r\nexport const CalendarEventsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCalendarEventsListViewModel({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.eventType.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.providers.filter(it => it.provider.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0).length\r\n || item.schedules.filter(it => scheduleDescription(it).toLocaleLowerCase().indexOf(lowerSearch) >= 0).length\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 7;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('calendarEventsList.heading', 'Events')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n <> {t('calendarEventsList.export', 'Export to Excel')}\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 {\r\n items?.map(item => {\r\n const editUrl = `/administration/events/edit/${item.id}`;\r\n const onDoubleClick = () => history.push(editUrl);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {item.eventType.name}\r\n \r\n \r\n
\r\n {\r\n item.schedules.map(item => (\r\n
\r\n {scheduleDescription(item)}\r\n
\r\n ))\r\n }\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {item.eventType.name}\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 \r\n \r\n \r\n \r\n \r\n \r\n
{t('calendarEventsList.event', 'Event')}{t('calendarEventsList.name', 'Name')}{t('calendarEventsList.start', 'Date')}{t('calendarEventsList.eventType', 'Type of event')}{t('calendarEventsList.providers', 'Providers')}  
\r\n
{item.name}
\r\n \r\n
{item.name}\r\n {\r\n item.schedules.map(item => (\r\n
\r\n {scheduleDescription(item)}\r\n
\r\n ))\r\n }\r\n
\r\n \r\n
\r\n {\r\n item.providers.map(item => (\r\n
\r\n {item.provider.name}\r\n
\r\n ))\r\n }\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
*/}\r\n {/* */}{/* This row is here for maintaining visible striping in the table only */}\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 { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventMutation, createCalendarEventMutationVariables } from '../generated/createCalendarEventMutation';\r\nimport { calendarEventFieldsFragment } from '../models/CalendarEvent';\r\n\r\n/**\r\n * Get a callback to create a CalendarEvent in the store.\r\n */\r\nexport function useCreateCalendarEventCallback(): [(model: CalendarEventCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventMutation ($model: CalendarEventCreateInput!) {\r\n createCalendarEvent(model: $model) {\r\n ...calendarEventFields\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventMutation, updateCalendarEventMutationVariables } from '../generated/updateCalendarEventMutation';\r\nimport { calendarEventFieldsFragment } from '../models/CalendarEvent';\r\n\r\n/**\r\n * Get a callback to update a CalendarEvent in the store.\r\n */\r\nexport function useUpdateCalendarEventCallback(): [(id: string, model: CalendarEventUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventMutation ($model: CalendarEventUpdateInput!) {\r\n updateCalendarEvent(model: $model) {\r\n ...calendarEventFields\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport { ValidationErrors } from 'pojo-validator';\r\nimport { ValidateCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport * as React from 'react';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Col, FormGroup, Label, ListGroupItem, Row, InputGroup, InputGroupAddon } from 'reactstrap';\r\nimport { CalendarEventUrl } from '../../api/main/models/CalendarEventUrl';\r\nimport { getFullUrl } from '../../utilities/getFullUrl';\r\nimport { TrackedLink } from '../shared/trackedLink/TrackedLink';\r\n\r\nexport interface EventUrlProps {\r\n model: CalendarEventUrl,\r\n change: (changes: Partial) => void,\r\n validate: ValidateCallback,\r\n validationErrors: ValidationErrors,\r\n remove: () => void,\r\n singleItem?: boolean,\r\n}\r\n\r\n/**\r\n * Component for editing a URL attached to an event as a CalenderEventUrl.\r\n * @param props\r\n */\r\nexport const EventUrl = (props: EventUrlProps) => {\r\n const {\r\n model, change,\r\n validate, validationErrors,\r\n remove,\r\n singleItem = false,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ url: e.currentTarget.value })} onBlur={e => validate('url')} validationErrors={validationErrors['url']} />\r\n \r\n \r\n {t('eventUrl.checkLink', 'Check link')}\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}","import { FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport { ValidationErrors } from 'pojo-validator';\r\nimport { ValidateCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport * as React from 'react';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Col, FormGroup, ListGroupItem, Row, } from 'reactstrap';\r\nimport { CalendarEventCalendarEventProvider } from '../../api/main/models/CalendarEventCalendarEventProvider';\r\nimport { CalendarEventProvider } from '../../api/main/models/CalendarEventProvider';\r\n\r\nexport interface ProviderLinkProps {\r\n model: CalendarEventCalendarEventProvider,\r\n change: (changes: Partial) => void,\r\n validate: ValidateCallback,\r\n validationErrors: ValidationErrors,\r\n remove: () => void,\r\n providers: Array,\r\n singleItem?: boolean,\r\n}\r\n\r\n/**\r\n * Component for editing a provider attached to an event as a CalenderEventCalendarEventProvider.\r\n * @param props\r\n */\r\nexport const ProviderLink = (props: ProviderLinkProps) => {\r\n const {\r\n model, change,\r\n validate, validationErrors,\r\n remove,\r\n providers,\r\n singleItem = false,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n change({ calendarEventProviderId: e.currentTarget.value })} onBlur={e => validate('calendarEventProviderId')} validationErrors={validationErrors['calendarEventProviderId']}>\r\n \r\n {\r\n providers?.map(item => (\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}","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventUrlCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventUrlMutation, createCalendarEventUrlMutationVariables } from '../generated/createCalendarEventUrlMutation';\r\nimport { calendarEventUrlFieldsFragment } from '../models/CalendarEventUrl';\r\n\r\n/**\r\n * Get a callback to create a CalendarEventUrl in the store.\r\n */\r\nexport function useCreateCalendarEventUrlCallback(): [(model: CalendarEventUrlCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventUrlMutation ($model: CalendarEventUrlCreateInput!) {\r\n createCalendarEventUrl(model: $model) {\r\n ...calendarEventUrlFields\r\n }\r\n }\r\n\r\n ${calendarEventUrlFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventUrlCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventUrlUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventUrlMutation, updateCalendarEventUrlMutationVariables } from '../generated/updateCalendarEventUrlMutation';\r\nimport { calendarEventUrlFieldsFragment } from '../models/CalendarEventUrl';\r\n\r\n/**\r\n * Get a callback to update a CalendarEventUrl in the store.\r\n */\r\nexport function useUpdateCalendarEventUrlCallback(): [(id: string, model: CalendarEventUrlUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventUrlMutation ($model: CalendarEventUrlUpdateInput!) {\r\n updateCalendarEventUrl(model: $model) {\r\n ...calendarEventUrlFields\r\n }\r\n }\r\n\r\n ${calendarEventUrlFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventUrlUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventCalendarEventProviderCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventCalendarEventProviderMutation, createCalendarEventCalendarEventProviderMutationVariables } from '../generated/createCalendarEventCalendarEventProviderMutation';\r\nimport { calendarEventCalendarEventProviderFieldsFragment } from '../models/CalendarEventCalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to create a CalendarEventCalendarEventProvider in the store.\r\n */\r\nexport function useCreateCalendarEventCalendarEventProviderCallback(): [(model: CalendarEventCalendarEventProviderCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventCalendarEventProviderMutation ($model: CalendarEventCalendarEventProviderCreateInput!) {\r\n createCalendarEventCalendarEventProvider(model: $model) {\r\n ...calendarEventCalendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventCalendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventCalendarEventProviderCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventCalendarEventProviderUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventCalendarEventProviderMutation, updateCalendarEventCalendarEventProviderMutationVariables } from '../generated/updateCalendarEventCalendarEventProviderMutation';\r\nimport { calendarEventCalendarEventProviderFieldsFragment } from '../models/CalendarEventCalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to update a CalendarEventCalendarEventProvider in the store.\r\n */\r\nexport function useUpdateCalendarEventCalendarEventProviderCallback(): [(id: string, model: CalendarEventCalendarEventProviderUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventCalendarEventProviderMutation ($model: CalendarEventCalendarEventProviderUpdateInput!) {\r\n updateCalendarEventCalendarEventProvider(model: $model) {\r\n ...calendarEventCalendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventCalendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventCalendarEventProviderUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventScheduleCreateInput } from '../generated/globalTypes';\r\nimport { createCalendarEventScheduleMutation, createCalendarEventScheduleMutationVariables } from '../generated/createCalendarEventScheduleMutation';\r\nimport { calendarEventScheduleFieldsFragment } from '../models/CalendarEventSchedule';\r\n\r\n/**\r\n * Get a callback to create a CalendarEventSchedule in the store.\r\n */\r\nexport function useCreateCalendarEventScheduleCallback(): [(model: CalendarEventScheduleCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCalendarEventScheduleMutation ($model: CalendarEventScheduleCreateInput!) {\r\n createCalendarEventSchedule(model: $model) {\r\n ...calendarEventScheduleFields\r\n }\r\n }\r\n\r\n ${calendarEventScheduleFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CalendarEventScheduleCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CalendarEventScheduleUpdateInput } from '../generated/globalTypes';\r\nimport { updateCalendarEventScheduleMutation, updateCalendarEventScheduleMutationVariables } from '../generated/updateCalendarEventScheduleMutation';\r\nimport { calendarEventScheduleFieldsFragment } from '../models/CalendarEventSchedule';\r\n\r\n/**\r\n * Get a callback to update a CalendarEventSchedule in the store.\r\n */\r\nexport function useUpdateCalendarEventScheduleCallback(): [(id: string, model: CalendarEventScheduleUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCalendarEventScheduleMutation ($model: CalendarEventScheduleUpdateInput!) {\r\n updateCalendarEventSchedule(model: $model) {\r\n ...calendarEventScheduleFields\r\n }\r\n }\r\n\r\n ${calendarEventScheduleFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CalendarEventScheduleUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { FontAwesomeIcon} from '@fortawesome/react-fontawesome';\r\nimport moment from 'moment';\r\nimport { ValidationErrors } from 'pojo-validator';\r\nimport { ValidateCallback } from 'pojo-validator-react';\r\nimport * as React from 'react';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Col, FormGroup, Label, ListGroupItem, Row, } from 'reactstrap';\r\nimport { CalendarEventSchedule } from '../../api/main/models/CalendarEventSchedule';\r\nimport { TwoValueSwitch } from '../shared/TwoValueSwitch';\r\nimport { ValidatedISODateTimeInput } from '../shared/ValidatedISODateTimeInput';\r\n\r\nexport interface ScheduleProps {\r\n model: CalendarEventSchedule,\r\n change: (changes: Partial) => void,\r\n validate: ValidateCallback,\r\n validationErrors: ValidationErrors,\r\n remove: () => void,\r\n singleItem?: boolean,\r\n}\r\n\r\n/**\r\n * Component for editing a URL attached to an event as a CalenderSchedule.\r\n * @param props\r\n */\r\nexport const Schedule = (props: ScheduleProps) => {\r\n const {\r\n model, change,\r\n validate, validationErrors,\r\n remove,\r\n singleItem = false,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Work out the format to show for the date pickers.\r\n const dateInputType = model.isAllDay ? 'date' : 'datetime-local';\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n change({ start: e.currentTarget.value })} onBlur={e => validate('start')} validationErrors={validationErrors['start']} />\r\n \r\n \r\n \r\n \r\n \r\n change({ end: e.currentTarget.value })} onBlur={e => validate('end')} validationErrors={validationErrors['end']} />\r\n \r\n \r\n \r\n \r\n \r\n {\r\n if (!checked) {\r\n // Is an all day event, we need to loose the time element.\r\n change({ isAllDay: !checked, start: moment(model.start).startOf('day').toISOString(), end: moment(model.end).startOf('day').toISOString() });\r\n } else {\r\n // Is not an all day event, just toggle the flag.\r\n change({ isAllDay: !checked, });\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}","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ItemTagLinkCreateInput } from '../generated/globalTypes';\r\nimport { createItemTagLinkMutation, createItemTagLinkMutationVariables } from '../generated/createItemTagLinkMutation';\r\nimport { itemTagLinkFieldsFragment } from '../models/ItemTagLink';\r\n\r\n/**\r\n * Get a callback to create a ItemTagLink in the store.\r\n */\r\nexport function useCreateItemTagLinkCallback(): [(model: ItemTagLinkCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createItemTagLinkMutation ($model: ItemTagLinkCreateInput!) {\r\n createItemTagLink(model: $model) {\r\n ...itemTagLinkFields\r\n }\r\n }\r\n\r\n ${itemTagLinkFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ItemTagLinkCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ItemTagLinkUpdateInput } from '../generated/globalTypes';\r\nimport { updateItemTagLinkMutation, updateItemTagLinkMutationVariables } from '../generated/updateItemTagLinkMutation';\r\nimport { itemTagLinkFieldsFragment } from '../models/ItemTagLink';\r\n\r\n/**\r\n * Get a callback to update a ItemTagLink in the store.\r\n */\r\nexport function useUpdateItemTagLinkCallback(): [(id: string, model: ItemTagLinkUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateItemTagLinkMutation ($model: ItemTagLinkUpdateInput!) {\r\n updateItemTagLink(model: $model) {\r\n ...itemTagLinkFields\r\n }\r\n }\r\n\r\n ${itemTagLinkFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: ItemTagLinkUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { ValidationErrors, Validator, ValidationState } from \"pojo-validator\";\r\n\r\n/**\r\n * Hook that provides a validate method and its associated validationErrors as a state object managed by validation.\r\n * \r\n * validation is a callback that is takes a model and stores the errors for all the models that have been passed in index by their id.\r\n * \r\n * @param validating the validation method.\r\n */\r\nexport function useValidatorArrayCallback(validating: (model: T, validation: ValidationState, fieldsToCheck?: Array) => void, deps: React.DependencyList): [(model: T, fieldsToCheck?: string | Array | undefined) => boolean, (id: string) => ValidationErrors] {\r\n const [validationErrors, setValidationErrors] = React.useState<{ [key: string ]: ValidationErrors }>({});\r\n\r\n // Create the method in the right format for us to return it so we can call validate() directly.\r\n const validate = React.useCallback((model: T, fieldsToCheck?: string | Array): boolean => {\r\n let validator = new Validator(validating);\r\n\r\n // Work out the fields to be checked as we support passing a single field for convenience as well as passing an array.\r\n let fields: Array | undefined = undefined;\r\n if (fieldsToCheck) {\r\n if (fieldsToCheck as string) {\r\n fields = [(fieldsToCheck as string)];\r\n } else {\r\n fields = (fieldsToCheck as any) as Array;\r\n }\r\n }\r\n \r\n const ok = validator.validate(model, fields);\r\n\r\n setValidationErrors(prevState => ({\r\n ...prevState,\r\n [(model as any).id]: validator.errors(), // NOTE this line is not typesafe as it assumes T has a propery id.\r\n }));\r\n\r\n return ok;\r\n }, [...deps, validating, setValidationErrors]);\r\n\r\n const getErrors = React.useCallback((id: string) => {\r\n const ret = validationErrors[id];\r\n return ret ?? {} as ValidationErrors;\r\n }, [validationErrors]);\r\n\r\n return [validate, getErrors];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col, ListGroup, ButtonGroup } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges, useChangesArray } from '../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCalendarEventCallback } from '../../api/main/calendarEvents/useSaveCalendarEventCallback';\r\nimport { CalendarEvent } from '../../api/main/models/CalendarEvent';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { HtmlEditor } from '../../shared/htmlEditor';\r\nimport { FileUploadButton } from '../shared/fileUploadButton/FileUploadButton';\r\nimport { useUploadBlobCallback } from '../../api/main/blobReferences/useUploadBlobCallback';\r\nimport { BlobReference } from '../../api/main/models/BlobReference';\r\nimport { useEditCalendarEventViewModel } from '../../api/main/calendarEvents/viewModels/useEditCalendarEventViewModel';\r\nimport { UploadedImagePreview } from '../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { useEditCalendarEventSupportingData } from '../../api/main/calendarEvents/viewModels/useEditCalendarEventSupportingData';\r\nimport { TwoValueSwitch } from '../shared/TwoValueSwitch'\r\nimport { CalendarEventUrl } from '../../api/main/models/CalendarEventUrl';\r\nimport { EventUrl } from './EventUrl';\r\nimport { ProviderLink } from './ProviderLink';\r\nimport { useDeleteCalendarEventUrlCallback } from '../../api/main/calendarEventUrls/useDeleteCalendarEventUrlCallback';\r\nimport { useSaveCalendarEventUrlCallback } from '../../api/main/calendarEventUrls/useSaveCalendarEventUrlCallback';\r\nimport { useSaveCalendarEventCalendarEventProviderCallback } from '../../api/main/calendarEventCalendarEventProviders/useSaveCalendarEventCalendarEventProviderCallback';\r\nimport { CalendarEventCalendarEventProvider } from '../../api/main/models/CalendarEventCalendarEventProvider';\r\nimport { useDeleteCalendarEventCalendarEventProviderCallback } from '../../api/main/calendarEventCalendarEventProviders/useDeleteCalendarEventCalendarEventProviderCallback';\r\nimport { useSaveCalendarEventScheduleCallback } from '../../api/main/calendarEventSchedules/useSaveCalendarEventScheduleCallback';\r\nimport { useDeleteCalendarEventScheduleCallback } from '../../api/main/calendarEventSchedules/useDeleteCalendarEventScheduleCallback';\r\nimport { CalendarEventSchedule } from '../../api/main/models/CalendarEventSchedule';\r\nimport moment from 'moment';\r\nimport { Schedule } from './Schedule';\r\nimport { ItemTagLink } from '../../api/main/models/ItemTagLink';\r\nimport { useSaveItemTagLinkCallback } from '../../api/main/itemTagLinks/useSaveItemTagLinkCallback';\r\nimport { useDeleteItemTagLinkCallback } from '../../api/main/itemTagLinks/useDeleteItemTagLinkCallback';\r\nimport { TagSelector } from '../tags/TagSelector';\r\nimport { useValidatorArrayCallback } from '../../shared/validator-react-contrib/useValidatorArrayCallback';\r\nimport { EventTypeColorBlock } from '../shared/calendar/EventTypeColorBlock';\r\n\r\ninterface EditCalendarEventProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CalendarEvent.\r\n */\r\nexport const CreateCalendarEvent = () => ();\r\n\r\n/**\r\n * Edit a CalendarEvent.\r\n */\r\nexport const EditCalendarEvent = (props: EditCalendarEventProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading: _isLoading, errors: loadErrors } = useEditCalendarEventViewModel(id);\r\n const { data: { calendarEventTypes, calendarEventProviders, itemTags, }, isLoading: isLoadingSupportingData, errors: loadSupportingDataErrors } = useEditCalendarEventSupportingData();\r\n const isLoading = _isLoading || isLoadingSupportingData;\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', descriptionHtml: '', } : {});\r\n const [save, { errors: saveErrors }] = useSaveCalendarEventCallback();\r\n const history = useHistory();\r\n\r\n // CalendarEventUrl apis\r\n const urlsManager = useChangesArray(storeModel?.urls, item => item.id);\r\n const [saveCalendarEventUrl] = useSaveCalendarEventUrlCallback();\r\n const [deleteCalendarEventUrl] = useDeleteCalendarEventUrlCallback();\r\n\r\n // CalendarEventCalendarEventProvider apis\r\n const providerLinksManager = useChangesArray(storeModel?.providers, item => item.id);\r\n const [saveCalendarEventCalendarEventProvider] = useSaveCalendarEventCalendarEventProviderCallback();\r\n const [deleteCalendarEventCalendarEventProvider] = useDeleteCalendarEventCalendarEventProviderCallback();\r\n\r\n // CalendarEventSchedule apis\r\n const schedulesManager = useChangesArray(storeModel?.schedules, item => item.id);\r\n const [saveCalendarEventSchedule] = useSaveCalendarEventScheduleCallback();\r\n const [deleteCalendarEventSchedule] = useDeleteCalendarEventScheduleCallback();\r\n\r\n // ItemTagLink apis\r\n const tagLinksManager = useChangesArray(storeModel?.tagLinks, item => item.id);\r\n const [saveItemTagLink] = useSaveItemTagLinkCallback();\r\n const [deleteItemTagLink] = useDeleteItemTagLinkCallback();\r\n const toggleTagLink = React.useCallback((id: string) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const existing = tagLinksManager.model.find(it => it.itemTagId === id);\r\n if (existing) {\r\n tagLinksManager.removeFor(existing.id);\r\n } else {\r\n tagLinksManager.addFor({ id: Guid.newGuid(), itemTagId: id, targetId: model.id, });\r\n }\r\n }, [tagLinksManager, model]);\r\n\r\n\r\n // Image display and uploading.\r\n const [imageBlob, setImageBlob] = React.useState();\r\n React.useEffect(() => setImageBlob(storeModel?.imageBlobReference), [storeModel]);\r\n\r\n const [uploadBlob] = useUploadBlobCallback();\r\n const [uploadImageBlob, { isExecuting: isUploadingImageBlob, errors: uploadImageBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ imageBlobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setImageBlob(blob);\r\n }, [uploadBlob, change, setImageBlob]);\r\n\r\n const clearImage = React.useCallback(() => {\r\n change({ imageBlobReferenceId: null });\r\n setImageBlob(null);\r\n }, [change]);\r\n\r\n // Validation\r\n //\r\n const [validateProvider, providerValidationErrors] = useValidatorArrayCallback((myModel, validation, fieldsToCheck) => {\r\n const rules = {\r\n calendarEventProviderId: () => Guid.isEmpty(myModel?.calendarEventProviderId) ? t('editCalendarEvent.calendarEventProviderIdRequired', 'Provider is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, []);\r\n\r\n const [validateUrl, urlValidationErrors] = useValidatorArrayCallback((myModel, validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !myModel?.name ? t('editCalendarEvent.nameRequired', 'Link text is required') : '',\r\n //url: () => !myModel?.name ? t('editCalendarEvent.urlRequired', 'Url is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, []);\r\n\r\n const [validateSchedule, scheduleValidationErrors] = useValidatorArrayCallback((myModel, validation, fieldsToCheck) => {\r\n const rules = {\r\n start: () => !myModel?.start ? t('editCalendarEvent.nameRequired', 'Start date is required') : '',\r\n end: () => !myModel?.end ? t('editCalendarEvent.nameRequired', 'Start date is required')\r\n : myModel.end < myModel.start ? t('editCalendarEvent.nameRequired', 'End date cannot be before the start date')\r\n : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, []);\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCalendarEvent.nameRequired', 'Name is required') : '',\r\n calendarEventTypeId: () => Guid.isEmpty(model?.calendarEventTypeId) ? t('editCalendarEvent.calendarEventTypeIdRequired', 'Type of event is required') : '',\r\n\r\n // Validate related objects.\r\n providers: () => providerLinksManager.model.filter(it => !validateProvider(it)).length ? t('editCalendarEvent.providersInvalid', 'One or more providers are invalid') : '',\r\n urls: () => urlsManager.model.filter(it => !validateUrl(it)).length ? t('editCalendarEvent.urlsInvalid', 'One or more links are invalid') : '',\r\n schedules: () => schedulesManager.model.filter(it => !validateSchedule(it)).length ? t('editCalendarEvent.schedulesInvalid', 'One or more dates invalid') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model,\r\n providerLinksManager, validateProvider,\r\n urlsManager, validateUrl,\r\n schedulesManager, validateSchedule,\r\n ]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n // Save the main form.\r\n await save(model.id, changes, !!isCreate);\r\n\r\n // Save changes to the URLs\r\n for (const item of urlsManager.added) {\r\n await saveCalendarEventUrl(item.id, urlsManager.changesFor(item.id), true);\r\n }\r\n for (const item of urlsManager.updated) {\r\n await saveCalendarEventUrl(item.id, urlsManager.changesFor(item.id), false);\r\n }\r\n for (const item of urlsManager.removed) {\r\n await deleteCalendarEventUrl(item.id);\r\n }\r\n urlsManager.markAsSaved();\r\n\r\n // Save changes to the linked providers\r\n for (const item of providerLinksManager.added) {\r\n await saveCalendarEventCalendarEventProvider(item.id, providerLinksManager.changesFor(item.id), true);\r\n }\r\n for (const item of providerLinksManager.updated) {\r\n await saveCalendarEventCalendarEventProvider(item.id, providerLinksManager.changesFor(item.id), false);\r\n }\r\n for (const item of providerLinksManager.removed) {\r\n await deleteCalendarEventCalendarEventProvider(item.id);\r\n }\r\n providerLinksManager.markAsSaved();\r\n\r\n // Save changes to the schedules\r\n for (const item of schedulesManager.added) {\r\n await saveCalendarEventSchedule(item.id, schedulesManager.changesFor(item.id), true);\r\n }\r\n for (const item of schedulesManager.updated) {\r\n await saveCalendarEventSchedule(item.id, schedulesManager.changesFor(item.id), false);\r\n }\r\n for (const item of schedulesManager.removed) {\r\n await deleteCalendarEventSchedule(item.id);\r\n }\r\n schedulesManager.markAsSaved();\r\n\r\n // Save changes to the tags\r\n for (const item of tagLinksManager.added) {\r\n await saveItemTagLink(item.id, tagLinksManager.changesFor(item.id), true);\r\n }\r\n for (const item of tagLinksManager.updated) {\r\n await saveItemTagLink(item.id, tagLinksManager.changesFor(item.id), false);\r\n }\r\n for (const item of tagLinksManager.removed) {\r\n await deleteItemTagLink(item.id);\r\n }\r\n tagLinksManager.markAsSaved();\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history,\r\n urlsManager, saveCalendarEventUrl, deleteCalendarEventUrl,\r\n providerLinksManager, saveCalendarEventCalendarEventProvider, deleteCalendarEventCalendarEventProvider,\r\n schedulesManager, saveCalendarEventSchedule, deleteCalendarEventSchedule,\r\n tagLinksManager, saveItemTagLink, deleteItemTagLink,\r\n ]);\r\n\r\n // When we are creating a new item, then once we have the store model we're going to add some defaults\r\n // to the linked objects.\r\n const [needToAddDefaults, setNeedToAddDefaults] = React.useState(!!isCreate);\r\n React.useEffect(() => {\r\n if (!needToAddDefaults) {\r\n return;\r\n }\r\n\r\n // Wait until all the managers we want are ready.\r\n if (!model || !urlsManager || !providerLinksManager) {\r\n return;\r\n }\r\n\r\n // Add default records where we need them.\r\n urlsManager.addFor({ id: Guid.newGuid(), calendarEventId: model.id, name: '', url: '', linkType: 'Other', });\r\n providerLinksManager.addFor({ id: Guid.newGuid(), calendarEventId: model.id, });\r\n schedulesManager.addFor({ id: Guid.newGuid(), calendarEventId: model.id, start: moment().startOf('day').toISOString(), end: moment().startOf('day').toISOString(), isAllDay: true, });\r\n\r\n setNeedToAddDefaults(false);\r\n }, [needToAddDefaults, setNeedToAddDefaults, model, urlsManager, providerLinksManager, schedulesManager]);\r\n\r\n // Work out some interface changes based on related tables that often have only one item.\r\n const hasSingleSchedule = schedulesManager.model.length === 1;\r\n const hasSingleProviderLink = providerLinksManager.model.length === 1;\r\n const hasSingleUrl = urlsManager.model.length === 1;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCalendarEvent.createHeading', 'Add event')}\r\n ): (\r\n <>{t('editCalendarEvent.editHeading', 'Edit event')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n item.id === model.calendarEventTypeId)?.color ?? 'transparent'} />\r\n \r\n \r\n change({ calendarEventTypeId: e.currentTarget.value })} onBlur={e => validate('calendarEventTypeId')} validationErrors={validationErrors['calendarEventTypeId']}>\r\n \r\n {\r\n calendarEventTypes?.map(item => (\r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n change({ isFeatured: checked })} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n change({ location: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n\r\n \r\n \r\n\r\n \r\n {\r\n providerLinksManager.model.map(item => (\r\n providerLinksManager.changeFor(item.id, changes)}\r\n remove={() => providerLinksManager.removeFor(item.id)}\r\n validate={() => validateProvider(item)}\r\n validationErrors={providerValidationErrors(item.id)}\r\n providers={calendarEventProviders ?? []}\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 schedulesManager.model.map(item => (\r\n schedulesManager.changeFor(item.id, changes)}\r\n remove={() => schedulesManager.removeFor(item.id)}\r\n validate={() => validateSchedule(item)}\r\n validationErrors={scheduleValidationErrors(item.id)}\r\n />\r\n ))\r\n }\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n it.tagType === 'SchoolType') ?? []}\r\n isSelected={id => !!tagLinksManager.model.find(it => it.itemTagId === id)}\r\n toggle={(id) => toggleTagLink(id)} />\r\n \r\n \r\n \r\n \r\n \r\n it.tagType === 'SchoolPhase') ?? []}\r\n isSelected={id => !!tagLinksManager.model.find(it => it.itemTagId === id)}\r\n toggle={(id) => toggleTagLink(id)} />\r\n \r\n \r\n \r\n \r\n \r\n it.tagType === 'Other') ?? []}\r\n isSelected={id => !!tagLinksManager.model.find(it => it.itemTagId === id)}\r\n toggle={(id) => toggleTagLink(id)} />\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n uploadImageBlob(files)} isExecuting={isUploadingImageBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCalendarEvent.uploadPromotionalImage', 'Upload promotional image...')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n change({ descriptionHtml: value })} />\r\n \r\n\r\n \r\n \r\n\r\n \r\n {\r\n urlsManager.model.map(item => (\r\n urlsManager.changeFor(item.id, changes)}\r\n remove={() => urlsManager.removeFor(item.id)}\r\n validate={() => validateUrl(item)}\r\n validationErrors={urlValidationErrors(item.id)}\r\n />\r\n ))\r\n }\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCalendarEventViewModelQuery, editCalendarEventViewModelQueryVariables } from '../../generated/editCalendarEventViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventFieldsFragment } from '../../models/CalendarEvent';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { Guid } from 'guid-string';\r\nimport { calendarEventUrlFieldsFragment } from '../../models/CalendarEventUrl';\r\nimport { calendarEventCalendarEventProviderFieldsFragment } from '../../models/CalendarEventCalendarEventProvider';\r\nimport { calendarEventScheduleFieldsFragment } from '../../models/CalendarEventSchedule';\r\nimport { itemTagLinkFieldsFragment } from '../../models/ItemTagLink';\r\n\r\n/**\r\n * View model for EditCalendarEvent that replaces the call to useCalendarEvent() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useEditCalendarEventViewModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCalendarEventViewModelQuery ($id: ID!) {\r\n model: calendarEvent(id: $id) {\r\n ...calendarEventFields\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n\r\n urls {\r\n ...calendarEventUrlFields\r\n }\r\n\r\n providers {\r\n ...calendarEventCalendarEventProviderFields\r\n }\r\n\r\n schedules {\r\n ...calendarEventScheduleFields\r\n }\r\n\r\n tagLinks {\r\n ...itemTagLinkFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n ${calendarEventUrlFieldsFragment}\r\n ${calendarEventCalendarEventProviderFieldsFragment}\r\n ${calendarEventScheduleFieldsFragment}\r\n ${itemTagLinkFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCalendarEventSupportingDataQuery } from '../../generated/editCalendarEventSupportingDataQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventTypeFieldsFragment } from '../../models/CalendarEventType';\r\nimport { itemTagFieldsFragment } from '../../models/ItemTag';\r\nimport { calendarEventProviderFieldsFragment } from '../../models/CalendarEventProvider';\r\n\r\n/**\r\n * Supporting data for EditCalendarEvent that loads static data (e.g. dropdowns) that are not changed by the model being used.\r\n * @param options\r\n */\r\nexport function useEditCalendarEventSupportingData(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCalendarEventSupportingDataQuery {\r\n calendarEventTypes {\r\n ...calendarEventTypeFields\r\n }\r\n\r\n itemTags {\r\n ...itemTagFields\r\n }\r\n\r\n calendarEventProviders {\r\n ...calendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventTypeFieldsFragment}\r\n ${itemTagFieldsFragment}\r\n ${calendarEventProviderFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { CalendarEventCreateInput, CalendarEventUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventCallback } from './useCreateCalendarEventCallback';\r\nimport { useUpdateCalendarEventCallback } from './useUpdateCalendarEventCallback';\r\nimport { CalendarEvent } from '../models/CalendarEvent';\r\n\r\n/**\r\n * Get a callback to save a CalendarEvent in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { CalendarEventUrlCreateInput, CalendarEventUrlUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventUrlCallback } from './useCreateCalendarEventUrlCallback';\r\nimport { useUpdateCalendarEventUrlCallback } from './useUpdateCalendarEventUrlCallback';\r\nimport { CalendarEventUrl } from '../models/CalendarEventUrl';\r\n\r\n/**\r\n * Get a callback to save a CalendarEventUrl in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventUrlCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventUrlCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventUrlCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventUrlCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventUrlUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventUrlMutation, deleteCalendarEventUrlMutationVariables } from '../generated/deleteCalendarEventUrlMutation';\r\nimport { calendarEventUrlFieldsFragment } from '../models/CalendarEventUrl';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEventUrl in the store.\r\n */\r\nexport function useDeleteCalendarEventUrlCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventUrlMutation ($id: ID!) {\r\n deleteCalendarEventUrl(id: $id) {\r\n ...calendarEventUrlFields\r\n }\r\n }\r\n\r\n ${calendarEventUrlFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { CalendarEventCalendarEventProviderCreateInput, CalendarEventCalendarEventProviderUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventCalendarEventProviderCallback } from './useCreateCalendarEventCalendarEventProviderCallback';\r\nimport { useUpdateCalendarEventCalendarEventProviderCallback } from './useUpdateCalendarEventCalendarEventProviderCallback';\r\nimport { CalendarEventCalendarEventProvider } from '../models/CalendarEventCalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to save a CalendarEventCalendarEventProvider in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventCalendarEventProviderCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventCalendarEventProviderCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventCalendarEventProviderCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventCalendarEventProviderCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventCalendarEventProviderUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventCalendarEventProviderMutation, deleteCalendarEventCalendarEventProviderMutationVariables } from '../generated/deleteCalendarEventCalendarEventProviderMutation';\r\nimport { calendarEventCalendarEventProviderFieldsFragment } from '../models/CalendarEventCalendarEventProvider';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEventCalendarEventProvider in the store.\r\n */\r\nexport function useDeleteCalendarEventCalendarEventProviderCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventCalendarEventProviderMutation ($id: ID!) {\r\n deleteCalendarEventCalendarEventProvider(id: $id) {\r\n ...calendarEventCalendarEventProviderFields\r\n }\r\n }\r\n\r\n ${calendarEventCalendarEventProviderFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { CalendarEventScheduleCreateInput, CalendarEventScheduleUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCalendarEventScheduleCallback } from './useCreateCalendarEventScheduleCallback';\r\nimport { useUpdateCalendarEventScheduleCallback } from './useUpdateCalendarEventScheduleCallback';\r\nimport { CalendarEventSchedule } from '../models/CalendarEventSchedule';\r\n\r\n/**\r\n * Get a callback to save a CalendarEventSchedule in the store using either a create or update.\r\n */\r\nexport function useSaveCalendarEventScheduleCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCalendarEventScheduleCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CalendarEventScheduleCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCalendarEventScheduleCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CalendarEventScheduleUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventScheduleMutation, deleteCalendarEventScheduleMutationVariables } from '../generated/deleteCalendarEventScheduleMutation';\r\nimport { calendarEventScheduleFieldsFragment } from '../models/CalendarEventSchedule';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEventSchedule in the store.\r\n */\r\nexport function useDeleteCalendarEventScheduleCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventScheduleMutation ($id: ID!) {\r\n deleteCalendarEventSchedule(id: $id) {\r\n ...calendarEventScheduleFields\r\n }\r\n }\r\n\r\n ${calendarEventScheduleFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { ItemTagLinkCreateInput, ItemTagLinkUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateItemTagLinkCallback } from './useCreateItemTagLinkCallback';\r\nimport { useUpdateItemTagLinkCallback } from './useUpdateItemTagLinkCallback';\r\nimport { ItemTagLink } from '../models/ItemTagLink';\r\n\r\n/**\r\n * Get a callback to save a ItemTagLink in the store using either a create or update.\r\n */\r\nexport function useSaveItemTagLinkCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateItemTagLinkCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as ItemTagLinkCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateItemTagLinkCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as ItemTagLinkUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteItemTagLinkMutation, deleteItemTagLinkMutationVariables } from '../generated/deleteItemTagLinkMutation';\r\nimport { itemTagLinkFieldsFragment } from '../models/ItemTagLink';\r\n\r\n/**\r\n * Get a callback to delete a ItemTagLink in the store.\r\n */\r\nexport function useDeleteItemTagLinkCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteItemTagLinkMutation ($id: ID!) {\r\n deleteItemTagLink(id: $id) {\r\n ...itemTagLinkFields\r\n }\r\n }\r\n\r\n ${itemTagLinkFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCalendarEvent } from '../../api/main/calendarEvents/useCalendarEvent';\r\nimport { useDeleteCalendarEventCallback } from '../../api/main/calendarEvents/useDeleteCalendarEventCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\n/**\r\n * Delete a CalendarEvent.\r\n */\r\nexport const DeleteCalendarEvent = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCalendarEvent(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCalendarEventCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCalendarEvent.heading', 'Delete event?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { CalendarEventsList } from \"./CalendarEventsList\";\r\nimport { EditCalendarEvent, CreateCalendarEvent } from \"./EditCalendarEvent\";\r\nimport { DeleteCalendarEvent } from \"./DeleteCalendarEvent\";\r\n\r\nexport const calendarEventRoutes: Array = [\r\n { path: '/administration/events', exact: true, component: CalendarEventsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/events/edit/:id', component: EditCalendarEvent, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/events/add', component: CreateCalendarEvent, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/events/delete/:id', component: DeleteCalendarEvent, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { calendarEventsListViewModelQuery, calendarEventsListViewModelQueryVariables } from '../../generated/calendarEventsListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { calendarEventFieldsFragment } from '../../models/CalendarEvent';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { CalendarEventsAsyncLoadPagedOptions } from '../useCalendarEvents';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\nimport { calendarEventScheduleFieldsFragment } from '../../models/CalendarEventSchedule';\r\n\r\n/**\r\n * View model for CalendarEventsList that replaces the call to useCalendarEvents() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useCalendarEventsListViewModel(options: CalendarEventsAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query calendarEventsListViewModelQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: calendarEvents (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...calendarEventFields\r\n\r\n eventType {\r\n id\r\n name\r\n color\r\n }\r\n\r\n providers {\r\n id\r\n provider {\r\n id\r\n name\r\n }\r\n }\r\n\r\n tagLinks {\r\n id\r\n itemTag {\r\n id\r\n name\r\n }\r\n }\r\n\r\n schedules {\r\n ...calendarEventScheduleFields\r\n }\r\n\r\n imageBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n ${calendarEventScheduleFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { calendarEventQuery, calendarEventQueryVariables } from '../generated/calendarEventQuery';\r\nimport { calendarEventFieldsFragment } from '../models/CalendarEvent';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a CalendarEvent from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCalendarEvent(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query calendarEventQuery ($id: ID!) {\r\n model: calendarEvent(id: $id) {\r\n ...calendarEventFields\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCalendarEventMutation, deleteCalendarEventMutationVariables } from '../generated/deleteCalendarEventMutation';\r\nimport { calendarEventFieldsFragment } from '../models/CalendarEvent';\r\n\r\n/**\r\n * Get a callback to delete a CalendarEvent in the store.\r\n */\r\nexport function useDeleteCalendarEventCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCalendarEventMutation ($id: ID!) {\r\n deleteCalendarEvent(id: $id) {\r\n ...calendarEventFields\r\n }\r\n }\r\n\r\n ${calendarEventFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { analyticEventsListViewModelQuery, analyticEventsListViewModelQueryVariables } from '../../generated/analyticEventsListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { analyticEventFieldsFragment } from '../../models/AnalyticEvent';\r\nimport { AnalyticEventsAsyncLoadPagedOptions } from '../useAnalyticEvents';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\nimport { calendarEventScheduleFieldsFragment } from '../../models/CalendarEventSchedule';\r\n\r\n/**\r\n * View model for AnalyticEventsList that replaces the call to useAnalyticEvents() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useAnalyticEventsListViewModel(options: AnalyticEventsAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query analyticEventsListViewModelQuery ($offset: Int, $first: Int, $fromDate: DateTimeOffset, $toDate: DateTimeOffset, $eventType: String) {\r\n items: analyticEvents (offset: $offset, first: $first, fromDate: $fromDate, toDate: $toDate, eventType: $eventType) {\r\n ...analyticEventFields\r\n\r\n user {\r\n id\r\n email\r\n }\r\n\r\n calendarEvent {\r\n id\r\n name\r\n\r\n providers {\r\n id\r\n provider {\r\n id\r\n name\r\n }\r\n }\r\n }\r\n\r\n calendarEventUrl {\r\n id\r\n name\r\n\r\n calendarEvent {\r\n id\r\n name\r\n }\r\n }\r\n\r\n calendarEventSchedule {\r\n ...calendarEventScheduleFields\r\n }\r\n }\r\n }\r\n\r\n ${analyticEventFieldsFragment}\r\n ${calendarEventScheduleFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n eventType: options.eventType,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport Chart from 'react-apexcharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { isUndefined } from 'util';\r\n\r\nexport interface AnalyticEventsChartDataItem {\r\n id: string,\r\n text: string,\r\n count: number\r\n}\r\n\r\nexport interface AnalyticEventsChartProps {\r\n data: Array,\r\n\r\n onItemClick?: (selectedItem: AnalyticEventsChartDataItem) => void,\r\n\r\n width?: string | number | undefined,\r\n height?: string | number | undefined,\r\n}\r\n\r\nexport const AnalyticEventChart = (props: AnalyticEventsChartProps) => {\r\n const { t } = useTranslation();\r\n\r\n const {\r\n data,\r\n onItemClick,\r\n width,\r\n height,\r\n } = props;\r\n\r\n\r\n const series = React.useMemo(() => [{\r\n name: t('analyticEventsChart.seriesName', 'Clicks'),\r\n data: data.map(item => ({\r\n x: item.text,\r\n y: item.count,\r\n\r\n _item: item,\r\n }))\r\n }], [data, t]);\r\n\r\n const options = React.useMemo(() => ({\r\n chart: {\r\n toolbar: {\r\n show: false,\r\n },\r\n events: {\r\n dataPointSelection: (e, chart, config) => {\r\n // If the chart type doesn't give us a useful data point for where we clicked, do nothing.\r\n if (isUndefined(config.dataPointIndex) || isUndefined(config.seriesIndex)) {\r\n return;\r\n }\r\n\r\n // Raise the onItemClick event.\r\n if (onItemClick) {\r\n const selectedItem = config.w.config.series[config.seriesIndex].data[config.dataPointIndex]?._item;\r\n if (selectedItem) {\r\n onItemClick(selectedItem);\r\n }\r\n }\r\n },\r\n }\r\n },\r\n xaxis: {\r\n type: 'category',\r\n }\r\n } as ApexCharts.ApexOptions), [onItemClick]);\r\n\r\n // We need to force the refresh of the chart sometimes by updating its key as its too optomistic with its internal caching and\r\n // so doesn't end up changes top options very well at all if we dont.\r\n const key = React.useMemo(() => JSON.stringify(options), [options]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\nimport { CalendarEventOpenAnalyticEventsList } from \"./CalendarEventOpenAnalyticEventsList\";\r\nimport { LinkClickAnalyticEventsList } from \"./LinkClickAnalyticEventsList\";\r\n\r\nexport const analyticEventRoutes: Array = [\r\n { path: '/administration/analytics/calendar-event-opens', exact: true, component: CalendarEventOpenAnalyticEventsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/analytics/link-clicks', exact: true, component: LinkClickAnalyticEventsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Row, Col, Collapse } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useAnalyticEventsListViewModel } from '../../api/main/analyticEvents/viewModels/useAnalyticEventsListViewModel';\r\nimport { analyticEventsListViewModelQuery_items, analyticEventsListViewModelQuery_items_calendarEvent } from '../../api/main/generated/analyticEventsListViewModelQuery';\r\nimport moment from 'moment';\r\nimport { Link } from 'react-router-dom';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\nimport { ISODateTimeInput } from '../shared/ISODateTimeInput';\r\nimport { AnalyticEventChart } from './AnalyticEventsChart';\r\nimport { ScrollTo } from '@scottbamford/react-scrollto';\r\nimport { scheduleDescription } from '../../utilities/scheduleDescription';\r\n\r\n/**\r\n * List of CalendarEventOpenAnalyticEvents.\r\n */\r\nexport const CalendarEventOpenAnalyticEventsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n\r\n const [fromDate, setFromDate] = React.useState(() => moment().startOf('month').toISOString());\r\n const [toDate, setToDate] = React.useState(() => moment().startOf('month').add(1, 'month').toISOString());\r\n\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useAnalyticEventsListViewModel({ pageSize: undefined, fromDate: fromDate, toDate: toDate, eventType: 'CalendarEventOpen', });\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.url.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.user?.email ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || (item.calendarEvent?.name ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || (item.calendarEventUrl?.calendarEvent?.name ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(item.eventDate) }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.calendarEventSchedule && scheduleDescription(item.calendarEventSchedule).toLocaleLowerCase()?.indexOf(lowerSearch) >= 0)\r\n || item.calendarEvent?.providers?.filter(it => it.provider.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0)?.length\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n // Group the items by their URL.\r\n const groups = React.useMemo(() => {\r\n if (!items) {\r\n return [];\r\n }\r\n\r\n let ret: Array<{\r\n calendarEvent: analyticEventsListViewModelQuery_items_calendarEvent,\r\n items: Array\r\n }> = [];\r\n\r\n for (const item of items) {\r\n if (!item.calendarEvent) {\r\n continue;\r\n }\r\n\r\n let group = ret.find(it => it.calendarEvent.id === item.calendarEventId);\r\n if (!group) {\r\n group = {\r\n calendarEvent: item.calendarEvent,\r\n items: []\r\n };\r\n ret.push(group);\r\n }\r\n\r\n group.items.push(item);\r\n }\r\n\r\n // Sort in descending item count order.\r\n ret.sort((a, b) => {\r\n if (a.items.length === b.items.length) {\r\n return 0;\r\n } else if (a.items.length > b.items.length) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n });\r\n\r\n return ret;\r\n }, [items]);\r\n\r\n const chartData = React.useMemo(() => groups.map(group => ({\r\n id: group.calendarEvent.id,\r\n text: group.calendarEvent?.name,\r\n count: group.items.length,\r\n })), [groups]);\r\n\r\n // Scroll to.\r\n const [scrollToGroupUrl, setScrollToGroupUrl] = React.useState(undefined);\r\n\r\n // Track which groups are open.\r\n const [groupIsOpen, toggleGroupOpen] = useToggleStateArray([]);\r\n\r\n const groupColCount = 4;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('calendarEventOpenAnalyticEventsList.heading', 'Calendar event opens')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n {t('calendarEventOpenAnalyticEventsList.from', 'From')}\r\n setFromDate(e.currentTarget.value)} />\r\n \r\n \r\n {t('calendarEventOpenAnalyticEventsList.to', 'To')}\r\n setToDate(e.currentTarget.value)} />\r\n \r\n \r\n setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n\r\n {\r\n // Scroll to the selected group.\r\n setScrollToGroupUrl(selected.id);\r\n\r\n // Expand the group if it is not expanded.\r\n if (!groupIsOpen(selected.id)) {\r\n toggleGroupOpen(selected.id);\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 groups?.map(group => {\r\n return (\r\n \r\n toggleGroupOpen(group.calendarEvent.id)}>\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 \r\n \r\n \r\n \r\n \r\n \r\n
{t('calendarEventOpenAnalyticEventsList.link', 'Calendar event')}{t('calendarEventOpenAnalyticEventsList.link', 'Providers')}{t('calendarEventOpenAnalyticEventsList.count', 'Count')} 
\r\n \r\n {group.calendarEvent.name}\r\n \r\n {\r\n group.calendarEvent.providers.map(item => (\r\n
\r\n {item.provider.name}\r\n
\r\n ))\r\n }\r\n
{t('common.integer', '{{value, #,0}}', { value: group.items.length })}\r\n \r\n
\r\n {/* This row is here for maintaining visible striping in the table only */}\r\n
\r\n \r\n {/* Inner table of actual items in the group */}\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 group.items.map(item => {\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
{t('calendarEventOpenAnalyticEventsList.date', 'Date')}{t('calendarEventOpenAnalyticEventsList.user', 'User')}{t('calendarEventOpenAnalyticEventsList.event', 'Event')}{t('calendarEventOpenAnalyticEventsList.providers', 'Providers')}{t('calendarEventOpenAnalyticEventsList.schedule', 'Schedule')}
{t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(item.eventDate) })}{item.user?.email}\r\n \r\n {item?.calendarEvent?.name}\r\n \r\n \r\n {\r\n group.calendarEvent.providers.map(item => (\r\n
\r\n {item.provider.name}\r\n
\r\n ))\r\n }\r\n
\r\n {\r\n item.calendarEventSchedule ? scheduleDescription(item.calendarEventSchedule)\r\n : null\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 * as React from 'react';\r\nimport { Table, Row, Col, Collapse } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useAnalyticEventsListViewModel } from '../../api/main/analyticEvents/viewModels/useAnalyticEventsListViewModel';\r\nimport moment from 'moment';\r\nimport { TrackedLink } from '../shared/trackedLink/TrackedLink';\r\nimport { getFullUrl } from '../../utilities/getFullUrl';\r\nimport { Link } from 'react-router-dom';\r\nimport { analyticEventsListViewModelQuery_items, analyticEventsListViewModelQuery_items_calendarEventUrl } from '../../api/main/generated/analyticEventsListViewModelQuery';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\nimport { ISODateTimeInput } from '../shared/ISODateTimeInput';\r\nimport { AnalyticEventChart } from './AnalyticEventsChart';\r\nimport { ScrollTo } from '@scottbamford/react-scrollto';\r\n\r\n/**\r\n * List of LinkClickAnalyticEvents.\r\n */\r\nexport const LinkClickAnalyticEventsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n\r\n const [fromDate, setFromDate] = React.useState(() => moment().startOf('month').toISOString());\r\n const [toDate, setToDate] = React.useState(() => moment().startOf('month').add(1, 'month').toISOString());\r\n\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useAnalyticEventsListViewModel({ pageSize: undefined, fromDate: fromDate, toDate: toDate, eventType: 'LinkClick', });\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.url.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.user?.email ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || (item.calendarEventUrl?.name ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || (item.calendarEventUrl?.calendarEvent?.name ?? '').toLocaleLowerCase()?.indexOf(lowerSearch) >= 0\r\n || t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(item.eventDate) }).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, t]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n // Group the items by their URL.\r\n const groups = React.useMemo(() => {\r\n if (!items) {\r\n return [];\r\n }\r\n\r\n let ret: Array<{\r\n url: string,\r\n calendarEventUrl: analyticEventsListViewModelQuery_items_calendarEventUrl | undefined | null,\r\n items: Array\r\n }> = [];\r\n\r\n for (const item of items) {\r\n let group = ret.find(it => it.url === item.url);\r\n if (!group) {\r\n group = {\r\n url: item.url,\r\n calendarEventUrl: item.calendarEventUrl,\r\n items: []\r\n };\r\n ret.push(group);\r\n } else {\r\n // If we end up with more than one calendarEventUrl for this link remove the referece to it from the group.\r\n if (group.calendarEventUrl?.id !== item.calendarEventUrl?.id) {\r\n group.calendarEventUrl = undefined;\r\n }\r\n }\r\n\r\n group.items.push(item);\r\n }\r\n\r\n // Sort in descending item count order.\r\n ret.sort((a, b) => {\r\n if (a.items.length === b.items.length) {\r\n return 0;\r\n } else if (a.items.length > b.items.length) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n });\r\n\r\n return ret;\r\n }, [items]);\r\n\r\n const chartData = React.useMemo(() => groups.map(group => ({\r\n id: group.url,\r\n text: group.calendarEventUrl?.name ? `${group.calendarEventUrl.name} (${group.url})` : group.url,\r\n count: group.items.length,\r\n })), [groups]);\r\n\r\n // Scroll to.\r\n const [scrollToGroupUrl, setScrollToGroupUrl] = React.useState(undefined);\r\n\r\n // Track which groups are open.\r\n const [groupIsOpen, toggleGroupOpen] = useToggleStateArray([]);\r\n\r\n const groupColCount = 3;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('linkClickAnalyticEventsList.heading', 'Link clicks')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n {t('linkClickAnalyticEventsList.from', 'From')}\r\n setFromDate(e.currentTarget.value)} />\r\n \r\n \r\n {t('linkClickAnalyticEventsList.to', 'To')}\r\n setToDate(e.currentTarget.value)} />\r\n \r\n \r\n setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n\r\n {\r\n // Scroll to the selected group.\r\n setScrollToGroupUrl(selected.id);\r\n\r\n // Expand the group if it is not expanded.\r\n if (!groupIsOpen(selected.id)) {\r\n toggleGroupOpen(selected.id);\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 groups?.map(group => {\r\n return (\r\n \r\n toggleGroupOpen(group.url)}>\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 \r\n \r\n \r\n \r\n \r\n
{t('linkClickAnalyticEventsList.link', 'Link')}{t('linkClickAnalyticEventsList.count', 'Count')} 
\r\n \r\n \r\n \r\n {group.calendarEventUrl?.name}\r\n \r\n \r\n
\r\n \r\n {group.url}\r\n \r\n
\r\n
{t('common.integer', '{{value, #,0}}', { value: group.items.length })}\r\n \r\n
\r\n {/* This row is here for maintaining visible striping in the table only */}\r\n
\r\n \r\n {/* Inner table of actual items in the group */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n group.items.map(item => {\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
{t('linkClickAnalyticEventsList.date', 'Date')}{t('linkClickAnalyticEventsList.user', 'User')}{t('linkClickAnalyticEventsList.event', 'Event')}{t('linkClickAnalyticEventsList.link', 'Link')}
{t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(item.eventDate) })}{item.user?.email}\r\n \r\n \r\n {item?.calendarEventUrl?.calendarEvent?.name}\r\n \r\n \r\n \r\n \r\n \r\n {item.calendarEventUrl?.name}\r\n \r\n \r\n
\r\n \r\n {item.url}\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 { useTranslation } from 'react-i18next';\r\nimport { Alert } from 'reactstrap';\r\n\r\n/**\r\n * Warning shown to administrators on CMS pages to let them know the CMS functionality isn't a full CMS.\r\n */\r\nexport const CmsAdministrationWarning = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {t('cmsAdministrationWarning.areYouSureWarning', 'The CMS-like functionality provided to administrators by this software is designed to allow you to update selected text, videos, and images used by the software and is not a full CMS. Care should be taken at all times when using these features to ensure core software functionality is not compromised.')}\r\n \r\n );\r\n};","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsTextCreateInput } from '../generated/globalTypes';\r\nimport { createCmsTextMutation, createCmsTextMutationVariables } from '../generated/createCmsTextMutation';\r\nimport { cmsTextFieldsFragment } from '../models/CmsText';\r\n\r\n/**\r\n * Get a callback to create a CmsText in the store.\r\n */\r\nexport function useCreateCmsTextCallback(): [(model: CmsTextCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCmsTextMutation ($model: CmsTextCreateInput!) {\r\n createCmsText(model: $model) {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsTextFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CmsTextCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsTextUpdateInput } from '../generated/globalTypes';\r\nimport { updateCmsTextMutation, updateCmsTextMutationVariables } from '../generated/updateCmsTextMutation';\r\nimport { cmsTextFieldsFragment } from '../models/CmsText';\r\n\r\n/**\r\n * Get a callback to update a CmsText in the store.\r\n */\r\nexport function useUpdateCmsTextCallback(): [(id: string, model: CmsTextUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCmsTextMutation ($model: CmsTextUpdateInput!) {\r\n updateCmsText(model: $model) {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsTextFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CmsTextUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { cmsTextQuery, cmsTextQueryVariables } from '../generated/cmsTextQuery';\r\nimport { cmsTextFieldsFragment } from '../models/CmsText';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { Guid } from 'guid-string';\r\n\r\nexport interface CmsTextAsyncLoadOptions extends AsyncLoadOptions {\r\n name?: string,\r\n}\r\n\r\n/**\r\n * Get a CmsText from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCmsText(id?: string | undefined | null, options: CmsTextAsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query cmsTextQuery ($id: ID, $name: String) {\r\n model: cmsText(id: $id, name: $name) {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsTextFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? (options?.name? undefined: Guid.empty), // Only pass undefined if we are looking up by name, otherwise use Guid.empty.\r\n name: options?.name,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCmsTextCallback } from '../../../api/main/cmsTexts/useSaveCmsTextCallback';\r\nimport { CmsText } from '../../../api/main/models/CmsText';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { HtmlEditor } from '../../../shared/htmlEditor';\r\nimport { useCmsText } from '../../../api/main/cmsTexts/useCmsText';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\ninterface EditCmsTextProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CmsText.\r\n */\r\nexport const CreateCmsText = () => ();\r\n\r\n/**\r\n * Edit a CmsText.\r\n */\r\nexport const EditCmsText = (props: EditCmsTextProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useCmsText(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', html: '', } : {});\r\n const [save, { errors: saveErrors }] = useSaveCmsTextCallback();\r\n const history = useHistory();\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCmsText.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCmsText.createHeading', 'Add CMS text')}\r\n ): (\r\n <>{t('editCmsText.editHeading', 'Edit CMS text')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n\r\n \r\n \r\n change({ html: value })} />\r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { CmsTextCreateInput, CmsTextUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCmsTextCallback } from './useCreateCmsTextCallback';\r\nimport { useUpdateCmsTextCallback } from './useUpdateCmsTextCallback';\r\nimport { CmsText } from '../models/CmsText';\r\n\r\n/**\r\n * Get a callback to save a CmsText in the store using either a create or update.\r\n */\r\nexport function useSaveCmsTextCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCmsTextCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CmsTextCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCmsTextCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CmsTextUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCmsText } from '../../../api/main/cmsTexts/useCmsText';\r\nimport { useDeleteCmsTextCallback } from '../../../api/main/cmsTexts/useDeleteCmsTextCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n/**\r\n * Delete a CmsText.\r\n */\r\nexport const DeleteCmsText = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCmsText(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCmsTextCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCmsText.heading', 'Delete CMS text?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../../shared/routes\";\r\nimport { IdentityRoles } from \"../../../configure/security/IdentityRoles\";\r\nimport { CmsTextsList } from \"./CmsTextsList\";\r\nimport { EditCmsText, CreateCmsText } from \"./EditCmsText\";\r\nimport { DeleteCmsText } from \"./DeleteCmsText\";\r\n\r\nexport const cmsTextRoutes: Array = [\r\n { path: '/administration/cms/texts', exact: true, component: CmsTextsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/texts/edit/:id', component: EditCmsText, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/texts/add', component: CreateCmsText, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/texts/delete/:id', component: DeleteCmsText, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem, Card } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { NoResultsFound } from '../../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useCmsTexts } from '../../../api/main/cmsTexts/useCmsTexts';\r\nimport { HtmlDisplay } from '../../../shared/htmlEditor';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n\r\n/**\r\n * List of CmsTexts.\r\n */\r\nexport const CmsTextsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCmsTexts({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 3;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('cmsTextsList.heading', 'CMS text')}

\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 setSearch(e.currentTarget.value)} />\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 \r\n {\r\n items?.map(item => {\r\n const editUrl = `/administration/cms/texts/edit/${item.id}`;\r\n const onDoubleClick = () => history.push(editUrl);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('cmsTextsList.provider', 'CMS text')}{t('cmsTextsList.name', 'Name')} 
\r\n
{item.name}
\r\n
{item.name}\r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {/* This row is here for maintaining visible striping in the table only */}\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 * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { cmsTextsQuery, cmsTextsQueryVariables } from '../generated/cmsTextsQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { cmsTextFieldsFragment } from '../models/CmsText';\r\n\r\nexport interface CmsTextsAsyncLoadPagedOptions extends AsyncLoadPagedOptions {\r\n includeArchived?: boolean,\r\n}\r\n\r\n/**\r\n * Get a list of cmsTexts from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCmsTexts(options: CmsTextsAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query cmsTextsQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: cmsTexts (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsTextFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCmsTextMutation, deleteCmsTextMutationVariables } from '../generated/deleteCmsTextMutation';\r\nimport { cmsTextFieldsFragment } from '../models/CmsText';\r\n\r\n/**\r\n * Get a callback to delete a CmsText in the store.\r\n */\r\nexport function useDeleteCmsTextCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCmsTextMutation ($id: ID!) {\r\n deleteCmsText(id: $id) {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsTextFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import './aboutPage.scss';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Col, Container, Row } from 'reactstrap';\r\nimport { useAboutPageViewModel } from '../../api/main/cmsPages/viewModels/useAboutPageViewModel';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { CmsTextHtmlDisplay } from '../cms/cmsTexts/CmsTextHtmlDisplay';\r\nimport { CmsVideoDisplay } from '../cms/cmsVideos/CmsVideoDisplay';\r\nimport { Background } from '../shared/background/Background';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\n\r\n/**\r\n * Cms based About page. \r\n */\r\nexport const AboutPage = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { video, section1, section2 /*, section3, section4,*/ }, errors: cmsTextErrors } = useAboutPageViewModel();\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n

\r\n {t('aboutPage.registerHeading', 'Not registered yet?')}\r\n

\r\n

\r\n {t('aboutPage.registerText', 'Register for your free TheSchoolYear account and keep yourself and your calendar up to date with everything that\\'s happening in education, all the time.')}\r\n

\r\n \r\n \r\n \r\n {t('aboutPage.login', 'Already have an account? Sign in here.')}\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};","import { RouteEntry } from \"../../shared/routes\";\r\nimport { AboutPage } from \"./AboutPage\";\r\nimport { PrivacyPolicyPage } from \"./PrivacyPolicyPage\";\r\nimport { TermsAndConditionsPage } from \"./TermsAndConditionsPage\";\r\n\r\nexport const cmsPagesRoutes: Array = [\r\n { path: '/about', exact: true, component: AboutPage, authorize: false, },\r\n { path: '/privacy-policy', exact: true, component: PrivacyPolicyPage, authorize: false, },\r\n { path: '/terms-and-conditions', exact: true, component: TermsAndConditionsPage, authorize: false, },\r\n];\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { aboutPageViewModelQuery } from '../../generated/aboutPageViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsVideoFieldsFragment } from '../../models/CmsVideo';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { cmsTextFieldsFragment } from '../../models/CmsText';\r\n\r\n/**\r\n * View model for LoginPartialPage that loads all cms data needed for the page at once.\r\n * @param options\r\n */\r\nexport function useAboutPageViewModel(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query aboutPageViewModelQuery {\r\n video: cmsVideo(name: \"About.Video\") {\r\n ...cmsVideoFields\r\n\r\n videoBlobReference {\r\n ...blobReferenceFields\r\n }\r\n\r\n thumbnailBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n\r\n section1: cmsText(name: \"About.Section1\") {\r\n ...cmsTextFields\r\n }\r\n\r\n section2: cmsText(name: \"About.Section2\") {\r\n ...cmsTextFields\r\n }\r\n\r\n section3: cmsText(name: \"About.Section3\") {\r\n ...cmsTextFields\r\n }\r\n\r\n section4: cmsText(name: \"About.Section4\") {\r\n ...cmsTextFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n ${cmsTextFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useCmsText } from '../../api/main/cmsTexts/useCmsText';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { CmsTextHtmlDisplay } from '../cms/cmsTexts/CmsTextHtmlDisplay';\r\nimport { Background } from '../shared/background/Background';\r\nimport { Banner } from '../shared/Banner';\r\nimport { MainContainer } from '../shared/MainContainer';\r\n\r\n/**\r\n * Cms based page showing the privacy policy. \r\n */\r\nexport const PrivacyPolicyPage = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { model: cmsText }, errors: cmsTextErrors } = useCmsText(undefined, { name: 'Privacy policy' });\r\n\r\n return (\r\n \r\n \r\n

\r\n {t('privcyPolicyPage.heading', 'Privacy policy')}\r\n

\r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n );\r\n};","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useCmsText } from '../../api/main/cmsTexts/useCmsText';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { CmsTextHtmlDisplay } from '../cms/cmsTexts/CmsTextHtmlDisplay';\r\nimport { Background } from '../shared/background/Background';\r\nimport { Banner } from '../shared/Banner';\r\nimport { MainContainer } from '../shared/MainContainer';\r\n\r\n/**\r\n * Cms based page showing terms and conditions. \r\n */\r\nexport const TermsAndConditionsPage = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { model: cmsText }, errors: cmsTextErrors } = useCmsText(undefined, { name: 'Terms and conditions' });\r\n\r\n return (\r\n \r\n \r\n

\r\n {t('termsAndConditionsPage.heading', 'Terms and conditions')}\r\n

\r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n );\r\n};","import { RouteEntry } from \"../../shared/routes\";\r\nimport { RedirectToLink } from \"./RedirectToLink\";\r\n\r\nexport const linksRoutes: Array = [\r\n { path: '/link/to/:url/', exact: true, component: RedirectToLink, authorize: false, },\r\n];\r\n","import { Guid } from 'guid-string';\r\nimport * as React from 'react';\r\nimport { useParams } from 'react-router';\r\nimport { useCreateAnalyticEventCallback } from '../../api/main/analyticEvents/useCreateAnalyticEventCallback';\r\nimport { useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\n\r\n/**\r\n * Redirect the user to a link, logging the event for anlytical purposes on the way.\r\n */\r\nexport const RedirectToLink = () => {\r\n const { url } = useParams<{ url: string }>();\r\n const {\r\n calendarEventId,\r\n calendarEventUrlId,\r\n } = useSearchParams();\r\n\r\n const [createAnalyticEvent] = useCreateAnalyticEventCallback();\r\n const [hasBeenLogged, setHasBeenLogged] = React.useState(false);\r\n React.useEffect(() => {\r\n if (hasBeenLogged) {\r\n return;\r\n }\r\n\r\n setHasBeenLogged(true);\r\n\r\n (async () => {\r\n const realUrl = decodeURIComponent(url);\r\n\r\n await createAnalyticEvent({\r\n id: Guid.newGuid(),\r\n eventType: 'LinkClick',\r\n calendarEventId: calendarEventId,\r\n calendarEventUrlId: calendarEventUrlId,\r\n url: realUrl,\r\n });\r\n\r\n window.location.href = realUrl;\r\n })();\r\n }, [hasBeenLogged, setHasBeenLogged, createAnalyticEvent, url, calendarEventId, calendarEventUrlId]);\r\n\r\n return (\r\n \r\n );\r\n};","import gql from \"graphql-tag\";\r\nimport { cmsImageFields } from \"../generated/cmsImageFields\";\r\n\r\nexport const cmsImageFieldsFragment = gql`\r\n fragment cmsImageFields on CmsImage {\r\n id\r\n name\r\n blobReferenceId\r\n archived\r\n createdByUserId\r\n createdDate\r\n }\r\n`;\r\n\r\n\r\nexport type CmsImage = Omit;\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { NoResultsFound } from '../../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { UploadedImagePreview } from '../../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { useCmsImagesListViewModel } from '../../../api/main/cmsImages/viewModels/useCmsImagesListViewModel';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n\r\n/**\r\n * List of CmsImages.\r\n */\r\nexport const CmsImagesList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCmsImagesListViewModel({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 3;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('cmsImagesList.heading', 'CMS images')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => {\r\n const editUrl = `/administration/cms/images/edit/${item.id}`;\r\n const onDoubleClick = () => history.push(editUrl);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('cmsImagesList.provider', 'CMS image')}{t('cmsImagesList.name', 'Name')}  
\r\n
{item.name}
\r\n
{item.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsImageCreateInput } from '../generated/globalTypes';\r\nimport { createCmsImageMutation, createCmsImageMutationVariables } from '../generated/createCmsImageMutation';\r\nimport { cmsImageFieldsFragment } from '../models/CmsImage';\r\n\r\n/**\r\n * Get a callback to create a CmsImage in the store.\r\n */\r\nexport function useCreateCmsImageCallback(): [(model: CmsImageCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCmsImageMutation ($model: CmsImageCreateInput!) {\r\n createCmsImage(model: $model) {\r\n ...cmsImageFields\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CmsImageCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsImageUpdateInput } from '../generated/globalTypes';\r\nimport { updateCmsImageMutation, updateCmsImageMutationVariables } from '../generated/updateCmsImageMutation';\r\nimport { cmsImageFieldsFragment } from '../models/CmsImage';\r\n\r\n/**\r\n * Get a callback to update a CmsImage in the store.\r\n */\r\nexport function useUpdateCmsImageCallback(): [(id: string, model: CmsImageUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCmsImageMutation ($model: CmsImageUpdateInput!) {\r\n updateCmsImage(model: $model) {\r\n ...cmsImageFields\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CmsImageUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedFormFeedback, ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCmsImageCallback } from '../../../api/main/cmsImages/useSaveCmsImageCallback';\r\nimport { CmsImage } from '../../../api/main/models/CmsImage';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { FileUploadButton } from '../../shared/fileUploadButton/FileUploadButton';\r\nimport { UploadedImagePreview } from '../../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { useUploadBlobCallback } from '../../../api/main/blobReferences/useUploadBlobCallback';\r\nimport { BlobReference } from '../../../api/main/models/BlobReference';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\nimport { useEditCmsImageViewModel } from '../../../api/main/cmsImages/viewModels/useEditCmsImageViewModel';\r\n\r\ninterface EditCmsImageProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CmsImage.\r\n */\r\nexport const CreateCmsImage = () => ();\r\n\r\n/**\r\n * Edit a CmsImage.\r\n */\r\nexport const EditCmsImage = (props: EditCmsImageProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useEditCmsImageViewModel(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', } : {});\r\n const [save, { errors: saveErrors }] = useSaveCmsImageCallback();\r\n const history = useHistory();\r\n\r\n // Image display and uploading.\r\n const [imageBlob, setImageBlob] = React.useState();\r\n React.useEffect(() => setImageBlob(storeModel?.blobReference), [storeModel]);\r\n\r\n const [uploadBlob] = useUploadBlobCallback();\r\n const [uploadImageBlob, { isExecuting: isUploadingImageBlob, errors: uploadImageBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ blobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setImageBlob(blob);\r\n }, [uploadBlob, change, setImageBlob]);\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCmsImage.nameRequired', 'Name is required') : '',\r\n blobReferenceId: () => Guid.isEmpty(model?.blobReferenceId) ? t('editCmsImage.blobReferenceRequired', 'An uploaded image is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCmsImage.createHeading', 'Add CMS image')}\r\n ): (\r\n <>{t('editCmsImage.editHeading', 'Edit CMS image')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n uploadImageBlob(files)} isExecuting={isUploadingImageBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCmsImage.uploadImage', 'Upload image...')}\r\n \r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCmsImageViewModelQuery, editCmsImageViewModelQueryVariables } from '../../generated/editCmsImageViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsImageFieldsFragment } from '../../models/CmsImage';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { Guid } from 'guid-string';\r\n\r\n/**\r\n * View model for EditCmsImage that replaces the call to useCmsImage() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useEditCmsImageViewModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCmsImageViewModelQuery ($id: ID!) {\r\n model: cmsImage(id: $id) {\r\n ...cmsImageFields\r\n\r\n blobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { CmsImageCreateInput, CmsImageUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCmsImageCallback } from './useCreateCmsImageCallback';\r\nimport { useUpdateCmsImageCallback } from './useUpdateCmsImageCallback';\r\nimport { CmsImage } from '../models/CmsImage';\r\n\r\n/**\r\n * Get a callback to save a CmsImage in the store using either a create or update.\r\n */\r\nexport function useSaveCmsImageCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCmsImageCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CmsImageCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCmsImageCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CmsImageUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCmsImage } from '../../../api/main/cmsImages/useCmsImage';\r\nimport { useDeleteCmsImageCallback } from '../../../api/main/cmsImages/useDeleteCmsImageCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n/**\r\n * Delete a CmsImage.\r\n */\r\nexport const DeleteCmsImage = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCmsImage(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCmsImageCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCmsImage.heading', 'Delete CMS image?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../../shared/routes\";\r\nimport { IdentityRoles } from \"../../../configure/security/IdentityRoles\";\r\nimport { CmsImagesList } from \"./CmsImagesList\";\r\nimport { EditCmsImage, CreateCmsImage } from \"./EditCmsImage\";\r\nimport { DeleteCmsImage } from \"./DeleteCmsImage\";\r\n\r\nexport const cmsImageRoutes: Array = [\r\n { path: '/administration/cms/images', exact: true, component: CmsImagesList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/images/edit/:id', component: EditCmsImage, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/images/add', component: CreateCmsImage, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/images/delete/:id', component: DeleteCmsImage, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { cmsImagesListViewModelQuery, cmsImagesListViewModelQueryVariables } from '../../generated/cmsImagesListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsImageFieldsFragment } from '../../models/CmsImage';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { CmsImagesAsyncLoadPagedOptions } from '../useCmsImages';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\n\r\n/**\r\n * View model for CmsImagesList that replaces the call to useCmsImages() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useCmsImagesListViewModel(options: CmsImagesAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query cmsImagesListViewModelQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: cmsImages (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...cmsImageFields\r\n\r\n blobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { cmsImageQuery, cmsImageQueryVariables } from '../generated/cmsImageQuery';\r\nimport { cmsImageFieldsFragment } from '../models/CmsImage';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { Guid } from 'guid-string';\r\n\r\nexport interface CmsImageAsyncLoadOptions extends AsyncLoadOptions {\r\n name?: string,\r\n}\r\n\r\n/**\r\n * Get a CmsImage from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCmsImage(id?: string | undefined | null, options: CmsImageAsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query cmsImageQuery ($id: ID, $name: String) {\r\n model: cmsImage(id: $id, name: $name) {\r\n ...cmsImageFields\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? (options?.name? undefined: Guid.empty), // Only pass undefined if we are looking up by name, otherwise use Guid.empty.\r\n name: options?.name,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCmsImageMutation, deleteCmsImageMutationVariables } from '../generated/deleteCmsImageMutation';\r\nimport { cmsImageFieldsFragment } from '../models/CmsImage';\r\n\r\n/**\r\n * Get a callback to delete a CmsImage in the store.\r\n */\r\nexport function useDeleteCmsImageCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCmsImageMutation ($id: ID!) {\r\n deleteCmsImage(id: $id) {\r\n ...cmsImageFields\r\n }\r\n }\r\n\r\n ${cmsImageFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Table, Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { NoResultsFound } from '../../shared/NoResultsFound';\r\nimport { TableRowButtons } from '../../shared/TableRowButtons';\r\nimport { StickyToolbar } from '../../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { UploadedImagePreview } from '../../shared/uploadedImagePreview/UploadedImagePreview';\r\nimport { useCmsVideosListViewModel } from '../../../api/main/cmsVideos/viewModels/useCmsVideosListViewModel';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n\r\n/**\r\n * List of CmsVideos.\r\n */\r\nexport const CmsVideosList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useCmsVideosListViewModel({ pageSize: undefined });\r\n const [isMenuOpenIds, setIsMenuOpenIds] = React.useState>([]);\r\n const isMenuOpen = React.useCallback((id: string) => isMenuOpenIds.find(it => it === id) ? true : false, [isMenuOpenIds]);\r\n const toggleMenuOpen = React.useCallback((id: string) => {\r\n setIsMenuOpenIds(prevState => {\r\n if (prevState.find(it => it === id)) {\r\n return prevState.filter(it => it !== id);\r\n } else {\r\n return [...prevState, id];\r\n }\r\n });\r\n }, [setIsMenuOpenIds]);\r\n const history = useHistory();\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const colCount = 3;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{t('cmsVideosList.heading', 'CMS videos')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\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 \r\n \r\n {\r\n items?.map(item => {\r\n const editUrl = `/administration/cms/videos/edit/${item.id}`;\r\n const onDoubleClick = () => history.push(editUrl);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('cmsVideosList.provider', 'CMS image')}{t('cmsVideosList.name', 'Name')}  
\r\n
{item.name}
\r\n
{item.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\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","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsVideoCreateInput } from '../generated/globalTypes';\r\nimport { createCmsVideoMutation, createCmsVideoMutationVariables } from '../generated/createCmsVideoMutation';\r\nimport { cmsVideoFieldsFragment } from '../models/CmsVideo';\r\n\r\n/**\r\n * Get a callback to create a CmsVideo in the store.\r\n */\r\nexport function useCreateCmsVideoCallback(): [(model: CmsVideoCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createCmsVideoMutation ($model: CmsVideoCreateInput!) {\r\n createCmsVideo(model: $model) {\r\n ...cmsVideoFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: CmsVideoCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { CmsVideoUpdateInput } from '../generated/globalTypes';\r\nimport { updateCmsVideoMutation, updateCmsVideoMutationVariables } from '../generated/updateCmsVideoMutation';\r\nimport { cmsVideoFieldsFragment } from '../models/CmsVideo';\r\n\r\n/**\r\n * Get a callback to update a CmsVideo in the store.\r\n */\r\nexport function useUpdateCmsVideoCallback(): [(id: string, model: CmsVideoUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateCmsVideoMutation ($model: CmsVideoUpdateInput!) {\r\n updateCmsVideo(model: $model) {\r\n ...cmsVideoFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: CmsVideoUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Row, Col, ButtonGroup } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useChanges } from '../../../shared/useChanges';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedFormFeedback, ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { Guid } from 'guid-string';\r\nimport { useSaveCmsVideoCallback } from '../../../api/main/cmsVideos/useSaveCmsVideoCallback';\r\nimport { CmsVideo } from '../../../api/main/models/CmsVideo';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { FileUploadButton } from '../../shared/fileUploadButton/FileUploadButton';\r\nimport { useUploadBlobCallback } from '../../../api/main/blobReferences/useUploadBlobCallback';\r\nimport { BlobReference } from '../../../api/main/models/BlobReference';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\nimport { useEditCmsVideoViewModel } from '../../../api/main/cmsVideos/viewModels/useEditCmsVideoViewModel';\r\n\r\ninterface EditCmsVideoProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create a new CmsVideo.\r\n */\r\nexport const CreateCmsVideo = () => ();\r\n\r\n/**\r\n * Edit a CmsVideo.\r\n */\r\nexport const EditCmsVideo = (props: EditCmsVideoProps) => {\r\n const { isCreate } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading, errors: loadErrors } = useEditCmsVideoViewModel(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { id: Guid.newGuid(), name: '', } : {});\r\n const [save, { errors: saveErrors }] = useSaveCmsVideoCallback();\r\n const history = useHistory();\r\n\r\n // Video display and uploading.\r\n const [videoBlob, setVideoBlob] = React.useState();\r\n React.useEffect(() => setVideoBlob(storeModel?.videoBlobReference), [storeModel]);\r\n\r\n const [uploadBlob] = useUploadBlobCallback();\r\n const [uploadVideoBlob, { isExecuting: isUploadingVideoBlob, errors: uploadVideoBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ videoBlobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setVideoBlob(blob);\r\n }, [uploadBlob, change, setVideoBlob]);\r\n\r\n // Thumbnail display and uploading.\r\n const [thumbnailBlob, setThumbnailBlob] = React.useState();\r\n React.useEffect(() => setThumbnailBlob(storeModel?.thumbnailBlobReference), [storeModel]);\r\n\r\n const [uploadThumbnailBlob, { isExecuting: isUploadingThumbnailBlob, errors: uploadThumbnailBlobErrors }] = useAsyncCallback(async (files: FileList | null) => {\r\n if (!files) {\r\n return;\r\n }\r\n\r\n // Upload the blob.\r\n const blob = await uploadBlob(files);\r\n if (!blob) {\r\n return;\r\n }\r\n\r\n // Update the model.\r\n change({ thumbnailBlobReferenceId: blob.id });\r\n\r\n // Update the blob in the state.\r\n setThumbnailBlob(blob);\r\n }, [uploadBlob, change, setThumbnailBlob]);\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editCmsVideo.nameRequired', 'Name is required') : '',\r\n videoBlobReferenceId: () => Guid.isEmpty(model?.videoBlobReferenceId) ? t('editCmsVideo.videoBlobReferenceRequired', 'An uploaded video is required') : '',\r\n thumbnailBlobReferenceId: () => Guid.isEmpty(model?.thumbnailBlobReferenceId) ? t('editCmsVideo.thumbnailBlobReferenceRequired', 'An uploaded thumbnail image is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, !!isCreate);\r\n\r\n history.goBack();\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editCmsVideo.createHeading', 'Add CMS video')}\r\n ): (\r\n <>{t('editCmsVideo.editHeading', 'Edit CMS video')}\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
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n change({ name: e.currentTarget.value })} onBlur={e => validate('name')} validationErrors={validationErrors['name']} />\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 uploadVideoBlob(files)} isExecuting={isUploadingVideoBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCmsVideo.uploadVideo', 'Upload video...')}\r\n \r\n uploadThumbnailBlob(files)} isExecuting={isUploadingThumbnailBlob}\r\n executingChildren={<><> {t('common.uploading', 'Uploading...')}}\r\n >\r\n {t('editCmsVideo.uploadIThumbnail', 'Upload thumbnail...')}\r\n \r\n \r\n
\r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { editCmsVideoViewModelQuery, editCmsVideoViewModelQueryVariables } from '../../generated/editCmsVideoViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsVideoFieldsFragment } from '../../models/CmsVideo';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { Guid } from 'guid-string';\r\n\r\n/**\r\n * View model for EditCmsVideo that replaces the call to useCmsVideo() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useEditCmsVideoViewModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query editCmsVideoViewModelQuery ($id: ID!) {\r\n model: cmsVideo(id: $id) {\r\n ...cmsVideoFields\r\n\r\n videoBlobReference {\r\n ...blobReferenceFields\r\n }\r\n\r\n thumbnailBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}","import * as React from 'react';\r\nimport { CmsVideoCreateInput, CmsVideoUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateCmsVideoCallback } from './useCreateCmsVideoCallback';\r\nimport { useUpdateCmsVideoCallback } from './useUpdateCmsVideoCallback';\r\nimport { CmsVideo } from '../models/CmsVideo';\r\n\r\n/**\r\n * Get a callback to save a CmsVideo in the store using either a create or update.\r\n */\r\nexport function useSaveCmsVideoCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateCmsVideoCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as CmsVideoCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateCmsVideoCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as CmsVideoUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useCmsVideo } from '../../../api/main/cmsVideos/useCmsVideo';\r\nimport { useDeleteCmsVideoCallback } from '../../../api/main/cmsVideos/useDeleteCmsVideoCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../../shared/Banner';\r\nimport { Background } from '../../shared/background/Background';\r\nimport { CmsAdministrationWarning } from '../shared/CmsAdministrationWarning';\r\n\r\n/**\r\n * Delete a CmsVideo.\r\n */\r\nexport const DeleteCmsVideo = () => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useCmsVideo(id);\r\n const [remove, { errors: removeErrors }] = useDeleteCmsVideoCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n\r\n history.goBack();\r\n }, [remove, model, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteCmsVideo.heading', 'Delete CMS video?')}

\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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { RouteEntry } from \"../../../shared/routes\";\r\nimport { IdentityRoles } from \"../../../configure/security/IdentityRoles\";\r\nimport { CmsVideosList } from \"./CmsVideosList\";\r\nimport { EditCmsVideo, CreateCmsVideo } from \"./EditCmsVideo\";\r\nimport { DeleteCmsVideo } from \"./DeleteCmsVideo\";\r\n\r\nexport const cmsVideoRoutes: Array = [\r\n { path: '/administration/cms/videos', exact: true, component: CmsVideosList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/videos/edit/:id', component: EditCmsVideo, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/videos/add', component: CreateCmsVideo, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/cms/videos/delete/:id', component: DeleteCmsVideo, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult } from '../../../../shared/abstractStore';\r\nimport { cmsVideosListViewModelQuery, cmsVideosListViewModelQueryVariables } from '../../generated/cmsVideosListViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { cmsVideoFieldsFragment } from '../../models/CmsVideo';\r\nimport { blobReferenceFieldsFragment } from '../../models/BlobReference';\r\nimport { CmsVideosAsyncLoadPagedOptions } from '../useCmsVideos';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\n\r\n/**\r\n * View model for CmsVideosList that replaces the call to useCmsVideos() and loads the right related data.\r\n * @param options\r\n */\r\nexport function useCmsVideosListViewModel(options: CmsVideosAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query cmsVideosListViewModelQuery ($offset: Int, $first: Int, $includeArchived: Boolean) {\r\n items: cmsVideos (offset: $offset, first: $first, includeArchived: $includeArchived) {\r\n ...cmsVideoFields\r\n\r\n thumbnailBlobReference {\r\n ...blobReferenceFields\r\n }\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n ${blobReferenceFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n includeArchived: options.includeArchived,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { cmsVideoQuery, cmsVideoQueryVariables } from '../generated/cmsVideoQuery';\r\nimport { cmsVideoFieldsFragment } from '../models/CmsVideo';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { Guid } from 'guid-string';\r\n\r\nexport interface CmsVideoAsyncLoadOptions extends AsyncLoadOptions {\r\n name?: string,\r\n}\r\n\r\n/**\r\n * Get a CmsVideo from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useCmsVideo(id?: string | undefined | null, options: CmsVideoAsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query cmsVideoQuery ($id: ID, $name: String) {\r\n model: cmsVideo(id: $id, name: $name) {\r\n ...cmsVideoFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? (options?.name? undefined: Guid.empty), // Only pass undefined if we are looking up by name, otherwise use Guid.empty.\r\n name: options?.name,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteCmsVideoMutation, deleteCmsVideoMutationVariables } from '../generated/deleteCmsVideoMutation';\r\nimport { cmsVideoFieldsFragment } from '../models/CmsVideo';\r\n\r\n/**\r\n * Get a callback to delete a CmsVideo in the store.\r\n */\r\nexport function useDeleteCmsVideoCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteCmsVideoMutation ($id: ID!) {\r\n deleteCmsVideo(id: $id) {\r\n ...cmsVideoFields\r\n }\r\n }\r\n\r\n ${cmsVideoFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { RouteEntry } from \"../shared/routes\";\r\nimport { apiAuthorizationRoutes } from \"../components/api-authorization/routes\";\r\nimport { accountRoutes } from \"../components/account/routes\";\r\nimport { profileRoutes } from \"../components/profiles/routes\";\r\nimport { userRoutes } from \"../components/users/routes\";\r\nimport { NotFound } from \"../components/shared/NotFound\";\r\nimport { homeRoutes } from \"../components/home/routes\";\r\nimport { administrationRoutes, administrationSidebarRoutes } from \"../components/administration/routes\";\r\nimport { calendarRoutes } from \"../components/calendar/routes\";\r\nimport { calendarEventTypeRoutes } from \"../components/calendarEventTypes/routes\";\r\nimport { calendarEventProviderRoutes } from \"../components/calendarEventProviders/routes\";\r\nimport { calendarHeadlineRoutes } from \"../components/calendarHeadlines/routes\";\r\nimport { schoolPhaseRoutes } from \"../components/schoolPhases/routes\";\r\nimport { schoolTypeRoutes } from \"../components/schoolTypes/routes\";\r\nimport { tagRoutes } from \"../components/tags/routes\";\r\nimport { calendarEventRoutes } from \"../components/calendarEvents/routes\";\r\nimport { analyticEventRoutes } from \"../components/analyticEvents/routes\";\r\nimport { cmsTextRoutes } from \"../components/cms/cmsTexts/routes\";\r\nimport { cmsPagesRoutes } from \"../components/cmsPages/routes\";\r\nimport { linksRoutes } from \"../components/links/routes\";\r\nimport { cmsImageRoutes } from \"../components/cms/cmsImages/routes\";\r\nimport { cmsVideoRoutes } from \"../components/cms/cmsVideos/routes\";\r\n\r\n\r\nexport const appRoutes: Array = [\r\n ...apiAuthorizationRoutes,\r\n ...accountRoutes,\r\n ...homeRoutes,\r\n ...profileRoutes,\r\n ...userRoutes,\r\n\r\n ...analyticEventRoutes,\r\n ...administrationRoutes,\r\n ...calendarRoutes,\r\n ...calendarEventTypeRoutes,\r\n ...calendarEventProviderRoutes,\r\n ...calendarHeadlineRoutes,\r\n ...calendarEventRoutes,\r\n ...cmsPagesRoutes,\r\n ...cmsImageRoutes,\r\n ...cmsTextRoutes,\r\n ...cmsVideoRoutes,\r\n ...linksRoutes,\r\n ...schoolPhaseRoutes,\r\n ...schoolTypeRoutes,\r\n ...tagRoutes,\r\n\r\n { path: undefined, component: NotFound }\r\n];\r\n\r\nexport const sidebarRoutes: Array = [\r\n ...administrationSidebarRoutes,\r\n];","import * as React from 'react';\r\nimport { Button } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router';\r\nimport { MainContainer } from './MainContainer';\r\nimport { Banner } from './Banner';\r\nimport { Background } from './background/Background';\r\n\r\n/**\r\n * Component to show when a route is not found. \r\n */\r\nexport const NotFound = () => {\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n return (\r\n \r\n \r\n

{t('notFound.notFoundHeading', 'Sorry the page you have requested cannot be found')}

\r\n
\r\n \r\n

\r\n {t('notFound.helpText', 'The link you have acccessed is for a page that could not be found. Please check and try again, or try navigating to the page you want using the apps menus.')}\r\n

\r\n\r\n \r\n
\r\n
\r\n );\r\n};","import './sidebar.scss';\r\n\r\nimport * as React from 'react';\r\nimport { AppSidebar, AppSidebarFooter, AppSidebarForm, AppSidebarHeader, AppSidebarMinimizer } from '@coreui/react';\r\nimport { SidebarNav } from '../../shared/sidebarNav';\r\nimport { AppRoutes } from '../shared/AppRoutes';\r\nimport { sidebarRoutes } from '../../configure/routeConfig';\r\nimport { Nav } from 'reactstrap';\r\nimport { Navigation } from './Navigation';\r\n\r\nexport const Sidebar = () => {\r\n return (\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n );\r\n};\r\n","import './layout.scss';\r\n\r\nimport * as React from 'react';\r\n//import { AppBreadcrumb } from '@coreui/react';\r\nimport { Header } from './Header';\r\nimport { Footer } from './Footer';\r\n\r\nimport { Sidebar } from './Sidebar';\r\nimport { LoadingIndicator } from '../../components/shared/LoadingIndicator';\r\n\r\nimport { RouteEntry } from '../../shared/routes';\r\n\r\nexport interface LayoutProps {\r\n appRoutes: Array,\r\n children: React.ReactNode\r\n}\r\n\r\nexport const Layout = (props: LayoutProps) => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n {/**/}\r\n }>\r\n {props.children}\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { Library, library } from '@fortawesome/fontawesome-svg-core';\r\nimport { faSpinner, faLock, faUser, faSearch, faPlus, faCogs, faSave, faEdit, faUsers, faTrash, faCaretUp, faCaretDown, faCaretLeft, faUndo, faMinus, faExclamationCircle, faCaretRight, faTimesCircle, faCalendarWeek, faBusinessTime, faStopwatch, faUserClock, faTimes, faStop, faDesktop, faRuler, faFlagCheckered, faPlay, faUserCheck, faCreditCard, faPhone, faEnvelope, faSchool, faPoundSign, faVoteYea, faPersonBooth, faTrashAlt, faChevronLeft, faChevronRight, faDownload, faCross, faCheckCircle, faEye, faTrashRestore, faSync, faArchive, faBusAlt, faThumbsDown, faThumbsUp, faCloudDownloadAlt, faPhotoVideo, faTag, faUserTag, faArchway, faCalendarCheck, faLink, faCalendarDay, faFileAlt, faInfo, faCalendarPlus, faCalendarAlt, faUserGraduate } from '@fortawesome/free-solid-svg-icons';\r\nimport { faFrown as farFrown, faFrownOpen as farFrownOpen, faCircle as farCircle, faClock as farClock, faCalendarAlt as farCalendarAlt, faListAlt as farListAlt, faCalendarTimes as farCalendarTimes } from '@fortawesome/free-regular-svg-icons';\r\n\r\n// Import the fontawsome icons we actually want to use.\r\nexport const initializeIcons = () => {\r\n configureIcons(library);\r\n};\r\n\r\nexport const configureIcons = (library: Library) => {\r\n library.add(\r\n // solid\r\n faArchive,\r\n faArchway,\r\n faBusAlt,\r\n faBusinessTime,\r\n faCalendarCheck,\r\n faCalendarDay,\r\n faCalendarPlus,\r\n faCalendarWeek,\r\n faCalendarAlt,\r\n faCaretUp,\r\n faCaretDown,\r\n faCaretLeft,\r\n faCaretRight,\r\n faCheckCircle,\r\n faChevronLeft,\r\n faChevronRight,\r\n faCloudDownloadAlt,\r\n faCogs,\r\n faCreditCard,\r\n faCross,\r\n faDesktop,\r\n faDownload,\r\n faEdit,\r\n faExclamationCircle,\r\n faEye,\r\n faFileAlt,\r\n faFlagCheckered,\r\n faInfo,\r\n faLink,\r\n faLock,\r\n faMinus,\r\n faPersonBooth,\r\n faPhotoVideo,\r\n faPlay,\r\n faPlus,\r\n faPoundSign,\r\n faRuler,\r\n faSave,\r\n faSchool,\r\n faSearch,\r\n faSpinner,\r\n faStop,\r\n faStopwatch,\r\n faSync,\r\n faTag,\r\n faThumbsDown,\r\n faThumbsUp,\r\n faTimes,\r\n faTimesCircle,\r\n faTrash,\r\n faTrashAlt,\r\n faTrashRestore,\r\n faUndo,\r\n faUser,\r\n faUserCheck,\r\n faUserClock,\r\n faUserGraduate,\r\n faUserTag,\r\n faUsers,\r\n faVoteYea,\r\n\r\n // regular\r\n farCalendarAlt,\r\n farCalendarTimes,\r\n farCircle,\r\n farClock,\r\n farFrown,\r\n farFrownOpen,\r\n farListAlt,\r\n faPhone,\r\n faEnvelope,\r\n );\r\n};\r\n","import { mainApiConfig } from \"./mainApiConfig\";\r\nimport { CachePersistor } from 'apollo3-cache-persist';\r\n\r\nimport { ApolloClient, HttpLink, InMemoryCache } from \"@apollo/client\";\r\n\r\nconst cache = new InMemoryCache();\r\n\r\n// Load cache from the persisited storage.\r\nexport const apolloCachePersistor = new CachePersistor({\r\n cache,\r\n storage: (window.localStorage as any),\r\n});\r\napolloCachePersistor.restore();\r\n\r\nconst link = new HttpLink({\r\n uri: mainApiConfig.endpoint,\r\n credentials: 'same-origin',\r\n});\r\n\r\nexport const apolloClient = new ApolloClient({\r\n link: link,\r\n cache: cache,\r\n});","// Import the required localization files for momentjs.\r\n//import 'moment/locale/en-us'; // Built in.\r\nimport 'moment/locale/en-gb';\r\n//import 'moment/locale/fr';\r\n//import 'moment/locale/pt';\r\n//import 'moment/locale/es';\r\n\r\n// Import the required localization files for numeraljs.\r\n//import 'numeral/locale/en-us'; // Built in.\r\nimport 'numeral/locales/en-gb';\r\n//import 'numeral/locales/fr';\r\n//import 'numeral/locales/pt-pt';\r\n//import 'numeral/locales/es';\r\n\r\n\r\n/**\r\n * Languages available in the application. \r\n */\r\nexport const availableLanguages = [\r\n { code: 'en-US', name: 'English (American)', flagCountryCode: 'us', momentLocale: 'en', numeralLocale: 'en' },\r\n { code: 'en-GB', name: 'English (British)', flagCountryCode: 'gb', momentLocale: 'en-gb', numeralLocale: 'en-gb' },\r\n //{ code: 'fr', name: 'Français', flagCountryCode: 'fr', momentLocale: 'fr', numeralLocale: 'fr' },\r\n //{ code: 'pt', name: 'Português', flagCountryCode: 'pt', momentLocale: 'pt', numeralLocale: 'pt-pt' },\r\n //{ code: 'es', name: 'Español', flagCountryCode: 'fr', momentLocale: 'fr', numeralLocale: 'fr' }\r\n];\r\n","import * as React from 'react';\r\nimport { Layout } from './components/layout/Layout';\r\nimport { ServiceProviderContext } from 'inject-typesafe-react';\r\nimport { createServiceProvider } from './configure/configureServices';\r\nimport { AppRoutes } from './components/shared/AppRoutes';\r\nimport { appRoutes } from './configure/routeConfig';\r\nimport { initializeIcons } from './configure/iconsConfig';\r\nimport { Helmet, HelmetProvider } from 'react-helmet-async';\r\nimport { ApolloProvider } from '@apollo/react-hooks';\r\nimport { apolloClient, apolloCachePersistor } from './configure/configureApollo';\r\nimport { configurei18n } from './configure/i18n';\r\nimport { LoadingIndicator } from './components/shared/LoadingIndicator';\r\nimport { I18nextProvider } from 'react-i18next';\r\nimport authService from './api/api-authorization/AuthorizeService';\r\nimport { configureErrorMessages } from './configure/errorMessageConfig';\r\nimport { RecoilRoot } from 'recoil';\r\nimport { purgeRecoilPersist } from './configure/recoilPersistConfig';\r\n\r\n// Configure services.\r\nconst serviceProvider = createServiceProvider();\r\n\r\n// When the authorization state changes, clear the right parts of our caches.\r\nauthService.subscribe(() => {\r\n purgeRecoilPersist();\r\n apolloCachePersistor.purge();\r\n});\r\n\r\n// Configure icons.\r\ninitializeIcons();\r\n\r\n// Configure i18n\r\nconst i18n = configurei18n();\r\n\r\n// Configure server and 3rd party error messages to make them friendly and translatable.\r\nconfigureErrorMessages();\r\n\r\n\r\n\r\n// App component.\r\nexport const App = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { ServiceResolver, ServiceProvider, IServiceCollectionBuilder } from \"inject-typesafe\";\r\nimport { AccountService } from \"../api/account\";\r\nimport { ApiFetch } from 'apifetch-json';\r\n\r\n/**\r\n * Returns a configured service provider.\r\n */\r\nexport function createServiceProvider() {\r\n return new ServiceProvider((builder: IServiceCollectionBuilder) => ({\r\n accountService: builder.singleton(services => new AccountService()),\r\n apiFetch: builder.singleton(services => new ApiFetch()),\r\n }));\r\n}\r\n\r\nexport interface AppServices {\r\n accountService: ServiceResolver,\r\n apiFetch: ServiceResolver,\r\n}\r\n\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport Backend from 'i18next-xhr-backend';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport moment, { isMoment } from 'moment';\r\nimport numeral from 'numeral';\r\nimport { isNumber } from 'util';\r\nimport { availableLanguages } from './languageConfig';\r\n\r\n// not like to use this?\r\n// have a look at the Quick start guide \r\n// for passing in lng and translations on init\r\nexport function configurei18n() {\r\n i18n\r\n // load translation using xhr -> see /public/locales\r\n // learn more: https://github.com/i18next/i18next-xhr-backend\r\n .use(Backend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n .use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n fallbackLng: 'en-GB',\r\n //debug: true,\r\n\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n\r\n format: function (value, format, lang) {\r\n // Handle dates with moment.\r\n if (value instanceof Date) {\r\n return moment(value).format(format);\r\n } else if (isMoment(value)) {\r\n return moment(value).format(format);\r\n }\r\n\r\n // Handle numbers with numeral.\r\n if (value instanceof Number) {\r\n return numeral(value).format(format);\r\n } else if (isNumber(value)) {\r\n return numeral(value).format(format);\r\n }\r\n\r\n return value;\r\n }\r\n }\r\n });\r\n\r\n // Keep the moment and numeral formats in sync with the i18n formats.\r\n i18n.on('languageChanged', (lng) => {\r\n // As we are not supporting internationalisation in this app:\r\n // Force all en * language to always be en - GB as this is only for UK use, and Chrome in the UK download defaults to the en/en-US language.\r\n if ((lng?.indexOf('en') ?? 0) !== -1) {\r\n lng = 'en-GB';\r\n }\r\n\r\n const thisLanguage = availableLanguages.find(item => item.code === lng);\r\n\r\n moment.locale(thisLanguage?.momentLocale ?? lng);\r\n numeral.locale(thisLanguage?.numeralLocale ?? lng);\r\n });\r\n\r\n return i18n;\r\n}\r\n","import { registerErrorMessageConverters } from \"../shared/userFriendlyErrorMessage\";\r\nimport i18next from \"i18next\";\r\n\r\n// Register the converters to make friendly versions of error messages.\r\n// This is primarily used to make friendly versions of message from 3rd party libraries, or the server.\r\n// By convention tranlsation keys for returned errors should start \"error.\" rather than \"errorMessageConfig.\".\r\nexport function configureErrorMessages() {\r\n registerErrorMessageConverters([\r\n // Convert the apollo graphql errors message to something more friendly.\r\n (error) => {\r\n let shouldHandle = false;\r\n let message = error?.message ?? error?.toString() ?? ''; /* Sometimes we get an Error sometimes we get a String */\r\n let graphQLErrors: Array = [];\r\n switch (message) {\r\n // Network errors get a friendly message that is nicer given the use of cache for offline support.\r\n case 'Network error: Failed to fetch':\r\n message = i18next.t('error.apollo.networkErrorFailedToFetch', 'Could not synchronize information with the cloud.');\r\n shouldHandle = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // Handle graphQL errors as they all start with GraphQL error: in their message.\r\n if (message.indexOf('GraphQL error: ') === 0) {\r\n if (message.indexOf('GraphQL error: GraphQL.Validation.ValidationError: ') === 0) {\r\n message = i18next.t('error.apollo.graphQLValidationError', 'GraphQL error: request is not not a valid GraphQL query or mutation.');\r\n } else if (message.indexOf('GraphQL error: GraphQL.ExecutionError: ') === 0) {\r\n message = i18next.t('error.apollo.graphQLExecutionError', 'GraphQL error: query or mutation could not be executed.');\r\n }\r\n\r\n shouldHandle = true;\r\n }\r\n\r\n // If we have a graphQL errors, then lets handle those as seperate errors for the purpose of showing them.\r\n if (error?.graphQLErrors) {\r\n graphQLErrors = error?.graphQLErrors;\r\n shouldHandle = true;\r\n }\r\n\r\n // If we haven't decided we should handle this error by this point then just skip it.\r\n if (!shouldHandle) {\r\n console.log(error);\r\n return null;\r\n }\r\n\r\n // If we have multiple graphQLErrors in one Error object, lets return one error for each GraphQL error.\r\n if (graphQLErrors.length) {\r\n return graphQLErrors.map(item => ({\r\n message: message,\r\n details: i18next.t('errors.apollo.graphQLErrors.detail', '{{message}} location: {{location}}', { message: item.message, location: item.location }),\r\n error: error,\r\n }));\r\n }\r\n\r\n // Return the error.\r\n return { message, error };\r\n },\r\n\r\n // Convert error messages from the Account REST API to make them translatable.\r\n // Note that the original messages are friendly enough so we just use those for English but pass them for translation.\r\n (error) => {\r\n switch (error?.message) {\r\n // General messages used by multiple actions in the API.\r\n case 'This email does not have an account here.':\r\n return i18next.t('error.accountApi.common.NoAccountHere', 'This email does not have an account here.');\r\n case 'This account is not allowed to use this site.':\r\n return i18next.t('error.accountApi.common.notAllowed', 'This account is not allowed to use this site.');\r\n case '\"This account has been locked out, please try again later.':\r\n return i18next.t('error.accountApi.common.lockedOut', '\"This account has been locked out, please try again later.');\r\n case 'This email is already registered.':\r\n return i18next.t('error.accountApi.common.alreadyRegistered', 'This email is already registered.');\r\n case 'Unknown user':\r\n return i18next.t('error.accountApi.common.unknownUser', 'Unknown user');\r\n\r\n // Specific messages that are only used by individual actions.\r\n // Login\r\n case 'Invalid password':\r\n return i18next.t('error.accountApi.login.invalidPassword', 'Invalid password');\r\n // CreateAccountForExternalLogin\r\n case 'Error loading external login information during confirmation.':\r\n return i18next.t('error.accountApi.createAccountForExternalLogin', 'Error loading external login information during confirmation.');\r\n // CompleteExternalLogin\r\n case 'Error loading external login information.':\r\n return i18next.t('error.accountApi.completeExternalLogin.errorLoadingExternalLoginInformation', 'Error loading external login information.');\r\n // SendPasswordResetModel\r\n case 'This email has not been confirmed, so we can\\'t send a password reset until it has been confirmed.':\r\n return i18next.t('error.accountApi.', 'This email has not been confirmed, so we can\\'t send a password reset until it has been confirmed.');\r\n // ConfirmEmail\r\n case 'Error confirming your email.':\r\n return i18next.t('error.accountApi.confirmEmail.errorConfirmingEmail', 'Error confirming your email.');\r\n // ConfirmEmailChange\r\n case 'Error changing email.':\r\n return i18next.t('error.accountApi.errorChangingEmail', 'Error changing email.');\r\n // ConfirmInvite\r\n case 'This email has not been invited.':\r\n return i18next.t('error.accountApi.confirmInvite.notInvited', 'This email has not been invited.');\r\n case 'This invite has already been accepted.':\r\n return i18next.t('error.accountApi.confirmInvite.alreadyAccepted', 'This invite has already been accepted.');\r\n // Lockout\r\n case 'Error setting lockout for user':\r\n return i18next.t('error.accountApi.lockout.errorSettingLockout', 'Error setting lockout for user');\r\n default:\r\n break;\r\n }\r\n\r\n // Handle external authentication provider errors (from CompleteExternalLogin) by passing on the error with a chance to translate the prefix.\r\n if (error?.message?.indexOf('Error from external provider: ') === 0) {\r\n const externalProviderError = error.message.subStr(30);\r\n return i18next.t('error.accountApi.completeExternalLogin.externalProviderError', 'Error from external provider: {{error}}', { error: externalProviderError });\r\n }\r\n\r\n return null;\r\n },\r\n\r\n //(error) => {\r\n // // If we are in debug mode, log any error messages we get that were not made friendly.\r\n // console.debug(error);\r\n //}\r\n ]);\r\n}\r\n","// In production, we register a service worker to serve assets from local cache.\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 the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\n//let window: any;\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.1/8 is 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 default function register() {\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/facebookincubator/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. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: any) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker: any = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\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 }\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: any) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then((response: any) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').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);\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 { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import './configure/polyfill';\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Router } from 'react-router-dom';\r\nimport { App } from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport ReactGA from 'react-ga';\r\nimport { createBrowserHistory } from 'history';\r\nimport authService from './api/api-authorization/AuthorizeService';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') || undefined;\r\nconst rootElement = document.getElementById('root');\r\n\r\n// Configure google analytics and attach it to the routing events.\r\nconst history = createBrowserHistory({ basename: (baseUrl == null ? \"/\" : (baseUrl as string | undefined)) });\r\nReactGA.initialize('UA-78426939-4');\r\nhistory.listen(location => {\r\n // Grab the readily available user information (we don't want to allow analytics to be a reason why we async load anything so we don't use getUser() here).\r\n var identity = authService._user?.profile;\r\n ReactGA.set({ userId: identity?.email ?? '' });\r\n\r\n ReactGA.set({ page: location.pathname });\r\n ReactGA.pageview(location.pathname);\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n\r\n"],"sourceRoot":""}