{"version":3,"sources":["core.min.js"],"names":["re","window","location","href","search","pingdom","document","createElement","type","async","src","s","getElementsByTagName","parentNode","insertBefore","init","isModuleLoaded","moduleName","angular","module","e","moduleInit","modules","_","forEach","m","log","exports","_ng","filterParam","key","this","value","equals","val","operator","isArray","map","i","join","any","childkey","timezoneLookup","school","summerTimeZone","shortName","validTimezones","regex","phoneNumber","emailAddress","zipCode","getODataRequest","oDataParams","returnValue","top","orderby","select","skip","count","$filter","getODataFilterQuerystringValue","filter","getODataQuerystringValue","needAmpersand","length","capitalizeFirstLetter","string","charAt","toUpperCase","slice","cleanString","dirtyString","replace","getODataFilterFromParams","params","capitalizeIdString","firstLetterCapitalize","oDataFilter","propertyName","hasOwnProperty","newPropertyName","lastIndexOf","getParsedODataFilter","FilterOption","comparer","booleanOperator","updateODataFilterWithNHAFilter","nhaFilters","filterPropertyName","options","selectedItemIds","items","opts","extend","undefined","_utils","filterLookup","prop","filterObject","Array","thisFilter","j","Date","quotePlaceholder","isNaN","filterQuery","parameters","push","setOrderByParameters","sort","sortString","criteria","descending","$orderby","setSearchFilter","text","searchFields","splitText","split","word","searchParameter","searchField","openUrl","url","openInNewTab","open","joinUrl","baseUrl","theUrl","URI","is","absoluteTo","toString","getHashCode","h","charCodeAt","ensureDateIsValidMomentDate","date","momentToReturn","moment","isMoment","String","indexOf","isValid","setFilterItem","filters","filterKey","selectedFilterValue","selectedFilterItem","head","id","setFilterODataItem","keyName","selectedFilter","setFilterItemsByKeys","useCamelCaseId","keys","renderDatesAsStrings","formatDateAsDate","delimiter","format","stripTimeFromDate","datetime","getDateFromTimeString","time","returnTime","hour","minute","inSchoolTimezone","dateTime","timeZoneName","timeZone","tz","inSpecifiedTimezone","dateTimeString","timezoneStart","serverOffset","parseInt","substring","len","guess","utcOffset","replaceAll","target","replacement","RegExp","enableScrollToTopOnStateChangeSuccess","setTimeout","body","scrollTop","documentElement","keyCodes","leftArrow","upArrow","rightArrow","downArrow","shift","tab","enter","escape","call","prototype","zoneNames","EST","EDT","CST","CDT","MST","MDT","PST","PDT","GMT","UTC","zoneName","abbr","zoneAbbr","toJSON","args","arguments","match","number","hashCode","hash","charCode","toNameCase","name","NameCase","checkName","individualFields","config","UserContextService","ensureUserContext","run","$rootScope","pageTitleAppName","defaultPageTitle","$on","event","toState","toParams","fromState","fromParams","title","$inject","factory","Restangular","baseService","withConfig","RestangularConfigurer","setBaseUrl","appSettings","coreServicesRootUrl","attendanceServicesRootUrl","householdManagementServicesRootUrl","applicationServicesRootUrlv2","caseloadServicesRootUrl","enrollmentServicesRootUrl","administrationServicesRootUrl","studentServicesServicesRootUrl","masterSchedulingServicesRootUrl","gradebookServicesRootUrl","portalServicesRootUrl","curriculumServicesRootUrl","launchpadServicesRootUrl","assessmentServicesRootUrl","behaviorServicesRootUrl","questionnaireServicesRootUrl","reportingServicesRootUrl","dataWarehouseServicesRootUrl","ILMServicesRootUrl","calendarServicesRootUrl","service","AttendanceRestangular","CoreRestangular","ApplicationRestangular","CaseloadRestangular","EnrollmentRestangular","StudentServicesRestangular","AdministrationRestangular","MasterSchedulingRestangular","HouseholdRestangular","PortalRestangular","CurriculumRestangular","LaunchpadRestangular","AssessmentRestangular","BehaviorRestangular","MasterScheduleBuilderRestangular","GradebookRestangular","ReportingRestangular","ILMRestangular","RetentionRestangular","DefaultRestangular","getApiByName","apiLookup","getApiNameByRestangular","restangular","configuration","Attendance","Core","Application","CaseloadManagement","Enrollment","StudentServices","Administration","MasterScheduling","HouseholdManagement","Portal","Gradebook","Curriculum","LaunchPad","Assessment","Behavior","ScheduleQuestionnaire","Reporting","ILM","Retention","$q","cache","getSingle","endpoint","shouldCache","shouldLog","RestangularFactory","useInMemoryCache","getList","then","result","deferred","defer","cacheKey","isEmpty","JSON","stringify","cachedData","inMemoryCache","getByObjectKey","resolve","promise","isUndefined","one","get","data","putByObjectKey","error","reject","put","objectToUpdate","paramsOriginallyUsedInGetList","all","customPUT","destroyByObjectKey","q","DSCacheFactory","onExpire","storageMode","localStorage","maxAge","cacheFlushInterval","deleteOnExpire","capacity","cacheFactory","obj","getHashKey","description","remove","clearAll","removeAll","repositoryFactory","endpointOptions","svc","assign","defaultOptions","isOData","urlAppendString","requireODataFilter","pageSize","append","moreExist","loadedCount","getPage","_options","searchText","textSearchFields","getAll","response","pubSubFactory","PubSubManager","appName","hasKey","addData","callback","addCallback","clean","scope","signature","$id","removeCallback","bind","cb","index","cbSignature","splice","getData","setData","oldData","copy","removeData","removeAllData","resetData","each","cacheName","uniqueId","concat","apiParameters","orderBy","includes","endpointUrl","entity","post","customPOST","save","patch","$templateCache","guid","c","r","Math","random","v","request","$httpProvider","interceptors","_appSettings","myNHA","IMPERSONATION_COOKIE","environment","addImpersonationHeader","headers","Cookies","notifySvc","statusCodes","400","message","401","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","500","501","502","503","504","505","511","interceptor","responseError","status","success","getToken","token","SESSION_COOKIE","addAuthToken","_myNHA","_userSessionService","UserSessionService","_refreshInProgress","enableSessionInjectorApiRequestLogging","console","Promise","check","setInterval","hasUserToken","clearInterval","JWT","isTokenExpired","refreshToken","jwt","academicYearRepository","coreRestangular","getAllAcadmicYears","getByAcademicYearId","academicYearId","getCurrentAcademicYear","IsCurrent","getAllAcademicYears","accessibleResourceRepository","ApiSecurityService","$timeout","apiResolutionService","parseResource","singleResourceString","resource","action","parseApiResourceAction","apiResourceAction","defaultApi","apiTokenIndex","api","substr","resourceAction","parsedResourceAction","doesPolicyAllowAccess","application","accessibleResources","isAccessAllowed","disableApiSecurity","forceBulkAccessCall","debug","disableBulkAuthorizationRetrieval","isAccessAllowedSingle","isAccessAllowedBulk","hasSaviyntEntitlement","entitlement","context","entitlementParts","toLowerCase","entitlementType","entitlementName","entitlements","find","applicationName","isBulkLoadingAccess","waitForAccessibleResources","loadAccessibleResources","setAccessibleResources","isAllowed","tmpResources","applicationResources","groupBy","groupedResources","resourceName","trimmedResourceName","trim","resources","individualResource","doesUserHaveClaim","claimType","getUserContext","isFeatureAccessible","getClaimValue","appContextFactory","$stateParams","appContextModel","schoolService","stateRepository","schoolAcademicYearRepository","ipCookie","modelExtension","retrievalMethodExtension","ensureAppContext","loadContext","getContext","compileMethods","retrievalMethods","loadAcademicYear","loadState","loadSchool","loadSchoolAcademicYear","item","getPersistedAcademicYearId","academicYear","academicYearID","academicYears","year","persistedAcademicYearId","isCurrent","stateId","state","schoolId","schoolAcademicYear","getBySchoolId","schoolAcademicYears","isCurrentYear","model","$injector","getTemplateUrl","templateUrl","serviceName","has","coreWebRootUrl","getController","controllerExpression","getView","controller","businessApplicationLastViewedRecordRepository","$http","getByApplicationNameAndStaffId","staffId","update","businessApplicationLastViewedRecord","add","businessApplicationsSvc","getById","businessApplicationId","getForUser","getByRoles","roles","roleNames","businessResponseService","showBusinessResponse","businessResponse","customMessageToDisplay","messageTitle","messageText","swalType","messages","isOverride","isException","operationResult","exception","errorMessage","Message","InnerException","innerExceptionMessage","modelState","rules","errorsExist","some","rule","ruleSeverity","every","swalOptions","showCancelButton","confirmButtonText","closeOnConfirm","swal","isConfirm","coreAppContextManager","coreAppContextModel","retrievalMethodExtensions","countryRepository","getCountries","courseSectionGroupMarkingPeriodRepository","courseSectionGroupID","CourseSectionGroupID","courseSectionGroupRepository","getByAcademicYearSchoolAndGrade","gradeLevelId","oDataParameters","AcademicYearID","SchoolID","GradeLevelID","getByAcademicYearSchool","courseSectionGroupId","courseSectionGroup","getByCourseSectionId","courseSectionId","courseSectionRosterOrderRepository","saveRosterOrders","rosterOrders","courseSectionRosterRepository","courseSectionRosterId","getByCourseSection","CourseSectionID","getActiveRostersForMarkingPeriod","courseSectionID","markingPeriodID","courseSectionRoster","courseSectionRepository","getBySchoolAndStaff","acadademicYearId","getBySchoolAndAcademicYear","getByStudentInSchool","studentInSchoolId","courseSection","repo","userContextService","doesUserHaveAccessToSchool","schoolID","hasAccessToSchool","validSchoolID","role","intersection","adminroles","hasServiceCenterRole","isSingleSchoolUser","doesUserHaveAdminRole","spread","hasAdminRole","userSchools","isMultiRoleUser","isMultiDepartmentUser","isMultiPositionUser","isMultiTeamUser","isStaffUser","isAdminUser","restangularToInvoke","enumSet","Object","allEnums","individualEnumValue","Enum","recordErrors","errorObj","allErrors","getActiveErrors","dismissAllErrors","areErrorsPresent","severity","getUnhandledError","userMessage","detail","gatherAllErorrs","union","fileReaderFactory","onLoad","reader","$apply","onError","onProgress","$broadcast","total","loaded","getReader","FileReader","onload","onerror","readAsArrayBuffer","file","readAsBinaryString","readAsDataUrl","readAsDataURL","readAsText","formReceivedRepo","genderRepository","getGenders","gradeLevelRepository","getForAcademicYearAndState","stateID","getForScoolIDAndAcademicYearID","getForCourseSection","getForCourseSectionGroup","languageId","MarkingPeriodRepository","masterSchedulingRestangular","masterStatusTypeID","MasterStatusTypeID","nhaTimezoneRepository","getNHATimezones","phoneFormatService","formatPhoneNumberForStorage","city","extension","raceRepository","getRaces","roleTypeRepo","roleRepo","salutationRepository","salutationID","getSchoolsByYear","getSchoolsByYearAndState","School/StateID","getSchoolByYear","updateSchoolByYear","schoolAcademicYearID","addSchoolByYear","getActiveSchoolDates","beginDate","endDate","beginDateStr","endDateStr","schoolFormRepo","getBySchoolAndYear","customGET","schoolForms","schoolInstructionalAcademicYearRepository","getSchoolInstructionalAcademicYears","getByAcademicYearAndSchool","isDisplayedInFilters","getByAcademicYear","getByCourseSectionGroup","getBySchoolIdsAndAcademicYear","schoolIds","schoolMarkingPeriodService","getCurrentSchoolMarkingPeriod","now","results","currentMarkingPeriod","schoolMarkingPeriod","isBefore","isAfter","getSystemCurrentYear","repository","getSchool","getSchools","StateID","getSchoolsForUser","getSchoolsByState","getStartEndTimes","getSchoolAcademicYears","getSchoolAcademicYearsWithDates","schoolInstYears","schoolYears","merge","getSchoolInstructionalAcademicYear","updateSchoolAcademicYear","updateSchool","deleteSchool","parms","getBySchool","getAvatar","size","stateAcademicYearRepository","stateAcademicYearId","getByStateId","stateAcademicYearID","$state","apiSecurityService","$location","goToForbiddenState","forbiddenStateName","go","defaultState","path","isAuthorized","requiredResource","apiRestangular","allRequests","contains","x","resolveAuthorization","when","attachStateChangeListener","security","preventDefault","getSchoolsForStateByAcademicYear","getAllForStudentByStudentInSchool","getByStudentID","studentID","StudentID","getByStudentIDandYear","studentStatusHistoryRepository","getStudentStatusHistories","termDisplay","schoolMarkingPeriods","markingPeriods","courseSchoolMarkingPeriods","smp","markingPeriodGroup","markingPeriod","markingPeriodGroupId","markingPeriodGroupID","uiAlertService","toastr","toastrConfig","optionOverrides","toastrConfigOverrides","toast","info","warning","toastType","closeButton","extendedTimeOut","hideDuration","hideEasing","hideMethod","onclick","progressBar","showDuration","showEasing","showMethod","timeOut","_toastrConfig","allowHtml","autoDismiss","closeHtml","containerId","iconClasses","maxOpened","messageClass","newestOnTop","onHidden","onShown","onTap","positionClass","preventDuplicates","preventOpenDuplicates","tapToDismiss","templates","progressbar","titleClass","toastClass","alert","prompt","fail","userContext","userService","GetApiService","user","modifyUserObjectForBackwardsCompatibility","parse","fullName","lastName","firstName","username","roleName","department","roleType","schoolIDs","locationID","jobTitle","userGuid","staffID","userID","getDefaultSchool","schools","getStaffId","doesUserHaveRole","doesHaveRole","wingRepository","wingId","wingID","getGradeLevelWingsMap","messageManager","pubSubManager","bindLookupDirective","bindLookupLink","element","attrs","ctrl","transclude","directive","template","link","bindLookupController","$scope","$attrs","setResult","$eval","lookup","$watch","newVal","oldVal","$parse","el","showRuleAlert","sortExpression","sortChanged","headings","setSortField","toggle","expr","heading","removeClass","selectedCriteria","addClass","notifySortChanged","expression","registerHeading","require","tableSortCtrl","shiftKey","tableSortCriteria","$compile","setSelected","restrict","studentId","altText","avatarWidth","avatarUrl","getAvatarUrl","concatDirective","content","BreadcrumbContextManager","setCustomStep","step","existingStep","customSteps","CoreBreadcrumbController","$controller","breadcrumbContextManager","currentState","current","coreBreadcrumbVM","label","goToState","goToPage","filtersLink","filtersController","$sce","filterService","errorService","dataSecurityService","filterConfig","defaultSchoolCookieName","viewState","filtersLoading","filterTimer","selectedSchoolId","selectedAcademicYearIds","selectedGradeLevelIds","isPhone","mobileAcademicYearSelection","isTeacher","oneSchool","filterSets","defaultFilterSetName","lastStateFilterSetName","requestedTypes","omitBy","loadFilterData","setCurrentAcademicYear","AcademicYear","selectRadio","selectedIds","ay","hasValidAySelection","selected","ensureSchoolID","persistedSchoolID","getPersistedSchool","permission","School","defaultId","defaultSchool","getPersistedFilter","filterName","saveFilterSet","filterSetName","notThisFilter","filterSet","values","getSelectedFilterValue","loadFilterSet","fromFilterName","filterItem","keyValueMatch","selectedID","selectedItems","dontSaveDefaultFilterSet","requestTypeKeys","clone","stateElement","State","academicYearString","GradeLevel","gradeLevelString","getFilters","source","persist","cachedYearSelections","isInteger","typeName","shouldShowHighSchoolInGradeLevels","selectedAcademicYear","highSchoolGradeLevelsToExclude","item2","selectedId","selectCheckbox","idArray","checkboxIds","isString","defaultIndex","subType","prependItems","reverse","unshift","MarkingPeriod","selectedItem","LetterType","defaultLetterType","loadPreset","showCountForItem","hideCountsIfZero","notSorted","overrideClick","getAppliedFilters","cancel","selectedFilters","selectItem","isClick","persistMultipleFilterSelection","Staff","Homeroom","filterItems","foundCheckBox","persistFilterSelection","today","startDate","set","toDate","daysInMonth","endOf","day","startOf","dateFilter","customStart","customEnd","clearOnSelect","deselectItem","syncItemCounts","fetchItems","syncItems","countItem","fetchItem","resetFilters","f","preset","filterset","attendanceCodes","AttendanceCode","required","forOwn","hostnameParts","host","domainName","domain","idValues","option","applyDateFilter","myFilter","customDateItem","initDate","isStart","daysOffset","customStartDaysOffset","trust","html","trustAsHtml","setNameCasing","homeRoomTeacherNameFilters","staffFilters","filterTypes","sourceRestangular","moduleID","types","$cookieStore","showFilters","getCookiedPosition","position","togglePosition","removeFilterSelection","removeFilterGroup","selectedFiltersToShow","k","fileInput","fileInputLink","updateModel","modelSet","$parent","childNodes","files","onChange","modelGet","buttonText","acceptFilter","attributes","scrollTo","innerTopPosition","offsetTop","containerTopPosition","parentElement","scrollIf","scrollWhen","events","eventName","elem","attr","focusOn","focus","horizontalGrid","scrollBar","$","defaultHeight","css","table","scroll","$step","currentTarget","scrollLeft","resize","posTop","newHeight","height","scrollableAreaWidth","$element","stateManagement","isDirty","ngModelCtrl","next","ignorePendingChanges","answer","confirm","determineIfRequired","groupName","group","groups","modelCtrl","updateValidity","isRequired","$setValidity","validate","$isEmpty","requiredAny","$formatters","$parsers","loaderDirective","isLoading","mini","noMessage","viewOptions","dateChanged","noop","navigateToDateByOffset","offsetFromCurrentDay","isMultiDayView","navigateToDates","unbindLocationChange","isSame","updateDtpViewValue","isCurrentTimePeriod","datePanelOptions","selectedDateView","showDayWeekSelector","showCalendarSelector","currentDateRangePosition","maxDate","fromJson","isToday","isMaxDateReached","diff","getCurrentTimePeriodDescription","isWeekDisabled","showNextDay","showPreviousDay","showCurrentTimePeriod","showDayView","lastStartDate","showWeekView","preventNavigation","dtp","transitionTo","inherit","relative","notify","parent","datetimepicker","showTodayButton","defaultDate","on","$applyAsync","datePickerOptions","dynamicDatePickerOptions","disableKeyBinds","keyBinds","down","widget","show","enableKeyBinds","setPickerValue","$modelValue","$viewValue","extensionOptions","maxDateIsCurrent","setToolTip","midnight","$set","input","extraFormats","icons","up","previous","passedInOptions","datePickerExtensionOptions","newDate","month","second","millisecond","$setViewValue","$render","allOptions","selectorUtils","syncData","multiSelect","onSelectionChanged","selectOnlyLeafs","canSelectItem","loadChildItems","itemHasChildren","selection","tagName","placeholder","useCanSelectItemCallback","isAsync","noButton","showButton","useTagName","selectAllLeafs","$document","$window","$interpolate","docClickHide","closePopup","showTree","activeItem","itemMeta","getMetaData","isActive","asyncChildCache","off","keyboardNav","findItemOwnerAndParent","array","parentArray","parentIndex","itemIndex","currentArray","newArray","hasChildren","getChildren","findLowestExpandedItem","children","isExpanded","getNextItem","itemData","previousAtSameLevel","changeActiveItem","onActiveItem","idx","keyCode","stopPropagation","itemSelected","findIndexForItemById","findIndex","itemMeta2","$event","dataItem","grp","child","childMeta","indexOfItem","isParentSelected","onButtonClicked","onControlClicked","showSelectedItem","_hsmeta","clearSelection","newValue","oldValue","getTagName","useCanSelectItem","metaData","theChildren","showExpando","onExpandoClicked","meta","clickSelectItem","subItemSelected","activeSubItem","onMouseOver","isFunction","showCheckbox","compile","compiledContents","contents","pre","apply","getMetaPath","$$hashKey","display","changed","searchPlaceholderText","updateSearch","saveCall","saving","deleting","disabled","cancelCall","deleteCall","lastSavedDate","lastSavedBy","showSave","showDelete","showCancel","cancelLabel","saveLabel","deleteLabel","showErrorPanel","handleError","errorException","errorDetails","errorSvc","errorPanelVM","errorArray","displayClass","allowDismiss","category","showDetails","displayType","isVisible","dismissErrorPanel","inputName","isDisabled","isReadOnly","scaled","iconClass","isFieldSetDisabled","closest","placeholderMessage","ngModelController","hide","ifHasEntitlement","featureFlagService","checkFeatureFlagStatus","ifHasFeatureFlag","apiResourceActions","parsedArray","saviyntEntitlements","ifAtLeastOneResourceAccessible","parsed","saviyntEntitlement","individualResult","ifResourceAccessible","httpSrc","requestConfig","method","responseType","subArray","arr","Uint8Array","raw","chunk","subarray","fromCharCode","b64","btoa","selectedModel","customSettings","customTexts","showTagCloud","getFindObj","findObj","settings","optionID","grpSelectAll","defaultSettings","optionLabel","selectionLimit","selectAll","defaultTexts","texts","singleSelection","groupedOptions","isChecked","getPropertyForObject","checkboxClick","setSelectedItem","grpItems","allowRemove","preventRemove","exists","object","property","getModelDisplayValue","allSelected","opt","unselectItem","$index","tag","saveQueue","$watchCollection","last","notification","failed","confirmOnExit","confirmMessageWindow","confirmMessageRoute","ignoredUrls","isolateArea","defaultConfirmMessageWindowMessage","defaultConfirmMessageRouteMessage","onbeforeunload","$locationChangeStartUnbind","meetingBlockTimes","masterScheduleTypeId","displayHorizontally","hideTime","sortJoinedDays","strJoinedDays","str","compareDays","day1","day2","getNewMeetingBlockTimes","meetingBlockName","meetingBlockStartTime","meetingBlockEndTime","matches","mbt","firstSpaceIndex","secondSpaceIndex","uniques","uniq","leftSide","dayAndTime","daysByTime","chain","toPairs","currentItem","zipObject","joinedDays","days","horizontalValues","concattedResult","infiniteScrollModal","nhaInfiniteScrollLink","lengthThreshold","scrollThreshold","timeThreshold","lastRemaining","remaining","scrollHeight","clientHeight","tabs","tabToDisplay","tabRestangular","parsedResource","hidden","indexOfParen","sref","srefToCheck","resizeWrapperController","defaultScale","resizeWrapperVM","avatarScale","resizeMe","resizeMeLink","widths","6","5","4","3","2","1","width","controllerAs","app","overflowItems","rightBuffer","maxItemCount","checkForOverflows","sum","outerWidth","innerWidth","resizeDelay","delayedHandler","registerItem","deregisterItem","clearTimeout","overflowItem","overflowCtrl","innerText","ev","dropdownContainer","getBoundingClientRect","buttonHeight","dropdownMenu","menuHeight","outerHeight","$win","widthConstraint","linkFn","setConstraints","offsetPosition","offset","min-width","left","max-width","directiveObj","setAttribute","nhaTest","chars","breakOnWord","lastspace","formattedDateString","momentDate","zone","d","tel","country","rangeInfo","filtered","min","minIndex","max","maxIndex","currentIndex","dataArray","termLower","startsWithFirst","startsWith","startsWithLast","startsWithFirstLast","startsWithLastFirst","startsWithLastFirst2","startsWithLastFirst3","words","inputWords","end","moduleNavbarController","hideCallout","visible","vm","isObject","defaultConfig","isTraining","messageCheck","hasPortalAppLogo","loading","moduleId","businessApplication","businessApplicationLink","maskVisible","appIcon","breadcrumb","miniSearch","miniLauncher","walkMe","schoolSelector","userSettings","moduleNavbarDirective","bindToController","settingKey","schoolSelectorOnChange","maintenanceNotificationController","showMaintenanceNotification","parseAppSetting","hasDismissed","secure","expires","expirationUnit","dismissedID","$onInit","component","NavbarCtrl","$cookies","clearAllCookies","cookies","route","getCurrentUser","currentContext","signOut","signOutUrl","adfsBaseUrl","redirectUrl","moduleWebRootUrl","attribute","staffService","appCalloutActive","maskActive","applications","activeModule","profileDropDownLabel","isTrainingEnv","getActiveModule","activeModuleRootUrl","trustAsResourceUrl","getStaffImage","image","staffImage","toggleSearch","toggleMask","userSessionService","accountService","userId","userTitle","canImpersonate","watchForImpersonationStartEnd","userSettingsCalloutActive","_impersonationCheckTimer","isImpersonatingNow","isImpersonating","reload","impersonationUser","calloutName","toggleUserSettings","close","impersonateUser","unique_name","getByUsername","account","getDomain","endImpersonationSession","signout","logout","$uibModal","openModal","modalClass","modalScope","$new","windowClass","delete","del","deleteModal","modal","dismissable","buttons","classes","click","dismiss","$interval","JWTIsValid","networkFailed","getApplications","dataLoading","sortedData","without","businessApplicationID","launchApplication","toggleAppCallout","defaultSchoolForUser","setSelectedSchoolLabel","schoolSelectorCalloutActive","mergeStatesAndSchools","arr1","arr2","arr2obj","arr1obj","selectedSchools","schoolFilter","defaultToAllSchools","moduleDefaultSchoolCookieName","noCourseLoaded","_defaultSchoolCookie","setUserDefaultSchool","isDefaultSchool","retVal","defaultsCookie","states","sortBy","toggleSchoolSelector","BusinessResponseModalCtrl","$uibModalInstance","displayModal","businessResponseHasOnlyWarnings","criteriaMet","warningRules","showWarningFooter","checkboxWarning","showCheckboxWarningFooter","overrideWarning","ignoreWarnings","closeModal","mssOpen","mssAutoClose","mssSpeed","mssClass","mssSize","mssSqueeze","mssCloak","mssPush","mssContainer","mssKeyListener","mssBodyClass","mssModuleId","mssStudentId","setBodyClass","param","bodyClass","className","bodyClassRe","mssClose","slider","style","squeeze","right","keyListener","cloak","speed","ESC_KEY","which","zindex","Boolean","container","getElementById","appendChild","zIndex","transitionDuration","webkitTransitionDuration","transitionProperty","mssCustomHeight","mssCustomTop","bottom","mssCustomBottom","mssCustomRight","removeChild","CalendarController","onSelect","removeTime","buildMonth","prev","goToToday","isSelected","start","weeks","done","monthIndex","buildWeek","isCurrentMonth","bindings"],"mappings":"CAAA,WACC,YAEA,IAAIA,GAAK,sBACT,IAAIC,OAAOC,SAASC,KAAKC,OAAOJ,GAAM,GAAI,CAEzC,GAAIK,GAAUC,SAASC,cAAc,SACrCF,GAAQG,KAAO,kBACfH,EAAQI,OAAQ,EAChBJ,EAAQK,IAAM,yDAGd,IAAIC,GAAIL,SAASM,qBAAqB,UAAU,EAChDD,GAAEE,WAAWC,aAAaT,EAASM,OAQrC,WACC,YAGA,SAASI,KAYR,QAASC,GAAeC,GACvB,IAAkC,MAA5BC,SAAQC,OAAOF,IAAoB,EACzC,MAAOG,GAAI,OAAO,GAUnB,QAASC,GAAWC,GAWnB,MATAC,GAAEC,QAAQF,EAAS,SAASG,GACtBT,EAAeS,KAEnBP,QAAQC,OAAOM,MACfC,IAAI,WAAaD,EAAI,6CAKhBH,EAjCR,GAAIK,IACHX,eAAgBA,EAChBK,WAAYA,EAmCb,OAAOM,GAIa,mBAAV,OACV1B,OAAO2B,IAAMb,QAeZ,WACC,YAEA,SAASA,KAuPL,QAASc,GAAYC,GACjB,MAAO,IAAI,YACPC,KAAKC,MAAQ,GACbD,KAAKD,IAAMA,EACXC,KAAKE,OAAS,SAAUC,EAAKC,GAQzB,MAPIZ,GAAEa,QAAQF,GACVH,KAAKC,OAAS,IAAMT,EAAEc,IAAIH,EAAK,SAAUI,GACrC,MAAOR,GAAM,OAASQ,IACvBC,KAAK,KAAOJ,GAAY,MAAQ,KAAO,IAE1CJ,KAAKC,OAASF,EAAM,OAASI,EAE1BH,KAAKC,OAEhBD,KAAKS,IAAM,SAAUN,EAAKO,GAYtB,MAXIP,GACIX,EAAEa,QAAQF,GACVH,KAAKC,OAASF,EAAM,WAAaP,EAAEc,IAAIH,EAAK,SAAUI,GAClD,MAAO,MAAQG,EAAWA,EAAWX,EAAM,MAAQ,OAASQ,IAC7DC,KAAK,QAAU,KAElBR,KAAKC,OAASD,KAAKD,IAAM,aAAeW,EAAWA,EAAWV,KAAKD,IAAM,MAAQ,OAASI,EAAM,IAGpGH,KAAKC,OAASD,KAAKD,IAAM,OAEtBC,KAAKC,QAgNxB,QAASU,GAAeC,GAEpB,OAAQA,EAAOC,gBACX,IAAK,WACD,MAAO,gBAEX,KAAK,WACD,MAAO,iBAEX,KAAK,WACD,MAAO,iBAEX,SACI,KAAMD,GAAOE,UAAY,gBAAkBF,EAAOC,eAAiB,uBA3e/E,GAAIE,IACA,UACA,kBACA,kBACA,iBAEA,uBAGAnB,IAkjBJ,OAhjBAA,GAAQoB,SACRpB,EAAQoB,MAAMC,YAAc,wPAC5BrB,EAAQoB,MAAME,aAAe,4BAC7BtB,EAAQoB,MAAMG,QAAU,eAMxBvB,EAAQwB,gBAAkB,SAAUC,GAChC,GAAIC,KAgCJ,OA9BID,KACgC,mBAApBA,GAAe,MACvBC,EAAkB,KAAID,EAAYE,KAGF,mBAAxBF,GAAmB,UAC3BC,EAAsB,SAAID,EAAYG,SAGP,mBAAvBH,GAAkB,SAC1BC,EAAqB,QAAID,EAAYI,QAGR,mBAArBJ,GAAgB,OACxBC,EAAmB,MAAID,EAAYK,MAGL,mBAAtBL,GAAiB,QACzBC,EAAoB,OAAID,EAAYM,OAGL,mBAAvBN,GAAkB,SACU,mBAAxBA,GAAmB,QAC3BC,EAAqB,QAAID,EAAYO,QAAU,QAAU5B,KAAK6B,+BAA+BR,EAAYS,QAEzGR,EAAqB,QAAItB,KAAK6B,+BAA+BR,EAAYS,UAK9ER,GAIX1B,EAAQmC,yBAA2B,SAAUV,GACzC,GAAIC,GAAc,GAEdU,GAAgB,CA+BpB,OA7BIX,GAAYE,IAAM,IAClBD,GAAe,QAAUD,EAAYE,IACrCS,GAAgB,GAGhBX,EAAYS,OAAOG,OAAS,IAC5BX,IAAgBU,EAAgB,IAAM,IAAM,YAAchC,KAAK6B,+BAA+BR,EAAYS,QAC1GE,GAAgB,GAGhBX,EAAYG,QAAQS,OAAS,IAC7BX,IAAgBU,EAAgB,IAAM,IAAM,YAAcX,EAAYG,QACtEQ,GAAgB,GAGhBX,EAAYI,OAAOQ,OAAS,IAC5BX,IAAgBU,EAAgB,IAAM,IAAM,WAAaX,EAAYI,OACrEO,GAAgB,GAGhBX,EAAYK,KAAO,IACnBJ,IAAgBU,EAAgB,IAAM,IAAM,SAAWX,EAAYK,KACnEM,GAAgB,GAGhBX,EAAYM,MAAQ,IACpBL,IAAgBU,EAAgB,IAAM,IAAM,UAAYX,EAAYM,OAGjEL,GAGX1B,EAAQsC,sBAAwB,SAAUC,GACtC,MAAOA,GAAOC,OAAO,GAAGC,cAAgBF,EAAOG,MAAM,IAGzD1C,EAAQ2C,YAAc,SAAUC,GAK5B,MAJAA,GAAcA,EAAYC,QAAQ,mBAAoB,IACtDD,EAAcA,EAAYC,QAAQ,IAAM,MACxCD,EAAcA,EAAYC,QAAQ,KAAM,MACxCD,EAAcA,EAAYC,QAAQ,KAAM,QAI5C7C,EAAQ8C,yBAA2B,SAAUC,EAAQC,EAAoBC,GACrE,GAAIC,KAQJ,IAL6B,MAAzBD,IACAA,GAAwB,GAIxBF,EAEA,IAAK,GAAII,KAAgBJ,GAErB,GAAIA,EAAOK,eAAeD,GAAe,CAErC,GAAIE,GAAmBJ,EAAwB7C,KAAKkC,sBAAsBa,GAAgBA,CAGtFH,IAA4D,KAAtCK,EAAgBC,YAAY,QAClDD,EAAkBA,EAAgBR,QAAQ,KAAM,OAIpDK,EAAYG,GAAmBN,EAAOI,GAKlD,MAAOD,IAGXlD,EAAQuD,qBAAuB,SAAUR,EAAQC,EAAoBC,GACjE,MAAO7C,MAAKoB,iBAAkBU,OAAU9B,KAAK0C,yBAAyBC,EAAQC,EAAoBC,MAGtGjD,EAAQwD,aAAe,SAAUrD,EAAKE,EAAOoD,EAAUC,GACnDtD,KAAKD,IAAMA,EACXC,KAAKC,MAAQA,EACbD,KAAKqD,SAAWA,EAChBrD,KAAKsD,gBAAkBA,GAG3B1D,EAAQ2D,+BAAiC,SAAwCC,EAAYC,EAAoB1D,EAAK+C,EAAaY,GAC/H,GAAIF,EAAWC,GAAqB,CAChC,GAAIE,GAAkBnE,EAAEc,IAAId,EAAEsC,OAAO0B,EAAWC,GAAoBG,MAAO,YAAa,MAGpFC,EAAOrE,EAAEsE,QAETR,kBAAkBK,EAAgB1B,OAAS,IAAOyB,GAAYA,EAAQJ,gBAA2BS,OAAP,KAG1FV,SAAU,MACXK,EAECC,IACAb,EAAYW,GAAsB,GAAIO,QAAOZ,aAC7CN,EAAYW,GAAoB1D,IAAMA,EACtC+C,EAAYW,GAAoBxD,MAAmC,IAA3B0D,EAAgB1B,OAAe0B,EAAgB,GAAKA,EAC5Fb,EAAYW,GAAoBJ,SAAWQ,EAAKR,SAChDP,EAAYW,GAAoBH,gBAAkBO,EAAKP,iBAGvDR,EAAY/C,GAAO,IAK/BH,EAAQiC,+BAAiC,SAAUoC,GAC/C,GAAI3C,GAAc,GAEdf,EAAI,CAER,KAAK,GAAI2D,KAAQD,GACb,GAAIA,EAAajB,eAAekB,GAAO,CACnC,GAAIC,GAAeF,EAAaC,EAEhC,IAAIC,EACA,GAAmC,gBAAvBA,GAAkB,OAAiBF,EAAaC,YAAiBlE,MAAKoD,aAC9E,GAAIe,EAAalE,gBAAiBmE,OAAO,CAGrC,IAAK,GAFDC,GAAa,GAERC,EAAI,EAAGA,EAAIH,EAAalE,MAAMgC,OAAQqC,IACvCA,EAAI,IACJD,GAAc,IAAMF,EAAab,gBAAkB,KAIvDe,GAAe,IAAMF,EAAapE,IAAM,IAAMoE,EAAad,SAAW,IAAMc,EAAalE,MAAMqE,EAG/F/D,GAAI,IACJe,GAAe,SAGnBA,GAAe,IAAM+C,EAAa,QAC/B,CACH,GAAIpE,EAGAA,GADAkE,EAAalE,gBAAiBsE,MACtB,YAAeJ,EAAalE,MAAQ,IAEpCkE,EAAalE,MAGzBqB,GAAgB,IAAM6C,EAAapE,IAAM,IAAMoE,EAAad,SAAW,IAAMpD,MAE9E,IAAIgE,EAAaC,YAAiBlE,MAAKoD,aAEtC7C,EAAI,IACJe,GAAe,SAEnBA,GAAgB,IAAM6C,EAAapE,IAAM,IAAMoE,EAAad,SAAW,IAAMc,EAAalE,UAEvF,CACH,GAAIuE,GAAmBC,MAAMR,EAAaC,IAAS,IAAO,EAEtD3D,GAAI,IACJe,GAAe,SAInBA,GAAgB,IAAM4C,EAAO,OAASM,EAAmBP,EAAaC,GAAQM,MAE1D,QAAjBL,IACH5D,EAAI,IACJe,GAAe,SAEnBA,GAAgB,IAAM4C,EAAO,YAGjC3D,KAIR,MAAOe,IAkCX1B,EAAQ8E,YAAc,WAClB,MAAO,IAAI,YACP1E,KAAK2E,cACL3E,KAAKE,OAAS,SAAUH,EAAKI,EAAKC,GAC9B,MAAKL,IAAQI,GAGbH,KAAK2E,WAAWC,KAAK9E,EAAYC,GAAKG,OAAOC,EAAKC,IAC3CJ,MAHIA,MAKfA,KAAKS,IAAM,SAAUV,EAAKI,EAAKO,GAE3B,MADAV,MAAK2E,WAAWC,KAAK9E,EAAYC,GAAKU,IAAIN,EAAKO,IACxCV,MAEXA,KAAKC,MAAQ,WACT,MAAOD,MAAK2E,WAAWnE,KAAK,YAKxCZ,EAAQiF,qBAAuB,SAAUF,EAAYG,GACjD,GAAIC,GAAa,EACjB,IAAID,EAAM,CACN,IAAK,GAAIvE,GAAI,EAAGA,EAAIuE,EAAK7C,OAAQ1B,IAC7BwE,GAAcD,EAAKvE,GAAGyE,UAAYF,EAAKvE,GAAG0E,WAAa,QAAU,IAC7D1E,EAAI,EAAIuE,EAAK7C,SACb8C,GAAc,KAGtBJ,GAAWO,SAAWH,IAM9BnF,EAAQuF,gBAAkB,SAAUR,EAAYS,EAAMC,GAClD,GAAID,EAAM,CACN,GAAIE,GAAYF,EAAKG,MAAM,IAE3B,IAAID,EAAUrD,OAAS,EACnBzC,EAAEC,QAAQ6F,EAAW,SAAUE,GAE3B5F,EAAQuF,gBAAgBR,EAAYa,EAAMH,SAG7C,CACD,GAAII,GAAkB,GACtBjG,GAAEC,QAAQ4F,EAAc,SAAUK,GAC9BD,GAAmB,gBAAmBL,EAAO,MAASM,EAAc,UAExED,EAAkBA,EAAgBnD,MAAM,EAAGmD,EAAgBxD,OAAS,GACpEwD,GAAmB,IACfd,EAAW/C,QACX+C,EAAW/C,SAAW,QAAU6D,EAEhCd,EAAW/C,QAAU6D,KAOrC7F,EAAQ+F,QAAU,SAAUC,EAAKC,GAC7B,GAAIA,EACA,CAAU3H,OAAO4H,KAAKF,EAAK,QAE3BzH,UAASC,KAAOwH,GAIxBhG,EAAQmG,QAAU,SAAUC,EAASJ,GACjC,GAAIK,GAAS,GAAIC,KAAIN,EAIrB,OAHIK,GAAOE,GAAG,cACVF,EAASA,EAAOG,WAAWJ,IAExBC,EAAOI,YAGlBzG,EAAQ0G,YAAc,SAAU1H,GAC5B,IAAK,GAAI2H,GAAI,EAAGhG,EAAI,EAAGA,EAAI3B,EAAEqD,OAAQsE,GAAKA,EACtCA,EAAI,GAAKA,EAAI3H,EAAE4H,WAAWjG,IAE9B,OAAOgG,IAGX3G,EAAQ6G,4BAA8B,SAAUC,GAG5C,GAAIC,GAAiBC,QAErB,KACI,GAAIF,EACA,aAAe,IACX,IAAK,SACDC,EAAiBC,OAAO,GAAIrC,MAAKmC,GACrC,KAAK,SACGE,OAAOC,SAASH,GAChBC,EAAiBD,GAGjBA,EAAO,GAAII,QAAOJ,GAEdA,EAAKK,QAAQ,KAAO,GACpBL,EAAKjE,QAAQ,IAAK,KAEtBkE,EAAiBC,OAAO,GAAIrC,MAAKmC,KAM5CC,EAAeK,YAChBL,EAAiBC,UAGzB,MAAOvH,GAEHsH,EAAiBC,SAGrB,MAAOD,IAGX/G,EAAQqH,cAAgB,SAAUC,EAASC,GAEvC,GAAIC,GAAsB,IAC1B,IAAIF,EAAQC,GAAY,CAEpB,GAAIE,GAAqB7H,EAAEsC,OAAOoF,EAAQC,GAAWvD,MAAO,WACxDyD,KAGID,EADAC,EAAmBpF,OAAS,EACNzC,EAAEc,IAAI+G,EAAoB,MAE1B7H,EAAE8H,KAAKD,GAAoBE,IAI7D,MAAOH,IAGXxH,EAAQ4H,mBAAqB,SAAU1E,EAAaoE,EAASC,EAAWM,GAOpE,GAJKA,IACDA,EAAUN,EAAY,MAGtBD,GAAWA,EAAQC,GAAY,CAC/B,GAAIO,GAAiBlI,EAAEsC,OAAOoF,EAAQC,GAAWvD,MAAO,WACpD8D,KAEA5E,EAAYqE,GAAa,GAAInD,QAAOZ,aACpCN,EAAYqE,GAAWpH,IAAM0H,EAC7B3E,EAAYqE,GAAW9D,SAAW,KAE9BqE,EAAezF,OAAS,GACxBa,EAAYqE,GAAW7D,gBAAkB,KACzCR,EAAYqE,GAAWlH,MAAQT,EAAEc,IAAIoH,EAAgB,OAErD5E,EAAYqE,GAAWlH,MAAQT,EAAE8H,KAAKI,GAAgBH,MAMtE3H,EAAQ+H,qBAAuB,SAAUhD,EAAYuC,EAASU,GACtDjD,GAAcuC,GACd1H,EAAEC,QAAQD,EAAEqI,KAAKX,GAAU,SAAUC,GACjCxC,EAAWwC,GAAaS,EAAiB,KAAO,OAAS5D,OAAOiD,cAAcC,EAASC,MAOnGvH,EAAQkI,qBAAuB,SAAUnD,GACrC,IAAK,GAAI5E,KAAO4E,GACRA,EAAW5E,YAAgBwE,QAC3BI,EAAW5E,GAAOH,EAAQmI,iBAAiBpD,EAAW5E,IAI9D,OAAO4E,IAGX/E,EAAQmI,iBAAmB,SAAUrB,EAAMsB,GACvC,MAAOpB,QAAOF,GAAMuB,OAAO,MAAQD,EAAYA,EAAY,KAAO,KAAOA,EAAYA,EAAY,KAAO,SAG5GpI,EAAQsI,kBAAoB,SAAUC,GAClC,MAAOvB,QAAOuB,GAAUF,OAAO,eAGnCrI,EAAQwI,sBAAwB,SAAUC,GACtC,GAAIC,GAAa1B,SACbrB,EAAQ8C,EAAK9C,MAAM,IAGvB,OAFA+C,GAAWC,KAAKhD,EAAM,IACtB+C,EAAWE,OAAOjD,EAAM,IACjB+C,GAsBX1I,EAAQ6I,iBAAmB,SAAUC,EAAU9H,GAC3C,GAAI+H,EAcJ,OAHIA,GATC/H,EAAOgI,UAAahI,EAAOgI,SAASD,aAStB/H,EAAOgI,SAASD,aARzB/H,EAAO+H,aAEM/H,EAAO+H,aAGPhI,EAAeC,GAM/BgG,OAAO8B,GAAUG,GAAGF,IAG/B/I,EAAQkJ,oBAAsB,SAASC,GACnC,GAAIA,EAAgB,CAChB,GAAMA,EAAehC,QAAS,CAC1B,GAAIiC,GAAgBD,EAAehC,QAAQ,IAK3C,IAJqB,IAAjBiC,IACAA,EAAgBD,EAAehC,QAAQ,MAGvCiC,EAAgB,GAGhB,IAAK,GAFDC,GAAsF,GAAvEC,SAASH,EAAeI,UAAUH,EAAeA,EAAgB,IAE3EzI,EAAI,EAAG6I,EAAMrI,EAAekB,OAAYmH,EAAJ7I,EAASA,IAAK,CACvD,GAAI8I,GAAQzC,OAAOiC,GAAGE,EAAgBhI,EAAeR,GAErD,IAAI8I,EAAMC,aAAeL,EACrB,MAAOI,QAKnB,IAAIzC,OAAOC,SAASkC,IAAqBA,EAAeF,IAAQE,EAAeF,KAE3E,MAAOE,EAMf,OAAOnC,QAAOiC,GAAGE,EAAgB,IAEjC,MAAO,OAKfnJ,EAAQ2J,WAAa,SAAUC,EAAQnL,EAAQoL,GAC3C,MAAOD,GAAO/G,QAAQ,GAAIiH,QAAOrL,EAAQ,KAAMoL,IAInD7J,EAAQ+J,sCAAwC,WAC5C,MAAOzL,QAAO0L,WAAW,WACrBrL,SAASsL,KAAKC,UAAYvL,SAASwL,gBAAgBD,UAAY,GAChE,KAGPlK,EAAQoK,UACJC,UAAW,GACXC,QAAS,GACTC,WAAY,GACZC,UAAW,GACXC,MAAO,GACPC,IAAK,EACLC,MAAO,GACPC,OAAQ,IAGL5K,EAIa,mBAAb,UACP1B,OAAO8F,OAAShF,MAEtByL,KAAKzK,MAEP4G,OAAO8D,UAAUC,WACbC,IAAK,eACLC,IAAK,eACLC,IAAK,eACLC,IAAK,eACLC,IAAK,gBACLC,IAAK,gBACLC,IAAK,eACLC,IAAK,eACLC,IAAK,GACLC,IAAK,IAGTzE,OAAO8D,UAAUY,SAAW,WACxB,GAAIC,GAAOvL,KAAKwL,UAChB,OAAOxL,MAAK2K,UAAUY,IAASA,GAGnC3E,OAAO8D,UAAUe,OAAS,WAEtB,MAAOzL,MAAKgH,UAAYhH,KAAKiI,SAAW,MAIvCnB,OAAO4D,UAAUzC,SAClBnB,OAAO4D,UAAUzC,OAAS,WACtB,GAAIyD,GAAOC,SACX,OAAO3L,MAAKyC,QAAQ,WAAY,SAAUmJ,EAAOC,GAC7C,MAA8B,mBAAhBH,GAAKG,GACfH,EAAKG,GACLD,MAOX9E,OAAO4D,UAAUoB,WAClBhF,OAAO4D,UAAUoB,SAAW,WACxB,GAAIC,GAAO,CACX,IAAoB,IAAhB/L,KAAKiC,OAAc,MAAO8J,EAC9B,KAAK,GAAIxL,GAAI,EAAGA,EAAIP,KAAKiC,OAAQ1B,IAAK,CAClC,GAAIyL,GAAWhM,KAAKwG,WAAWjG,EAC/BwL,IAASA,GAAQ,GAAKA,EAAQC,EAC9BD,GAAcA,EAElB,MAAOA,KAIfjF,OAAO4D,UAAUuB,WAAa,WAC1B,GAAIC,GAAOlM,KAAKqG,UAEhB,OAAI8F,UAASC,UAAUF,GACZC,SAASD,GAAQG,kBAAkB,IAEnCrM,MAIf,WACC,YAEAb,SAAQC,OAAO,YAEd,aAEA,YACA,WAEA,YACA,WACA,cACA,8BAEA,eACA,YACA,YACA,cACA,wBACA,kBACA,yBACA,YACA,YACA,gBACA,kBACA,sBACA,gBACA,SACA,YACA,kBAEA,cAEA,gBACA,UACA,oBACA,yBACA,sBAIF,WACC,YAIA,SAASkN,KACR,MAAOC,oBAAmBC,oBAM3B,QAASC,GAAIC,GACZ,GAAIC,GAAmB,oCACnBC,EAAmB,UAAYD,CAEnCD,GAAWG,IAAI,sBAAuB,SAAUC,EAAOC,EAASC,EAAUC,EAAWC,GAChFH,EAAQ/J,eAAe,SAC1BzE,SAAS4O,MAAQJ,EAAQI,MAAQR,EACvBpO,SAAS4O,QAAUP,IAC7BrO,SAAS4O,MAAQP,KAjBpBzN,QAAQC,OAAO,YAAYkN,OAAOA,GAMlCnN,QAAQC,OAAO,YAAYqN,IAAIA,GAC/BA,EAAIW,SAAW,iBAehB,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,mBAAoB,cAAe,cAAe,SAAUC,EAAaC,GACxG,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYC,0BAIjEzO,QAAQC,OAAO,YAAYiO,QAAQ,yBAA0B,cAAe,cAAe,SAAUC,EAAaC,GAC9G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYE,gCAIjE1O,QAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC7G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYG,yCAIjE3O,QAAQC,OAAO,YAAYiO,QAAQ,0BAA2B,cAAe,cAAe,SAAUC,EAAaC,GAC/G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYI,mCAIjE5O,QAAQC,OAAO,YAAYiO,QAAQ,uBAAwB,cAAe,cAAe,SAAUC,EAAaC,GAC5G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYK,8BAIjE7O,QAAQC,OAAO,YAAYiO,QAAQ,yBAA0B,cAAe,cAAe,SAAUC,EAAaC,GAC9G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYM,gCAIjE9O,QAAQC,OAAO,YAAYiO,QAAQ,oBAAqB,cAAe,cAAe,SAAUC,EAAaC,GACzG,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYO,oCAIjE/O,QAAQC,OAAO,YAAYiO,QAAQ,8BAA+B,cAAe,cAAe,SAAUC,EAAaC,GACnH,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYQ,qCAIjEhP,QAAQC,OAAO,YAAYiO,QAAQ,+BAAgC,cAAe,cAAe,SAAUC,EAAaC,GACpH,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYS,sCAIjEjP,QAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC7G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYU,+BAIjElP,QAAQC,OAAO,YAAYiO,QAAQ,qBAAuB,cAAe,cAAe,SAAUC,EAAaC,GAC3G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYW,4BAIjEnP,QAAQC,OAAO,YAAYiO,QAAQ,yBAA0B,cAAe,cAAe,SAAUC,EAAaC,GAC9G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYY,gCAIjEpP,QAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC7G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYa,+BAIjErP,QAAQC,OAAO,YAAYiO,QAAQ,yBAA0B,cAAe,cAAe,SAAUC,EAAaC,GAC9G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYc,gCAIjEtP,QAAQC,OAAO,YAAYiO,QAAQ,uBAAwB,cAAe,cAAe,SAAUC,EAAaC,GAC5G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYe,8BAIjEvP,QAAQC,OAAO,YAAYiO,QAAQ,oCAAqC,cAAe,cAAe,SAAUC,EAAaC,GACzH,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYgB,mCAIjExP,QAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC7G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYiB,+BAIpEzP,QAAQC,OAAO,YAAYiO,QAAQ,4BAA6B,cAAe,cAAe,SAAUC,EAAaC,GAC9G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYkB,mCAIpE1P,QAAQC,OAAO,YAAYiO,QAAQ,kBAAmB,cAAe,cAAe,SAAUC,EAAaC,GACvG,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYmB,yBAIjE3P,QAAQC,OAAO,YAAYiO,QAAQ,uBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC1G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYoB,8BAIjE5P,QAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,cAAe,SAAUC,EAAaC,GAC7G,MAAOD,GAAYE,WAAW,SAAUC,GACpCA,EAAsBC,WAAWH,EAAYI,YAAYoB,iCAIrE,WACI,YAEA5P,SAAQC,OAAO,YACV4P,QAAQ,wBAAyB,wBAAyB,kBAAmB,yBAA0B,sBAAuB,wBAAyB,6BAA8B,mBAAoB,8BAA+B,uBAAwB,oBAAqB,wBAAyB,uBAAwB,wBAAyB,sBAAuB,mCAAoC,uBAAwB,uBAAwB,iBAAkB,uBAAwB,cACrf,SAAUC,EAAuBC,EAAiBC,EAAwBC,EAAqBC,EAAuBC,EAA4BC,EAA2BC,EAA6BC,EAAsBC,EAAmBC,EAAuBC,EAAsBC,EAAuBC,EAAqBC,EAAkCC,EAAsBC,EAAsBC,EAAgBC,EAAsBC,GA6Bhc,QAASC,GAAanE,GAClB,MAAOlM,MAAKsQ,UAAUpE,GAAQlM,KAAKsQ,UAAUpE,GAAQ,KAIzD,QAASqE,GAAwBC,GACxBA,IAEDA,EAAcJ,EAGlB,KAAK,GAAIrQ,KAAOC,MAAKsQ,UACjB,GAAItQ,KAAKsQ,UAAUvQ,GAAK0Q,cAAczK,UAAYwK,EAAYC,cAAczK,QACxE,MAAOjG,EAIf,OAAO,MA3CXC,KAAKsQ,WACDI,WAAczB,EACd0B,KAAQzB,EACR0B,YAAezB,EACf0B,mBAAsBzB,EACtB0B,WAAczB,EACd0B,gBAAmBzB,EACnB0B,eAAkBzB,EAClB0B,iBAAoBzB,EACpB0B,oBAAuBzB,EACvB0B,OAAUzB,EACV0B,UAAapB,EACbqB,WAAc1B,EACd2B,UAAa1B,EACb2B,WAAc1B,EACd2B,SAAY1B,EACZ2B,sBAAyB1B,EACzB2B,UAAazB,EACb0B,IAAOzB,EACP0B,UAAazB,GAGjBnQ,KAAKqQ,aAAeA,EACpBrQ,KAAKuQ,wBAA0BA,QA0BvC,WACI,YAEApR,SAAQC,OAAO,YACV4P,QAAQ,eAAgB,cAAe,KAAM,QAAS,cAAe,SAAUrB,EAAakE,EAAIC,EAAOxE,GAiBpG,QAASyE,GAAUC,EAAUrN,EAAYsN,EAAaC,EAAWC,EAAoBC,GACjF,MAAOpD,GAAQqD,QAAQL,EAAUrN,EAAYsN,EAAaC,EAAWC,EAAoBC,GAAkBE,KAAK,SAAUC,GACtH,MAAOA,IAAUA,EAAOtQ,OAAS,EAAIsQ,EAAO,GAAKA,IAIzD,QAASF,GAAQL,EAAUrN,EAAYsN,EAAaC,EAAWC,EAAoBC,GAG/EH,GAAc,CAEd,IAAIO,GAAWX,EAAGY,QAMdC,EAAWV,CAEVxS,GAAEmT,QAAQhO,KACX+N,GAAY,IAAME,KAAKC,UAAUlO,GAGrC,IAAImO,GAAa,IAGjB,IAAIb,IAEIa,EADAV,GAAoBpD,EAAQ+D,cAAcL,GAC7B1D,EAAQ+D,cAAcL,GAGtBZ,EAAMkB,eAAeN,IAclC,MADAF,GAASS,QAAQH,GACVN,EAASU,OAQxB,IAAI1C,IAAgBhR,EAAE2T,YAAYhB,IAA6C,MAAtBA,EAAkD7E,EAArB6E,GAAkCiB,IAAIpB,EAqC5H,OAnCAxB,GAAY6C,IAAI1O,GAAY2N,KAAK,SAAUgB,GAGvCrB,GAAc,EAGVA,GAAuB,MAARqB,IAUXlB,EAEApD,EAAQ+D,cAAcL,GAAYY,EAIlCxB,EAAMyB,eAAeb,EAAUY,IAI3B,MAARA,GACAd,EAASS,QAAQK,IAGzB,SAAUE,GACN7T,IAAI,sBAAuBqS,EAAUwB,GACrChB,EAASiB,OAAOD,KAGbhB,EAASU,QAMpB,QAASQ,GAAI1B,EAAU2B,EAAgBpM,EAAI2K,EAAWC,EAAoByB,GACtE,GAAIpB,GAAWX,EAAGY,QAKdjC,GAAqCzM,QAAtBoO,EAAkCA,EAAqB7E,GAAauG,IAAI7B,EAyC3F,OAxCAxB,GAAYsD,UAAUH,EAAgBpM,GAAI+K,KAAK,SAAUgB,GASrD,GAAIZ,GAAWV,CAEXF,GAAMkB,eAAeN,IACrBZ,EAAMiC,mBAAmBrB,GAG7BA,EAAWV,EAAW,IAAMzK,EAExBuK,EAAMkB,eAAeN,IACrBZ,EAAMiC,mBAAmBrB,GAGzBkB,IACAlB,EAAWkB,EAEP9B,EAAMkB,eAAeN,IACrBZ,EAAMiC,mBAAmBrB,IAIrB,MAARY,EACAd,EAASS,QAAQK,GAEjBd,EAASS,WAGd,SAAUO,GACT7T,IAAI,0BAA2BqS,EAAUwB,GACzChB,EAASiB,OAAOD,KAGbhB,EAASU,QA9JpB,GAAIlE,IACArB,YAAaA,EACbqG,EAAGnC,EACHC,MAAOA,EACPxE,YAAaA,EACb+E,QAASA,EACTqB,IAAKA,EACL3B,UAAWA,EACXgB,iBAGJ,OAAO/D,SA8JnB,WACI,YAkEA,SAAS1I,GAAY1H,GACjB,IAAK,GAAI2H,GAAI,EAAGhG,EAAI,EAAGA,EAAI3B,EAAEqD,OAAQsE,GAAKA,EACtCA,EAAI,GAAKA,EAAI3H,EAAE4H,WAAWjG,IAE9B,OAAOgG,GApEXpH,QAAQC,OAAO,YACdiO,QAAQ,SAAU,iBAAkB,SAAU4G,GAE3C,GAAIvQ,IACAwQ,SAAU,SAAUnU,EAAKE,KAGzBkU,YAAcjW,OAAOkW,aAAe,eAAiB,SACrDC,OAAQ,KACRC,mBAAoB,IACpBC,eAAgB,aAChBC,SAAU,KAIVC,EAAeR,EAAe,QAASvQ,GAEvCoO,GACA2C,aAAcA,EACdzB,eAAgB,SAAU0B,GACtB,GAAI3U,GAAMC,KAAK2U,WAAWD,EAE1B,OAAO1U,MAAKyU,aAAapB,IAAItT,IAEjCwT,eAAgB,SAAUmB,EAAKpB,GAC3B,GAAIvT,GAAMC,KAAK2U,WAAWD,EAE1B,KACI,MAAO1U,MAAKyU,aAAaf,IAAI3T,EAAKuT,GACpC,MAAOjU,GAEL,MADAM,KAAI,yCAA2CN,EAAEuV,YAAc,OACxD,OAGfvB,IAAK,SAAUtT,GAEX,MAAOC,MAAKyU,aAAapB,IAAItT,IAEjC2T,IAAK,SAAU3T,EAAKuT,GAEhB,IACI,MAAOtT,MAAKyU,aAAaf,IAAI3T,EAAKuT,GACpC,MAAOjU,GAEL,MADAM,KAAI,yCAA2CN,EAAEuV,YAAc,OACxD,OAGfD,WAAY,SAAU5U,GAClB,MAAOuG,GAAYsM,KAAKC,UAAU9S,KAEtCgU,mBAAoB,SAAUW,GAC1B,GAAI3U,GAAMC,KAAK2U,WAAWD,EAE1B,OADA/U,KAAI,mBAAqBI,GAClBC,KAAKyU,aAAaI,OAAO9U,IAEpC+U,SAAU,WAEN,MADAnV,KAAI,yBACGK,KAAKyU,aAAaM,aAIjC,OAAOjD,SAYf,WACI,YAEA3S,SAAQC,OAAO,YACdiO,QAAQ,6BAA8B,oBAAqB,SAAU2H,GAElE,MAAO,UAAUhD,EAAUxB,EAAayE,GAEpC,GAAIC,GAAMlV,IAGVR,GAAE2V,OAAOD,EAAK,GAAIF,GAAkBhD,EAAUxB,EAAayE,IAE3DC,EAAIlD,SAAWA,EACfkD,EAAI1E,YAAcA,EAElB0E,EAAIE,eAAiB5V,EAAE2V,QACnBlD,aAAa,EACbC,WAAW,EACXmD,SAAS,EACTzS,oBAAoB,EACpBC,uBAAuB,EACvByS,gBAAiB,GACjBC,oBAAoB,EACpBC,SAAU,GACVC,QAAQ,GACTR,GAEHC,EAAIQ,WAAY,EAChBR,EAAIS,YAAc,EAQlBT,EAAIU,QAAU,SAAUjT,EAAQe,GAG5B,GAAImS,GAAWnS,EAAUlE,EAAE2V,OAAOnV,KAAKoV,eAAgB1R,GAAW1D,KAAKoV,cAkBvE,OAhBK1R,GAAQ+R,SACTP,EAAIS,YAAc,EAClBT,EAAIQ,WAAY,GAGhBG,EAASR,UACT1S,EAAOpB,IAAMsU,EAASL,SACtB7S,EAAOjB,KAAOwT,EAAIS,YACdhT,EAAOmC,MACPd,OAAOa,qBAAqBlC,EAAQA,EAAOmC,MAE3CnC,EAAOmT,YACP9R,OAAOmB,gBAAgBxC,EAAQA,EAAOmT,WAAYZ,EAAIa,mBAIvD/V,KAAKgW,OAAOrT,EAAQkT,GAAUvD,KAAK,SAAU2D,GAK5C,MAJJf,GAAIS,aAAeM,EAAShU,OACpBgU,EAAShU,OAAS4T,EAASL,WAC3BN,EAAIQ,WAAY,GAEbO,YAc/B,WACI,YASA,SAASC,GAAcjC,GAEnB,QAASkC,GAActO,EAAMsM,EAAaiC,GAgCtC,QAASC,GAAOtW,GACZ,MAAOC,MAAK6H,KAAK7E,eAAejD,GAIpC,QAASuW,GAAQvW,EAAKuT,EAAMiD,GAEnBvW,KAAKqW,OAAOtW,KACbC,KAAK6H,KAAK9H,OAId+R,EAAM4B,IAAI3T,EAAKuT,GAGXiD,GAAUC,EAAYzW,EAAKwW,GAInC,QAASC,GAAYzW,EAAKwW,EAAUE,EAAOC,GAEnC1W,KAAKqW,OAAOtW,KAE3BwW,EAASI,UAAYJ,EAASlQ,YAAcqQ,EAAQ,IAAMA,EAAME,IAAM,IAGnDH,GAAOzW,KAAK6W,eAAe9W,EAAKwW,GACpCvW,KAAK6H,KAAK9H,GAAK6E,KAAK2R,GAG/BG,GAEHA,EAAM7J,IAAI,WAAY,WAErB7M,KAAK6W,eAAe9W,EAAKwW,IACxBO,KAAK9W,QAMD,QAAS6W,GAAe9W,EAAKwW,GAEzB,GAAIvW,KAAKqW,OAAOtW,GAAM,CAElB,GAAI4W,GAAYJ,EAASI,SAGzBnX,GAAEC,QAAQO,KAAK6H,KAAK9H,GAAM,SAAUgX,EAAIC,GAEtD,GAAID,EAAI,CAEP,GAAIE,GAAcF,EAAGJ,SAGjBA,KAAcM,GACjBjX,KAAK6H,KAAK9H,GAAKmX,OAAOF,EAAO,OAI9BhX,MAAK6H,KAAK9H,GAAKmX,OAAOF,EAAO,IAEdF,KAAK9W,QAKf,QAASmX,GAAQpX,GAEb,MAAKC,MAAKqW,OAAOtW,GACV+R,EAAMuB,IAAItT,IAAQ,KADK,KAKlC,QAASqX,GAAQrX,EAAKuT,GAEbtT,KAAKqW,OAAOtW,KACbC,KAAK6H,KAAK9H,MAId,IAAIsX,GAAUlY,QAAQmY,KAAKxF,EAAMuB,IAAItT,GAGxB,QAATuT,GAA0BvP,SAATuP,EAAoBxB,EAAM+C,OAAO9U,GACjD+R,EAAM4B,IAAI3T,EAAKuT,GAGpB9T,EAAEC,QAAQO,KAAK6H,KAAK9H,GAAM,SAAUwW,GAChCA,EAASzE,EAAMuB,IAAItT,IAAQ,KAAMsX,KAKzC,QAASE,GAAWxX,GAEhB+R,EAAM+C,OAAO9U,SAGNC,MAAK6H,KAAK9H,GAIrB,QAASyX,KAEL1F,EAAMiD,YAGN/U,KAAK6H,QAIT,QAAS4P,GAAU5P,GACfrI,EAAEkY,KAAK7P,EAAM,SAAU9H,GACnBC,KAAKoX,QAAQrX,EAAK,OACpB+W,KAAK9W,OAjJX,GAAI2X,GAAYnY,EAAEoY,UAAUxB,GAAW,SAAW,KAC9CtE,EAAQmC,EAAe0D,GACvBxD,YAAcA,EAAcA,EAAejW,OAAOkW,aAAe,eAAiB,SAClFC,OAAQ,KACRE,eAAgB,cAIpBvU,MAAK6H,QAGL7H,KAAKqW,OAASA,EACdrW,KAAKsW,QAAUA,EACftW,KAAKwW,YAAcA,EACnBxW,KAAK6W,eAAiBA,EACtB7W,KAAKmX,QAAUA,EACfnX,KAAKoX,QAAUA,EACfpX,KAAKuX,WAAaA,EAClBvX,KAAKwX,cAAgBA,EACrBxX,KAAKyX,UAAYA,EAGZ5P,IAAMA,MACXrI,EAAEkY,KAAK7P,EAAM,SAAU9H,GACnBC,KAAKsW,QAAQvW,EAAK,OACpB+W,KAAK9W,OA6HX,MAAOmW,GAhKXhX,QAAQC,OAAO,YAAYiO,QAAQ,kBAAmB6I,GAGtDA,EAAc9I,SAAW,qBAgK7B,WACI,YAEAjO,SAAQC,OAAO,YACdiO,QAAQ,qBAAsB,cAAe,cAAe,KAAM,SAAUE,EAAaD,EAAauE,GAEnG,MAAO,UAAUG,EAAUxB,EAAayE,GAGpC,MAAKjD,IAKLhS,KAAKgS,SAAWA,EAChBhS,KAAKwQ,YAAeA,EAAcA,EAAclD,EAChDtN,KAAKoV,eAAiB5V,EAAE2V,QACpBlD,aAAa,EACbC,WAAW,EACXmD,SAAS,EACTzS,oBAAoB,EACpBC,uBAAuB,EACvByS,gBAAiB,GACjBC,oBAAoB,GACrBN,GAQHjV,KAAKqT,IAAM,SAAU9L,EAAI7D,GAGD,gBAAT,KACP6D,GAAOA,GAAIA,GAIf,IAAIsO,GAAWnS,EAAUlE,EAAE2V,OAAOnV,KAAKoV,eAAgB1R,GAAW1D,KAAKoV,cAEvE,OAAO7H,GAAYwE,UAAU/R,KAAKgS,SAAS6F,OAAOhC,EAASP,iBAAkB/N,EAAIsO,EAAS5D,YAAa4D,EAAS3D,UAAWlS,KAAKwQ,cASpIxQ,KAAKgW,OAAS,SAAUrT,EAAQe,GAG5B,GAAImS,GAAWnS,EAAUlE,EAAE2V,OAAOnV,KAAKoV,eAAgB1R,GAAW1D,KAAKoV,eACnE0C,IAGJ,IAAIjC,EAASR,SAAWQ,EAASN,oBAAsB/V,EAAEmT,QAAQhQ,GAC7D,MAAOkP,GAAG4B,QAASD,MAAO,qGAIzBhU,GAAEmT,QAAQhQ,KAGPkT,EAASR,QAGJ1S,EAAOb,QAAUa,EAAOpB,KAAOoB,EAAOhB,OAASgB,EAAOjB,MAAQiB,EAAOoV,SAAWpV,EAAOlB,QAGxFjC,EAAEC,QAAQD,EAAEqI,KAAKlF,GAAS,SAAS5C,GAG3BP,EAAEwY,UAAU,SAAU,SAAU,WAAYjY,KAGvCP,EAAEmT,QAAQhQ,EAAO5C,UAMX4C,GAAO5C,GAHd4C,EAAO5C,GAAOiE,OAAOtB,yBAAyBC,EAAO5C,GAAM8V,EAASjT,mBAAoBiT,EAAShT,0BAU7GiV,EAAgB9T,OAAO5C,gBAAgBuB,IAIvCmV,EAAgB9T,OAAOb,qBAAqBR,EAAQkT,EAASjT,mBAAoBiT,EAAShT,uBAG9FiV,EAAgBnV,EAKxB,IAAIsV,GAAcjY,KAAKgS,QAKvB,OAJI6D,GAASP,kBACT2C,EAAcA,EAAYJ,OAAOhC,EAASP,kBAGvC/H,EAAY8E,QAAQ4F,EAAaH,EAAejC,EAAS5D,YAAa4D,EAAS3D,UAAWlS,KAAKwQ,cAS1GxQ,KAAK0T,IAAM,SAAUwE,EAAQ3Q,EAAI7D,GAG7B,GAAImS,GAAWnS,EAAUlE,EAAE2V,OAAOnV,KAAKoV,eAAgB1R,GAAW1D,KAAKoV,eAGnE6C,EAAcjY,KAAKgS,QAKvB,OAJI6D,GAASP,kBACT2C,EAAcA,EAAYJ,OAAOhC,EAASP,kBAGvC9E,EAAYqD,IAAIoE,GAAanE,UAAUoE,EAAQ3Q,IAS1DvH,KAAKmY,KAAO,SAAUD,EAAQxU,GAG1B,GAAImS,GAAWnS,EAAUlE,EAAE2V,OAAOnV,KAAKoV,eAAgB1R,GAAW1D,KAAKoV,eAGnE6C,EAAcjY,KAAKgS,QAKvB,OAJI6D,GAASP,kBACT2C,EAAcA,EAAYJ,OAAOhC,EAASP,kBAGvC9E,EAAYqD,IAAIoE,GAAaG,WAAWF,IASnDlY,KAAKqY,KAAO,SAAUH,EAAQ3Q,GAC1B,MAAQA,GAAKvH,KAAK0T,IAAIwE,EAAQ3Q,GAAMvH,KAAKmY,KAAKD,IASlDlY,KAAKsY,MAAQ,SAAUJ,EAAQ3Q,GAC3B,MAAOiJ,GAAY4C,IAAIpB,GAAUsG,MAAMJ,EAAQ3Q,SASnDvH,KAAK6U,OAAS,SAAUtN,GACpB,MAAOiJ,GAAY4C,IAAIpT,KAAKgS,SAAUzK,GAAIsN,aAxK1ClV,IAAI,oDACG,iCA+KvB,WACC,YAEAR,SAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,iBAAkB,SAAUkL,GACvF,QAASC,KACR,MAAO,uCAAuC/V,QAAQ,QAAS,SAASgW,GACvE,KAAMC,GAAkB,GAAdC,KAAKC,SAAY,EAAGC,EAAU,MAANJ,EAAYC,EAAO,EAAFA,EAAM,CACzD,OAAOG,GAAExS,SAAS,MAIpB,OACCyS,QAAS,SAAUxM,GAClB,MAAIA,GAAO1G,IAAIoS,SAAS,WAAaO,EAAelF,IAAI/G,EAAO1G,MAC9D0G,EAAO1G,KAAO,OAAS1H,OAAOwU,SAAWxU,OAAOwU,SAAW8F,KACpDlM,GAGDA,OAKVnN,QAAQC,OAAO,YAAYkN,QAAQ,gBAAiB,SAAUyM,GAC7DA,EAAcC,aAAapU,KAAK,8BAIlC,WACC,YAEA,IAAIqU,GAAeC,MAAMvL,YACrBwL,EAAuBF,EAAaG,YAAc,sBAEtDja,SAAQC,OAAO,YAAYiO,QAAQ,yBAClC,WACC,QAASgM,GAAuB/M,GAI/B,MAHAA,GAAOgN,QAAQ,sBAAwBC,QAAQlG,IAAI8F,GACnD7M,EAAOgN,QAAQ,2BAA6B,QAC5ChN,EAAOgN,QAAQ,6BAA+B,QACvChN,EAGR,OACCwM,QAAS,SAAUxM,GAClB,MAAKA,GAAO1G,IAAIoS,SAAS,SAIrBuB,QAAQlG,IAAI8F,GACRE,EAAuB/M,GAJvBA,OAaZnN,QAAQC,OAAO,YAAYkN,QAC1B,gBACA,SAAUyM,GACTA,EAAcC,aAAapU,KAAK,+BAgBnCzF,QAAQC,OAAO,YAAYiO,QAAQ,4BAA6B,CAAE,SAASmM,GAE1E,GAAIC,IACHC,KAASvM,MAAS,cAAewM,QAAW,qDAC5CC,KAASzM,MAAS,eAAgBwM,QAAW,iKAC7CE,KAAS1M,MAAS,YAAawM,QAAW,gFAC1CG,KAAS3M,MAAS,YAAawM,QAAW,kFAC1CI,KAAS5M,MAAS,qBAAsBwM,QAAW,kFACnDK,KAAS7M,MAAS,iBAAkBwM,QAAW,8EAC/CM,KAAS9M,MAAS,gCAAiCwM,QAAW,4DAC9DO,KAAS/M,MAAS,kBAAmBwM,QAAW,gDAChDQ,KAAShN,MAAS,WAAYwM,QAAW,2EACzCS,KAASjN,MAAS,OAAQwM,QAAW,6CACrCU,KAASlN,MAAS,kBAAmBwM,QAAW,0FAChDW,KAASnN,MAAS,sBAAuBwM,QAAW,0EACpDY,KAASpN,MAAS,2BAA4BwM,QAAW,mFACzDa,KAASrN,MAAS,uBAAwBwM,QAAW,8JACrDc,KAAStN,MAAS,yBAA0BwM,QAAW,mFACvDe,KAASvN,MAAS,kCAAmCwM,QAAW,6FAChEgB,KAASxN,MAAS,qBAAsBwM,QAAW,8EACnDiB,KAASzN,MAAS,wBAAyBwM,QAAW,4EACtDkB,KAAS1N,MAAS,kBAAmBwM,QAAW,2GAChDmB,KAAS3N,MAAS,cAAewM,QAAW,yGAC5CoB,KAAS5N,MAAS,sBAAuBwM,QAAW,4DACpDqB,KAAS7N,MAAS,kBAAmBwM,QAAW,8GAChDsB,KAAS9N,MAAS,6BAA8BwM,QAAW,6EAC3DuB,KAAS/N,MAAS,kCAAmCwM,QAAW,4DAI7DwB,GAEHC,cAAiB,SAASnF,GAKzB,MAHAuD,GAAUhG,MAAMiG,EAAYxD,EAASoF,QAAQlO,MAAOsM,EAAYxD,EAASoF,QAAQ1B,UAGxErG,MAAUgI,SAAW,EAAO9H,OAAWrG,MAASsM,EAAYxD,EAASoF,QAAQlO,MAAOwM,QAAWF,EAAYxD,EAASoF,QAAQ1B,YAKvI,OAAOwB,MAIRhc,QAAQC,OAAO,YAAYkN,OAAO,cAOlC,WACC,YAEAnN,SAAQC,OAAO,YAAYiO,QAAQ,mBAAoB,WAWtD,QAASkO,KAER,GAAIC,GAAQjC,QAAQlG,IAAIoI,EACxB,OAAOD,GAIR,QAASE,GAAapP,GAGrB,MADAA,GAAOgN,QAAuB,cAAI,UAAYiC,IACvCjP,EAnBR,GAAIqP,GAASzd,OAAc,MACvB+a,EAAe0C,EAAOhO,YACtBiO,EAAsB,GAAID,GAAOE,mBACjCC,GAAqB,EAGrBL,EAAiBxC,EAAaG,YAAc,aAiBhD,QACCN,QAAS,SAAUxM,GAElB,IAAKA,EAAO1G,IAAIoS,SAAS,QACxB,MAAO1L,EAQR,IALI2M,EAAa8C,wCAChBC,QAAQrc,IAAI,gBAAkB2M,EAAO1G,KAIlCkW,EAIH,MAHAE,SAAQrc,IAAI,6BAGL,GAAIsc,SAAQ,SAAUhJ,GAC5B+I,QAAQrc,IAAI,oBAEZ,IAAIuc,GAAQ,IACZA,GAAQhe,OAAOie,YAAY,WACtBP,EAAoBQ,iBACvBJ,QAAQrc,IAAI,kBACZsT,EAAQyI,EAAapP,IACrBpO,OAAOme,cAAcH,GACrBA,EAAQ,OAEP,MAIJ,IAAIV,GAAQD,EAASjP,EAGrB,OAAIqP,GAAOW,IAAIC,eAAef,IAC7BQ,QAAQrc,IAAI,kCAAmC,mCAG/Cmc,GAAqB,EAGdF,EAAoBY,eAAelK,KAAK,SAAUmK,GASxD,MARAT,SAAQrc,IAAI,oBAAsB8c,GAGlCX,GAAqB,EAErBE,QAAQrc,IAAI,qBAAsB,kCAG3B+b,EAAapP,MAIdoP,EAAapP,QAQzBnN,QAAQC,OAAO,YAAYkN,QAAQ,gBAAiB,SAAUyM,GAC7DA,EAAcC,aAAapU,KAAK,yBASlC,WACI,YAgBA,SAAS8X,GAAuBnP,EAAaoP,GAmBzC,QAASC,KACL,MAAOrP,GAAY8E,QAAQ,eAAgB,MAAM,GAAM,EAAMsK,GASjE,QAASE,GAAoBC,GACzB,MAAOvP,GAAYwE,UAAU,gBAAkBxK,GAAIuV,IAAkB,GAAO,EAAMH,GAStF,QAASI,KACL,GAAIja,IACAka,WAAW,GAGXra,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAChD,OAAOyK,GAAYwE,UAAU,eAAgBpP,GAAQ,GAAO,EAAMga,GA1CtE,GAAI3N,GAAUhP,IAQd,OAJAgP,GAAQiO,oBAAsBL,EAC9B5N,EAAQ6N,oBAAsBA,EAC9B7N,EAAQ+N,uBAAyBA,EAE1B/N,EAxBX7P,QACKC,OAAO,YACP4P,QAAQ,yBAA0B0N,GAIvCA,EAAuBtP,SAAW,cAAe,sBA+DrD,WACI,YAgBA,SAAS8P,GAA6B3P,EAAaoP,GAO/C,QAAS3G,KACL,MAAOzI,GAAY8E,QAAQ,qBAAsB,MAAM,GAAO,EAAMsK,GALxE,GAAI3N,GAAUhP,IAQd,OANAgP,GAAQgH,OAASA,EAMVhH,EAxBX7P,QACKC,OAAO,YACP4P,QAAQ,+BAAgCkO,GAI7CA,EAA6B9P,SAAW,cAAe,sBAsB3D,WACC,YAMA,SAAS+P,GAAmB5P,EAAahB,EAAoBsF,EAAIlE,EAAauP,EAA8BE,EAAUC,GAqBrH,QAASC,GAAcC,GACtB,GAAIjc,KAEJ,IAAIic,EACH,GAAIA,EAAqBxW,QAAQ,KAAO,GAAI,CAC3C,GAAIzB,GAAYiY,EAAqBhY,MAAM,IAC3CjE,GAAYkc,SAAWlY,EAAU+E,QAE7B/E,EAAUrD,OAAS,IACtBX,EAAYmc,OAASnY,EAAU9E,KAAK,UAGrCc,GAAYkc,SAAWD,CAQzB,OAJKjc,GAAYmc,SAChBnc,EAAYmc,OAAS,OAGfnc,EAGR,QAASoc,GAAuBC,EAAmBC,GAClD,GAAIC,GAAgBF,EAAkB5W,QAAQ,MAC1C+W,EAAMD,EAAgB,EAAIF,EAAkBI,OAAO,EAAGF,GAAiBD,EAEvEI,EAAiBH,EAAgB,EAAIF,EAAkBI,OAAOF,EAAgB,GAAKF,EACnFM,EAAuBX,EAAcU,EAEzC,QACCF,IAAKA,EACLN,SAAUS,EAAqBT,SAC/BC,OAAQQ,EAAqBR,QAI/B,QAASS,GAAsBV,EAAUC,EAAQU,GAChD,GAAInP,EAAQoP,oBAAqB,CAChC,GAAI9c,GACH0N,EAAQoP,oBAAoBD,IAC5BnP,EAAQoP,oBAAoBD,GAAaX,IACzCxO,EAAQoP,oBAAoBD,GAAaX,GAAUC,EAEpD,OAAKje,GAAE2T,YAAY7R,IAGX,EAFAA,EAKR,OAAO,EAIT,QAAS+c,GAAgBb,EAAUC,EAAQjN,GAC1C,GAAI7C,EAAY2Q,mBAAoB,CACnC,GAAI9L,GAAWX,EAAGY,OAElB,OADAD,GAASS,SAAQ,GACVT,EAASU,QAIjB,MAAIvF,GAAY4Q,uBAAwB,IAAS5Q,EAAY6Q,OAAS7Q,EAAY8Q,mCAC1EzP,EAAQ0P,sBAAsBlB,EAAUC,EAAQjN,GAEhDxB,EAAQ2P,oBAAoBnB,EAAUC,EAAQjN,GAIvD,QAASoO,GAAsBC,GAC9B,MAAOtS,GAAmBC,oBAAoB8F,KAAK,SAAUwM,GAC5D,GAAIC,GAAmBF,EAAYG,cAAczZ,MAAM,KACnD0Z,EAAkBF,EAAiB,GACnCG,EAAkBH,EAAiB,EAEvC,OACCD,GAAQK,aAAaC,KAAK,SAAUP,GACnC,MAAOA,GAAYI,gBAAgBD,gBAAkBC,GAAmBJ,EAAYK,gBAAgBF,gBAAkBE,KAGhH,GAEA,IAKV,QAASP,GAAoBnB,EAAUC,EAAQjN,GAC9C,GAAIgC,GAAWX,EAAGY,OAElB,IAAIzD,EAAQoP,oBAAqB,CAChC,GAAIiB,GAAkBhC,EAAqB9M,wBAAwBC,EACnEgC,GAASS,QAAQjE,EAAQkP,sBAAsBV,EAAUC,EAAQ4B,QAE5DrQ,GAAQsQ,oBAGZtQ,EAAQuQ,2BAA2B/B,EAAUC,EAAQjN,EAAagC,GAFlExD,EAAQwQ,wBAAwBhC,EAAUC,EAAQjN,EAAagC,EAMjE,OAAOA,GAASU,QAGjB,QAASqM,GAA2B/B,EAAUC,EAAQjN,EAAagC,GAClE4K,EAAS,WACR,GAAIpO,EAAQoP,oBAAqB,CAChC,GAAIiB,GAAkBhC,EAAqB9M,wBAAwBC,EACnEgC,GAASS,QAAQjE,EAAQkP,sBAAsBV,EAAUC,EAAQ4B,QAEjErQ,GAAQuQ,2BAA2B/B,EAAUC,EAAQjN,EAAagC,IAEjE,KAGJ,QAASgN,GAAwBhC,EAAUC,EAAQjN,EAAagC,GAC/DxD,EAAQsQ,qBAAsB,EAE9BpC,EAA6BlH,SAAS1D,KACrC,SAAUC,GACTvD,EAAQyQ,uBAAuBlN,EAE/B,IAAI8M,GAAkBhC,EAAqB9M,wBAAwBC,EAEnEgC,GAASS,QAAQjE,EAAQkP,sBAAsBV,EAAUC,EAAQ4B,IACjErQ,EAAQsQ,qBAAsB,GAE/B,WACCtQ,EAAQsQ,qBAAsB,IAKjC,QAASZ,GAAsBlB,EAAUC,EAAQjN,GAChD,MAAOjD,GAAYwE,UAAU,UAAYyL,SAAUA,EAAUC,OAAQA,IAAU,GAAO,EAAMjN,GAAa,GAAO8B,KAAK,SAAUC,GAC9H,MAAOA,IAAUA,EAAOmN,YAI1B,QAASD,GAAuBrB,GAC/B,GAAIuB,MACAC,EAAuBpgB,EAAEqgB,QAAQzB,EAAqB,cAE1D,KAAK,GAAIiB,KAAmBO,GAAsB,CAC5CD,EAAaN,KACjBM,EAAaN,MAGd,IAAIS,GAAmBtgB,EAAEqgB,QAAQD,EAAqBP,GAAkB,WAExE,KAAK,GAAIU,KAAgBD,GAAkB,CAC1C,GAAIE,GAAsBxgB,EAAEygB,KAAKF,EAE5BJ,GAAaN,GAAiBW,KAClCL,EAAaN,GAAiBW,MAG/B,IAAIE,GAAYJ,EAAiBE,EAEjCxgB,GAAEC,QAAQygB,EAAW,SAAUC,GAC1BA,EAAmB1C,OAAO1W,QAAQ,KAAO,GAC5CvH,EAAEC,QAAQ0gB,EAAmB1C,OAAOlY,MAAM,KAAM,SAAUkY,GACzDkC,EAAaN,GAAiB7f,EAAEygB,KAAKE,EAAmB3C,WAAWhe,EAAEygB,KAAKxC,KAAW,IAGtFkC,EAAaN,GAAiB7f,EAAEygB,KAAKE,EAAmB3C,WAAWhe,EAAEygB,KAAKE,EAAmB1C,UAAW,KAM5GzO,EAAQoP,oBAAsBuB,EAG/B,QAASS,GAAkBC,GAC1B,GAAIvB,GAAUvS,EAAmB+T,gBACjC,OAAOxB,IAAWA,EAAQuB,GAG3B,QAASE,GAAoBF,GAC5B,MAAOD,GAAkBC,GAG1B,QAASG,GAAcH,GACtB,GAAIvB,GAAUvS,EAAmB+T,gBACjC,OAAOxB,GAAQuB,GA7MhB,GAAIrR,IACHoR,kBAAmBA,EACnB/B,gBAAiBA,EACjBmC,cAAeA,EACfD,oBAAqBA,EACrBjD,cAAeA,EACfI,uBAAwBA,EACxBU,oBAAqB,KACrBF,sBAAuBA,EACvBuB,uBAAwBA,EACxBD,wBAAyBA,EACzBD,2BAA4BA,EAC5BZ,oBAAqBA,EACrBD,sBAAuBA,EACvBE,sBAAuBA,EACvBU,qBAAqB,EAGtB,OAAOtQ,GAvBR7P,QAAQC,OAAO,YAAY4P,QAAQ,qBAAsBmO,GAEzDA,EAAmB/P,SAAW,cAAe,qBAAsB,KAAM,cAAe,+BAAgC,WAAY,2BA0NrI,WACI,YAiBA,SAASqT,GAAkBC,EAAc7O,EAAI8O,EACzCC,EAAeC,EAAiBnE,EAAwBoE,EAA8BC,GAEtF,MAAO,UAASC,EAAgBC,GAY5B,QAASC,KACL,MAAOC,KAAc7O,KAAK,WAAa,MAAO8O,OAGlD,QAASA,KACL,GAAItC,GAAU6B,CACd,OAAO7B,GAGX,QAASuC,KAELrS,EAAQsS,kBACJC,IACAC,IACAC,IACAC,KAIAT,GACAzhB,EAAEC,QAAQwhB,EAA0B,SAASU,GACzC3S,EAAQsS,iBAAiB1c,KAAK+c,OAK1C,QAASR,KACLE,GACA,IAAI7O,GAAWX,EAAGY,OAIlB,OAHAZ,GAAGgC,IAAI7E,EAAQsS,kBAAkBhP,KAAK,WAClCE,EAASS,YAENT,EAASU,QAGpB,QAAS0O,KACL,GAAI9E,GAAiBiE,EAAS,sBAI9B,OAHKjE,KACDA,EAAiB,IAEdA,EAGX,QAASyE,KACL,GAAI/O,GAAWX,EAAGY,OAqBlB,QAnBKkO,EAAgBkB,cAAiBnB,EAAa5D,gBAAmB6D,EAAgBkB,aAAaC,gBAAkBpB,EAAa5D,eAC9HJ,EAAuBO,sBAAsB3K,KAAK,SAAUyP,GACxD,GAAIrB,EAAa5D,eACb6D,EAAgBkB,aAAeriB,EAAE4f,KAAK2C,EAAe,SAAUC,GAAQ,MAAOA,GAAKF,kBAAqBpB,EAAa5D,qBAClH,CACH,GAAImF,GAA0BL,GAC1BK,GAA0B,IAC1BtB,EAAgBkB,aAAeriB,EAAE4f,KAAK2C,GAAiBD,eAAgBG,KAEtEtB,EAAgBkB,eACjBlB,EAAgBkB,aAAeriB,EAAE4f,KAAK2C,GAAiBG,WAAW,KAG1E1P,EAASS,YAGbT,EAASS,UAGNT,EAASU,QAGpB,QAASsO,KACL,GAAIhP,GAAWX,EAAGY,OAClB,IAAIiO,EAAayB,QAAS,CACtB,GAAIA,GAAUzB,EAAayB,OAC3BtB,GAAgBxN,IAAI8O,GAAS7P,KAAK,SAAU8P,GACxCzB,EAAgByB,MAAQA,EACxB5P,EAASS,gBAGb0N,GAAgByB,MAAQ,KACxB5P,EAASS,SAEb,OAAOT,GAASU,QAGpB,QAASuO,KACL,GAAIjP,GAAWX,EAAGY,OAClB,IAAIiO,EAAa2B,SAAU,CACvB,GAAIA,GAAW3B,EAAa2B,QAC5BzB,GAAcvN,IAAIgP,GAAU/P,KAAK,SAAU1R,GACvC+f,EAAgB/f,OAASA,EACzB4R,EAASS,gBAGb0N,GAAgB/f,OAAS,KACzB4R,EAASS,SAEb,OAAOT,GAASU,QAGpB,QAASwO,KACL,GAAIlP,GAAWX,EAAGY,OAElB,IAAKkO,EAAgB2B,mBA2BjB9P,EAASS,cA1BT,IAAIyN,EAAa2B,SAAU,CACvB,GAAIA,GAAW3B,EAAa2B,QAE5BvB,GAA6ByB,cAAcF,GAAU/P,KAAK,SAAUkQ,GAChE7B,EAAgB2B,mBAAqB9iB,EAAE4f,KAAKoD,GAAuBV,eAAgBpB,EAAaoB,iBAE5FnB,EAAgB2B,mBAChB9P,EAASS,UAET6N,EAA6ByB,cAAcF,GAAU/P,KAAK,SAAUkQ,GAChE,GAAIP,GAA0BL,GAC1BK,GAA0B,IAC1BtB,EAAgB2B,mBAAqB9iB,EAAE4f,KAAKoD,GAAuBV,eAAgBG,KAElFtB,EAAgB2B,qBACjB3B,EAAgB2B,mBAAqB9iB,EAAE4f,KAAKoD,GAAuBC,eAAe,KAEtFjQ,EAASS,kBAKrB0N,GAAgB/f,OAAS,KACzB4R,EAASS,SAKjB,OAAOT,GAASU,QA7IpB,GAAIlE,GAAUhP,IAGVghB,KACAL,EAAkBnhB,EAAE2V,OAAOwL,EAAiBK,IAIhDhS,EAAQkS,iBAAmBA,EAC3BlS,EAAQoS,WAAaA,GA3B7BjiB,QACKC,OAAO,YACPiO,QAAQ,oBAAqBoT,GAIlCA,EAAkBrT,SAAW,eAAgB,KAAM,kBAC/C,gBAAiB,kBAAmB,yBAA0B,+BAAgC,eAmKtG,WACI,YAkBA,SAASuT,KACL,GAAI+B,IACAN,MAAO;AACPxhB,OAAQ,KACRihB,aAAc,KACdS,mBAAoB,KAExB,OAAOI,GAtBXvjB,QACKC,OAAO,YACP4P,QAAQ,kBAAmB2R,GAIhCA,EAAgBvT,cAoBpB,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,uBAAwB,YAAa,cAExE,SAAUsV,EAAWhV,GAUjB,QAASiV,GAAeC,EAAaC,GACjC,MAAIH,GAAUI,IAAID,GACPD,EAEAlV,EAAYqV,eAAiB,8BAK5C,QAASC,GAAcH,EAAaI,GAChC,MAAOP,GAAUI,IAAID,GAAeI,EAAuB,KAI/D,QAASC,GAAQN,EAAaC,EAAaI,GACvC,OACIL,YAAaD,EAAeC,EAAaC,GACzCM,WAAYH,EAAcH,EAAaI,IA1B/C,GAAIhO,IACAiO,QAASA,EACTF,cAAeA,EACfL,eAAgBA,EAIpB,OAAO1N,SA0Bf,WACI,YAWA,SAASmO,GAA8C9V,EAAaoP,EAAiB2G,EAAO3V,GAaxF,QAAS4V,GAA+BlE,EAAiBmE,GACrD,MAAOjW,GAAY8E,QAAQ,uCAAyCgN,EAAkB,IAAMmE,EAAS,MAAM,GAAO,EAAM7G,GAG5H,QAAS8G,GAAOC,GACZ,MAAOJ,GAAM5P,IAAI/F,EAAYC,oBAAsB,sCAAuC8V,GAG9F,QAASC,GAAID,GACT,MAAOJ,GAAMnL,KAAKxK,EAAYC,oBAAsB,sCAAuC8V,GAnB/F,GAAI1U,GAAUhP,IAQd,OAJAgP,GAAQuU,+BAAiCA,EACzCvU,EAAQyU,OAASA,EACjBzU,EAAQ2U,IAAMA,EAEP3U,EAnBX7P,QACKC,OAAO,YACP4P,QAAQ,gDAAiDqU,GAI9DA,EAA8CjW,SAAW,cAAe,kBAAmB,QAAS,kBA6BxG,WACI,YAYA,SAASwW,GAAwBrW,EAAa2B,EAAiBxC,GAe3D,QAAS2G,KACL,MAAO9F,GAAY8E,QAAQ,sBAAuB,MAAM,GAAM,EAAMnD,GAG9E,QAAS8G,KACR,MAAOzI,GAAY8E,QAAQ,0BAA2B,MAAM,GAAM,EAAMnD,GAGnE,QAAS2U,GAAQC,GACb,GAAInhB,GAAS,IACb,OAAO4K,GAAY8E,QAAQ,+BAA+ByR,EAAuBnhB,GAAQ,GAAM,EAAMuM,GAGzG,QAAS6U,KACL,MAAOxW,GAAY8E,QAAQ,iCAAkC,MAAM,GAAM,EAAMnD,GAGnF,QAAS8U,GAAWC,GAChB,GAAIthB,IAAWuhB,UAAWD,EAC1B,OAAO1W,GAAY8E,QAAQ,sBAAuB1P,GAAQ,GAAM,EAAMuM,GA/B1E,GAAIF,GAAUhP,IAUd,OANAgP,GAAQqE,IAAMA,EACpBrE,EAAQgH,OAASA,EACXhH,EAAQ6U,QAAUA,EAClB7U,EAAQgV,WAAaA,EACrBhV,EAAQ+U,WAAaA,EAEd/U,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,0BAA2B4U,GAIxCA,EAAwBxW,SAAW,cAAe,kBAAmB,iBA0CzE,WACI,YAMA,SAAS+W,GAAwBtS,GAM7B,QAASuS,GAAqBC,EAAkBlX,EAAOmX,GAEnD,GAAI9R,GAAWX,EAAGY,QAEd8R,EAAgBpX,GAAS,gCACzBqX,EAAc,GACdC,EAAW,QAEXC,EAAYJ,GAA2BA,MAEvCK,GAAa,EACbC,GAAc,CAGlB,IAAIP,GAAoBA,EAAiBQ,gBAAiB,CAGtD,GAAIR,EAAiBQ,gBAAgBC,UAAW,CAE5C,GAAIA,GAAYT,EAAiBQ,gBAAgBC,SAEjDF,IAAc,CAEd,IAAIG,GAAeD,EAAUE,OAM7B,IAJAN,EAAS9f,KAAK,mDACd8f,EAAS9f,KAAKmgB,GAGVD,EAAUG,gBAAkBH,EAAUG,eAAeA,eAAgB,CACrE,GAAIC,GAAwBJ,EAAUG,eAAeA,eAAeD,OAChEE,IACAR,EAAS9f,KAAKsgB,IAK1B,IAAKN,IAGGP,EAAiBc,YACjBT,EAAS9f,KAAKyf,EAAiBc,YAG/Bd,EAAiBQ,gBAAgBO,OAAO,CAExC,GAAIC,GAAc7lB,EAAE8lB,KAAKjB,EAAiBQ,gBAAgBO,MAAO,SAAUG,GAAQ,MAA6B,UAAtBA,EAAKC,cAAkD,aAAtBD,EAAKC,cAC5HH,GAEAhB,EAAiBQ,gBAAgBO,MAAQ5lB,EAAEiU,OAAO4Q,EAAiBQ,gBAAgBO,OAASI,aAAc,aAItGhmB,EAAEimB,MAAMpB,EAAiBQ,gBAAgBO,OAASI,aAAc,cAChEf,EAAW,UACXE,GAAa,GAGbnlB,EAAEimB,MAAMpB,EAAiBQ,gBAAgBO,OAASI,aAAc,WAChEf,EAAW,SAKnBjlB,EAAEC,QAAQ4kB,EAAiBQ,gBAAgBO,MAAO,SAAUG,GACxD/lB,EAAEC,QAAQ8lB,EAAKb,SAAU,SAAU/K,GAC/B+K,EAAS9f,KAAK+U,QAQ7Bna,EAAEmT,QAAQ+R,KACXF,EAAcE,EAASlkB,KAAK,QAGhC,IAAIklB,IAAgBvY,MAAOoX,EAAc9lB,KAAMgmB,EAsB/C,OApBID,KACAkB,EAAYtgB,KAAOof,GAGnBG,IACAe,EAAYC,kBAAmB,EAC/BD,EAAYE,kBAAoB,WAChCF,EAAYG,gBAAiB,GAI7BlB,EACAmB,KAAKJ,EAAa,SAAUK,GACxBvT,EAASS,QAAQ8S,KAIrBD,KAAKJ,GAGFlT,EAASU,QAxGpB,GAAIlE,IACAoV,qBAAsBA,EA0G1B,OAAOpV,GAjHX7P,QAAQC,OAAO,YAAY4P,QAAQ,0BAA2BmV,GAE9DA,EAAwB/W,SAAW,SAwHvC,WACI,YAgBA,SAAS4Y,GAAsBvF,EAAmBE,EAAiBsF,GA0B/D,GAAIC,KAGJ,OAAO,IAAIzF,GAAkBwF,EAAqBC,GA1CtD/mB,QACKC,OAAO,YACP4P,QAAQ,wBAAyBgX,GAItCA,EAAsB5Y,SAAW,oBAAqB,kBAAmB,0BA6C7E,WACI,YAcA,SAAS6Y,KACL,GAAIvD,KAGJ,OAAOA,GAfXvjB,QACKC,OAAO,YACP4P,QAAQ,sBAAuBiX,MAuBxC,WACI,YAgBA,SAASE,GAAkB5Y,EAAa2B,GAiBpC,QAASkX,KACL,MAAO7Y,GAAY8E,QAAQ,WAAanN,SAAU,uBAAwB,GAAO,EAAMgK,GAf3F,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQoX,aAAeA,EAEhBpX,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,oBAAqBmX,GAIlCA,EAAkB/Y,SAAW,cAAe,sBAmChD,WACI,YAgBA,SAASiZ,GAA0C9Y,EAAa2B,GAiB5D,QAASmE,GAAIiT,GACT,MAAO/Y,GAAY8E,QAAQ,kCAAmCrO,OAAO5C,iBAAkBU,QAAUykB,qBAAsBD,MAA0B,GAAM,EAAMpX,GAfjK,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQqE,IAAMA,EAEPrE,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,4CAA6CqX,GAI1DA,EAA0CjZ,SAAW,cAAe,sBAkCxE,WACI,YAgBA,SAASoZ,GAA6BjZ,EAAa2B,GAwB/C,QAAS8G,KACL,MAAOzI,GAAY8E,QAAQ,qBAAsB,MAAM,GAAM,EAAMnD,GAGvE,QAASuX,GAAgC3J,EAAgBuF,EAAUqE,GAC/D,GAAIC,GAAkB3iB,OAAO5C,iBACzBU,QACI8kB,eAAgB9J,EAChB+J,SAAUxE,EACVyE,aAAcJ,IAItB,OAAKC,IAAoBA,EAAgB/kB,QAElC2L,EAAY8E,QAAQ,qBAAsBsU,GAAiB,GAAM,EAAMzX,GAFnB,KAKrE,QAAS6X,GAAwBjK,EAAgBuF,GACvC,GAAIsE,GAAkB3iB,OAAO5C,iBACzBU,QACI8kB,eAAgB9J,EAChB+J,SAAUxE,IAIlB,OAAKsE,IAAoBA,EAAgB/kB,QAElC2L,EAAY8E,QAAQ,qBAAsBsU,GAAiB,GAAM,EAAMzX,GAFnB,KAY/D,QAASmE,GAAI2T,GACT,MAAOzZ,GAAYwE,UAAU,sBAAwBxK,GAAIyf,IAAwB,GAAM,EAAM9X,GAUjG,QAAS2F,GAAOmS,GACZ,MAAO9X,GAAgBkE,IAAI,qBAAsB4T,GAAsBnS,SAU3E,QAASnB,GAAIuT,EAAoBD,GAC7B,MAAO9X,GAAgB2E,IAAI,sBAAsBC,UAAUmT,EAAoBD,GASnF,QAAS7O,GAAK8O,GACV,MAAO/X,GAAgB2E,IAAI,sBAAsBuE,WAAW6O,GAShE,QAASC,GAAqBC,GAE1B,MAAO5Z,GAAYwE,UAAU,2CAA6CoV,EAAiB,MAAM,GAAM,EAAMjY,GAvGjH,GAAIF,GAAUhP,IAad,OATAgP,GAAQgH,OAASA,EACjBhH,EAAQqE,IAAMA,EACdrE,EAAQ6F,OAASA,EACjB7F,EAAQ0E,IAAMA,EACd1E,EAAQmJ,KAAOA,EACfnJ,EAAQkY,qBAAuBA,EAC/BlY,EAAQyX,gCAAkCA,EAChDzX,EAAQ+X,wBAA0BA,EAErB/X,EA7BX7P,QACKC,OAAO,YACP4P,QAAQ,+BAAgCwX,GAI7CA,EAA6BpZ,SAAW,cAAe,sBA2H3D,WACI,YAWA,SAASga,GAAmC7Z,EAAa2B,GAKrD,QAASmY,GAAiBC,GACtB,MAAOpY,GAAgB2E,IAAI,4BAA4BC,UAAUwT,GALrE,GAAItY,GAAUhP,IAQd,OANAgP,GAAQqY,iBAAmBA,EAMpBrY,EAjBX7P,QACKC,OAAO,YACP4P,QAAQ,qCAAsCoY,GAInDA,EAAmCha,SAAW,cAAe,sBAmBjE,WACI,YAgBA,SAASma,GAA8Bha,EAAa2B,GAwBhD,QAASmE,GAAImU,GACT,MAAOja,GAAYwE,UAAU,uBAAyBxK,GAAIigB,IAAyB,GAAM,EAAMtY,GAQnG,QAAS8G,KACL,MAAOzI,GAAY8E,QAAQ,sBAAuB,MAAM,GAAM,EAAMnD,GASxE,QAASuY,GAAmBN,GACxB,GAAIR,GAAkB3iB,OAAO5C,iBAAkBU,QAAU4lB,gBAAiBP,IAC1E,OAAO5Z,GAAY8E,QAAQ,sBAAuBsU,GAAiB,GAAM,EAAMzX,GAGnF,QAASyY,GAAiCC,EAAiBC,GACvD,MAAOta,GAAY8E,QAAQ,qCAAuCuV,gBAAiBA,EAAiBC,gBAAkBA,IAAkB,GAAM,EAAM3Y,GAUxJ,QAAS2F,GAAO2S,GACZ,MAAOtY,GAAgBkE,IAAI,sBAAuBoU,GAAuB3S,SAU7E,QAASnB,GAAIoU,EAAqBN,GAC9B,MAAOtY,GAAgB2E,IAAI,uBAAuBC,UAAUgU,EAAqBN,GASrF,QAASrP,GAAK2P,GACV,MAAO5Y,GAAgB2E,IAAI,uBAAuBuE,WAAW0P,GA9EjE,GAAI9Y,GAAUhP,IAYd,OARAgP,GAAQqE,IAAMA,EACdrE,EAAQgH,OAASA,EACjBhH,EAAQyY,mBAAqBA,EAC7BzY,EAAQ2Y,iCAAmCA,EAC3C3Y,EAAQ6F,OAASA,EACjB7F,EAAQ0E,IAAMA,EACd1E,EAAQmJ,KAAOA,EAERnJ,EA5BX7P,QACKC,OAAO,YACP4P,QAAQ,gCAAiCuY,GAI9CA,EAA8Bna,SAAW,cAAe,sBA6F5D,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,gCAAiC,kBAAmB,cAEvF,SAAU6B,EAAiB3B,GAOvB,QAASyI,GAAOrR,GACZ,MAAO4I,GAAY8E,QAAQ,qBAAsBrO,OAAO5C,iBAAkBU,OAAQ6C,KAAe,GAAM,EAAMuK,GAPjH,GAAIgG,IACAc,OAAQA,EAGZ,OAAOd,SAYf,WACI,YAgBA,SAAS6S,GAAwBxa,EAAa2B,GAwB1C,QAAS8G,KACL,MAAOzI,GAAY8E,QAAQ,gBAAiB,MAAM,GAAM,EAAMnD,GAGlE,QAAS8Y,GAAoB3F,EAAUmB,EAASyE,GAC5C,MAAO1a,GAAY8E,QAAQ,qCAAuCgQ,EAAW,IAAMmB,EAAU,IAAMyE,EAAkB,MAAM,GAAM,EAAM/Y,GAG3I,QAASgZ,GAA2B7F,EAAU4F,GAC1C,MAAO1a,GAAY8E,QAAQ,4CAA8CgQ,EAAW,IAAM4F,EAAkB,MAAM,GAAM,EAAM/Y,GAGlI,QAASiZ,GAAqBC,GAC1B,MAAO7a,GAAY8E,QAAQ,sCAAwC+V,EAAmB,MAAM,GAAM,EAAMlZ,GAU5G,QAASmE,GAAI8T,GACT,MAAO5Z,GAAYwE,UAAU,iBAAmBxK,GAAI4f,IAAmB,GAAO,EAAMjY,GAUxF,QAAS2F,GAAOsS,GACZ,MAAOjY,GAAgBkE,IAAI,gBAAiB+T,GAAiBtS,SAUjE,QAASnB,GAAI2U,EAAelB,GACxB,MAAOjY,GAAgB2E,IAAI,iBAAiBC,UAAUuU,EAAelB,GASzE,QAAShP,GAAKkQ,GACV,MAAOnZ,GAAgB2E,IAAI,iBAAiBuE,WAAWiQ,GA7E3D,GAAIrZ,GAAUhP,IAad,OATAgP,GAAQgH,OAASA,EACjBhH,EAAQgZ,oBAAsBA,EAC9BhZ,EAAQkZ,2BAA6BA,EACrClZ,EAAQmZ,qBAAuBA,EAC/BnZ,EAAQqE,IAAMA,EACdrE,EAAQ6F,OAASA,EACjB7F,EAAQ0E,IAAMA,EACd1E,EAAQmJ,KAAOA,EAERnJ,EA7BX7P,QACKC,OAAO,YACP4P,QAAQ,0BAA2B+Y,GAIxCA,EAAwB3a,SAAW,cAAe,sBA4FtD,WACI,YAEAjO,SAAQC,OAAO,YACX4P,QAAQ,8CAA+C,oBAAqB,kBAAmB,cAC5F,SAAUgG,EAAmB2H,EAAiBpP,GAY1C,QAASka,GAAmBN,GAExB,MAAO5Z,GAAYwE,UAAU,uDAAyDoV,EAAiB,MAAM,GAAM,EAAMxK,GAb7H,GAAI2L,GAAO,GAAItT,GAAkB,mCAAoC2H,EAgBrE,OAdA2L,GAAKb,mBAAqBA,EAcnBa,QAItB,WACI,YAEAnpB,SAAQC,OAAO,YACX4P,QAAQ,6CAA8C,oBAAqB,kBAAmB,cAC3F,SAAUgG,EAAmB2H,EAAiBpP,GAY1C,QAASka,GAAmBN,GAExB,MAAO5Z,GAAYwE,UAAU,sDAAwDoV,EAAiB,MAAM,GAAM,EAAMxK,GAb5H,GAAI2L,GAAO,GAAItT,GAAkB,kCAAmC2H,EAgBpE,OAdA2L,GAAKb,mBAAqBA,EAcnBa,QAItB,WACI,YAEAnpB,SAAQC,OAAO,YACX4P,QAAQ,sCAAuC,oBAAqB,kBAAmB,cACpF,SAAUgG,EAAmB2H,EAAiBpP,GAY1C,QAASka,GAAmBN,GAExB,MAAO5Z,GAAYwE,UAAU,+CAAiDoV,EAAiB,MAAM,GAAM,EAAMxK,GAbrH,GAAI2L,GAAO,GAAItT,GAAkB,2BAA4B2H,EAgB7D,OAdA2L,GAAKb,mBAAqBA,EAcnBa,QAItB,WACC,YAEAnpB,SAAQC,OAAO,YACb4P,QAAQ,uBAAwB,qBAAsB,KACtD,SAAUuZ,EAAoB1W,GAW7B,QAAS2W,GAA2BC,GAEnC,GAAIjW,GAAWX,EAAGY,OAiClB,OA/BA8V,GAAmB/b,oBAAoB8F,KAAK,SAAUwM,GACrD,GAAI4J,IAAoB,EACpBC,EAAgB7J,EAAQ,wCAI3B4J,GAFGtkB,MAAM/D,QAAQsoB,GAEGnpB,EAAE8lB,KAAKqD,EAAe,SAAU/pB,GACnD,MAAa,QAANA,GAAe6pB,KAAe7pB,IAIA,QAAlB+pB,GAA2BF,KAAeE,GAAkBnpB,EAAE4f,KAAKN,EAAQ,2CAA4C,kBAGxIA,EAAQ8J,KAAK5Q,SAAS,oBACzB0Q,GAAoB,GAGjBtkB,MAAM/D,QAAQye,EAAQ8J,MACrBppB,EAAEqpB,aAAaC,EAAYhK,EAAQ8J,MAAM3mB,OAAS,IACrDymB,GAAoB,GAGjBlpB,EAAEwY,SAAS8Q,EAAYhK,EAAQ8J,QAClCF,GAAoB,GAItBlW,EAASS,QAAQyV,GAAqBK,wBAGhCvW,EAASU,QAMjB,QAAS8V,GAAmBlK,GAC3B,GAAItM,GAAWX,EAAGY,OAgBlB,OAdAZ,GAAGgC,KACF0U,EAAmB/b,oBACnByc,MACE3W,KAAK9S,EAAE0pB,OAAO,SAAUpK,EAASqK,GAEnC,GAAIC,GAActK,EAAQ,0CAErB1a,MAAM/D,QAAQ+oB,KAAkBA,EAAe,IAAMD,EACzD3W,EAASS,SAAQ,GAEjBT,EAASS,SAAQ,MAIZT,EAASU,QAGjB,QAASmW,GAAgBvK,GACxB,GAAIxd,IAAc,CAUlB,OARI8C,OAAM/D,QAAQye,EAAQ8J,OACrBppB,EAAEsC,OAAOgd,EAAQ8J,KAAM,SAAUA,GACnC,MAAe,YAARA,IACL3mB,OAAS,IACZX,GAAc,GAITA,EAGR,QAASgoB,GAAsBxK,GAC9B,MAAOA,GAAQ,4CACd1a,MAAM/D,QAAQye,EAAQ,6CACtBA,EAAQ,2CAA2C7c,OAAS,EAG9D,QAASsnB,GAAoBzK,GAC5B,MAAOA,GAAQ,0CACd1a,MAAM/D,QAAQye,EAAQ,2CACtBA,EAAQ,yCAAyC7c,OAAS,EAG5D,QAASunB,GAAgB1K,GACxB,MAAOA,GAAQ,sCACd1a,MAAM/D,QAAQye,EAAQ,uCACtBA,EAAQ,qCAAqC7c,OAAS,EAIxD,QAASwnB,GAAY3K,GACpB,MAAOuK,GAAgBvK,IACtBwK,EAAsBxK,IACtByK,EAAoBzK,IACpB0K,EAAgB1K,GAGlB,QAAS4K,GAAY5K,GACpB,GAAI1a,MAAM/D,QAAQye,EAAQ8J,OACzB,GAAIppB,EAAEqpB,aAAaC,EAAYhK,EAAQ8J,MAAM3mB,OAAS,EACrD,OAAO,MAGR,IAAIzC,EAAEwY,SAAS8Q,EAAYhK,EAAQ8J,MAClC,OAAO,CAIT,QAAO,EAMR,QAASK,KAER,GAAIzW,GAAWX,EAAGY,QAEd0W,GAAe,CAQnB,OANAZ,GAAmB/b,oBAAoB8F,KAAK,SAAUwM,GACrDqK,EAAeO,EAAY5K,GAE3BtM,EAASS,QAAQkW,KAGX3W,EAASU,QA5IjB,GAAI4V,IAAc,aAEd9Z,GACHwZ,2BAA4BA,EAC5BS,sBAAuBA,EACvBD,mBAAoBA,EACpBS,YAAaA,EACbC,YAAaA,EAwId,OAAO1a,SAIX,WACI,YAEA7P,SAAQC,OAAO,YAAYiO,QAAQ,eAAgB,cAAe,kBAElE,SAAUE,EAAa2B,GAOnB,QAASmE,GAAIsW,GACT,MAAOpc,GAAY8E,QAAQ,WAAY,GAAO,EAAMsX,GAAuBza,GAAiBoD,KAAK,SAAUC,GACvG,GAAIjR,KAIJ,IAAIiR,EACA,IAAK,GAAIqX,KAAWrX,GAChB,GAAwD,mBAApDsX,OAAOnf,UAAUrE,SAASoE,KAAK8H,EAAOqX,IAAgC,CACtE,GAAIE,KAEJtqB,GAAEC,QAAQ8S,EAAOqX,GAAU,SAAUG,GACjCD,EAASC,EAAoB7d,MAAQ6d,EAAoB9pB,QAG7DqB,EAAYsoB,GAAW,GAAII,MAAKF,GAK5C,MAAOxoB,KA1Bf,GAAI4T,IACA7B,IAAKA,EAGT,OAAO6B,SA4Bf,WACI,YAGA/V,SAAQC,OAAO,YAAYiO,QAAQ,YAC9B,QAAS,cAAe,KAE7B,SAAUiW,EAAO3V,EAAakE,GAa1B,QAASoY,GAAaC,GACbA,IAEDA,YAAoB9lB,OACpB5E,EAAEC,QAAQyqB,EAAU,SAAU1W,GAC1B0B,EAAIiV,UAAUvlB,KAAK4O,KAGlB0W,GACLhV,EAAIiV,UAAUvlB,KAAKslB,IAI3B,QAASE,KACL,MAAOlV,GAAIiV,UAGf,QAASE,KACL7qB,EAAEqV,OAAOK,EAAIiV,UAAW,WAAc,OAAO,IAGjD,QAASG,GAAiB7rB,GACtB,MAAOe,GAAE4f,KAAKlK,EAAIiV,UAAW,SAAUxI,GAAQ,MAAOA,GAAK4I,UAAY9rB,GAAQkjB,EAAKljB,MAAQA,GAAQe,EAAE2T,YAAY1U,KAGtH,QAAS+rB,GAAkBhX,EAAOiX,GACjB,MAATjX,IAEmB,MAAfiX,IACAA,EAAc,0BAGlBvV,EAAI+U,cAAetQ,QAAW8Q,EAAahsB,KAAQ,QAASisB,OAAU9X,KAAKC,UAAUW,MAI7F,QAASmX,GAAgBjW,EAAKnC,GAC1B,GAAIA,GAASA,KAEb,IAAImC,EACA,IAAK,GAAI3R,KAAgB2R,GACD,UAAhB3R,EACAwP,EAAS/S,EAAEorB,MAAMrY,EAAQmC,EAAI3R,IAEM,gBAAtB2R,GAAI3R,GACjBwP,EAAS/S,EAAEorB,MAAMrY,EAAQ2C,EAAIyV,gBAAgBjW,EAAI3R,GAAewP,IAE7B,eAAtBmC,GAAI3R,IACjBvD,EAAEC,QAAQiV,EAAI3R,GAAe,WACzBwP,EAAS/S,EAAEorB,MAAMrY,EAAQ2C,EAAIyV,gBAAgBjW,EAAI3R,GAAewP,KAMhF,OAAOA,GAnEX,GAAI2C,IACA+U,aAAcA,EACdG,gBAAiBA,EACjBC,iBAAkBA,EAClBC,iBAAkBA,EAClBE,kBAAmBA,EACnBL,aACAQ,gBAAiBA,EAGrB,OAAOzV,SAkEf,WACI,YAgBA,SAAS2V,GAAkBhZ,GAuBvB,QAASiZ,GAAOC,EAAQvY,EAAUkE,GAC9B,MAAO,YACHA,EAAMsU,OAAO,WACTxY,EAASS,QAAQ8X,EAAOxY,WAWpC,QAAS0Y,GAAQF,EAAQvY,EAAUkE,GAC/B,MAAO,YACHA,EAAMsU,OAAO,WACTxY,EAASiB,OAAOsX,EAAOxY,WAWnC,QAAS2Y,KACL,MAAO,UAAUpe,GACb4J,MAAMyU,WAAW,gBACbC,MAAOte,EAAMse,MACbC,OAAQve,EAAMue,UAY1B,QAASC,GAAU9Y,EAAUkE,GACzB,GAAIqU,GAAS,GAAIQ,WAIjB,OAHAR,GAAOS,OAASV,EAAOC,EAAQvY,EAAUkE,GACzCqU,EAAOU,QAAUR,EAAQF,EAAQvY,EAAUkE,GAC3CqU,EAAOG,WAAaA,EAAWH,EAAQrU,GAChCqU,EASX,QAASW,GAAkBC,EAAMjV,GAC7B,GAAIlE,GAAWX,EAAGY,QACdsY,EAASO,EAAU9Y,EAAUkE,EAGjC,OAFAqU,GAAOW,kBAAkBC,GAElBnZ,EAASU,QASpB,QAAS0Y,GAAmBD,EAAMjV,GAC9B,GAAIlE,GAAWX,EAAGY,QACdsY,EAASO,EAAU9Y,EAAUkE,EAGjC,OAFAqU,GAAOa,mBAAmBD,GAEnBnZ,EAASU,QASpB,QAAS2Y,GAAcF,EAAMjV,GACzB,GAAIlE,GAAWX,EAAGY,QACdsY,EAASO,EAAU9Y,EAAUkE,EAGjC,OAFAqU,GAAOe,cAAcH,GAEdnZ,EAASU,QASpB,QAAS6Y,GAAWJ,EAAMjV,GACtB,GAAIlE,GAAWX,EAAGY,QACdsY,EAASO,EAAU9Y,EAAUkE,EAGjC,OAFAqU,GAAOgB,WAAWJ,GAEXnZ,EAASU,QA7HpB,GAAIlE,GAAUhP,IAYd,OARAgP,GAAQ8b,OAASA,EACjB9b,EAAQic,QAAUA,EAClBjc,EAAQkc,WAAaA,EACrBlc,EAAQ0c,kBAAoBA,EAC5B1c,EAAQ4c,mBAAqBA,EAC7B5c,EAAQ6c,cAAgBA,EACxB7c,EAAQ+c,WAAaA,EAEd/c,EA5BX7P,QACKC,OAAO,YACP4P,QAAQ,oBAAqB6b,GAIlCA,EAAkBzd,SAAW,SAiJjC,WACC,YASA,SAAS4e,GAAiBhX,EAAmB2H,GAE5C,GAAI2L,GAAO,GAAItT,GAAkB,eAAgB2H,EAGjD,OAAO2L,GAXRnpB,QAAQC,OAAO,YAAY4P,QAAQ,2BAA4Bgd,GAG/DA,EAAiB5e,SAAW,oBAAqB,sBAgBlD,WACI,YAgBA,SAAS6e,GAAiB1e,EAAa2B,GAiBnC,QAASgd,KACL,MAAO3e,GAAY8E,QAAQ,UAAYnN,SAAU,aAAc,GAAM,EAAMgK,GAf/E,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQkd,WAAaA,EAEdld,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,mBAAoBid,GAIjCA,EAAiB7e,SAAW,cAAe,sBAmC/C,WACI,YAgBA,SAAS+e,GAAqBxP,EAAiBpP,GAuB3C,QAAS8F,GAAIqT,EAAchjB,GAIvB,MAHKA,KACDA,GAAYuO,aAAa,EAAMC,WAAW,IAEvC3E,EAAY8E,QAAQ,cAAgB9K,GAAImf,GAAgBhjB,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAQ3G,QAAS3G,GAAOtS,GAIZ,MAHKA,KACDA,GAAYuO,aAAa,EAAMC,WAAW,IAEvC3E,EAAY8E,QAAQ,gBAAkB3O,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAGzF,QAASwL,GAAqBC,EAAmB1kB,GAI7C,MAHKA,KACDA,GAAYuO,aAAa,EAAMC,WAAW,IAEvC3E,EAAY8E,QAAQ,8BAAgC+V,KAAuB1kB,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAGpI,QAASyP,GAA2BtK,EAAgBuK,EAAS3oB,GAE5D,MADKA,KAASA,GAAYuO,aAAa,EAAMC,WAAW,IACjD3E,EAAY8E,QAAQ,gCAAkCyP,EAAiB,IAAMuK,KAAa3oB,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAG1I,QAAS2P,GAA+B7D,EAAU3G,EAAgBpe,GAE9D,MADKA,KAASA,GAAYuO,aAAa,EAAMC,WAAW,IACjD3E,EAAY8E,QAAQ,2BAA6BoW,EAAW,IAAM3G,KAAoBpe,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAGzI,QAAS4P,GAAoB3E,EAAiBlkB,GAE1C,MADKA,KAASA,GAAYuO,aAAa,EAAMC,WAAW,IACjD3E,EAAY8E,QAAQ,4BAA8BuV,KAAqBlkB,EAAQuO,YAAavO,EAAQwO,UAAWyK,GAG1H,QAAS6P,GAAyBlG,EAAsB5iB,GAEpD,MADKA,KAASA,GAAYuO,aAAa,EAAMC,WAAW,IACjD3E,EAAY8E,QAAQ,iCAAmCiU,KAA0B5iB,EAAQuO,YAAavO,EAAQwO,UAAWyK,GA/D9H,GAAI3N,GAAUhP,IAYd,OARAgP,GAAQqE,IAAMA,EACdrE,EAAQgH,OAASA,EACjBhH,EAAQmZ,qBAAuBA,EAC/BnZ,EAAQod,2BAA6BA,EACrCpd,EAAQsd,+BAAiCA,EACzCtd,EAAQud,oBAAsBA,EAC9Bvd,EAAQwd,yBAA2BA,EAE5Bxd,EA5BX7P,QACKC,OAAO,YACP4P,QAAQ,uBAAwBmd,GAIrCA,EAAqB/e,SAAW,kBAAmB,kBA8EvD,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,mBAAoB,kBAAmB,cAE1E,SAAU6B,EAAiB3B,GAOvB,QAAS8F,GAAIoZ,GACT,MAAOlf,GAAY8E,QAAQ,YAAc9K,GAAIklB,IAAc,GAAM,EAAMvd,GAP3E,GAAIF,IACAqE,IAAKA,EAGT,OAAOrE,SAQf,WACI,YAEA7P,SAAQC,OAAO,YACX4P,QAAQ,gCAAiC,oBAAqB,kBAC3D,SAAUgG,EAAmB2H,GACzB,MAAO,IAAI3H,GAAkB,qBAAsB2H,SASlE,WACI,YAgBA,SAAS+P,GAAwBnf,EAAa2B,GAW1C,QAASmE,GAAIwU,GACT,MAAOta,GAAYwE,UAAU,iBAAmBxK,GAAIsgB,IAAmB,GAAM,EAAM3Y,GATvF,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQqE,IAAMA,EAEPrE,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,0BAA2B0d,GAIxCA,EAAwBtf,SAAW,cAAe,sBAuBtD,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,wBAAyB,cAAe,kBAE3E,SAAUE,EAAaoP,GAOnB,QAAStJ,KACL,MAAO9F,GAAY8E,QAAQ,gBAAiB,MAAM,GAAM,EAAMsK,GAPlE,GAAIzH,IACA7B,IAAKA,EAGT,OAAO6B,SAQf,WACI,YAEA/V,SAAQC,OAAO,YACX4P,QAAQ,gCAAiC,oBAAqB,8BAC3D,SAAUgG,EAAmB2X,GACzB,MAAO,IAAI3X,GAAkB,sBAAuB2X,GAA+B/pB,oBAAoB,UAItH,WACI,YAEAzD,SAAQC,OAAO,YAAYiO,QAAQ,uBAAwB,cAE3D,SAAUE,GASN,QAASyI,GAAOrR,GACZ,MAAO4I,GAAY8E,QAAQ,eAAgB1N,OAAkB,GAAM,GAGvE,QAAS0O,GAAIuZ,GACT,GAAIjqB,KAMJ,OAJIiqB,KACAjqB,EAASqB,OAAO5C,iBAAkBU,QAAU+qB,mBAAoBD,MAG7Drf,EAAY8E,QAAQ,eAAgB1P,GAAQ,GAAM,GAnB7D,GAAIuS,IACAc,OAAQA,EACR3C,IAAKA,EAGT,OAAO6B,SAwBf,WACI,YAgBA,SAAS4X,GAAsBvf,EAAa2B,GAiBxC,QAAS6d,KACL,MAAOxf,GAAY8E,QAAQ,eAAiBnN,SAAU,iBAAkB,GAAO,EAAMgK,GAfzF,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQ+d,gBAAkBA,EAEnB/d,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,wBAAyB8d,GAItCA,EAAsB1f,SAAW,cAAe,sBAiCpD,WACI,YAgBA,SAAS4f,GAAmBzf,GAcxB,QAAS0f,GAA4BhsB,GACjC,IAAKA,EAAe,MAAO,EAE3B,IACIisB,GAAMrhB,EAAQshB,EADdltB,EAAQgB,EAAYoF,WAAW4Z,OAAOxd,QAAQ,MAAO,GAGzD,OAAIxC,GAAMgC,QAAU,IAChBirB,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,GACrBuJ,EAASA,EAAOvJ,MAAM,EAAG,GAAK,IAAMuJ,EAAOvJ,MAAM,IACzC4qB,EAAO,IAAMrhB,GAAQoU,SAE7BiN,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,EAAG,IACxBuJ,EAASA,EAAOvJ,MAAM,EAAG,GAAK,IAAMuJ,EAAOvJ,MAAM,GACjD6qB,EAAYltB,EAAMqC,MAAM,KAChB4qB,EAAO,IAAMrhB,EAAS,IAAMshB,GAAWlN,QA7BvD,GAAI/K,IACA+X,4BAA6BA,EAGjC,OAAO/X,GAlBX/V,QACKC,OAAO,YACP4P,QAAQ,qBAAsBge,GAInCA,EAAmB5f,SAAW,kBAgDlC,WACI,YAgBA,SAASggB,GAAe7f,EAAa2B,GAiBjC,QAASme,KACL,MAAO9f,GAAY8E,QAAQ,QAAUnN,SAAU,WAAY,GAAM,EAAMgK,GAf3E,GAAIF,GAAUhP,IAMd,OAFAgP,GAAQqe,SAAWA,EAEZre,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,iBAAkBoe,GAI/BA,EAAehgB,SAAW,cAAe,sBAmC7C,WACC,YASA,SAASkgB,GAAatY,EAAmB2H,GAExC,GAAI2L,GAAO,GAAItT,GAAkB,WAAY2H,EAG7C,OAAO2L,GAXRnpB,QAAQC,OAAO,YAAY4P,QAAQ,uBAAwBse,GAG3DA,EAAalgB,SAAW,oBAAqB,sBAgB9C,WACC,YASA,SAASmgB,GAASvY,EAAmB2H,GAEpC,GAAI2L,GAAO,GAAItT,GAAkB,OAAQ2H,EAGzC,OAAO2L,GAXRnpB,QAAQC,OAAO,YAAY4P,QAAQ,kBAAmBue,GAGtDA,EAASngB,SAAW,oBAAqB,sBAW1C,WACI,YAEAjO,SAAQC,OAAO,YACV4P,QAAQ,kBAAmB,oBAAqB,kBAC7C,SAAUgG,EAAmB9F,GACzB,MAAO,IAAI8F,GAAkB,OAAQ9F,SASrD,WACI,YAgBA,SAASse,GAAqBjgB,EAAa2B,GAkBvC,QAAS8G,KACL,MAAOzI,GAAY8E,QAAQ,aAAc,MAAM,GAAM,EAAMnD,GAU/D,QAASmE,GAAIoa,GACT,MAAOlgB,GAAYwE,UAAU,cAAgBxK,GAAIkmB,IAAgB,GAAM,EAAMve,GA3BjF,GAAIF,GAAUhP,IAOd,OAHAgP,GAAQgH,OAASA,EACjBhH,EAAQqE,IAAMA,EAEPrE,EAvBX7P,QACKC,OAAO,YACP4P,QAAQ,uBAAwBwe,GAIrCA,EAAqBpgB,SAAW,cAAe,sBAkDnD,WACI,YAgBA,SAAS0T,GAA6BvT,EAAayH,EAAmB2H,GAsBlE,QAAS4F,GAAcF,GACnB,GAAIvf,IACA+jB,SAAUxE,GAGV1f,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAEhD,OADAyK,GAAYuE,MAAMiC,mBAAmBpR,GAC9B4K,EAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAGzE,QAAS+Q,GAAiB5Q,GACtB,GAAIha,IACA8jB,eAAgB9J,GAEhBna,EAASqB,OAAO5C,iBAAkBU,OAAUgB,EAAatB,QAAW,qBACxE,OAAO+L,GAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAG/E,QAASgR,GAAyB7Q,EAAgBuP,GACjD,GAAIvpB,IACH8jB,eAAgB9J,EAChB8Q,iBAAkBvB,GAEf1pB,EAASqB,OAAO5C,iBAAkBU,OAAUgB,EAAatB,QAAW,qBACxE,OAAO+L,GAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAGtE,QAASkR,GAAgBxL,EAAUvF,GACzB,GAAIha,IACA+jB,SAAUxE,EACVuE,eAAgB9J,GAEhBna,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAChD,OAAOyK,GAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAGzE,QAASmR,GAAmBltB,GAExB,GAAIkC,IACA+jB,SAAUjmB,EAAO6nB,SACjB7B,eAAgBhmB,EAAOkhB,gBAEvBnf,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAChD,OAAOyK,GAAYmG,IAAI,qBAAsB9S,EAAQA,EAAOmtB,sBAAsB,EAAMpR,EAAiBha,GAG7G,QAASqrB,GAAgBptB,GACrB,MAAO+b,GAAgB9I,IAAI,sBAAsBsE,KAAKvX,GAlE1D,GAAIoO,GAAU,GAAIgG,GAAkB,qBAAsB2H,EAW1D,OAPA3N,GAAQuT,cAAgBA,EACxBvT,EAAQ0e,iBAAmBA,EACjC1e,EAAQ2e,yBAA2BA,EAC7B3e,EAAQ6e,gBAAkBA,EAC1B7e,EAAQ8e,mBAAqBA,EAC7B9e,EAAQgf,gBAAkBA,EAEnBhf,EA3BX7P,QACKC,OAAO,YACP4P,QAAQ,+BAAgC8R,GAI7CA,EAA6B1T,SAAW,cAAe,oBAAqB,sBAkFhF,WACI,YAEAjO,SAAQC,OAAO,YACX4P,QAAQ,qBAAsB,oBAAqB,kBAAmB,cACnE,SAAUgG,EAAmB2H,EAAiBpP,GAK1C,QAAS0gB,GAAqB5L,EAAUvF,EAAgBoR,EAAWC,GAE/D,GAAIC,GAAeF,EAAUjmB,OAAO,cAChComB,EAAaF,EAAQlmB,OAAO,cAE5BnG,EAAS,wBAA0BugB,EAAW,0BAA4BvF,EAAiB,iDAAmDsR,EAAe,0BAA4BC,EAAa,GAE1M,OAAO9gB,GAAY8E,QAAQ,aAAevQ,MAAY,GAAO,EAAO6a,GAXxE,GAAI2L,GAAO,GAAItT,GAAkB,aAAc2H,EAc/C,OAZA2L,GAAK2F,qBAAuBA,EAYrB3F,QAStB,WACC,YASA,SAASgG,GAAetZ,EAAmB2H,GAQ1C,QAAS4R,GAAmB9F,EAAU3G,GACrC,MAAOnF,GAAgB9I,IAAI,cAAc2a,UAAU1M,EAAiB,IAAM2G,GAAUnW,KAAK,SAASmc,GACjG,MAAOA,KART,GAAInG,GAAO,GAAItT,GAAkB,aAAc2H,EAa/C,OAVA2L,GAAKiG,mBAAqBA,EAUnBjG,EArBRnpB,QAAQC,OAAO,YAAY4P,QAAQ,yBAA0Bsf,GAG7DA,EAAelhB,SAAW,oBAAqB,sBAqBhD,WACI,YAEAjO,SAAQC,OAAO,YACV4P,QAAQ,qCAAsC,oBAAqB,kBAChE,SAAUgG,EAAmB9F,GACzB,MAAO,IAAI8F,GAAkB,0BAA2B9F,SAIxE,WACI,YAEA/P,SAAQC,OAAO,YAAYiO,QAAQ,2BAA4B,cAAe,kBAE9E,SAAUE,EAAaoP,GAOnB,QAAStJ,GAAIgP,EAAUvF,GACnB,GAAIhb,KAUJ,OARKtC,GAAE2T,YAAYkP,KACfvgB,EAAO+kB,SAAWxE,GAGjB7iB,EAAE2T,YAAY2J,KACfhb,EAAO8kB,eAAiB9J,GAGrBvP,EAAY8E,QAAQ,mBAAoBrO,OAAO5C,iBAAkBU,OAAQA,KAAW,GAAM,EAAM6a,GAjB3G,GAAIzH,IACA7B,IAAKA,EAGT,OAAO6B,SAuBf,WACI,YAgBA,SAASwZ,GAA0CnhB,EAAaoP,GAkB5D,QAASgS,GAAoCtM,GACzC,MAAO9U,GAAY8E,QAAQ,mCAAqCzQ,QAAS,eAAiBygB,IAAY,GAAM,EAAM1F,GAItH,QAASiS,GAA2B9R,EAAgBuF,GAChD,GAAIsE,GAAkB3iB,OAAO5C,iBACzBU,QACI8kB,eAAgB9J,EAChB+J,SAAUxE,IAIlB,OAAO9U,GAAY8E,QAAQ,kCAAmCsU,GAAiB,GAAM,EAAMhK,GA5B/F,GAAI3N,GAAUhP,IAOd,OAHAgP,GAAQ2f,oCAAsCA,EAC9C3f,EAAQ4f,2BAA6BA,EAE9B5f,EAvBX7P,QACKC,OAAO,YACP4P,QAAQ,4CAA6C0f,GAI1DA,EAA0CthB,SAAW,cAAe,sBA2CxE,WACI,YAEAjO,SAAQC,OAAO,YAAYiO,QAAQ,sCAAuC,cAAe,kBAEzF,SAAUE,EAAaoP,GAanB,QAAStJ,GAAIgP,EAAUvF,EAAgB+R,GACnC,GAAI/sB,KAeJ,OAbKtC,GAAE2T,YAAYkP,KACfvgB,EAAO+kB,SAAWxE,GAGjB7iB,EAAE2T,YAAY2J,KACfhb,EAAO8kB,eAAiB9J,GAIxB+R,IACA/sB,EAAO+sB,qBAAuBA,GAG3BthB,EAAY8E,QAAQ,8BAA+BrO,OAAO5C,iBAAkBU,OAAQA,KAAW,GAAM,EAAM6a,GAGtH,QAASmS,GAAkBhS,GACvB,GAAIhb,KAMJ,OAJKtC,GAAE2T,YAAY2J,KACfhb,EAAO8kB,eAAiB9J,GAGrBvP,EAAY8E,QAAQ,8BAA+BrO,OAAO5C,iBAAkBU,OAAQA,KAAW,GAAM,EAAM6a,GAGtH,QAASwL,GAAqBC,GAC1B,MAAO7a,GAAY8E,QAAQ,oDAAsD+V,EAAmB,MAAM,GAAM,EAAMzL,GAG1H,QAAS8K,GAAmBG,GACxB,MAAOra,GAAY8E,QAAQ,kDAAoDuV,EAAiB,MAAM,GAAM,EAAMjL,GAGtH,QAASoS,GAAwBzI,GAC7B,MAAO/Y,GAAY8E,QAAQ,uDAAyDiU,EAAsB,MAAM,GAAM,EAAM3J,GAGhI,QAASqS,GAA8BC,EAAWnS,GAC9C,GAAIhb,KAMJ,OAJKtC,GAAE2T,YAAY8b,KACfntB,EAAOmtB,UAAYzvB,EAAEa,QAAQ4uB,GAAaA,GAAaA,IAGpD1hB,EAAY8E,QAAQ,6DAA+DyK,EAAgBhb,GAAQ,GAAM,EAAM6a,GA3DlI,GAAIzH,IACA7B,IAAKA,EACLyb,kBAAmBA,EACnB3G,qBAAsBA,EACtBV,mBAAoBA,EACpBsH,wBAAyBA,EACzBC,8BAA+BA,EAGnC,OAAO9Z,SAuDf,WACI,YAEA/V,SAAQC,OAAO,YAAY4P,QAAQ,8BAA+B,cAAe,kBAAmB,6BAA8B,KAElI,SAAUzB,EAAaoP,EAAiBuS,EAA4Brd,GAQhE,QAASsd,GAA8B9M,EAAUvF,GAC7C,GAAItK,GAAWX,EAAGY,QAEd2c,EAAMxoB,QAWV,OATAsoB,GAA2B7b,IAAIgP,EAAUvF,GAAgBxK,KAAK,SAAU+c,GACpE,GAAIC,GAAuB9vB,EAAE4f,KAAKiQ,EAAS,SAAUE,GACjD,MAAO3oB,QAAO2oB,EAAoBrB,WAAWsB,SAASJ,IAC/CxoB,OAAO2oB,EAAoBpB,SAASsB,QAAQL,IAGvD5c,GAASS,QAAQqc,KAGd9c,EAASU,QArBpB,GAAIlE,GAAUhP,IAEdgP,GAAQmgB,8BAAgCA,QAwBhD,WACI,YAEAhwB,SAAQC,OAAO,YAAYiO,QAAQ,8BAA+B,cAAe,kBAEjF,SAAUE,EAAaoP,GAanB,QAAStJ,GAAIgP,EAAUvF,EAAgB+R,GACnC,GAAI/sB,KAeJ,OAbKtC,GAAE2T,YAAYkP,KACfvgB,EAAO+kB,SAAWxE,GAGjB7iB,EAAE2T,YAAY2J,KACfhb,EAAO8kB,eAAiB9J,GAIxB+R,IACA/sB,EAAO+sB,qBAAuBA,GAG3BthB,EAAY8E,QAAQ,sBAAuBrO,OAAO5C,iBAAkBU,OAAQA,KAAW,GAAM,EAAM6a,GAG9G,QAASmS,GAAkBhS,GACvB,GAAIhb,KAMJ,OAJKtC,GAAE2T,YAAY2J,KACfhb,EAAO8kB,eAAiB9J,GAGrBvP,EAAY8E,QAAQ,sBAAuBrO,OAAO5C,iBAAkBU,OAAQA,KAAW,GAAM,EAAM6a,GAG9G,QAASwL,GAAqBC,GAC1B,MAAO7a,GAAY8E,QAAQ,4CAA8C+V,EAAmB,MAAM,GAAM,EAAMzL,GAGlH,QAAS8K,GAAmBG,GACxB,MAAOra,GAAY8E,QAAQ,0CAA4CuV,EAAiB,MAAM,GAAM,EAAMjL,GAG9G,QAASoS,GAAwBzI,GAC7B,MAAO/Y,GAAY8E,QAAQ,+CAAiDiU,EAAsB,MAAM,GAAM,EAAM3J,GAGxH,QAASqS,GAA8BC,EAAWnS,GAC9C,GAAIhb,KAMJ,OAJKtC,GAAE2T,YAAY8b,KACfntB,EAAOmtB,UAAYzvB,EAAEa,QAAQ4uB,GAAaA,GAAaA,IAGpD1hB,EAAY8E,QAAQ,qDAAuDyK,EAAgBhb,GAAQ,GAAM,EAAM6a,GA3D1H,GAAIzH,IACA7B,IAAKA,EACLyb,kBAAmBA,EACnB3G,qBAAsBA,EACtBV,mBAAoBA,EACpBsH,wBAAyBA,EACzBC,8BAA+BA,EAGnC,OAAO9Z,SAuDf,WACI,YAEA/V,SAAQC,OAAO,YACX4P,QAAQ,wBAAyB,oBAAoB,cAAe,kBACjE,SAAUgG,EAAmBzH,EAAaoP,GAMtC,QAAS+S,KACL,MAAOniB,GAAY8E,QAAQ,kCAAmC,MAAM,GAAM,EAAMsK,GAGpF,QAASiS,GAA2B9R,EAAgBuF,GAChD,GAAIsE,GAAkB3iB,OAAO5C,iBACzBU,QACI8kB,eAAgB9J,EAChB+J,SAAUxE,IAIlB,OAAO9U,GAAY8E,QAAQ,qBAAsBsU,GAAiB,GAAM,EAAMhK,GAjBlF,GAAIgT,GAAa,GAAI3a,GAAkB,qBAAsB2H,EAoB7D,OAlBAgT,GAAWD,qBAAuBA,EAClCC,EAAWf,2BAA6BA,EAiBjCe,QAMtB,WACI,YAEAxwB,SAAQC,OAAO,YAAYiO,QAAQ,iBAC9B,kBAAmB,cAExB,SAAUsP,EAAiBpP,GAkBvB,QAAS8F,GAAIoV,GACT,MAAOmH,GAAUnH,GAGrB,QAASmH,GAAUvN,GACf,MAAO9U,GAAYwE,UAAU,SAAU/N,OAAO5C,iBAAkBU,QAAU+kB,SAAUxE,MAAc,GAAO,EAAM1F,GAGnH,QAASkT,GAAWltB,GAChB,GAAIA,EAAQ,CACR,GAAIG,KACAH,GAAOmf,iBACPhf,EAAY8jB,eAAiBjkB,EAAOmf,gBAEpCnf,EAAO0pB,UACPvpB,EAAYgtB,QAAUntB,EAAO0pB,SAE7B1pB,EAAO8lB,WACP3lB,EAAY+jB,SAAWlkB,EAAO8lB,UAElC9lB,EAASqB,OAAO5C,iBAAkBU,OAAUgB,IAEhD,MAAOyK,GAAY8E,QAAQ,SAAU1P,GAAQ,GAAO,EAAMga,GAG9D,QAASoT,KACL,MAAOxiB,GAAY8E,QAAQ,oBAAqB,MAAM,GAAO,EAAMsK,GAGvE,QAASqT,GAAkB7N,GACvB,GAAIrf,IACAgtB,QAAS3N,GAETxf,EAASqB,OAAO5C,iBAAkBU,OAAUgB,EAAatB,QAAW,cACxE,OAAO+L,GAAY8E,QAAQ,SAAU1P,GAAQ,GAAO,EAAMga,GAG9D,QAASsT,GAAiBxH,EAAU3G,GAChC,GAAIhf,IACA+jB,SAAU4B,EACV7B,eAAgB9E,GAGhBnf,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAChD,OAAOyK,GAAYwE,UAAU,qBAAsBpP,GAAQ,GAAM,EAAMga,GAG3E,QAASuT,GAAuBzH,GAC5B,GAAI3lB,IACA+jB,SAAU4B,GAGV9lB,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAChD,OAAOyK,GAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAKzE,QAASwT,GAAgC1H,GACrC,GAAI3lB,IACA+jB,SAAU4B,GAGV9lB,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAEhD,OAAOyK,GAAY8E,QAAQ,kCAAmC1P,GAAQ,GAAM,EAAMga,GAAiBrK,KAAK,SAAS8d,GAC7G,MAAO7iB,GAAY8E,QAAQ,qBAAsB1P,GAAQ,GAAM,EAAMga,GAAiBrK,KAAK,SAAS+d,GAChG,MAAO7wB,GAAE8wB,MAAMF,EAAiBC,OAK5C,QAASE,GAAmClO,EAAUvF,GAClD,GAAIha,IACA+jB,SAAUxE,EACVuE,eAAgB9J,GAGhBna,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAEhD,OAAOyK,GAAY8E,QAAQ,kCAAmC1P,GAAQ,GAAM,EAAMga,GAGtF,QAAS6T,GAAyBlO,GAC9B,MAAO/U,GAAYmG,IAAI,qBAAsB4O,EAAoBA,EAAmByL,sBAAsB,EAAMpR,GAGpH,QAAS8T,GAAa7vB,GAClB,MAAO2M,GAAYmG,IAAI,SAAU9S,EAAQA,EAAO6nB,UAAU,EAAM9L,GAGpE,QAAS+T,GAAaC,GAClB,MAAOhU,GAAgB9H,OAAO8b,GA7GlC,GAAI3hB,IACAqE,IAAKA,EACLuc,UAAWA,EACXC,WAAYA,EACZE,kBAAmBA,EACnBC,kBAAmBA,EACnBC,iBAAkBA,EAClBC,uBAAwBA,EACxBC,gCAAiCA,EACjCI,mCAAoCA,EACpCC,yBAA0BA,EAC1BC,aAAcA,EACdC,aAAcA,EAGlB,OAAO1hB,SAmGf,WACI,YAEA7P,SAAQC,OAAO,YACX4P,QAAQ,8BAA+B,oBAAoB,cAAe,kBACvE,SAAUgG,EAAmBzH,EAAaoP,GACtC,GAAIgT,GAAa,GAAI3a,GAAkB,mBAAoB2H,EAoB3D,OAAOgT,SAMtB,WACI,YAEAxwB,SAAQC,OAAO,YAAYiO,QAAQ,qBAAsB,kBAAmB,cAE5E,SAAU6B,EAAiB3B,GAQvB,QAAS8F,GAAI9L,GACT,MAAOgG,GAAY8E,QAAQ,cAAgB9K,GAAIA,IAAM,GAAO,EAAM2H,GARtE,GAAIgG,IACA7B,IAAKA,EAIT,OAAO6B,SASf,WACI,YAEA/V,SAAQC,OAAO,YACX4P,QAAQ,wCAAyC,oBAAqB,kBACnE,SAAUgG,EAAmB2H,GACzB,MAAO,IAAI3H,GAAkB,6BAA8B2H,SAI1E,WACI,YAEAxd,SAAQC,OAAO,YAAYiO,QAAQ,2BAA4B,kBAAmB,cAElF,SAAU6B,EAAiB3B,GAOvB,QAASyI,GAAOrR,GACZ,MAAO4I,GAAY8E,QAAQ,gBAAiBrO,OAAO5C,iBAAkBU,OAAQ6C,KAAe,GAAM,EAAMuK,GAP5G,GAAIgG,IACAc,OAAQA,EAGZ,OAAOd,SAQf,WACI,YAEA/V,SAAQC,OAAO,YAAYiO,QAAQ,gBAAiB,kBAAmB,cAEvE,SAAU6B,EAAiB3B,GAUvB,QAAS8F,GAAImQ,GACT,MAAOjW,GAAY8E,QAAQ,SAAW9K,GAAIic,IAAW,GAAM,EAAMtU,GAGrE,QAAS8G,GAAOrR,GACZ,MAAO4I,GAAY8E,QAAQ,QAASrO,OAAO5C,iBAAkBU,OAAQ6C,KAAe,GAAM,EAAMuK,GAGpG,QAAS0hB,GAAYvO,GACjB,MAAO9U,GAAY8E,QAAQ,qBAAuBgQ,EAAU,MAAM,GAAM,EAAMnT,GAGlF,QAAS2hB,GAAUrN,EAASsN,GAExB,MADKA,KAAOA,EAAO,IACZvjB,EAAYwE,UAAU,SAAWyR,EAAU,WAAasN,EAAM,MAAM,GAAM,EAAM5hB,GAvB3F,GAAIgG,IACA7B,IAAKA,EACL2C,OAAQA,EACR4a,YAAaA,EACbC,UAAWA,EAGf,OAAO3b,SA2Bf,WACI,YAgBA,SAAS6b,GAA4BxjB,EAAaoP,GAe9C,QAAS9H,GAAOmc,GACZ,MAAOrU,GAAgBvJ,IAAI,oBAAqB4d,GAAqBnc,SASzE,QAASgI,GAAoBC,GACzB,GAAIha,IACA8jB,eAAgB9J,GAEhBna,EAASqB,OAAO5C,iBAAkBU,OAAUgB,EAAatB,QAAW,cACxE,OAAO+L,GAAY8E,QAAQ,oBAAqB1P,GAAQ,GAAO,EAAMga,GAQzE,QAASsU,GAAa9O,GAClB,GAAIrf,IACAgtB,QAAS3N,GAGTxf,EAASqB,OAAO5C,iBAAkBU,OAAUgB,GAEhD,OADAyK,GAAYuE,MAAMiC,mBAAmBpR,GAC9B4K,EAAY8E,QAAQ,oBAAqB1P,GAAQ,GAAM,EAAMga,GASxE,QAASxE,GAAKiK,GACV,MAAOzF,GAAgB9I,IAAI,qBAAqBsE,KAAKiK,GASzD,QAAS1O,GAAI0O,GACT,MAAO7U,GAAYmG,IAAI,oBAAqB0O,EAAOA,EAAM8O,qBAAqB,EAAMvU,GA9DxF,GAAI3N,GAAUhP,IAUd,OANAgP,GAAQ6N,oBAAsBA,EAC9B7N,EAAQiiB,aAAeA,EACvBjiB,EAAQmJ,KAAOA,EACfnJ,EAAQ0E,IAAMA,EACd1E,EAAQ6F,OAASA,EAEV7F,EA1BX7P,QACKC,OAAO,YACP4P,QAAQ,8BAA+B+hB,GAI5CA,EAA4B3jB,SAAW,cAAe,sBA8E1DjO,QAAQC,OAAO,YAAY4P,QAAQ,gCAClC,SACA,KACA,aACA,qBACA,cACA,cACA,uBACA,YACA,WACA,SACCmiB,EACAtf,EACAnF,EACA0kB,EACAzjB,EACA6C,EACA6M,EACAgU,EACAjU,GAWA,QAASkU,KACJH,EAAO9d,IAAI3G,EAAW6kB,oBACzBJ,EAAOK,GAAG9kB,EAAW6kB,oBACX5jB,GAAeA,EAAY8jB,aACrCN,EAAOK,GAAG7jB,EAAY8jB,cAGtBJ,EAAUK,KAAK,KAIjB,QAASC,GAAaC,EAAkB9T,GACvC,IAAK8T,EACJ,OAAO,CAGR,MAAM1R,GAAY0R,EAAiBrsB,MAAM,IAGzC,IAAIssB,GAAiB/T,EAClBT,EAAqBhN,aAAayN,GAClCtN,EAECshB,IAkBJ,OAhBAtyB,GAAEC,QAAQygB,EAAW,SAAS1C,GAC7B,GAAIA,EAASuU,SAAS,KACrBD,EAAYltB,KAAKwsB,EAAmBxS,sBAAsBpB,QACpD,CAEN,GAAIC,GAAS,KACb,IAAID,EAASzW,QAAQ,KAAO,GAAI,CAC/B,GAAIzB,GAAYkY,EAASjY,MAAM,IAC/BiY,GAAWlY,EAAU+E,QACrBoT,EAASnY,EAAU9E,KAAK,KAGzBsxB,EAAYltB,KAAKwsB,EAAmB/S,gBAAgBb,EAAUC,EAAQoU,OAIjEhgB,EAAGgC,IAAIie,GAAaxf,KAAK,SAAU+c,GACzC,MAAO7vB,GAAE4f,KAAKiQ,EAAS,SAAU2C,GAAK,MAAOA,OAI/C,QAASC,GAAqBL,EAAkB9T,GAC/C,MAAO6T,GAAaC,EAAkB9T,GAAKxL,KAAK,SAAUC,GAEzD,MAAIA,GAEIV,EAAGqgB,QAGV9U,EAAS,WACRkU,MAIMzf,EAAG4B,YAKb,QAAS0e,GAA0BZ,GAClC7kB,EAAW6kB,mBACVA,GAAsB7kB,EAAW6kB,mBAElC7kB,EAAWG,IACV,oBACA,SAAUxN,EAAG0N,EAASC,EAAUC,EAAWC,GAC1C,MACEH,IACAA,EAAQuG,MACRvG,EAAQuG,KAAK8e,UACbrlB,EAAQuG,KAAK8e,SAASR,kBAUxBjyB,IAAI,qCAAsCoN,EAAQuG,UAElDqe,GACC5kB,EAAQuG,KAAK8e,SAASR,iBACtB7kB,EAAQuG,KAAK8e,SAAStU,KACrBxL,KAAK,SAAUC,GACZA,EACH5S,IACC,0CACCoN,EAAQb,OAGVvM,IACC,gDACCoN,EAAQb,KACR,gCACAa,EAAQuG,KAAK8e,SAASR,iBACtB,KAEFvyB,EAAEgzB,iBACFf,YA5BD3xB,KACC,iCACCoN,EAAQb,KACR,wJAzFNQ,EAAW6kB,mBAAqB,KAEhC,IAAIviB,IACHmjB,0BAA2BA,EAC3BF,qBAAsBA,EACtBX,mBAAoBA,EAErB,OAAOtiB,MAyHT,WACI,YAgBA,SAAS6R,GAAgBtT,EAAaoP,GAmBlC,QAAStJ,GAAI8O,GACT,MAAO5U,GAAY8E,QAAQ,SAAW9K,GAAI4a,IAAW,GAAM,EAAMxF,GASrE,QAAS3G,KACL,GAAIrT,GAASqB,OAAO5C,iBAAkBI,QAAW,QACjD,OAAO+L,GAAY8E,QAAQ,QAAS1P,GAAQ,GAAM,EAAMga,GAQ5D,QAAS2V,GAAiCxV,GACtC,MAAOvP,GAAY8E,QAAQ,0CAA4CyK,EAAgB,MAAM,GAAM,EAAMH,GArC7G,GAAI3N,GAAUhP,IAQd,OAJAgP,GAAQqE,IAAMA,EACdrE,EAAQgH,OAASA,EACjBhH,EAAQsjB,iCAAmCA,EAEpCtjB,EAxBX7P,QACKC,OAAO,YACP4P,QAAQ,kBAAmB6R,GAIhCA,EAAgBzT,SAAW,cAAe,sBAqD9C,WACI,YAEAjO,SAAQC,OAAO,YACX4P,QAAQ,6BAA8B,oBAAqB,kBACxD,SAAUgG,EAAmB2H,GACzB,MAAO,IAAI3H,GAAkB,kBAAmB2H,SAI/D,WACI,YAEAxd,SAAQC,OAAO,YAAYiO,QAAQ,0BAC9B,kBAAmB,cAExB,SAAU6B,EAAiB3B,GAUvB,QAAS8F,GAAI+U,GACT,MAAO7a,GAAYwE,UAAU,mBAAqBxK,GAAI6gB,IAAqB,GAAM,EAAMlZ,GAG3F,QAASqjB,GAAkCnK,GACvC,MAAO7a,GAAY8E,QAAQ,qDAAuD+V,EAAmB,MAAM,GAAM,EAAMlZ,GAG3H,QAASsjB,GAAe1Q,EAAgB2Q,GACpC,MAAOllB,GAAYwE,UAAU,mBAAqB2gB,UAAWD,EAAW7L,eAAgB9E,IAAkB,GAAM,EAAM5S,GAG1H,QAASyjB,GAAsB7Q,EAAgB2Q,GAC3C,MAAOllB,GAAY8E,QAAQ,mBAAqBqgB,UAAWD,EAAW7L,eAAgB9E,IAAkB,GAAM,EAAM5S,GAtBxH,GAAIF,IACAqE,IAAKA,EACLkf,kCAAmCA,EACnCC,eAAgBA,EAChBG,sBAAuBA,EAG3B,OAAO3jB,SA2Bf,WACI,YAgBA,SAAS4jB,GAA+BrlB,EAAa2B,GAiBjD,QAAS2jB,GAA0BzK,GAC/B,MAAO,MAfX,GAAIpZ,GAAUhP,IAMd,OAFAgP,GAAQ6jB,0BAA4BA,EAE7B7jB,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,iCAAkC4jB,GAI/CA,EAA+BxlB,SAAW,cAAe,sBA8B7D,WACI,YAEAjO,SAAQC,OAAO,YACX4P,QAAQ,qBAAsB,oBAAqB,kBAChD,SAAUgG,EAAmB2H,GACzB,MAAO,IAAI3H,GAAkB,UAAW2H,SAIvD,WACI,YAEAxd,SAAQC,OAAO,YACV4P,QAAQ,eAAgB,cAAe,8BACpC,SAAUzB,EAAaof,GAQnB,QAASmG,GAAYl0B,EAAGm0B,GAEpB,GAAIn0B,GAAKA,EAAEo0B,eAAgB,CAGvB,GAAIA,GAAiBxzB,EAAEc,IAAIyyB,EAAsB,gBAEjD,IAAIC,EAAgB,CAEhB,GAAIC,GAA6BzzB,EAAEsC,OAAOixB,EAAsB,SAAUG,GACtE,MAAO1zB,GAAEwY,SAASpZ,EAAEo0B,eAAgBE,EAAIrL,kBAG5C,IAAIoL,EAA4B,CAC5B,GAAIE,GAAqB3zB,EAAE8H,KAAK2rB,EAChC,IAAIE,GAAsBA,EAAmBC,cAAe,CAExD,GAAIC,GAAuBF,EAAmBC,cAAcE,qBAGxD3xB,EAAQnC,EAAEsC,OAAOkxB,GAAkBM,qBAAsBD,IAAwBpxB,MAIrF,OAAIgxB,GAA2BhxB,SAAWN,GAAkC,IAAzB0xB,EACxC,OAEA7zB,EAAEc,IAAI2yB,EAA4B,0BAA0BzyB,KAAK,UAjChG,GAAIwO,IACA8jB,YAAaA,EAGjB,OAAO9jB,SAuCvB,WACI,YAMA,SAASukB,GAAeC,EAAQC,EAAc5hB,GAE1C,QAASyJ,GAAQ3B,EAASxM,EAAOumB,EAAiBC,GAE9CxmB,EAAQA,GAAS,UACjBwM,EAAUA,GAAW,mCAGrBia,EAAMja,EAASxM,EAAO,UAAWumB,EAAiBC,GAGtD,QAASE,GAAKla,EAASxM,EAAOumB,EAAiBC,GAE3CxmB,EAAQA,GAAS,OACjBwM,EAAUA,GAAW,oBAGrBia,EAAMja,EAASxM,EAAO,OAAQumB,EAAiBC,GAGnD,QAASG,GAAQna,EAASxM,EAAOumB,EAAiBC,GAE9CxmB,EAAQA,GAAS,UACjBwM,EAAUA,GAAW,qCAGrBia,EAAMja,EAASxM,EAAO,UAAWumB,EAAiBC,GAGtD,QAASngB,GAAMmG,EAASxM,EAAOqG,EAAOkgB,EAAiBC,GAEnDxmB,EAAQA,GAAS,QACjBwM,EAAUA,GAAW,qCAGjBnG,IACAmG,EAAUnG,EAAMmG,SAIpBia,EAAMja,EAASxM,EAAO,QAASumB,EAAiBC,GAGpD,QAASC,GAAMja,EAASxM,EAAO4mB,EAAWL,EAAiBC,GAEvD,GAAI9d,IACAme,aAAa,EACbxV,OAAO,EACPyV,gBAAiB,OACjBC,aAAc,OACdC,WAAY,SACZC,WAAY,UACZC,QAAS,KACTC,aAAa,EACbC,aAAc,MACdC,WAAY,QACZC,WAAY,SACZC,QAAS,QAITC,GACAC,WAAW,EACXC,aAAa,EACbb,aAAa,EACbc,UAAW,2BACXC,YAAa,kBACbd,gBAAiB,IACjBe,aACIxhB,MAAO,cACPqgB,KAAM,aACNvY,QAAS,gBACTwY,QAAS,iBAEbmB,UAAW,EACXC,aAAc,gBACdC,aAAa,EACbC,SAAU;AACVC,QAAS,KACTC,MAAO,KACPC,cAAe,oBACfC,mBAAmB,EACnBC,uBAAuB,EACvBnB,aAAa,EACboB,cAAc,EACdlsB,OAAQ,OACRmsB,WACI/B,MAAO,8BACPgC,YAAa,2CAEjBlB,QAAS,IACTmB,WAAY,cACZC,WAAY,QA+BhB,QA3BInC,IACAgB,EAAgBn1B,EAAE2V,OAAOwf,EAAehB,IAIxCgB,IACAlB,EAAej0B,EAAE2V,OAAOse,EAAckB,IAItCjB,IACA7d,EAAWrW,EAAE2V,OAAOU,EAAU6d,IAIlCF,EAAO9vB,QAAUmS,EAGjB1I,EAAQA,GAAS,UACjBwM,EAAUA,GAAW,mCAGhBoa,IACDA,EAAY,WAIRA,GACJ,IAAK,QACDP,EAAOhgB,MAAMmG,EAASxM,EAAO0I,EAC7B,MACJ,KAAK,UACD2d,EAAOM,QAAQna,EAASxM,EAAO0I,EAC/B,MACJ,KAAK,OACD2d,EAAOK,KAAKla,EAASxM,EAAO0I,EAC5B,MACJ,KAAK,UACL,QACI2d,EAAOlY,QAAQ3B,EAASxM,EAAO0I,IAI3C,QAASkgB,GAAMryB,GACPA,EAAQiW,SAAWjW,EAAQyJ,MAC3B2Y,KAAKpiB,EAAQiW,QAASjW,EAAQyJ,OAE1BzJ,EAAQiW,UAAYjW,EAAQyJ,OAChC2Y,KAAKpiB,EAAQiW,SAIrB,QAASqc,GAAOrc,EAASxM,GACrB,GAAIqF,GAAWX,EAAGY,OAalB,OAXAqT,OACI3Y,MAAOA,GAAS,gBAChB/H,KAAMuU,EACNlb,KAAM,UACNknB,kBAAkB,EAClBC,kBAAmB,MACnBC,gBAAgB,GACjB,WACCrT,EAASS,SAAQ,KAGdT,EAASU,QAGpB,OACIoI,QAASA,EACTuY,KAAMA,EACNC,QAASA,EACTmC,KAAMziB,EACNA,MAAOA,EACPogB,MAAOA,EACPmC,MAAOA,EACPC,OAAQA,GAjLhB72B,QAAQC,OAAO,YAAY4P,QAAQ,iBAAkBukB,GAErDA,EAAenmB,SAAW,SAAU,eAAgB,QAoLxD,IAAIb,qBACHC,kBAAmB,WAClB,MAAO,IAAIyP,SAAQ,SAAShJ,GAC3B,GAAI/U,OAAOg4B,YAEV,WADAjjB,GAAQ/U,OAAOg4B,YAIhB,IAAIC,GAAcjd,MAAMkd,cAAc,UAAW,cACjDD,GAAY9iB,IAAI,KAAM,MAAM,GAAOf,KAAK,SAAS+jB,GAChDA,EAAO9pB,mBAAmB+pB,0CAA0C1jB,KAAK2jB,MAAMF,IAC/En4B,OAAOg4B,YAAcG,EACrBpjB,EAAQ/U,OAAOg4B,kBAKlB5V,eAAgB,WACf,MAAOpiB,QAAOg4B,aAGfI,0CAA2C,SAAUD,GACpDA,EAAkB,YAAIA,EAAKG,SAC3BH,EAAkB,YAAIA,EAAKI,SAC3BJ,EAAiB,WAAIA,EAAKK,UAC1BL,EAAa,OAAIA,EAAKM,SACtBN,EAAkB,YAAIA,EAAKM,SAC3BN,EAAqB,eAAIA,EAAKM,SAE9BN,EAAW,KAAIA,EAAKpS,MAAM3jB,IAAI,SAASoY,GACtC,MAAOA,GAAEke,UAGV,IAAIC,GAAaR,EAAKpS,MAAM7E,KAAK,SAAS1G,GACzC,MAAsB,eAAfA,EAAEoe,UAeV,OAbID,KACHR,EAAK,2CAA6CQ,EAAWD,UAG9DP,EAAK,8CAAgDA,EAAKU,UAC1DV,EAAK,2CAA6CA,EAAKW,WACvDX,EAAK,yCAA2CA,EAAKU,UACrDV,EAAK,sCAAwCA,EAAKY,SAClDZ,EAAK,yCAA2CA,EAAKa,SACrDb,EAAK,6CAA+CA,EAAKc,QACzDd,EAAK,6CAA+C,GACpDA,EAAK,2CAA6CA,EAAKe,OAEhDf,GAGRgB,iBAAkB,WACjB,GAAIvY,GAAUvS,mBAAmB+T,iBAC7BgX,EAAUxY,EAAQ,wCAEtB,OAAItf,GAAEa,QAAQi3B,GACN93B,EAAE0J,SAAS1J,EAAE8H,KAAKgwB,IAGnB93B,EAAE0J,SAASouB,IAGnBC,WAAY,WACX,GAAIzY,GAAUvS,mBAAmB+T,iBAC7BkD,EAAU1E,EAAQ,4CAEtB,OAAI0E,GACIhkB,EAAE0J,SAASsa,GAEX,MAITgU,iBAAkB,SAAU5O,GAC3B,GAAI6O,IAAe,EACf3Y,EAAUvS,mBAAmB+T,gBAYjC,OAVIlc,OAAM/D,QAAQye,EAAQ8J,MACrB9J,EAAQ8J,KAAK7hB,QAAQ6hB,GAAQ,KAChC6O,GAAe,GAGZ3Y,EAAQ8J,MAAQA,IACnB6O,GAAe,GAIVA,GAITt4B,SAAQC,OAAO,YAAY4P,QAAQ,qBAAsB,WACxD,MAAOzC,sBAOR,WACI,YAgBA,SAASmrB,GAAenqB,EAAaoP,GAmBjC,QAAStJ,GAAIskB,GACT,MAAOpqB,GAAY8E,QAAQ,QAAUulB,OAAQD,IAAU,GAAM,EAAMhb,GASvE,QAAS3G,KACL,MAAOzI,GAAY8E,QAAQ,WAAY,GAAM,EAAMsK,GAQvD,QAASkb,KACL,GAAIv3B,KAEMomB,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,EAAGiR,OAAU,IAC7BjR,aAAgB,IAAKiR,OAAU,IAC/BjR,aAAgB,IAAKiR,OAAU,IAC/BjR,aAAgB,IAAKiR,OAAU,IAC/BjR,aAAgB,IAAKiR,OAAU,GAEzC,OAAOr3B,GApDX,GAAI0O,GAAUhP,IAQd,OAJAgP,GAAQqE,IAAMA,EACdrE,EAAQgH,OAASA,EACjBhH,EAAQ6oB,sBAAwBA,EAEzB7oB,EAxBX7P,QACKC,OAAO,YACP4P,QAAQ,iBAAkB0oB,GAI/BA,EAAetqB,SAAW,cAAe,sBAyE7C,WACC,YASA,SAAS0qB,GAAe5hB,GAEvB,GAAI6hB,GAAgB,GAAI7hB,IAAe,WAAY,SAAU,OAM7D,OAHA6hB,GAAczhB,QAAQ,WAAavW,IAAO,KAAME,MAAS,OAGlD83B,EAdR54B,QAAQC,OAAO,YAAY4P,QAAQ,kBAAmB8oB,GAGtDA,EAAe1qB,SAAW,sBAc3B,WACI,YAUA,SAAS4qB,KAUL,QAASC,GAAevhB,EAAOwhB,EAASC,EAAOC,EAAMC,IATrD,GAAIC,IACAD,YAAY,EACZE,SAAU,oBACV7hB,OAAO,EACP8hB,KAAMP,EACN7U,WAAYqV,EAEhB,OAAOH,GASX,QAASG,GAAqBC,EAAQC,GAClC,QAASC,KACDD,EAAOvZ,OACPsZ,EAAOtZ,KAAOsZ,EAAOG,MAAMF,EAAOvZ,OAElCuZ,EAAOG,SACPJ,EAAOI,OAASJ,EAAOG,MAAMF,EAAOG,SAEpCH,EAAOpmB,QACPmmB,EAAOtZ,MAAwC,OAAhCxM,KAAKC,UAAU6lB,EAAOtZ,OAClCsZ,EAAOI,SACVJ,EAAOC,EAAOpmB,QAAU/S,EAAE4f,KAAKsZ,EAAOI,OAAQJ,EAAOtZ,OAIzDuZ,EAAOG,QAAUH,EAAOvZ,MAAQuZ,EAAOpmB,SACvCqmB,IAEAF,EAAOK,OAAOJ,EAAOG,OAAQ,SAAUE,EAAQC,GAC3CL,MAEJF,EAAOK,OAAOJ,EAAOvZ,KAAM,SAAU4Z,EAAQC,GACzCL,OA3CZz5B,QACKC,OAAO,YACPk5B,UAAU,aAAcN,GAiB7BS,EAAqBrrB,SAAW,SAAU,aA8B9C,WACI,YAEAjO,SAAQC,OAAO,YAAYk5B,UAAU,oBAAqB,WAAY,SAAU,cAAe,SAAUlb,EAAU8b,EAAQvrB,GACvH,OACIkV,YAAalV,EAAYqV,eAAiB,0DAC1CtM,OACI2N,iBAAkB,KAEtBmU,KAAM,SAAS9hB,EAAOyiB,EAAIhB,GACtBzhB,EAAM0iB,cAAgB,SAAU7T,GAE5B,MAA6B,YAAtBA,EAAKC,eAA+BhmB,EAAEkX,EAAM2N,iBAAiBQ,gBAAgBO,OAAO3R,OAAO,eAAe6R,MAAOE,aAAgB,mBAQ5J,WACI,YAEArmB,SAAQC,OAAO,YACdk5B,UAAU,YAAa,WACpB,OACI5hB,OACI2iB,eAAgB,KAChBC,YAAa,KAEjBlW,YAAa,SAAU,WAAY,SAAUsV,EAAQtb,GACjDsb,EAAOa,YACHb,EAAOW,iBAEPX,EAAOW,mBAGXr5B,KAAKw5B,aAAe,SAAUx0B,EAAUkzB,EAASuB,EAAQhkB,GACrD,GAAIikB,IAAS10B,SAAUA,EAAUC,YAAY,EAQ7C,IAPKwQ,GACDjW,EAAEC,QAAQi5B,EAAOa,SAAU,SAAUI,GACjCA,EAAQC,YAAY,iBACpBD,EAAQC,YAAY,oBAIxBp6B,EAAE8lB,KAAKoT,EAAOW,gBAAkBr0B,SAAYA,KAAey0B,EAAQ,CACnE,GAAII,GAAmBr6B,EAAE4f,KAAKsZ,EAAOW,gBAAkBr0B,SAAYA,GACnE60B,GAAiB50B,YAAc40B,EAAiB50B,WAC5C40B,EAAiB50B,YACjBizB,EAAQ0B,YAAY,iBACpB1B,EAAQ4B,SAAS,oBAGjB5B,EAAQ0B,YAAY,kBACpB1B,EAAQ4B,SAAS,kBAEhBrkB,IACDijB,EAAOW,gBAAkBQ,QAIzBnB,GAAOW,eAAep3B,OAAS,IAC/By3B,EAAKz0B,WAAayzB,EAAOW,eAAe,GAAGp0B,WACvCy0B,EAAKz0B,YACLizB,EAAQ0B,YAAY,iBACpB1B,EAAQ4B,SAAS,oBAGjB5B,EAAQ0B,YAAY,kBACpB1B,EAAQ4B,SAAS,mBAIrBrkB,EACAijB,EAAOW,eAAez0B,KAAK80B,GAE3BhB,EAAOW,gBAAkBK,EAIjChB,GAAOqB,qBAKXrB,EAAOqB,kBAAoB,WACvB3c,EAAS,WACLsb,EAAOY,aAAcU,WAAYtB,EAAOW,oBAIhDr5B,KAAKi6B,gBAAkB,SAAU/B,EAASlzB,GACtCkzB,EAAQ4B,SAAS,sBACjBpB,EAAOa,SAAS30B,KAAKszB,EAErB,IAAI2B,GAAmBr6B,EAAE4f,KAAKsZ,EAAOW,gBAAkBr0B,SAAYA,GAC/D60B,KACIA,EAAiB50B,YACjBizB,EAAQ0B,YAAY,iBACpB1B,EAAQ4B,SAAS,oBAGjB5B,EAAQ0B,YAAY,kBACpB1B,EAAQ4B,SAAS,yBASxCxB,UAAU,qBAAqB,WAAY,SAAUlb,GAClD,OACI8c,QAAS,aACT1B,KAAM,SAAU9hB,EAAOyiB,EAAIhB,EAAOgC,GAC9BhB,EAAGriB,KAAK,QAAS,SAAUzX,GAEnB+d,EADA/d,EAAE+6B,SACO,WACLD,EAAcX,aAAarB,EAAMkC,kBAAmBlB,GAAI,GAAM,IAGzD,WACLgB,EAAcX,aAAarB,EAAMkC,kBAAmBlB,GAAI,OAMpEgB,EAAcF,gBAAgBd,EAAIhB,EAAMkC,wBAMlD/B,UAAU,0BAA2B,WAAY,WAAY,SAAUlb,EAAUkd,GAC9E,OACIJ,QAAS,aACTxjB,OACI1R,SAAW,2BAEfuzB,SAAU,oVASVC,KAAM,SAAU9hB,EAAOyiB,EAAIhB,EAAOgC,GAC9BzjB,EAAMmjB,iBAAmBnjB,EAAM1R,UAAY0R,EAAM1R,SAAS/C,OAAS,EAAIyU,EAAM1R,SAAS,GAAK,GAE3Fm0B,EAAG/Z,KAAK,sBAAsBtI,KAAK,QAAS,SAAUzX,GAE9C+d,EADA/d,EAAE+6B,SACO,WACLD,EAAcX,aAAa9iB,EAAMmjB,iBAAiB70B,SAAUm0B,GAAI,GAAM,IAGjE,WACLgB,EAAcX,aAAa9iB,EAAMmjB,iBAAiB70B,SAAUm0B,GAAI,OAK5EziB,EAAM6jB,YAAc,SAAUv1B,GAC1B0R,EAAMmjB,iBAAmB70B,EACzBm1B,EAAcX,aAAa9iB,EAAMmjB,iBAAiB70B,SAAUm0B,GAAI,IAGpEgB,EAAcF,gBAAgBd,EAAIziB,EAAMmjB,iBAAiB70B,kBAU1E,WACI,YAEA7F,SAAQC,OAAO,YACVk5B,UAAU,UACP,cAAe,SAAU3qB,GACrB,OACI6sB,SAAU,KACV9jB,OACI+jB,UAAW,KACXjX,QAAS,KACTkX,QAAS,KACTC,YAAa,MAEjB9X,YAAalV,EAAYqV,eAAiB,oCAC1CwV,KAAM,SAAU9hB,EAAOyiB,EAAIhB,GACvBzhB,EAAMqiB,OAAO,YAAa,SAAUC,EAAQC,GACpCD,IACAtiB,EAAMkkB,UAAYlkB,EAAMmkB,mBAIpCzX,YAAa,SAAU,cAAe,SAAUsV,EAAQ/qB,GACpD,GAAIgtB,GAAc,EACdjC,GAAOiC,cACPA,EAAcjC,EAAOiC,aAGzBjC,EAAOmC,aAAe,WAClB,GAAIp8B,GAAQe,EAAE2T,YAAYulB,EAAO+B,WAAyB,QAAZ,SAC9C,OAAO9sB,GAAYC,oBAAsBnP,EAAO,KAASi6B,EAAOlV,SAAWkV,EAAO+B,WAAc,GAAK,WAAaE,GAEtHjC,EAAOkC,UAAYlC,EAAOmC,wBAWlD,WACC,YAMA,SAASC,KAWR,QAAStC,GAAK9hB,EAAOwhB,EAASC,KAExBzhB,EAAMzU,QAAUiH,SAASwN,EAAMzU,QAAU,KAAGyU,EAAMzU,OAAS,IAGhE,IAAI84B,GAAU5C,EAAMtgB,MAChBsgB,GAAMtgB,OAAO5V,OAASyU,EAAMzU,SAE/B84B,EAAU5C,EAAMtgB,OAAO1O,UAAU,EAAGuN,EAAMzU,QAAU,OAIrDi2B,EAAQ9yB,KAAK21B,GArBd,OACCP,SAAU,IACV9jB,OACCzU,OAAQ,MAETu2B,KAAMA,GAVRr5B,QAAQC,OAAO,YAAYk5B,UAAU,SAAUwC,MAmChD,WACI,YAgBA,SAASE,KAWL,QAASC,GAAcC,GACnB,GAAIC,GAAe37B,EAAE4f,KAAKpQ,EAAQosB,YAAa,SAAUzZ,GAAQ,MAAOA,GAAK5hB,KAAOm7B,EAAKn7B,KAErFo7B,GACA37B,EAAEsE,OAAOq3B,EAAcD,GAGvBlsB,EAAQosB,YAAYx2B,KAAKs2B,GAfjC,GAAIlsB,GAAUhP,IAMd,OAJAgP,GAAQosB,eAERpsB,EAAQisB,cAAgBA,EAEjBjsB,EAtBX7P,QACKC,OAAO,YACP4P,QAAQ,2BAA4BgsB,GAIzCA,EAAyB5tB,SAAW,cAAe,2BAkCvD,WACI,YAgBA,SAASiuB,GAAyBlK,EAAQuH,EAAQ4C,EAAaC,GAS3D,QAASC,GAAaN,GAClB,MAAOA,GAAK9Y,OAAS+O,EAAOsK,QAAQvvB,KAPxC,GAAIwvB,GAAmB17B,IAEvB07B,GAAiBN,YAAcG,EAAyBH,YAExDM,EAAiBF,aAAeA,EApBpCr8B,QACKC,OAAO,YACPgkB,WAAW,2BAA4BiY,GAI5CA,EAAyBjuB,SAAW,SAAU,SAAU,cAAe,+BAsB3E,WACI,YAEAjO,SAAQC,OAAO,YAAYk5B,UAAU,eACjC,WACI,OACIkC,SAAU,IACV9jB,OACI9S,MAAO,WACP+3B,MAAO,IACPC,UAAW,IACXx9B,KAAK,MAETm6B,SACI,igBASJC,KAAM,SAAU9hB,EAAOyiB,EAAIhB,GAEvBzhB,EAAMmlB,SAAW,SAAUla,GACvBjL,EAAMklB,WAAYja,KAAMA,aAYhD,WACI,YAgBA,SAASza,GAAQyG,GAiBb,QAASmuB,GAAYplB,EAAOwhB,EAASC,EAAOC,IAhB5C,GAAIE,IACAkC,SAAU,KACV3X,YAAalV,EAAYqV,eAAiB,sCAC1CwV,KAAMsD,EACN1Y,WAAY2Y,EAKhB,OAAOzD,GAsBX,QAASyD,GAAkBrD,EAAQ7mB,EAAInF,EAAYsvB,EAAM3K,EAAWjU,EAAU6e,EAAelb,EACzFmb,EAAc3T,EAAoB4T,EAAqBrE,GA2CvD,QAAS94B,KAEL,MAA4B+E,UAAxB20B,EAAO0D,iBACPz8B,KAAI,6CAIR4oB,EAAmB/b,oBAAoB8F,KAAK,SAAUwM,GAClD4Z,EAAO2D,wBAA0B,gCAAkCvd,EAAQ,6CAG/E4Z,EAAO4D,WAAcC,gBAAgB,GACrC7D,EAAO8D,aAAc,EACrB9D,EAAO+D,iBAAmB,GAC1B/D,EAAOgE,2BAChBhE,EAAOiE,yBACEjE,EAAOxxB,WAGPwxB,EAAOkE,SAAU,EACjBlE,EAAOmE,4BAA8B,GACjCnE,EAAO0D,aAAaQ,UACpBlE,EAAOkE,QAAUlE,EAAO0D,aAAaQ,SAEzClE,EAAOoE,WAAY,EACfpE,EAAO0D,aAAaU,YACpBpE,EAAOoE,WAAY,GAEvBpE,EAAOqE,WAAY,EAGnBp9B,IAAI,iDAGJ+4B,EAAOsE,aACD9wB,KAAM+wB,IACN/wB,KAAMgxB,IAGZxE,EAAOyE,eAAiB39B,EAAE49B,OAAO1E,EAAO0D,aAAal1B,QAAS,SAAUpF,GACpE,MAAuB,OAAhBA,EAAO8B,YAIlB80B,GAAO2E,kBAgWX,QAASC,KACL,GAAgDv5B,QAA5C20B,EAAO0D,aAAal1B,QAAQq2B,aAA2B,CACvD,GAAI1b,GAAeriB,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,QAAQq2B,aAAa35B,MAAO,WAK1E,IAJoB,MAAhBie,GACA6W,EAAO8E,YAAY3b,EAAata,GAAI,iBAGnC/H,EAAEmT,QAAQ+lB,EAAOgE,yBAA0B,CAC3D,GAAIe,GAAc/E,EAAOgE,wBAAwBp8B,IAAI,SAAUo9B,GAAM,MAAOA,GAAGn2B,KAK3Eo2B,EAAsBn+B,EAAE8lB,KAAKoT,EAAO0D,aAAal1B,QAAQq2B,aAAa35B,MAAO,SAAUrD,GAC1F,MAAOf,GAAEwY,SAASylB,EAAal9B,EAAEgH,KAG9Bo2B,IACHn+B,EAAEC,QAAQi5B,EAAO0D,aAAal1B,QAAQq2B,aAAa35B,MAAO,SAAUrD,GACnEA,EAAEq9B,SAAWp+B,EAAEwY,SAASylB,EAAal9B,EAAEgH,QAOtC,QAASs2B,KAEL,GAAIrrB,GAAWX,EAAGY,OAElB,IAAgC,KAA5BimB,EAAO+D,iBACPjqB,EAASS,cACN,CACH,GAAI6qB,GAAoBC,GAExB5B,GAAoB3T,2BAA2BsV,GAAmBxrB,KAAK,SAAU0rB,GAEzEA,EACAtF,EAAO+D,iBAAmBqB,EAEtBvV,EAAmB8O,mBACnBqB,EAAO+D,iBAAmBlU,EAAmB8O,mBAE7CqB,EAAO+D,iBAAmB/D,EAAOyE,eAAec,OAAOC,UAI/D1rB,EAASS,YAIjB,MAAOT,GAASU,QAsTpB,QAAS6qB,KACL,GAAItV,GAAW,GACXA,EAAW1H,EAAS,gBAExB,KAAK0H,EAAU,CACX,GAAI0V,GAAgBpd,EAAS2X,EAAO2D,wBAChC8B,KACA1V,EAAW0V,EAAc1V,UAGjC,MAAOA,GAGX,QAAS2V,GAAmBC,GACxB,GAAI92B,GAAKwZ,EAAS,UAAYsd,EAC9B,OAAO92B,GAvyBX,GAAI01B,GAAuB,UACvBC,EAAyB,MAa7BxE,GAAO7rB,IAAI,kCAAmC,SAAUC,EAAOlM,GAGvDA,EAAO6nB,WAAaiQ,EAAO+D,mBAC3B/D,EAAO+D,iBAAmB77B,EAAO6nB,SACjCiQ,EAAO8E,YAAY9E,EAAO+D,iBAAkB,UAAU,GACtD/D,EAAOhxB,oBAGfgxB,EAAOK,OAAO,WACV,MAAOL,GAAO0D,cACf,SAAUpD,EAAQC,GACjBj6B,MAyDJ05B,EAAO4F,cAAgB,SAAUC,EAAeC,GAGvCD,IACDA,EAAgBtB,EAGpB,IAAIwB,GAAYj/B,EAAE4f,KAAKsZ,EAAOsE,YAAc9wB,KAAMqyB,GAGlDE,GAAUnrB,QAGV9T,EAAEC,QAAQi5B,EAAO0D,aAAal1B,QAAS,SAAUnH,GAE5B,WAAbA,EAAImM,MAAkC,kBAAbnM,EAAImM,MAA4BnM,EAAImM,OAASsyB,IAEtEC,EAAUnrB,KAAKvT,EAAImM,OACfA,KAAMnM,EAAImM,KACVwyB,OAAQhG,EAAOiG,uBAAuB5+B,OAKlDJ,IAAI,kBAAmBs9B,EAAsBwB,IAGjD/F,EAAOkG,cAAgB,SAAUL,EAAeM,GAGvCN,IACDA,EAAgBtB,EAIpB,IAAIwB,GAAYj/B,EAAE4f,KAAKsZ,EAAOsE,YAAc9wB,KAAQqyB,GAGpD/+B,GAAEC,QAAQg/B,EAAUnrB,KAAM,SAAUvT,GAGhC,GAAI+B,GAAStC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQnM,EAAImM,MAC3DpK,KAEiB,WAAb/B,EAAImM,MAAqBnM,EAAImM,OAAS2yB,IAGtCr/B,EAAEC,QAAQqC,EAAO8B,MAAO,SAAUk7B,GAE9B,GAAIC,GAAgBv/B,EAAE4f,KAAKrf,EAAI2+B,OAAQ,SAAU7lB,GAC7C,MAAOA,KAAMimB,EAAWv3B,IAGP,OAAjBw3B,IAGAD,EAAWlB,UAAW,EAGI,IAAtB79B,EAAI2+B,OAAOz8B,SACXH,EAAOk9B,WAAaD,SAWhDrG,EAAOiG,uBAAyB,SAAU78B,GACtC,GAAIA,EAAQ,CACR,GAAIm9B,GAAgBz/B,EAAEsC,OAAOA,EAAO8B,OAASg6B,UAAU,GACvD,IAAIqB,EACA,MAAOz/B,GAAEc,IAAI2+B,EAAe,MAGpC,MAAO,OAGXvG,EAAO2E,eAAiB,SAAU6B,EAA0BL,GAExDl/B,IAAI,+CAGJ+4B,EAAOyG,gBAAkB3/B,EAAE4/B,MAAM5/B,EAAEqI,KAAK6wB,EAAOyE,iBAG3CzE,EAAOyE,eAAec,QAEtB1V,EAAmB/b,oBAAoB8F,KAAK,SAAU4jB,GAElD2H,IAAiBvrB,KAAK,WAClB,GAAI/R,GAAI,CAIRf,GAAEC,QAAQi5B,EAAOyG,gBAAiB,SAAUp/B,GAExC,GAAY,WAARA,GAA+CgE,QAA3B20B,EAAO+D,iBAC3B/D,EAAOyG,gBAAgB5+B,GAAKR,EAAM,IAAM24B,EAAO+D,qBAE9C,IAAY,UAAR18B,EAAiB,CAEtB,GAAIs/B,GAAe7/B,EAAEsC,OAAO42B,EAAOyE,eAAemC,MAAM17B,MAAO,WAC3C,OAAhBy7B,GAAwBA,EAAap9B,OAAS,IAC9Cy2B,EAAOyG,gBAAgB5+B,GAAKR,EAAM,IAAMP,EAAE8H,KAAK+3B,GAAc93B,QAGhE,IAAY,iBAARxH,GAA0B24B,EAAOgE,wBAAyB,CAC/DhE,EAAOgE,wBAA0Bl9B,EAAEsC,OAAO42B,EAAOyE,eAAeI,aAAa35B,MAAO,WAGpF,IAAI27B,GAAqB//B,EAAEc,IAAIo4B,EAAOgE,wBAAyB,MAAMl8B,KAAK,IAC1Eb,KAAI,qBAAsB4/B,GAGtBA,IACA7G,EAAOyG,gBAAgB5+B,GAAKR,EAAM,IAAMw/B,OAGhE,IAAY,eAARx/B,GAAwB24B,EAAOiE,sBAAuB,CAC9DjE,EAAOiE,sBAAwBn9B,EAAEsC,OAAO42B,EAAOyE,eAAeqC,WAAW57B,MAAO,WAEhF,IAAI67B,GAAmBjgC,EAAEc,IAAIo4B,EAAOiE,sBAAuB,MAAMn8B,KAAK,IACtEb,KAAI,mBAAoB8/B,GAEpBA,IACH/G,EAAOyG,gBAAgB5+B,GAAKR,EAAM,IAAM0/B,GAIrBl/B,MAGJ07B,EAAcyD,WAAWhH,EAAOyG,gBAAiBzG,EAAO0D,aAAauD,QAAQrtB,KAAK,SAAUC,GAKxF,GAAImmB,EAAO0D,aAAal1B,QAAQq2B,cAAgB7E,EAAO0D,aAAal1B,QAAQq2B,aAAaqC,QAAS,CAC9F,GAAIC,GAAuBzB,EAAmB,eAE1CyB,KACIrgC,EAAEsgC,UAAUD,KAA0BrgC,EAAEmT,QAAQktB,KAChDrgC,EAAEC,QAAQ8S,EAAQ,SAAUoP,GACF,iBAAlBA,EAAKoe,UACLvgC,EAAEC,QAAQkiB,EAAK/d,MAAO,SAAUoe,GAC5BA,EAAK4b,UAAW,MAkJxC,GA1IAp+B,EAAEC,QAAQi5B,EAAOyE,eAAgB,SAAUr7B,GAIvC,GAFAA,EAAO8B,MAAQpE,EAAE4f,KAAK7M,GAAUwtB,SAAYj+B,EAAOoK,OAAQtI,MAExC,eAAhB9B,EAAOoK,MACFwsB,EAAOsH,kCAAmC,CAC1C,GAAIC,GAAuBzgC,EAAE4f,KAC1DsZ,EAAO0D,aAAal1B,QAAQq2B,aAAa35B,MACzC,WAE6B,IAAGq8B,EAAqB14B,GAAK,KAAM,CAE/B,GAAI24B,IAAmC,IAAmB,IAAmB,IAAmB,IAChG1gC,GAAEC,QAAQqC,EAAO8B,MAAO,SAAU+d,GAC1BniB,EAAEwY,SAASkoB,EAAgCve,EAAKpa,MAChDzF,EAAO8B,MAAQ9B,EAAO8B,MAAM9B,OAAO,SAASq+B,GACxC,MAAOA,GAAM54B,KAAOoa,EAAKpa,MAIjB,MAAZoa,EAAKpa,KACLoa,EAAK/M,YAAc,kBASvC,GAAI9S,EAAOo8B,YAAcp8B,EAAO89B,QAAS,CAErC,GAAoB,UAAhB99B,EAAOrD,KAAkB,CACzB,GAAI2hC,GAAal3B,SAASpH,EAAOo8B,UAAW,GACxB,YAAhBp8B,EAAOoK,OACPk0B,EAAa1H,EAAO+D,kBAIxB2D,EAAal3B,SAASk3B,EAAY,GAElC,IAAIze,GAAOniB,EAAE8H,KAAK9H,EAAEsC,OAAOA,EAAO8B,OAAS2D,GAAI64B,IACnC,OAARze,IACAA,EAAKic,UAAW,EAChBlF,EAAO8E,YAAY7b,EAAKpa,GAAIzF,EAAOoK,OAG3C,GAAoB,aAAhBpK,EAAOrD,KAAqB,CAC5B,GAAIg/B,GAAcj+B,EAAEa,QAAQyB,EAAOo8B,WACf1+B,EAAEc,IAAIwB,EAAOo8B,UAAW1+B,EAAE0J,WACzB1J,EAAE0J,SAASpH,EAAOo8B,UAAW,IAElD1+B,GAAEkY,KAAK+lB,EAAa,SAAUl2B,GAC1B,GAAIoa,GAAOniB,EAAE8H,KAAK9H,EAAEsC,OAAOA,EAAO8B,OAAS2D,GAAIA,IACnC,OAARoa,GACA+W,EAAO2H,eAAe1e,EAAKpa,GAAIzF,EAAOoK,aAKjD,IAAIpK,EAAO89B,QAAS,CACrB,GAAoB,UAAhB99B,EAAOrD,KAAkB,CACzB,GAAI2hC,GAAahC,EAAmBt8B,EAAOoK,KAE3C,IAAoB,iBAAhBpK,EAAOoK,OAA4Bk0B,EAEnC,WADA9C,IAKJ8C,GAAal3B,SAASk3B,EAAY,GAElC,IAAIze,GAAOniB,EAAE8H,KAAK9H,EAAEsC,OAAOA,EAAO8B,OAAS2D,GAAI64B,IACnC,OAARze,IACAA,EAAKic,UAAW,EAChBlF,EAAO8E,YAAY7b,EAAKpa,GAAIzF,EAAOoK,OAG3C,GAAoB,aAAhBpK,EAAOrD,KAAqB,CAC5B,GAAI6hC,MACAC,EAAcnC,EAAmBt8B,EAAOoK,KAExCq0B,KACI/gC,EAAEghC,SAASD,KACXA,EAAcA,EAAYh7B,MAAM,KAAKjF,IAAI,SAAUqhB,GAC/C,MAAOzY,UAASyY,EAAM,OAI9B2e,EAAUA,EAAQzoB,OAAO0oB,GAEzB/gC,EAAEC,QAAQ6gC,EAAS,SAAU/4B,GACzBmxB,EAAO2H,eAAe94B,EAAIzF,EAAOoK,MAAM,WAKlD,KAAK1M,EAAE2T,YAAYrR,EAAO2+B,eAAwC,MAAvB3+B,EAAO2+B,aAAsB,CACzE,GAAI9e,GAAO7f,EAAO8B,MAAM9B,EAAO2+B,aAEnB,OAAR9e,IACAA,EAAKic,UAAW,EAEI,UAAhB97B,EAAOrD,MACPi6B,EAAO8E,YAAY7b,EAAKpa,GAAIzF,EAAOoK,MAEnB,aAAhBpK,EAAOrD,MACPi6B,EAAO2H,eAAe1e,EAAKpa,GAAIzF,EAAOoK,OAM9CpK,EAAO4+B,UACP5+B,EAAO8B,MAAQpE,EAAEsC,OAAOA,EAAO8B,OAAS88B,QAAW5+B,EAAO4+B,WAI1D5+B,EAAO6+B,cACPnhC,EAAEC,QAAQqC,EAAO6+B,aAAaC,UAAW,SAAUjf,GAC/C7f,EAAO8B,MAAMi9B,QAAQlf,OAK7B+W,EAAO+D,iBACP/D,EAAO8E,YAAY9E,EAAO+D,iBAAkB,UAG5C/D,EAAO8E,YAAYh+B,EAAE8H,KAAKoxB,EAAO0D,aAAal1B,QAAQ+2B,OAAOr6B,OAAO2D,GAAI,UAIxEmxB,EAAO0D,aAAal1B,QAAQq2B,eAAiB7E,EAAO0D,aAAal1B,QAAQq2B,aAAaqC,SACtFtC,IAIA5E,EAAO0D,aAAal1B,QAAQ45B,eAAoE,UAAnDpI,EAAO0D,aAAal1B,QAAQ45B,cAAcriC,KAAkB,CACzG,GAAIsiC,GAAevhC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,QAAQ45B,cAAcl9B,MAAO,WAEvEm9B,IACArI,EAAO8E,YAAYuD,EAAax5B,GAAI,iBAK5C,GAA8CxD,QAA1C20B,EAAO0D,aAAal1B,QAAQ85B,WAAyB,CACrD,GAAIC,GAAoBzhC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,QAAQ85B,WAAWp9B,MAAO,WACpD,OAArBq9B,GACAvI,EAAO8E,YAAYyD,EAAkB15B,GAAImxB,EAAO0D,aAAal1B,QAAQ85B,WAAW90B,MASxF,GAHAwsB,EAAOwI,aAGFhC,EAEE,CAGHxG,EAAOkG,cAAc1B,EAAwB2B,EAGlBr/B,GAAE4f,KAAKsZ,EAAO0D,aAAal1B,QAAQq2B,aAAa35B,MAAO,gBAPlF80B,GAAO4F,eAa6C,KAApD5F,EAAO0D,aAAal1B,QAAQ+2B,OAAOr6B,MAAM3B,SACzCy2B,EAAOqE,WAAY,GAIvBrE,EAAOhxB,iBAEPgxB,EAAO4D,UAAUC,gBAAiB,EACvDzE,EAAe1gB,QAAQ,WAAarX,IAAO,UAAWE,MAAS,gBAGnD,SAAUuT,GACTklB,EAAO4D,UAAUC,gBAAiB,EAClCL,EAAa1R,kBAAkBhX,EAAO,wCA2DlDklB,EAAOyI,iBAAmB,SAAUxf,GAChC,MAAIA,GACI+W,EAAO0D,aAAagF,kBAAoBzf,EAAKhgB,MAAQ,GAC9C,EAGHggB,EAAKhgB,MAAQ,MAGlB,GAIX+2B,EAAO2I,UAAY,SAAU3sB,GACzB,MAAKA,GAGa,MAAVmV,OAAiBA,OAAOhiB,KAAK6M,GAAO,SAGhDgkB,EAAOhxB,eAAiB,SAAU45B,GAC9B,IAAIA,EAAJ,CAEA,GAAIp6B,GAAUwxB,EAAO6I,mBAIrB,IAFA5hC,IAAI,6EAAkFuH,GAElFwxB,EAAO8D,YACP,CAAkBpf,EAASokB,OAAO9I,EAAO8D,aAG7C9D,EAAO8D,YAAcpf,EAAS,WAC1B1Q,EAAWye,WAAW,gBAAkBsW,gBAAiBv6B,IAGzDlD,OAAO2F,yCAER,OAGP+uB,EAAOgJ,WAAa,SAAU/f,EAAM7f,GACZ,UAAhBA,EAAOrD,OAIXe,EAAEC,QAAQD,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQpK,EAAOoK,OAAQtI,MAAO,SAAUrD,GACpFA,EAAEq9B,UAAW,IAGjBjc,EAAKic,UAAW,EAChBlF,EAAOhxB,mBAGXgxB,EAAO2H,eAAiB,SAAU94B,EAAI82B,EAAYsD,GAC9C,GAAIA,EAAS,CACT,GAAI7/B,GAAStC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQmyB,GAIvDv8B,GAAO89B,SACPlH,EAAOkJ,+BAA+BvD,GAEvB,iBAAfA,GAAgD,eAAfA,GAGjC3F,EAAO4F,cAAcpB,IAGjBxE,EAAO0D,aAAal1B,QAAQ26B,OAASnJ,EAAO0D,aAAal1B,QAAQ46B,UAAYpJ,EAAO0D,aAAal1B,QAAQs4B,YAAc9G,EAAO0D,aAAal1B,QAAQq2B,eAEnJ7E,EAAO2E,gBAAe,EAAMgB,IAGhC3F,EAAOhxB,qBAGR,CACH,GAAIq6B,GAAcviC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQmyB,IAAcz6B,MAC1Eo+B,EAAgBxiC,EAAE4f,KAAK2iB,GAAex6B,GAAMA,GAC3B,OAAjBy6B,IACAA,EAAcpE,UAAW,KAKrClF,EAAO8E,YAAc,SAAUj2B,EAAI82B,EAAYsD,GAE3ChiC,IAAI,wBAAyB4H,EAAI82B,EAGjC,IAAIv8B,GAAStC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQmyB,GAQ3D,KALIv8B,EAAO89B,SAA2B,WAAhB99B,EAAOoK,OACzBwsB,EAAOuJ,uBAAuB5D,EAAY92B,GAI1CzF,EAAO8B,MAAO,CACd,GAAI+d,EAaJ,IAXAniB,EAAEC,QAAQqC,EAAO8B,MAAO,SAAUrD,GAC1BA,EAAEgH,KAAOA,GACThH,EAAEq9B,UAAW,EACbjc,EAAOphB,GAEJA,EAAEq9B,UAAW,IAGxB97B,EAAOk9B,WAAaz3B,EAGD,cAAf82B,EAA4B,CAC5B,GAAI6D,GAAQt7B,SAASqB,OAAO,aAC5B,QAAQV,GACJ,IAAK,GACDoa,EAAKwgB,UAAYv7B,OAAOs7B,GAAOE,IAAI,OAAQ,GAAGC,SAC9C1gB,EAAKwM,QAAUvnB,OAAOs7B,GAAOE,IAAI,OAAQx7B,OAAOs7B,GAAOI,eAAeC,MAAM,OAAOF,QACnF,MACJ,KAAK,GACD1gB,EAAKwgB,UAAYv7B,OAAOs7B,GAAOM,IAAI,GAAGH,SACtC1gB,EAAKwM,QAAUvnB,OAAOs7B,GAAOM,IAAI,GAAGD,MAAM,OAAOF,QACjD,MACJ,KAAK,GACD1gB,EAAKwgB,UAAYv7B,OAAOs7B,GAAOO,QAAQ,OAAOJ,SAC9C1gB,EAAKwM,QAAUvnB,OAAOs7B,GAAOK,MAAM,OAAOF,QAC1C,MACJ,SACI,GAAIK,GAAaljC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQ,aAC3Dw2B,KACA/gB,EAAKwgB,UAAYv7B,OAAO87B,EAAWC,aAAaF,QAAQ,OACxD9gB,EAAKwM,QAAUvnB,OAAO87B,EAAWE,WAAWL,MAAM,SAO/C,iBAAflE,IAAiC3F,EAAOmE,4BAA8Blb,EAAK/M,aAE/EjV,IAAI,2BAA4BgiB,GAIhCggB,GAA0B,WAAftD,GAA2B3F,EAAO0D,aAAal1B,QAAQ+2B,SAGlEvF,EAAO4F,cAAcpB,IAGjBxE,EAAO0D,aAAal1B,QAAQ26B,OAASnJ,EAAO0D,aAAal1B,QAAQ46B,UAAYpJ,EAAO0D,aAAal1B,QAAQs4B,YAAc9G,EAAO0D,aAAal1B,QAAQq2B,cAAgB7E,EAAO0D,aAAal1B,QAAQ45B,iBAG/LpI,EAAO+D,iBAAmBl1B,EAG1BmxB,EAAO2E,gBAAe,KAK1BsE,GAA0B,iBAAftD,GAAiC3F,EAAO0D,aAAal1B,QAAQq2B,eAGxE7E,EAAO4F,cAAcpB,IAGjBxE,EAAO0D,aAAal1B,QAAQ26B,OAASnJ,EAAO0D,aAAal1B,QAAQ46B,UAAYpJ,EAAO0D,aAAal1B,QAAQs4B,YAAc9G,EAAO0D,aAAal1B,QAAQq2B,eAEnJ7E,EAAO2E,gBAAe,EAAMgB,IAKhCsD,GAA0B,UAAftD,GAA0B3F,EAAO0D,aAAal1B,QAAQo4B,QAGjE5G,EAAO4F,cAAcpB,IAGjBxE,EAAO0D,aAAal1B,QAAQ26B,OAASnJ,EAAO0D,aAAal1B,QAAQ46B,UAAYpJ,EAAO0D,aAAal1B,QAAQs4B,YAAc9G,EAAO0D,aAAal1B,QAAQq2B,eAEnJ7E,EAAO2E,gBAAe,EAAMgB,IAKhCv8B,EAAO+gC,gBACa,aAAhB/gC,EAAOrD,MACPkB,IAAIH,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQpK,EAAO+gC,iBACzDrjC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQpK,EAAO+gC,gBAAiB7D,WAAa,MAEnFx/B,EAAEC,QAAQD,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQpK,EAAO+gC,gBAAiBj/B,MAAO,SAAUrD,GAC7FA,EAAEq9B,UAAW,MAO7BlF,EAAOoK,aAAe,SAAU52B,EAAM3E,GAClC,GAAIzF,GAAStC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQA,GAC3D1M,GAAE4f,KAAKtd,EAAO8B,OAAS2D,GAAMA,IAAMq2B,UAAW,EAGlC,aAAR1xB,IACApK,EAAOk9B,WAAa,MAIX,iBAAT9yB,GAA2BwsB,EAAO0D,aAAal1B,QAAsB,aAAE04B,SACvElH,EAAOkJ,+BAA+B,gBAG1ClJ,EAAOhxB,kBAIXgxB,EAAOqK,eAAiB,SAAUC,EAAYC,GAE1CzjC,EAAEC,QAAQwjC,EAAW,SAAUthB,GAE3B,GAAIuhB,GAAY1jC,EAAE4f,KAAK4jB,EAAY,SAAUG,GACzC,MAAOA,IAAaxhB,EAAKpa,KAAO47B,EAAU57B,IAG1C27B,GACAvhB,EAAKhgB,MAAQuhC,EAAUvhC,MAEvBggB,EAAKhgB,MAAQ,KAKpB+2B,EAAO0K,eACR1K,EAAO0K,aAAe,WAElB1K,EAAOwI,WAAW,WAGlB1hC,EAAEC,QAAQi5B,EAAO0D,aAAal1B,QAAS,SAAUm8B,GAG9B,WAAXA,EAAEn3B,MAAkC,kBAAXm3B,EAAEn3B,MAAuC,UAAXm3B,EAAE5kC,OACzDe,EAAEC,QAAQ4jC,EAAEz/B,MAAO,SAAUrD,GACzBA,EAAEq9B,UAAW,IAGjByF,EAAErE,WAAa,QAInBtG,EAAO0D,aAAal1B,QAAsB,aAAE04B,SAC5ClH,EAAOkJ,+BAA+B,gBAG1ClJ,EAAOkG,gBACPlG,EAAOhxB,mBAIfgxB,EAAOwI,WAAa,SAAUoC,GAG1B,GAFKA,IACDA,EAASjS,EAAUhzB,SAAiB,QACpCilC,EAAQ,CACR,GAAIC,GAAY/jC,EAAE4f,KAAKsZ,EAAOsE,YAAc9wB,KAAQo3B,GAChDC,IAEIA,EAAUC,iBACV9K,EAAO2H,eAAekD,EAAUE,eAAgB,kBAG5D/K,EAAOhxB,kBAGXgxB,EAAO6I,kBAAoB,WAEhC,GAAIr6B,KAwBJ,OArBA1H,GAAEC,QAAQi5B,EAAO0D,aAAal1B,QAAS,SAAUpF,GAEhD,GAAIm9B,GAAgBz/B,EAAEsC,OAAOA,EAAO8B,MAAO,WACvCq7B,GAAch9B,OAAS,IAE1BiF,EAAQpF,EAAOoK,OACdA,KAAQpK,EAAOoK,KACfw3B,SAA4B,UAAhB5hC,EAAOrD,MAAoC,cAAhBqD,EAAOoK,MAI/C1M,EAAEmkC,OAAO7hC,EAAQ,SAAS7B,EAAOF,GAChCmH,EAAQpF,EAAOoK,MAAMnM,GAAOE,IAI7BiH,EAAQpF,EAAOoK,MAAMtI,MAAQq7B,KAKxB/3B,GAIR+0B,EAAcsF,kBAAoB7I,EAAO6I,kBAqBnC7I,EAAOuJ,uBAAyB,SAAU5D,EAAY92B,GAClD,GAAIq8B,GAAgBvS,EAAUwS,OAAOt+B,MAAM,KACvCu+B,EAAazS,EAAUwS,MACvBD,GAAc3hC,OAAS,IACvB6hC,EAAaF,EAAcA,EAAc3hC,OAAO,GAAK,IAAM2hC,EAAcA,EAAc3hC,OAAO,GAElG,IAAIlC,GAAM,UAAYs+B,EAClBp+B,EAAQsH,CACZ5H,KAAI,wBAA0BI,EAAM,QAAUwH,EAAK,YAAcu8B,GAEjE/iB,EAAShhB,EAAKE,GAAS8jC,OAAQD,EAAYpS,KAAM,OAGrDgH,EAAOkJ,+BAAiC,SAAUvD,GAC9C,GAAIuF,GAAgBvS,EAAUwS,OAAOt+B,MAAM,KACvCu+B,EAAazS,EAAUwS,MACvBD,GAAc3hC,OAAS,IACvB6hC,EAAaF,EAAcA,EAAc3hC,OAAO,GAAK,IAAM2hC,EAAcA,EAAc3hC,OAAO,GAElG,IAAIlC,GAAM,UAAYs+B,EAClB2F,EAAW,EAEfxkC,GAAEC,QAAQi5B,EAAO0D,aAAal1B,QAAQm3B,GAAYz6B,MAAO,SAASqgC,GAC1DA,EAAOrG,WACPoG,EAAWxkC,EAAEmT,QAAQqxB,GAAYC,EAAO18B,GAAGlB,WAAc29B,EAAW,IAAMC,EAAO18B,GAAGlB,cAI5F1G,IAAI,wBAA0BI,EAAM,QAAUikC,EAAW,YAAcF,GAEvE/iB,EAAShhB,EAAKikC,GAAYD,OAAQD,EAAYpS,KAAM,OAGxDgH,EAAOwL,gBAAkB,SAAUpiC,GAC/B,GAAIqiC,GAAW3kC,EAAE4f,KAAKsZ,EAAO0D,aAAal1B,SAAWgF,KAAQ,cACzDk4B,EAAiB5kC,EAAE4f,KAAK+kB,EAASvgC,OAAS2D,GAAI,GAElDmxB,GAAO8E,YAAY4G,EAAe78B,GAAI,aACtCmxB,EAAOhxB,kBAGXgxB,EAAO2L,SAAW,SAAUviC,EAAQwiC,GAChC,GAAIA,EAAS,CACT,GAAIC,GAA4DxgC,SAA9C20B,EAAO0D,aAAaoI,uBACmC,OAA9C9L,EAAO0D,aAAaoI,sBAC3B9L,EAAO0D,aAAaoI,sBACpB,GACpB1iC,GAAO6gC,YAAc/7B,SAAS+c,IAAI4gB,EAAY,YAE9CziC,GAAO8gC,UAAYh8B,UAI3B8xB,EAAO+L,MAAQ,SAAUC,GACrB,MAAO1I,GAAK2I,YAAYD,IAI5B1lC,IA35BJG,QACKC,OAAO,YACPk5B,UAAU,UAAWpxB,GAI1BA,EAAQkG,SAAW,eA+BnB2uB,EAAkB3uB,SAAW,SAAU,KAAM,aAAc,OAAQ,YAAa,WAAY,gBAAiB,WACzG,WAAY,qBAAsB,sBAAuB,sBA03BjEjO,QAAQC,OAAO,YACV4P,QAAQ,iBAAkB,cAAe,kBAAmB,cAAe,SAAUzB,EAAaoP,EAAiBhP,GAGnH,GAAIi3B,GAAgB,SAAU19B,GAC1B,GAAIA,EAAS,CAET,GAAI29B,GAA6BrlC,EAAE4f,KAAKlY,GAAW64B,SAAY,YACjE8E,IAA8BA,EAA2BjhC,OAC5DpE,EAAEC,QAAQolC,EAA2BjhC,MAAO,SAAU+d,GAAQA,EAAK/M,YAAc+M,EAAK/M,YAAY3I,aAAa5F,YAGhH,IAAIy+B,GAAetlC,EAAE4f,KAAKlY,GAAW64B,SAAY,SACpC+E,IAAgBA,EAAalhC,OAC7BpE,EAAEC,QAAQqlC,EAAalhC,MAAO,SAAU+d,GAAQA,EAAK/M,YAAc+M,EAAK/M,YAAY3I,aAAa5F,eAK5Gq5B,EAAa,SAAUqF,EAAaC,GAEpC,GAAIC,GAAWt3B,EAAYs3B,UAAY,CASvC,OAPAtlC,KAAI,WAAYslC,GAGSlhC,QAArBihC,IACAA,EAAoBroB,GAGjBpP,EAAY8E,QAAQ,WAAa6yB,MAAOH,EAAYvkC,KAAK,KAAMykC,SAAUA,IAAY,GAAO,EAAMD,GAG7G,QACCtF,WAAYA,EACZkF,cAAeA,MAGrB,WACI,YAEAzlC,SAAQC,OAAO,YACVk5B,UAAU,mBACP,cAAe,OAAQ,SAAS3qB,EAAaquB,GACzC,OACIxB,SAAU,IACV3X,YAAalV,EAAYqV,eAAiB,+CAC1CI,YAAa,SAAU,YAAa,eAAgB,SAAU,SAASsV,EAAQrH,EAAW8T,EAAcxM,GAEpGD,EAAO0M,YAAqC,QAAvBzM,EAAOlH,aAE5BiH,EAAO2M,mBAAqB,WACxB,GAAI3T,GAAOL,EAAUzrB,MAAMgG,MAAM,SAAS,GACtC05B,EAAWH,EAAa9xB,IAAI,kBAAoBqe,EAChD4T,KACA5M,EAAO0M,YAAcE,IAI7B5M,EAAO2M,qBAEP3M,EAAO6M,eAAiB,WACpB,GAAI7T,GAAOL,EAAUzrB,MAAMgG,MAAM,SAAS,EAC1C8sB,GAAO0M,aAAe1M,EAAO0M,YAC7BD,EAAazxB,IAAI,kBAAoBge,EAAMgH,EAAO0M,aAC9C1M,EAAO0M,YACP1M,EAAOvN,WAAW,qBAElBuN,EAAOvN,WAAW,sBAK1BuN,EAAO8M,sBAAwB,SAAS1jC,EAAQ6f,GAC5ChiB,IAAImC,GACCA,EAAO4hC,WACR/jC,IAAI,YAAcmC,EAAOoK,KAAO,KAAOyV,EAAKpa,IAC5CmxB,EAAOoK,aAAahhC,EAAOoK,KAAMyV,EAAKpa,MAIhEmxB,EAAO+M,kBAAoB,SAAS3jC,GACnCnC,IAAImC,GACsBA,EAAO4hC,WACR/jC,IAAI,YAAcmC,EAAOoK,KAAO,eACxD1M,EAAEC,QAAQqC,EAAO8B,MAAO,SAAS+d,GAChC+W,EAAOoK,aAAahhC,EAAOoK,KAAMyV,EAAKpa,QAKvBmxB,EAAO7rB,IAAI,eAAgB,SAASC,EAAOwG,GAEvColB,EAAOgN,sBAAwB7b,OAAOhiB,KAAKyL,EAAKmuB,iBAAiBnhC,IAAI,SAASqlC,GAAK,MAAOryB,GAAKmuB,gBAAgBkE,OAGnHjN,EAAO+L,MAAQ,SAAUC,GACrB,MAAO1I,GAAK2I,YAAYD,aA+BpD,WACI,YAgBA,SAASkB,GAAU1M,EAAQvrB,GAkBvB,QAASk4B,GAAcnvB,EAAOwhB,EAASC,GAKnC,QAAS2N,KACLpvB,EAAMsU,OAAO,WACT+a,EAASrvB,EAAMsvB,QAAS9N,EAAQ,GAAG+N,WAAW,GAAGC,MAAM,IACvDC,EAASzvB,EAAMsvB,WAPvB,GAAII,GAAWlN,EAAOf,EAAMyN,WACxBG,EAAWK,EAASjxB,OACpBgxB,EAAWjN,EAAOf,EAAMgO,SAS5BjO,GAAQphB,KAAK,SAAUgvB,GA7B3B,GAAIxN,IACAkC,SAAU,KACV9jB,OACI2vB,WAAY,IACZC,aAAc,KAElBzjB,YAAalV,EAAYqV,eAAiB,4CAC1CvgB,SAAS,EACT+1B,KAAMqN,EAEV,OAAOvN,GAxBXn5B,QACKC,OAAO,YACPk5B,UAAU,YAAasN,GAI5BA,EAAUx4B,SAAW,SAAU,kBAyCnC,WACI,YACAjO,SAAQC,OAAO,YAAYk5B,UAAU,WAAY,WAC7C,MAAO,UAAU5hB,EAAOwhB,EAASqO,GAC7B,QAASC,KACL,GAAIC,GAAmBvO,EAAQ,GAAGwO,UAC9BC,EAAuBzO,EAAQ,GAAG0O,cAAcF,SACpDxO,GAAQ,GAAG0O,cAAc98B,UAAY28B,EAAmBE,EAQ5D,GANA/8B,WAAW,WACH8M,EAAMmiB,MAAM0N,EAAWM,WACvBL,MAIJD,EAAWO,WAAY,CACvB,GAAIC,GAASR,EAAWO,WAAWvhC,MAAM,IACzC/F,GAAEkY,KAAKqvB,EAAQ,SAAUC,GAErBtwB,EAAM7J,IAAIm6B,EAAW,SAAU3nC,GAC3BuK,WAAW,WACH8M,EAAMmiB,MAAM0N,EAAWM,WACvBL,iBAWhCrnC,QAAQC,OAAO,YACdk5B,UAAU,UAAW,WACrB,MAAO,UAAU5hB,EAAOuwB,EAAMC,GAC7BxwB,EAAM7J,IAAIq6B,EAAKC,QAAS,SAAU9nC,GACjC4nC,EAAK,GAAGG,aASV,WACA,YAMA,SAASC,KAQR,QAAS7O,GAAK9hB,EAAOuwB,GAEpB,GAAIK,GAAYC,EAAE,aAAcN,GAG5BO,EAAgBt+B,SAASo+B,EAAUG,IAAI,WAGvCC,EAAQH,EAAE,QAASN,EAGvBM,GAAE,UAAWD,GAAWK,OAAO,SAAStoC,GAEvC,GAAIuoC,GAAQL,EAAEloC,EAAEwoC,eAAeC,YAG/BJ,GAAMD,IAAI,eAAgBG,KAI3BL,EAAErpC,QAAQ6pC,OAAO,WAEhB,GAAIC,GAASV,EAAUhC,WAAW/jC,IAG9B0mC,EAAaV,EAAErpC,QAAQgqC,SAAWF,EAAU,CAG5CC,GAAYT,EAAeF,EAAUG,IAAI,SAAUQ,EAAY,MAC9DX,EAAUG,IAAI,SAAUD,EAAgB,KAG7C,IAAIW,GAAsBj/B,SAASw+B,EAAMD,IAAI,UAAYv+B,SAASq+B,EAAE,UAAWD,GAAWG,IAAI,SAG9FF,GAAE,SAAUD,GAAWG,IAAI,QAASU,EAAsB,QAI3DZ,EAAErpC,QAAQ6pC,SA9CX,OACCvN,SAAU,IACV9jB,SACA8hB,KAAMA,GAPRr5B,QAAQC,OAAO,YAAYk5B,UAAU,iBAAkB+O,MAsDxD,WACI,YAEAloC,SAAQC,OAAO,YAAYk5B,UAAU,iBAAiB,aAAc,WAAY,YAAa,SAAS5rB,EAAY0Q,EAAUiU,GACxH,OACI3a,OAAO,EACP8jB,SAAU,IACVpX,YAAa,SAAU,WAAY,SAASsV,EAAQ0P,GAE3C17B,EAAW27B,kBACZ37B,EAAW27B,mBACX37B,EAAW27B,gBAAgBC,SAAU,KAG7C9P,KAAM,SAAS9hB,EAAOwhB,EAASC,EAAOoQ,GAClC,GAAI5uB,GAAUwe,EAAMxe,QAAUwe,EAAMxe,QAChC,iIAGJ4tB,GAAErpC,QAAQ4Y,KAAK,eAAgB,WAC3B,MAAIpK,GAAW27B,gBAAgBC,QACpB,yIADX,SAMJ5xB,EAAM7J,IAAI,uBAAwB,SAASC,EAAO07B,EAAM/M,GACpD,GAAI/uB,EAAW27B,gBAAgBC,UAAY57B,EAAW27B,gBAAgBI,qBAAsB,CACxF,GAAIC,GAASC,QAAQhvB,EAEhB+uB,IAGDh8B,EAAW27B,gBAAgBI,sBAAuB,EAClD/7B,EAAW27B,gBAAgBC,SAAU,EAErClrB,EAAS,WACLiU,EAAUzrB,IAAIyrB,EAAUzrB,IAAI4iC,GAAMz8B,WANtCe,EAAMulB,iBAadjV,EAAS,WACL1Q,EAAW27B,gBAAgBI,sBAAuB,GACnD,OAIP/xB,EAAM7J,IAAI,oBAAqB,SAASC,EAAOC,EAASC,EAAUC,EAAWC,GACzE,GAAIR,EAAW27B,gBAAgBC,UAAY57B,EAAW27B,gBAAgBI,qBAAsB,CACxF,GAAIC,GAASC,QAAQhvB,EAEhB+uB,IAGDh8B,EAAW27B,gBAAgBI,sBAAuB,EAClD/7B,EAAW27B,gBAAgBC,SAAU,GAHrCx7B,EAAMulB,iBAOdjV,EAAS,WACL1Q,EAAW27B,gBAAgBI,sBAAuB,GACnD,eASvB,WACI,YAEAtpC,SACKC,OAAO,YACPk5B,UAAU,cAAe,WAMtB,QAASsQ,GAAoBC,GACzB,GAAIC,GAAQC,EAAOF,EACnB,KAAKC,EAAO,OAAO,CAEnB,IAAIjhC,GAAOgiB,OAAOhiB,KAAKihC,EACvB,OAAOjhC,GAAK4d,MAAM,SAAU1lB,GACxB,MAAgB,eAARA,IAA0B+oC,EAAM/oC,KAVhD,GAAIgpC,KAcJ,QACIvO,SAAU,IACVN,QAAS,WACTxjB,SAEA8hB,KAAM,SAAkB9hB,EAAOuwB,EAAM9O,EAAO6Q,GAuBxC,QAASC,KACDH,EAAMI,WACNF,EAAUG,aAAa,YAAY,GAEnCH,EAAUG,aAAa,YAAY,GAK3C,QAASC,GAASnpC,GAId,MAHA6oC,GAAMpyB,EAAME,MAAQoyB,EAAUK,SAASppC,GACvC6oC,EAAMI,WAAaN,EAAoBC,GACvCI,IACOH,EAAMI,WAAanlC,OAAY9D,EAjC1C,GAAK+oC,GAAc7Q,EAAMmR,YAAzB,CAIA,GAAIT,GAAY1Q,EAAMmR,WACIvlC,UAAtBglC,EAAOF,KACPE,EAAOF,IAAeK,YAAY,GAEtC,IAAIJ,GAAQpyB,EAAMoyB,MAAQC,EAAOF,EAGjCnyB,GAAM7J,IAAI,WAAY,iBACVi8B,GAAMpyB,EAAME,KAChBiT,OAAOhiB,KAAKihC,GAAO7mC,QAAU,SACrB8mC,GAAOF,KAyBvBG,EAAUO,YAAY3kC,KAAKwkC,GAC3BJ,EAAUQ,SAAS3I,QAAQuI,GAC3B1yB,EAAMqiB,OAAO,mBAAoBkQ,WAKrD9pC,QAAQC,OAAO,YAAYk5B,UAAU,mBAAoB,WACrD,OACIkC,SAAU,KACV3X,YAAa,8DACbO,WAAY,SAAUsV,QAU9B,WACC,YASA,SAAS+Q,GAAgB97B,GAExB,OACC6sB,SAAU,KACVnC,YAAY,EACZxV,YAAalV,EAAYqV,eAAiB,8CAC1CtM,OACCgzB,UAAW,IACXC,KAAM,IACNhwB,QAAS,MAfZxa,QAAQC,OAAO,YAAYk5B,UAAU,SAAUmR,GAG/CA,EAAgBr8B,SAAW,kBAiB5B,WACI,YAEAjO,SAAQC,OAAO,YACdk5B,UAAU,WAAY,cAAe,SAAU3qB,GAC5C,OACI6sB,SAAU,KACV/3B,SAAS,EACT41B,YAAY,EACZxV,YAAalV,EAAYqV,eAAiB,sCAC1CtM,OACIgzB,UAAW,IACX/vB,QAAS,IACTiwB,UAAW,aAO3B,WACI,YAEAzqC,SAAQC,OAAO,YACVk5B,UAAU,aAAc,cAAe,SAAU3qB,GAC9C,OACI6sB,SAAU,KACV3X,YAAalV,EAAYqV,eAAiB,0CAC1CtM,OACImzB,YAAa,IACb9C,OAAQ,KACR+C,YAAa,KAEjBtR,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOoQ,GACnC7xB,EAAM1X,KAAKm5B,GACNA,EAAM2R,cAAepzB,EAAMozB,YAAc3qC,QAAQ4qC,OAE1D3mB,YAAa,SAAU,aAAc,SAAU,eAAgB,YAAa,kBAAmB,SAAUsV,EAAQhsB,EAAYykB,EAAQzQ,EAAc2Q,EAAW1Q,GAmG1J,QAASqpB,GAAuBC,GAC5B,MAAO,YACH,GAAI9H,GAAWhU,CAEXuK,GAAOwR,kBACP/H,EAAYn+B,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAAWxe,IAAI,QAASsmB,GAAsBxH,QAAQ,QACxHtU,EAAUnqB,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1b,SAASxK,IAAI,QAASsmB,GAAsB1H,MAAM,UAGlHJ,EAAYn+B,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAAWxe,IAAI,OAAQsmB,GACzF9b,EAAUgU,GAGdzJ,EAAOyR,gBAAgBhI,EAAWhU,IA9G1C,GAAIic,GAAuB19B,EAAWG,IAAI,yBAA0B,SAAU1M,GACrEyG,OAAO8Z,EAAayhB,WAAWkI,OAAOzjC,OAAO8xB,EAAOmR,YAAY1H,WAAY,QAC5Ev7B,OAAO8Z,EAAayN,SAASkc,OAAOzjC,OAAO8xB,EAAOmR,YAAY1b,SAAU,SAEzEuK,EAAOmR,YAAY1H,UAAYv7B,OAAO8Z,EAAayhB,WAAWE,SAC9D3J,EAAOmR,YAAY1b,QAAUvnB,OAAO8Z,EAAayN,SAASkU,SAE1D3J,EAAO4R,mBAAmB5pB,EAAayhB,WACvCzJ,EAAOoR,gBAIfpR,GAAO7rB,IAAI,WAAY,WACnBu9B,MAGJ1R,EAAOmR,YAAcnR,EAAOmR,gBAE5BnR,EAAO6R,oBAAsB,WAEzB,GAAIA,IAAsB,CAQ1B,OANIA,GADA7R,EAAOwR,iBACetjC,SAAS67B,QAAQ,QAAQ4H,OAAOzjC,OAAO8xB,EAAOmR,YAAY1H,WAAWM,QAAQ,QAAS,OAGtF77B,SAASyjC,OAAOzjC,OAAO8xB,EAAOmR,YAAY1H,WAAY,QAMpFzJ,EAAO15B,KAAO,SAAUm5B,GAGpBO,EAAO8R,kBACHC,iBAAkB,UAClBC,qBAAqB,EACrBC,sBAAsB,EACtBC,yBAA0B,OAC1BC,QAAS,MAIRrrC,EAAEmT,QAAQwlB,EAAMqS,oBACjB9R,EAAO8R,iBAAmBrrC,QAAQ2E,OAAO40B,EAAO8R,iBAAkBrrC,QAAQ2rC,SAAS3S,EAAMqS,oBAGxF9R,EAAOmR,YAAY1H,YACpBzJ,EAAOmR,YAAY1H,UAAwD,WAA5CzJ,EAAO8R,iBAAiBC,iBAAgC,GAAIlmC,MAASqC,OAAO,GAAIrC,OAAQk+B,QAAQ,QAAQJ,UAGtI3J,EAAOmR,YAAY1b,UACpBuK,EAAOmR,YAAY1b,QAAsD,WAA5CuK,EAAO8R,iBAAiBC,iBAAgC,GAAIlmC,MAASqC,OAAO,GAAIrC,OAAQg+B,MAAM,QAAQF,UAGvI3J,EAAOqS,SAAU,EAEb/mC,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAAWkI,OAAOrmC,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1b,SAAU,OACxIuK,EAAO8R,iBAAiBC,iBAAmB,UAG3C/R,EAAO8R,iBAAiBC,iBAAmB,YAInD/R,EAAOsS,iBAAmB,WAEtB,MAAuC,OAAnCtS,EAAO8R,iBAAiBK,SAAiD,MAA9BnS,EAAOmR,YAAY1b,SAAkDpqB,SAA/B20B,EAAOmR,YAAY1b,SAC3FvnB,OAAO8xB,EAAO8R,iBAAiBK,SAASI,KAAKrkC,OAAO8xB,EAAOmR,YAAY1b,SAAU,SAAW,GAGlG,GAGXuK,EAAOwR,eAAiB,WACpB,GAAI/H,GAAYn+B,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAClEhU,EAAUnqB,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1b,QACpE,OAAOuK,GAAOmR,cAAgB1H,EAAUkI,OAAOlc,EAAS,QAG5DuK,EAAOwS,gCAAkC,WACrC,MAAIxS,GAAOwR,iBACA,YAGA,SAIfxR,EAAOyS,eAAiB,WACpB,MAA+B,2BAAxBha,EAAOsK,QAAQvvB,MAA6D,wBAAxBilB,EAAOsK,QAAQvvB,MAI9EwsB,EAAO0S,YAAcpB,EAAuB,GAC5CtR,EAAO2S,gBAAkBrB,EAAuB,IAmBhDtR,EAAO4S,sBAAwB,WAC3B,GAAInJ,GAAWhU,CAGXuK,GAAOwR,kBACP/H,EAAYv7B,SAAS67B,QAAQ,QAC7BtU,EAAUvnB,SAAS27B,MAAM,UAGzBJ,EAAYv7B,SACZunB,EAAUvnB,UAGd8xB,EAAOyR,gBAAgBhI,EAAWhU,IAGtCuK,EAAO6S,YAAc,WACjB,GAAK7S,EAAOwR,iBAAZ,CAIA,GAAI/H,GAAWhU,CAEsB,OAAjCxN,EAAgB6qB,gBAChB9S,EAAOmR,YAAY1H,UAAYn+B,OAAOyC,4BAA4Bka,EAAgB6qB,gBAGtFrJ,EAAYv7B,OAAO8xB,EAAOmR,YAAY1H,WACtChU,EAAUgU,EACVzJ,EAAO8R,iBAAiBC,iBAAmB,UAE3C/R,EAAOyR,gBAAgBhI,EAAWhU,KAGtCuK,EAAO+S,aAAe,WAClB,IAAI/S,EAAOwR,iBAAX,CAIA,GAAI/H,GAAWhU,CAEfxN,GAAgB6qB,cAAgBxnC,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAEjFzJ,EAAOyS,mBACRhJ,EAAYn+B,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1H,WAAWM,QAAQ,QACrFtU,EAAUnqB,OAAOyC,4BAA4BiyB,EAAOmR,YAAY1b,SAASoU,MAAM,QAC/E7J,EAAO8R,iBAAiBC,iBAAmB,YAG/C/R,EAAOyR,gBAAgBhI,EAAWhU,WAOtDhvB,QAAQC,OAAO,YAAYk5B,UAAU,oBAAqB,SAAU,SAAUnH,GAC1E,OACIqJ,SAAU,IACVN,QAAS,UACT1B,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOoQ;AAkCnC,QAAS+B,GAAmBnI,GACxB,GAAIA,GAAYv7B,OAAOu7B,EAEvBzrB,GAAMg1B,mBAAoB,EAC1BnE,EAAEoE,GAAKr4B,KAAK,kBAAkB5M,KAAKy7B,GACnCzrB,EAAMg1B,mBAAoB,EAG9B,QAASvB,GAAgBhI,EAAWhU,GAChC,GAGIxrB,IAHeiE,OAAOu7B,GACTv7B,OAAOunB,GAEX3uB,EAAE2V,OAAOgc,EAAOxuB,QAAUw/B,UAAWA,EAAUl6B,OAAO,cAAekmB,QAASA,EAAQlmB,OAAO,gBAC1GkpB,GAAOya,aAAaza,EAAOsK,QAAQvvB,KAAMvJ,GAAUxE,UAAU,EAAM0tC,SAAS,EAAMC,SAAU3a,EAAOsK,QAASsQ,QAAQ,IA7CxHr1B,EAAMg1B,mBAAoB,EAC1Bh1B,EAAMyzB,gBAAkBA,EACxBzzB,EAAM4zB,mBAAqBA,CAE3B,IAAI0B,GAASzE,EAAErP,GAAS8T,SACpBL,EAAMK,EAAOC,gBACbhkC,OAAQ,KACRikC,iBAAiB,EACjBC,YAAaz1B,EAAMmzB,YAAY1H,WAInCwJ,GAAIS,GAAG,YAAa,SAAU/sC,GAC1B,IAAKqX,EAAMg1B,kBAAmB,CAC1B,GAAIvJ,GACAhU,CAEAzX,GAAMwzB,kBACN/H,EAAYv7B,OAAOvH,EAAEqH,MAAM+7B,QAAQ,QACnCtU,EAAUvnB,OAAOvH,EAAEqH,MAAM67B,MAAM,UAE/BJ,EAAYv7B,OAAOvH,EAAEqH,MACrBynB,EAAUgU,GAGdgI,EAAgBhI,EAAWhU,GAC3BzX,EAAM21B,yBA2F9B,WACI,YAEAltC,SAAQC,OAAO,YAAYk5B,UAAU,cAAe,WAAY,SAAUlb,GACtE,OACI8c,QAAS,WACTM,SAAU,KACV9jB,OACI41B,kBAAmB,IACnBC,yBAA0B,MAE9B/T,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOoQ,GAgEnC,QAASiE,KACLtU,EAAQ5kB,KAAK,WAAY4kB,EAAQ5kB,KAAK,kBAAkB5P,UAAU+oC,UAClEvU,EAAQ5kB,KAAK,kBAAkBm5B,UAE3BC,KAAM,SAAUC,GACPA,GACD3sC,KAAK4sC,UAMrB,QAASC,KACL,GAAIhlC,GAAOqwB,EAAQ5kB,KAAK,WACpBzL,KACAqwB,EAAQ5kB,KAAK,kBAAkBm5B,SAAS5kC,GACxCqwB,EAAQ5kB,KAAK,WAAY,OAIjC,QAASw5B,KACL,GAAIv6B,GAAS,IAEPg2B,KAEIA,EAAYwE,aAAenmC,OAAOC,SAAS0hC,EAAYwE,aACzDx6B,EAASg2B,EAAYwE,YAEfxE,EAAYyE,aACdz6B,EAAS3L,OAAO2hC,EAAYyE,aAKxC,IAAIrB,GAAMzT,EAAQ5kB,KAAK,iBAEnB25B,GAAiBC,kBACjBvB,EAAId,QAAQjkC,UAGhB+kC,EAAIjlC,KAAK6L,GAGb,QAAS46B,KACL,GAAM5E,EAAYwE,aAAenmC,OAAOC,SAAS0hC,EAAYwE,cAAkBxE,EAAYwE,YAAYvhC,UAAkD,IAAtC+8B,EAAYwE,YAAYvhC,WAAkB,CACzJ,GAAI4hC,GAAW7E,EAAYwE,YAAY3N,QAAQqD,QAAQ,MACG,KAArD2K,EAASnC,KAAK1C,EAAYwE,YAAa,YACxC5U,EAAMkV,KAAK,QAAS9E,EAAYwE,YAAYzhC,aA9GxD,IAAKi9B,EAAa,CACd,GAAI+E,GAAQpV,EAAQ9Y,KAAK,SAAS9L,KAAK,qBACvCi1B,GAAc+E,EAAQA,EAAQtxB,QAAQxI,MAAM,6CAGhD,GAAI4B,IACAnN,OAAQ,aAAcslC,cAAe,YACrCC,OACInlC,KAAM,mBACN3B,KAAM,iBACN+mC,GAAI,mBACJf,KAAM,qBACNgB,SAAU,qBACVlF,KAAM,wBAIVmF,EAAkBj3B,EAAMmiB,MAAMV,EAAMmU,mBACpC5oC,EAAUvE,QAAQ2E,UAAWsR,EAAgBu4B,GAE7CV,EAAmBv2B,EAAMmiB,MAAMV,EAAMyV,+BAGzCrF,GAAYiB,SAAS5kC,KAAK,SAAUipC,GAEhC,MAAMtF,GAAYwE,aAAenmC,OAAOC,SAAS0hC,EAAYwE,cAAkBxE,EAAYwE,YAAYlkC,IAAQ0/B,EAAYwE,YAAYlkC,KAC/HjC,OAAOC,SAASgnC,GAETjnC,OAAOiC,GAAG0/B,EAAYwE,YAAYlkC,MAAMu5B,KAC3CpgB,KAAQ6rB,EAAQx6B,IAAI,QACpBy6B,MAASD,EAAQx6B,IAAI,SACrB3M,KAAQmnC,EAAQx6B,IAAI,QACpB9K,KAAQslC,EAAQx6B,IAAI,QACpB7K,OAAUqlC,EAAQx6B,IAAI,UACtB06B,OAAUF,EAAQx6B,IAAI,UACtB26B,YAAeH,EAAQx6B,IAAI,iBAIxBzM,OAAOinC,EAASnqC,EAAQuE,QAAQY,GAAG0/B,EAAYwE,YAAYlkC,MAInEglC,IAGX3V,EAAQkU,GAAG,YAAa,SAAU/sC,GAC9B+d,EAAS,WACL,GAAIuuB,GAAMzT,EAAQ5kB,KAAK,iBACvBi1B,GAAY0F,cAActC,EAAIjlC,YAKtCwxB,EAAQkU,GAAG,UAAW,SAAU/sC,GAC5BmtC,MAIJtU,EAAQkU,GAAG,UAAW,SAAU/sC,GAC5BwtC,MAuDJtE,EAAY2F,QAAU,SAAUjuC,GAC5B6sC,IACAN,IACAW,KAGJjV,EAAQ+T,eAAevoC,GACvBopC,IAGAp2B,EAAMqiB,OAAO,2BAA4B,SAAUC,EAAQC,GACvD,GAAID,EAAQ,CACR,GAAImV,GAAahvC,QAAQ2E,UAAWsR,EAAgBu4B,EAAiB3U,EACrEuO,GAAErP,GAAS5kB,KAAK,kBAAkB5P,QAAQyqC,cAQlE,WACI,YAQAhvC,SAAQC,OAAO,YACdk5B,UAAU,wBAAyB,WAAY,gBAAiB,cAAe,SAAUgC,EAAU8T,EAAezgC,GAC/G,OACI6sB,SAAU,IACV/3B,SAAS,EACTogB,YAAalV,EAAYqV,eAAiB,iEAC1CtM,OACI23B,SAAU,QACVC,YAAa,KACbC,mBAAoB,IACpBC,gBAAiB,KACjBC,cAAe,IACfC,eAAgB,IAChBC,gBAAiB,IACjBC,UAAW,IACXC,QAAS,IACTC,YAAa,KAEjBtW,KAAM,SAAU9hB,EAAOwhB,EAASC,GAoB5B,GAlBIA,EAAMsW,gBACN/3B,EAAMq4B,0BAA2B,GAEjC5W,EAAMuW,iBACNh4B,EAAMs4B,SAAU,GAEGjrC,SAAnBo0B,EAAM8W,WACNv4B,EAAMw4B,YAAa,GAEnB/W,EAAM0W,UACNn4B,EAAMy4B,YAAa,GAEnBhX,EAAMiX,iBACN14B,EAAM04B,gBAAiB,IAKtB14B,EAAM23B,UAAY33B,EAAMs4B,QAAS,CAClCt4B,EAAMpD,OACN,IAAI1P,GAAQ8S,EAAMg4B,gBAAiB1C,OAAQ,MACvC7sC,SAAQkB,QAAQuD,GAChB8S,EAAMpD,KAAO1P,EAGbA,EAAM0O,KAAK,SAAUgB,GACjBoD,EAAMpD,KAAOA,IAKrBoD,EAAM23B,WACN33B,EAAMpD,KAAOoD,EAAM23B,SACnB33B,EAAMqiB,OAAO,WAAY,WACrBriB,EAAMpD,KAAOoD,EAAM23B,aAI/BjrB,YAAa,SAAU,YAAa,UAAW,eAAgB,SAAUsV,EAAQ2W,EAAWC,EAASC,GASjG,QAASC,GAAanwC,GAClBowC,IACA/W,EAAO1N,SAGX,QAASykB,KAEL,GADA/W,EAAOgX,UAAW,EACdC,EAAY,CACZ,GAAIC,GAAWxB,EAAcyB,YAAYF,EACzCC,GAASE,UAAW,EACpBH,EAAa5rC,OAGjB20B,EAAOqX,mBACPV,EAAUW,IAAI,QAASR,GACvBH,EAAUW,IAAI,UAAWC,GAG7B,QAASC,GAAuBvuB,EAAMwuB,EAAOC,EAAaC,GACtD,GAAKF,EAAL,CAIA,GAAIG,GAAYH,EAAMppC,QAAQ4a,EAC9B,IAAI2uB,EAAY,GACZ,OAASC,aAAcJ,EAAOC,YAAaA,EAAaC,YAAaA,EAAaC,UAAWA,EAGjG,KAAK,GADDE,GACKjwC,EAAI,EAAGA,EAAI4vC,EAAMluC,UAClBmsC,EAAcqC,YAAYN,EAAM5vC,GAAIm4B,EAAOsW,YAC3CwB,EAAWN,EAAuBvuB,EAAMysB,EAAcsC,YAAYP,EAAM5vC,GAAIm4B,EAAOsW,QAAStW,EAAOqX,iBAAkBI,EAAO5vC,KAFlGA,KAQlC,MAAOiwC,IAGX,QAASG,GAAuBhvB,GAC5B,GAAIivB,GAAWxC,EAAcsC,YAAY/uB,EAAM+W,EAAOsW,QAAStW,EAAOqX,iBAClEt3B,EAAIm4B,EAASA,EAAS3uC,OAAS,EACnC,OAAImsC,GAAcyB,YAAYp3B,GAAGo4B,WACtBF,EAAuBl4B,GAE3BA,EAMX,QAASq4B,GAAYpE,EAAM/qB,EAAMwuB,GAC7B,GAAIY,GAAWb,EAAuBvuB,EAAMwuB,GACxCP,EAAWxB,EAAcyB,YAAYluB,EAEzC,IAAI+qB,EAAM,CACN,GAAIkD,EAASiB,WAET,MAAOzC,GAAcsC,YAAY/uB,EAAM+W,EAAOsW,QAAStW,EAAOqX,iBAAiB,EAEnF,IAAIgB,EAAST,UAAYS,EAASR,aAAatuC,OAAS,EAEpD,MAAO8uC,GAASR,aAAaQ,EAAST,UAAY,EAEtD,IAAIS,EAAST,WAAaS,EAASR,aAAatuC,OAAS,GAAK8uC,EAASX,aAAeW,EAASV,YAAcU,EAASX,YAAYnuC,OAAS,EAEvI,MAAO8uC,GAASX,YAAYW,EAASV,YAAc,OAGtD,CACD,GAAIU,EAAST,UAAY,EAAG,CAExB,GAAIU,GAAsBD,EAASR,aAAaQ,EAAST,UAAY,EACrE,OAAIlC,GAAcyB,YAAYmB,GAAqBH,WAExCF,EAAuBK,GAE3BA,EAEX,GAA2B,IAAvBD,EAAST,WAAmBS,EAASX,YAErC,MAAOW,GAASX,YAAYW,EAASV,aAI7C,MAAO1uB,GAGX,QAASsvB,GAAiBvE,GACjBiD,EAKDjX,EAAOwY,aAAaJ,EAAYpE,EAAMiD,EAAYjX,EAAOplB,QAHzD69B,IAAMzE,EAAO,EAAIhU,EAAOplB,KAAKrR,OAAS,EACtCy2B,EAAOwY,aAAaxY,EAAOplB,KAAK69B,OAIpCzY,EAAO1N,SAIX,QAASilB,GAAY5wC,GACjB,OAAQA,EAAE+xC,SAON,IAAK,IACD/xC,EAAEgzB,iBACFhzB,EAAEgyC,kBACF5B,IACA/W,EAAO1N,QACP,MAGJ,KAAK,IACL,IAAK,IACD3rB,EAAEgzB,iBACFhzB,EAAEgyC,kBACE1B,IACAjX,EAAO4Y,aAAa3B,GACpBjX,EAAO1N,SAEX,MAGJ,KAAK,IACD3rB,EAAEgzB,iBACFhzB,EAAEgyC,kBACFJ,GAAiB,EACjB,MAGJ,KAAK,IACD5xC,EAAEgzB,iBACFhzB,EAAEgyC,kBACFJ,GAAiB,EACjB,MAGJ,KAAK,IACD5xC,EAAEgzB,iBACFhzB,EAAEgyC,kBACE1B,IACAvB,EAAcyB,YAAYF,GAAYkB,YAAa,EACnDnY,EAAO1N,SAEX,MAGJ,KAAK,IACD3rB,EAAEgzB,iBACFhzB,EAAEgyC,kBACE1B,IACAvB,EAAcyB,YAAYF,GAAYkB,YAAa,EACnDnY,EAAO1N,WA+IvB,QAASumB,GAAqB5vB,GAC1B,MAAOniB,GAAEgyC,UAAU9Y,EAAOuG,eAAiB13B,GAAIoa,EAAKpa,KApTxD,GAAIooC,EAEJjX,GAAOgX,UAAW,EAClBhX,EAAOuG,iBACPvG,EAAO4V,YAAc5V,EAAO4V,cAAe,EAE3C5V,EAAOqX,mBAqKPrX,EAAOwY,aAAe,SAAUvvB,GAC5B,GAAIguB,GAAchuB,EAAM,CACpB,GAAIguB,EAAY,CACZ,GAAIC,GAAWxB,EAAcyB,YAAYF,EACzCC,GAASE,UAAW,EAExBH,EAAahuB,CACb,IAAI8vB,GAAYrD,EAAcyB,YAAYF,EAC1C8B,GAAU3B,UAAW,IAI7BpX,EAAOoK,aAAe,SAAUnhB,EAAM+vB,GAClCA,EAAOL,kBACP3Y,EAAOuG,cAAc/nB,OAAOq6B,EAAqB5vB,GAAO,GAExD8tB,GAGA,IAAIkC,GAAWnyC,EAAE4f,KAAKsZ,EAAOplB,MAAQ/L,GAAIoa,EAAKpa,IAEzCoqC,IACDnyC,EAAEkY,KAAKghB,EAAOplB,KAAM,SAAUs+B,GAE1B,MADAD,GAAWnyC,EAAE4f,KAAKwyB,EAAIhB,UAAYrpC,GAAIoa,EAAKpa,KACvCoqC,GACO,EADX,QAIR,IAAI/B,GAAWxB,EAAcyB,YAAY8B,EACzC/B,GAAShS,UAAW,EAGhBjc,EAAKivB,UACLpxC,EAAEC,QAAQkyC,EAASf,SAAU,SAAUiB,GACnC,GAAIC,GAAY1D,EAAcyB,YAAYgC,GAEtCE,EAAcR,EAAqBM,EACvCC,GAAUlU,UAAW,QACdkU,GAAUE,iBACjBtZ,EAAOuG,cAAc/nB,OAAO66B,EAAa,KAI7CrZ,EAAO6V,oBACP7V,EAAO6V,oBAAqB3qC,MAAO80B,EAAOuG,cAAch9B,OAASy2B,EAAOuG,cAAgBl7B,UAIhG20B,EAAOuZ,gBAAkB,SAAUP,GAC3BhZ,EAAOgX,SACPD,IAGA/W,EAAOwZ,iBAAiBR,IAIhChZ,EAAOwZ,iBAAmB,SAAUR,GAChCA,EAAOL,kBACF3Y,EAAOgX,WACRhX,EAAOgX,UAAW,EAElBL,EAAUjD,GAAG,QAASoD,GACtBH,EAAUjD,GAAG,UAAW6D,KAIhCvX,EAAOyZ,iBAAmB,SAAUxwB,GAChC,GAAIiuB,GAAWxB,EAAcyB,YAAYluB,EACzC,OAAIiuB,IAAYA,EAASoC,kBACd,GAGJ,GAGXtZ,EAAO4Y,aAAe,SAAU3vB,GAC5B,KAAK+W,EAAOqW,0BAA4BrW,EAAO+V,eAAgB9sB,KAAMA,OAAY,GAAW+W,EAAO8V,iBAAmBJ,EAAcqC,YAAY9uB,EAAM+W,EAAOsW,UAA7J,CAGA,GAAIY,GAAWxB,EAAcyB,YAAYluB,EACzC,IAAK+W,EAAO4V,YASL,CACHsB,EAAShS,UAAW,EACpBj+B,IAAIgiB,EAAMiuB,EAGV,IAAImC,GAAcR,EAAqB5vB,EACnCowB,GAAc,IACdnC,EAAShS,UAAW,EACpBlF,EAAOuG,cAAc/nB,OAAO66B,EAAa,IAEzCrZ,EAAOuG,cAAcr6B,KAAK+c,GAI1B+W,EAAO0W,gBACHztB,EAAKivB,UACLpxC,EAAEC,QAAQkiB,EAAKivB,SAAU,SAAUiB,GAE/B,GAAIC,GAAY1D,EAAcyB,YAAYgC,GAEtCE,EAAcR,EAAqBM,EAElCjC,GAAShS,UAKVkU,EAAUlU,UAAW,EACrBkU,EAAUE,kBAAmB,EAET,KAAhBD,EACArZ,EAAOuG,cAAcr6B,KAAKitC,GAE1BnZ,EAAOuG,cAAc8S,GAAaK,QAAQJ,kBAAmB,IAVjEF,EAAUlU,UAAW,QACdkU,GAAUE,iBACjBtZ,EAAOuG,cAAc/nB,OAAO66B,EAAa,UAlCpC,CACrBtC,GACA,KAAK,GAAIlvC,GAAI,EAAGA,EAAIm4B,EAAOuG,cAAch9B,OAAQ1B,IAC7C6tC,EAAcyB,YAAYnX,EAAOuG,cAAc1+B,IAAIq9B,UAAW,CAGlEgS,GAAShS,UAAW,EACpBlF,EAAOuG,iBACPvG,EAAOuG,cAAcr6B,KAAK+c,GA0C1B+W,EAAO6V,oBACP7V,EAAO6V,oBAAqB3qC,MAAO80B,EAAOuG,cAAch9B,OAASy2B,EAAOuG,cAAgBl7B,WAQhG20B,EAAO2Z,eAAiB,WACpB3Z,EAAOuG,iBACHvG,EAAO6V,oBACP7V,EAAO6V,oBAAqB3qC,MAAOG,UAI3C20B,EAAOK,OAAO,YAAa,SAAUuZ,EAAUC,GAC3C,GAAID,EACA,GAAInzC,QAAQkB,QAAQiyC,GAChB,IAAK,GAAI/xC,GAAI,EAAGA,EAAI+xC,EAASrwC,OAAQ1B,IACjCm4B,EAAO4Y,aAAanyC,QAAQmY,KAAKg7B,EAAS/xC,SAI9Cm4B,GAAO4Y,aAAanyC,QAAQmY,KAAKg7B,QAGhC5Z,GAAOuG,cAAch9B,OAAS,GACnCy2B,EAAO2Z,mBAIf3Z,EAAO8Z,WAAa,SAAUjyC,GAC1B,MAAIm4B,GAAOyW,WACAzW,EAAOmW,SAAUltB,KAAMphB,IAE3BA,EAAE2L,YAUzB/M,QAAQC,OAAO,YACdk5B,UAAU,YAAa,WAAY,KAAM,gBAAiB,cAAe,SAAUgC,EAAUzoB,EAAIu8B,EAAezgC,GAC7G,OACI6sB,SAAU,IACV/3B,SAAS,EACTogB,YAAalV,EAAYqV,eAAiB,qDAC1CtM,OACIiL,KAAM,IACN2vB,aAAc,IACdJ,aAAc,IACd5C,YAAa,KACbwB,SAAU,IACVtB,gBAAiB,KACjBiE,iBAAkB,IAClBhE,cAAe,IACfC,eAAgB,IAChBC,gBAAiB,IACjBjwC,MAAO,IACPqxC,gBAAiB,KAErB3sB,YAAa,SAAU,SAAUsV,GAC7BA,EAAOga,SAAWtE,EAAcyB,YAAYnX,EAAO/W,MACnD+W,EAAOga,SAAS7B,YAAa,EAE7BnY,EAAOia,YAAcja,EAAO/W,KAAKivB,SAEjClY,EAAOka,YAAc,SAAUjxB,GAC3B,MAAOysB,GAAcqC,YAAY9uB,EAAM+W,EAAOh6B,QAGlDg6B,EAAOma,iBAAmB,SAAUlxB,EAAM+vB,GACtCA,EAAOL,iBACP,IAAIyB,GAAO1E,EAAcyB,YAAYluB,EACrCmxB,GAAKjC,YAAciC,EAAKjC,YAG5BnY,EAAOqa,gBAAkB,SAAUpxB,EAAM+vB,GAErC,GADAA,EAAOL,kBACH3Y,EAAO4Y,aAAc,CACrB,GAAI1B,GAAWxB,EAAcyB,YAAYluB,EACzC,IAAIiuB,EAASoC,iBACT,OAAO,CAGXtZ,GAAO4Y,cAAe3vB,KAAMA,MAIpC+W,EAAOsa,gBAAkB,SAAUrxB,EAAM+vB,GACjChZ,EAAO4Y,cACP5Y,EAAO4Y,cAAe3vB,KAAMA,KAIpC+W,EAAOua,cAAgB,SAAUtxB,EAAM+vB,GAC/BhZ,EAAOwY,cACPxY,EAAOwY,cAAevvB,KAAMA,KAIpC+W,EAAOwa,YAAc,SAAUxB,GAC3BA,EAAOL,kBACHlyC,QAAQg0C,WAAWza,EAAOwY,eAC1BxY,EAAOwY,cAAevvB,KAAM+W,EAAO/W,QAI3C+W,EAAO0a,aAAe,WAClB,MAAK1a,GAAO4V,YAKR5V,EAAO+Z,iBACA/Z,EAAO+V,eAAgB9sB,KAAM+W,EAAO/W,QAEvC+W,EAAO8V,iBAAoB9V,EAAO8V,kBAAoBJ,EAAcqC,YAAY/X,EAAO/W,KAAM+W,EAAOh6B,QAPjG,KAgBnB20C,QAAS,SAAUnb,EAASC,EAAOK,GAE3Br5B,QAAQg0C,WAAW3a,KACnBA,GAASrgB,KAAMqgB,GAInB,IACI8a,GADAC,EAAWrb,EAAQqb,WAAW1+B,QAElC,QACI2+B,IAAMhb,GAAQA,EAAKgb,IAAOhb,EAAKgb,IAAM,KAIrCr7B,KAAM,SAAUzB,EAAOwhB,EAASC,GAEvBmb,IACDA,EAAmBhZ,EAASiZ,IAGhCD,EAAiB58B,EAAO,SAAU0oB,GAC9BlH,EAAQziB,OAAO2pB,KAIf5G,GAAQA,EAAKrgB,MACbqgB,EAAKrgB,KAAKs7B,MAAM,KAAM9nC,WAItB+K,EAAMhY,OACNgY,EAAMqiB,OAAO,QAAUqV,EAAcsF,cAAgB,cAAe,SAAU1a,GAC1E,GAAKA,EAAL,CAGA,GAAItiB,EAAMq5B,gBAAgBr5B,EAAMiL,KAAKgyB,WACjC,MAAOj9B,GAAMq5B,gBAAgBr5B,EAAMiL,KAAKgyB,UAI5C,IADAj9B,EAAMi8B,cAAiB7D,aAAa,IAChC3vC,QAAQg0C,WAAWz8B,EAAMg4B,iBAAmBh4B,EAAMiL,KAAM,CACxD,GAAI/d,GAAQ8S,EAAMg4B,gBAAiB1C,OAAQt1B,EAAMiL,MAC7CxiB,SAAQkB,QAAQuD,KAChB8S,EAAMi8B,YAAc/uC,GAExBA,EAAM0O,KAAK,SAAUgB,GACjBoD,EAAMi8B,YAAcr/B,EAEpBoD,EAAMq5B,gBAAgBr5B,EAAMiL,KAAKgyB,WAAargC,eAelFnU,QAAQC,OAAO,YACdiO,QAAQ,iBAAkB,KAAM,SAAUwE,GACvC,OACI6hC,YAAa,WACT,MAAO,WAGX7D,YAAa,SAAUluB,GAMnB,MAHKA,GAAKywB,UACNzwB,EAAKywB,YAEFzwB,EAAKywB,SAGhB3B,YAAa,SAAU9uB,EAAMjjB,GACzB,MAAOA,GAAQijB,EAAK8uB,YAAc9uB,EAAKivB,UAAYjvB,EAAKivB,SAAS3uC,OAAS,GAG9EyuC,YAAa,SAAU/uB,EAAMjjB,EAAOoT,GAChC,GAAI8+B,GAAWlyC,EAAQoT,EAAM6P,EAAKgyB,WAAahyB,EAAKivB,QACpD,OAAIlyC,KAAUkyC,GAAYjvB,EAAK8uB,eAIxBG,UAQvB,WACI,YAEAzxC,SAAQC,OAAO,YACdk5B,UAAU,aAAc,cAAe,WAAY,SAAU3qB,EAAayP,GACvE,OACIod,SAAU,KACV/3B,SAAQ,EACRogB,YAAalV,EAAYqV,eAAiB,4CAC1CtM,OACIo4B,YAAa,eACbzwC,OAAQ,IACRu1C,QAAS,KACTC,QAAS,MAEbrb,KAAM,SAAU9hB,EAAOyiB,GAQnB,QAAS52B,GAAYC,GACjB,GAAIiU,GAAQjU,CAKZ,OAJAiU,GAAQA,EAAMhU,QAAQ,mBAAoB,IAC1CgU,EAAQA,EAAMhU,QAAQ,IAAM,MAE5BgU,EAAQA,EAAMhU,QAAQ,KAAM,OAZhC,GAAIqxC,GAAwB,0BAExBp9B,GAAMo4B,cACNgF,EAAwBp9B,EAAMo4B,aAElCp4B,EAAMo9B,sBAAwBA,EAW9Bp9B,EAAMq9B,aAAe,WAEjBr9B,EAAMrY,OAASkE,EAAYmU,EAAMk9B,SACjCx2B,EAAS,WACD1G,EAAMm9B,SACNn9B,EAAMm9B,SAAU5zC,MAAOyW,EAAMrY,OAAQu1C,QAASl9B,EAAMk9B,WAEzD,YAQvB,WACI,YAEAz0C,SAAQC,OAAO,YACVk5B,UAAU,aACP,cAAe,SAAU3qB,GACrB,OACI6sB,SAAU,IACV9jB,OACIs9B,SAAU,IACVC,OAAQ,IACRC,SAAU,IACVC,SAAU,IACVC,WAAY,IACZC,WAAY,IACZC,cAAe,IACfC,YAAa,KAEjB1xB,YAAalV,EAAYqV,eAAiB,0CAC1CwV,KAAM,SAAU9hB,EAAOyiB,EAAIhB,GACvBzhB,EAAM89B,SAAWrc,EAAM6b,SACvBt9B,EAAM+9B,WAAatc,EAAMkc,WACzB39B,EAAMg+B,WAAavc,EAAMic,WAErBjc,EAAMwc,YACNj+B,EAAMi+B,YAAcxc,EAAMwc,YAE1Bj+B,EAAMi+B,YAAc,SAGpBxc,EAAMyc,UACNl+B,EAAMk+B,UAAYzc,EAAMyc,UAExBl+B,EAAMk+B,UAAY,OAGlBzc,EAAM0c,YACNn+B,EAAMm+B,YAAc1c,EAAM0c,YAE1Bn+B,EAAMm+B,YAAc,SAGxBn+B,EAAM2B,KAAO,WAET3B,EAAMs9B,YAEVt9B,EAAAA,UAAe,WACXA,EAAM29B,cAEV39B,EAAM8qB,OAAS,WACX9qB,EAAM09B,sBAOlC,WACI,YAEAj1C,SAAQC,OAAO,YACVk5B,UAAU,cACP,cAAe,SAAU3qB,GACrB,OACI6sB,SAAU,KACV9jB,OACI+jB,UAAW,IACXC,QAAS,KAEb7X,YAAalV,EAAYqV,eAAiB,4CAC1CI,WAAY,SAAUsV,GAElBA,EAAOoc,eAAiB,SAAUpL,GAG9B,MAAIA,IACO,GAGHlqC,EAAEmT,QAAQ+lB,EAAOllB,QAG7BklB,EAAOqc,YAAc,SAAUvhC,GAE3B7T,IAAI,oBAAqB6T,GAGrBA,EAAM6H,SACD7b,EAAEmT,QAAQa,EAAMF,QACjBolB,EAAOllB,SACPklB,EAAOllB,MAAMuR,aAAgBvR,EAAMF,KAAK0hC,eAAiBxhC,EAAMF,KAAK0hC,eAAiBxhC,EAAMF,KAAKqG,QAChG+e,EAAOllB,MAAMyhC,aAAeriC,KAAKC,UAAUW,EAAMF,iBASrF,WACI,YAEAnU,SAAQC,OAAO,YACdk5B,UAAU,yBAA0B,cAAe,SAAU3qB,GAC1D,OACI6sB,SAAU,IACV3X,YAAalV,EAAYqV,eAAiB,kEAC1CtM,OAAO,EACP0M,YAAa,SAAU,SAAU,WAAY,SAAUsV,EAAQC,EAAQuc,GAYnE,GAXAxc,EAAOyc,cAAiBC,WAAYF,EAAS/qB,UAAWkrB,aAAc,gBAGtE3c,EAAO4c,cAAe,EAGtB5c,EAAO6c,SAAW,MAGlB7c,EAAO8c,aAAc,EAEjB7c,EAAO8c,YAGP,OAFA/c,EAAOyc,aAAaM,YAAc9c,EAAO8c,YAElC9c,EAAO8c,aACV,IAAK,eACL,IAAK,eACD/c,EAAOyc,aAAaE,aAAe,eACnC,MACJ,KAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,aACL,IAAK,aACD3c,EAAOyc,aAAaE,aAAe,eAK/C3c,EAAOgd,UAAY,WACf,MAAOl2C,GAAEsC,OAAO42B,EAAOyc,aAAaC,YAAc32C,KAAMk6B,EAAO8c,cAAexzC,OAAS,GAG3Fy2B,EAAOid,kBAAoB,WACvBjd,EAAOyc,mBAGf3c,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOoQ,YAMnD,WACI,YACAppC,SAAQC,OAAO,YAAYk5B,UAAU,aAAc,SAAU,aAAc,UAAW,cAAe,SAAUnH,EAAQzkB,EAAY4iC,EAAS3hC,GACxI,OACI6sB,SAAU,IACV3X,YAAalV,EAAYqV,eAAiB,0CAC1CtM,OACIhQ,KAAM,IACNkvC,UAAW,KACX1M,WAAY,KACZ2M,WAAY,IACZC,WAAY,KACZpyC,QAAS,KACTyiC,SAAU,KACV4P,OAAQ,IACRC,UAAW,IACXzJ,yBAA0B,MAE9B/T,KAAM,SAAS9hB,EAAOwhB,EAASC,EAAOoQ,GAElC7xB,EAAMu/B,mBAAqB/d,EAAQge,QAAQ,YAAYhyC,KAAK,cAAe,EAG3EwS,EAAMy/B,mBAAyC,qBAApBz/B,EAAMs/B,UAAmC,eAAiB,eAE5DjyC,SAArB2S,EAAMo/B,aAA0Bp/B,EAAMo/B,YAAa,GAGlDp/B,EAAMk/B,YACPl/B,EAAMk/B,UAAY,aAElBl/B,EAAMyvB,WACNzvB,EAAMm9B,QAAU,WACZn9B,EAAMyvB,qBAO9BhnC,QAAQC,OAAO,YACdk5B,UAAU,gBAAiB,WACxB,OACI4B,QAAS,UACT1B,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOie,GACnCA,EAAkB5M,SAAS5kC,KAAK,SAAU0O,GAEtC,MAAOA,KAEX8iC,EAAkB7M,YAAY3kC,KAAK,SAAU0O,GAEzC,MAAO1M,QAAO0M,GAAMrL,OAAO,sBAK1CqwB,UAAU,gBAAiB,WACxB,OACI4B,QAAS,UACT1B,KAAM,SAAU9hB,EAAOwhB,EAASC,EAAOie,GACnCA,EAAkB5M,SAAS5kC,KAAK,SAAU0O,GACtC,MAAOA,KAEX8iC,EAAkB7M,YAAY3kC,KAAK,SAAU0O,GACzC,MAAO1M,QAAO0M,GAAMrL,OAAO,mBAM3C,WACC,YAEA9I,SAAQC,OAAO,YAAYk5B,UAAU,oBACpC,WACC,OACCkC,SAAU,IACVhC,KAAM,SAAU9hB,EAAOwhB,EAASC,GAC/BoP,EAAErP,GAASme,MAEX,IAAIt3B,GAAmBoZ,EAAMme,iBAC3Bt3B,cACAzZ,MAAM,KACJ0Z,EAAkBF,EAAiB,GACnCG,EAAkBH,EAAiB,GAEnCmX,EAAch4B,OAAOg4B,WAGxBA,GAAY/W,aAAaC,KAAK,SAAUP,GACvC,MACCA,GAAYI,gBAAgBD,gBAC3BC,GACDJ,EAAYK,gBAAgBF,gBAC3BE,IAIHqoB,EAAErP,GAAS0U,OAEXrF,EAAErP,GAASrjB,iBAQjB,WACC,YAEA,IAAI0hC,GAAqBr9B,MAAMkd,cAAc,OAAQ,qBAErDj3B,SAAQC,OAAO,YAAYk5B,UAAU,oBACpC,SACA,SAAUY,GACT,OACCsB,SAAU,IACVhC,KAAM,SAAU9hB,EAAOwhB,EAASC,GAC/BoP,EAAErP,GAASme,OAEXE,EACEC,uBAAuBre,EAAMse,kBAC7BnkC,KAAK,SAAU+I,GACXA,GACHksB,EAAErP,GAAS0U,iBAanB,WACI,YACAztC,SAAQC,OAAO,YAAYk5B,UAAU,kCAAmC,SAAU,qBAAsB,uBAAwB,KAAM,SAAUY,EAAQ9H,EAAoB/T,EAAsBxL,GAC9L,OACI2oB,SAAU,IACVhC,KAAM,SAAU9hB,EAAOwhB,EAASC,GAG5BoP,EAAErP,GAASme,MAGd,IAAIK,MACTC,KACYC,IACHze,GAAM0e,iCACL1e,EAAM0e,+BAA+B9vC,QAAQ,KAAO,GAChE2vC,EAAqBve,EAAM0e,+BAA+BtxC,MAAM,KAEvDmxC,EAAmB9xC,KAAKuzB,EAAM0e,gCAIzBr3C,EAAEC,QAAQi3C,EAAoB,SAAU/4B,GAEhCA,EAAkBoU,SAAS,KAC3B6kB,EAAoBhyC,KAAK+Y,GAEzBg5B,EAAY/xC,KAAKwsB,EAAmB1T,uBAAuBC,EAAmBwa,EAAMra,QAMhG,IAAIgU,KAEJtyB,GAAEC,QAAQk3C,EAAa,SAAUG,GAChC,GAAItmC,GAAc6M,EAAqBhN,aAAaymC,EAAOh5B,IACxDgU,GAAYltB,KAAKwsB,EAAmB/S,gBAAgBy4B,EAAOt5B,SAAUs5B,EAAOr5B,OAAQjN,MAGxFhR,EAAEC,QAAQm3C,EAAqB,SAAUG,GACrCjlB,EAAYltB,KAAKwsB,EAAmBxS,sBAAsBm4B,MAI9DllC,EAAGgC,IAAIie,GAAaxf,KAAK,SAAU+c,GAC3B7vB,EAAE4f,KAAKiQ,EAAS,SAAU2nB,GAC1B,MAAOA,MAEPzP,EAAErP,GAAS0U,iBAMnC,WACI,YACAztC,SAAQC,OAAO,YAAYk5B,UAAU,wBAAyB,SAAU,qBAAsB,uBAAwB,SAAUY,EAAQ9H,EAAoB/T,GACxJ,OACImd,SAAU,IACVhC,KAAM,SAAU9hB,EAAOwhB,EAASC,GAC/BoP,EAAErP,GAASme,MAER,IAAIS,GAAS1lB,EAAmB1T,uBAAuBya,EAAM8e,qBAAsB9e,EAAMra,KACrFtN,EAAc6M,EAAqBhN,aAAaymC,EAAOh5B,IAC3DsT,GAAmB/S,gBAAgBy4B,EAAOt5B,SAAUs5B,EAAOr5B,OAAQjN,GAAa8B,KAAK,SAAUC,GACvFA,GACAg1B,EAAErP,GAAS0U,iBAMnC,WACC,YAEAztC,SAAQC,OAAO,YACbk5B,UAAU,WAAY,QAAS,SAAUhV,GACzC,OACCkX,SAAU,IACV9jB,OACCwgC,QAAS,KAEV3e,SAAU,kBACVC,KAAM,SAAU9hB,EAAOwhB,EAASC,GAC/BzhB,EAAMqiB,OAAO,UAAW,SAAUC,EAAQC,GACzC,GAAID,EAAQ,CACX,GAAIme,IACHC,OAAQ,MACRxxC,IAAK8Q,EAAMwgC,QACXG,aAAc,cACdvlC,MAAO,OAGRwR,GAAM6zB,GACJ77B,QAAQ,SAAUhI,GAClB,GAGI/S,GAAG+D,EAAGgzC,EAHNC,EAAM,GAAIC,YAAWlkC,GAErBmkC,EAAM,GACUC,EAAQ,GAC5B,KAAKn3C,EAAI,EAAG+D,EAAIizC,EAAIt1C,OAAYqC,EAAJ/D,EAAOA,GAAKm3C,EACvCJ,EAAWC,EAAII,SAASp3C,EAAGA,EAAIm3C,GAC/BD,GAAO3wC,OAAO8wC,aAAanE,MAAM,KAAM6D,EAGxC,IAAIO,GAAMC,KAAKL,EAEftf,GAAMkV,KAAK,MAAO,0BAA4BwK,gBAQvD,WACI,YAEA14C,SAAQC,OAAO,YACdk5B,UAAU,mBAAoB,cAAe,WAAY,SAAU3qB,EAAayP,GAC7E,OACIod,SAAU,KACV3X,YAAalV,EAAYqV,eAAiB,sDAC1CtM,OACIhT,QAAS,IACTq0C,cAAe,IACfC,eAAgB,aAChBC,YAAa,UACbC,aAAc,KACd/D,SAAU,IACVhO,SAAU,KAEd3N,KAAM,SAAU9hB,EAAOyiB,EAAIhB,GAgCvB,QAASggB,GAAW5wC,GAChB,GAAI6wC,KAGJ,OAFAA,GAAQ1hC,EAAM2hC,SAASC,UAAY/wC,EAE5B6wC,EAlCX1hC,EAAM6hC,eAGN,IAAIC,IACAF,SAAU,KACVG,YAAa,QACbC,eAAgB,EAChBC,WAAW,GAIXC,GACAD,UAAW,aAIVxgB,GAAMgO,WAAYzvB,EAAMyvB,SAAWhnC,QAAQ4qC,MAGhDrzB,EAAM2hC,SAAW74C,EAAE2V,OAAOqjC,EAAiB9hC,EAAMshC,oBACjDthC,EAAMmiC,MAAQr5C,EAAE2V,OAAOyjC,EAAcliC,EAAMuhC,iBAE3CvhC,EAAMqiB,OAAO,iBAAkB,WAC3BriB,EAAM2hC,SAAW74C,EAAE2V,OAAOqjC,EAAiB9hC,EAAMshC,oBACjDthC,EAAMmiC,MAAQr5C,EAAE2V,OAAOyjC,EAAcliC,EAAMuhC,iBAE3CvhC,EAAMoiC,gBAAoD,IAAlCpiC,EAAM2hC,SAASK,iBAWvChiC,EAAM2hC,SAASx4B,SACfnJ,EAAMqiB,OAAO,UAAW,SAASuZ,GACzBA,IACA57B,EAAMqiC,eAAiBv5C,EAAEqgB,QAAQnJ,EAAMhT,QAASgT,EAAM2hC,SAASx4B,SAG3DnJ,EAAM2hC,SAASM,WACfn5C,EAAEkY,KAAKlY,EAAEqI,KAAK6O,EAAMqiC,gBAAiB,SAASh5C,GAC1C2W,EAAM6hC,aAAax4C,GAAOP,EAAEimB,MAAM/O,EAAMqiC,eAAeh5C,GAAM,SAASQ,GAClE,MAAOmW,GAAMsiC,UAAUtiC,EAAMuiC,qBAAqB14C,EAAGmW,EAAM2hC,SAASC,kBAQ5F5hC,EAAMwiC,cAAgB,SAAUxH,EAAQnqC,EAAIxH,GACxC2xC,EAAOL,kBACF36B,EAAM6hC,aAAax4C,IACpB2W,EAAMyiC,gBAAgB5xC,IAI9BmP,EAAMiiC,UAAY,SAAUjH,EAAQ0H,EAAUr5C,EAAKs5C,GAC/C,GAAI3iC,EAAMoiC,gBAAiB,CACvB,GAAIM,EAASn3C,OAAS,EAClB,MAMJ,OAJAyU,GAAMqhC,cAAgBv4C,EAAE8H,KAAK8xC,OAC7Bh8B,GAAS,WACL1G,EAAMyvB,aAIduL,EAAOL,kBAEP36B,EAAM6hC,aAAax4C,IAAQ2W,EAAM6hC,aAAax4C,GAE9CP,EAAEC,QAAQ25C,EAAU,SAAUn5C,GAC1ByW,EAAMyiC,gBAAgBl5C,EAAMyW,EAAM2hC,SAASC,WAAYe,MAI/D3iC,EAAMyiC,gBAAkB,SAAU5xC,EAAI+xC,GAClC,GAAIlB,GAAUD,EAAW5wC,GACrBoa,EAAOniB,EAAE4f,KAAK1I,EAAMhT,QAAS00C,EAEjC,IAAI1hC,EAAMoiC,gBAKN,MAJApiC,GAAMqhC,cAAgBp2B,MACtBvE,GAAS,WACL1G,EAAMyvB,YAIL3mC,GAAEa,QAAQqW,EAAMqhC,iBACjBrhC,EAAMqhC,kBAIduB,EAAgBA,GAAiB33B,EAAKwyB,WAAY,CAElD,IAAIoF,GAAuD,KAA9C/5C,EAAEgyC,UAAU96B,EAAMqhC,cAAeK,IAEzCkB,GAAiBC,GAClB7iC,EAAMqhC,cAAc7gC,OAAO1X,EAAEgyC,UAAU96B,EAAMqhC,cAAeK,GAAU,GACtE1hC,EAAMyvB,YACEoT,GAAW53B,EAAKwyB,YAA+C,IAAlCz9B,EAAM2hC,SAASK,gBAAwBhiC,EAAMqhC,cAAc91C,OAASyU,EAAM2hC,SAASK,kBACxHhiC,EAAMqhC,cAAcnzC,KAAK+c,GACzBjL,EAAMyvB,aAIdzvB,EAAMuiC,qBAAuB,SAAUO,EAAQC,GAC3C,MAAID,IAAUA,EAAOx2C,eAAey2C,GACzBD,EAAOC,GAEX,IAGX/iC,EAAMsiC,UAAY,SAAUzxC,GACxB,IAAKmP,EAAMqhC,cACP,MAAO,EAEX,IAAIrhC,EAAMoiC,gBAAiB,CACvB,GAAIt5C,EAAEa,QAAQqW,EAAMqhC,eAAgB,CAChC,GAAIp2B,GAAOniB,EAAE8H,KAAKoP,EAAMqhC,cACxB,OAAOp2B,IAAQA,EAAKjL,EAAM2hC,SAASC,WAAa32B,EAAKjL,EAAM2hC,SAASC,YAAcH,EAAW5wC,GAAImP,EAAM2hC,SAASC,UAEhH,MAA+B,QAAxB5hC,EAAMqhC,eAA0BrhC,EAAMqhC,cAAcrhC,EAAM2hC,SAASC,WAAa5hC,EAAMqhC,cAAcrhC,EAAM2hC,SAASC,YAAcH,EAAW5wC,GAAImP,EAAM2hC,SAASC,UAI9K,MAA4D,KAArD94C,EAAEgyC,UAAU96B,EAAMqhC,cAAeI,EAAW5wC,KAGvDmP,EAAMgjC,qBAAuB,WACzB,IAAKhjC,EAAMqhC,eAAiBv4C,EAAEmT,QAAQ+D,EAAMqhC,eACxC,MAAO,WAGP,IAAI9Y,KAuBJ,OAtBIvoB,GAAM2hC,SAASx4B,SAAWnJ,EAAMqiC,eAChCv5C,EAAEmkC,OAAOjtB,EAAMqiC,eAAgB,SAAUl1C,EAAM9D,GAC3C,GAAI45C,GAAcn6C,EAAEimB,MAAM5hB,EAAM,SAAS+1C,GACrC,MAAOljC,GAAMsiC,UAAUtiC,EAAMuiC,qBAAqBW,EAAKljC,EAAM2hC,SAASC,YAEtEqB,GACA1a,EAAcr6B,KAAK7E,GAEnBP,EAAEkY,KAAK7T,EAAM,SAAU+1C,GACfljC,EAAMsiC,UAAUtiC,EAAMuiC,qBAAqBW,EAAKljC,EAAM2hC,SAASC,YAC/DrZ,EAAcr6B,KAAK8R,EAAMuiC,qBAAqBW,EAAKljC,EAAM2hC,SAASI,kBAMlFj5C,EAAEkY,KAAKhB,EAAMhT,QAAS,SAASk2C,GACvBljC,EAAMsiC,UAAUtiC,EAAMuiC,qBAAqBW,EAAKljC,EAAM2hC,SAASC,YAC/DrZ,EAAcr6B,KAAK8R,EAAMuiC,qBAAqBW,EAAKljC,EAAM2hC,SAASI,gBAIvExZ,EAAch9B,OAAS,EAAI,WAAazC,EAAE8H,KAAK23B,YAW9E,WACI,YAGA9/B,SAAQC,OAAO,YACdk5B,UAAU,YAAa,cAAe,SAAU3qB,GAC7C,OACI6sB,SAAU,KACV3X,YAAalV,EAAYqV,eAAiB,wCAC1CtM,OACIpD,KAAM,KAEVklB,KAAM,SAAU9hB,EAAOyiB,GAKnBziB,EAAMmjC,aAAe,SAAUC,EAAQC,GAC/BA,IAAQA,EAAI5F,UACZz9B,EAAMpD,KAAK4D,OAAO4iC,EAAQ,GAIlC,IAAI96C,GAAO,YAIXA,aAqChB,WACI,YACAG,SAAQC,OAAO,YACVk5B,UAAU,mBAAoB,WAC3B,OACIkC,SAAU,IACV9jB,OAEIsjC,UAAW,KAEfzhB,SAAU,gCACVnV,YAAa,SAAU,KAAM,WAAY,SAAUsV,EAAQ7mB,EAAIuL,GAG3Dsb,EAAOuhB,iBAAiB,YAAa,WAC7BvhB,EAAOshB,UAAU/3C,SACjBy2B,EAAO8C,aAAe,YACtB77B,IAAI,mBAAoB+4B,EAAOshB,UAAU/3C,QAEzCzC,EAAE06C,KAAKxhB,EAAOshB,WAAW1nC,KAAK,KAAK,KAAK,SAAS6nC,GAC7CzhB,EAAO8C,aAAe2e,GAAgB,0BAI1CtoC,EAAGgC,IAAI6kB,EAAOshB,WAAW1nC,KAErB,SAAUgJ,GACNod,EAAO8C,aAAeh8B,EAAE06C,KAAK5+B,IAAY,qBAG7C,SAAU8+B,GACN1hB,EAAO8C,aAAe4e,GAAU,0BAPxCvoC,WAQe,WACP6mB,EAAOshB,aACPr6C,IAAI,mBAAoB+4B,EAAOshB,UAAU/3C,qBAS7E,WACI,YAuCA9C,SAAQC,OAAO,YAAYk5B,UAAU,gBAAiB,WAClD,OACI5hB,OACI2jC,cAAe,IACfC,qBAAsB,IACtBC,oBAAqB,IACrBC,YAAa,KACbC,YAAa,KAEjBjiB,KAAM,SAAUE,EAAQuO,EAAM9O,GAC1B,GAAIuiB,GAAqC,iCACrCC,EAAoC,kEACnCjiB,GAAO8hB,cACR9hB,EAAO8hB,gBAEXt8C,OAAO08C,eAAiB,WACpB,MAAIliB,GAAO2hB,gBACA3hB,EAAO4hB,sBAAwBI,EAD1C,OAIJ,IAAIG,GAA6BniB,EAAO7rB,IAAI,uBAAwB,SAAUC,EAAO07B,EAAM/M,GACnF/C,EAAO2hB,kBACP16C,IAAI,6BAA8BmN,EAAO07B,EAAM/M,KAG1C/C,EAAO+hB,aAAgB/hB,EAAO+hB,cAAgBj7C,EAAEwY,SAASwwB,EAAM,IAAM9P,EAAO+hB,YAAc,QAEtF/hB,EAAO8hB,YAAYv4C,QAAYzC,EAAE8lB,KAAKoT,EAAO8hB,YAAa,SAAU50C,GAAO,MAAOpG,GAAEwY,SAASwwB,EAAM5iC,MAC/F+iC,QAAQjQ,EAAO6hB,qBAAuBI,IACvC7tC,EAAMulB,oBAO1BqG,GAAO7rB,IAAI,WAAY,WACnB3O,OAAO08C,eAAiB,KACxBC,aAOpB,WACI,YAEA17C,SAAQC,OAAO,YACVk5B,UAAU,uBAAwB,cAC/B,SAAU3qB,GACN,OACI6sB,SAAU,KACVjC,SAAU,sJACV7hB,OACIokC,kBAAmB,IACnBC,qBAAsB,KACtBC,oBAAqB,KACrBC,SAAU,MAEd73B,YAAa,SAAU,SAAU1M,GAkM7B,QAASwkC,GAAeC,GAEpB,GAAIA,GAAiBA,EAAcl5C,OAAS,EAAG,CAC3C,GAAIm5C,GAAMD,EAAc51C,MAAM,IAC1B61C,GAAIn5C,OAAS,IACbm5C,EAAIt2C,KAAKu2C,GACTF,EAAgBC,EAAI56C,KAAK,MAGjC,MAAO26C,GAIX,QAASE,GAAYC,EAAMC,GACvB,OAAQD,GACJ,IAAK,IACD,GAAa,MAATC,GAAyB,MAATA,GAAyB,OAATA,GAA0B,MAATA,EACjD,MAAO,EAEX,MACJ,KAAK,IACD,GAAa,MAATA,GAAyB,OAATA,GAA0B,MAATA,EACjC,MAAO,EAEN,IAAa,MAATA,EACL,MAAO,EAEX,MACJ,KAAK,IACD,GAAa,OAATA,GAA0B,MAATA,EACjB,MAAO,EAEN,IAAa,MAATA,GAAyB,MAATA,EACrB,MAAO,EAEX,MAEJ,KAAK,KACD,GAAa,MAATA,EACA,MAAO,EAEN,IAAa,MAATA,GAAyB,MAATA,GAAyB,MAATA,EACrC,MAAO,EAEX,MAEJ,KAAK,IACD,GAAa,MAATA,GAAyB,MAATA,GAAyB,MAATA,GAAyB,OAATA,EAChD,MAAO,GAInB,MAAO,GArPX7kC,EAAM8kC,wBAA0B,WAC5B,GAAIl6C,KAEJ,IAAIoV,EAAMqkC,sBAAwBrkC,EAAMokC,mBAAqBt7C,EAAEa,QAAQqW,EAAMokC,oBAIzE,GAAmC,IAA/BpkC,EAAMqkC,qBAEiC,IAAnCrkC,EAAMokC,kBAAkB74C,QACrBzC,EAAE4f,KAAK1I,EAAMokC,mBAAqBW,iBAAkB,QACpDj8C,EAAE4f,KAAK1I,EAAMokC,mBAAqBW,iBAAkB,QACvDn6C,EAAYsD,KAAK,aAElB,IAAuC,IAAnC8R,EAAMokC,kBAAkB74C,OAE3ByU,EAAMukC,SAEN35C,EAAYsD,KAAK8R,EAAMokC,kBAAkB,GAAGW,kBAG5Cn6C,EAAYsD,KAAK8R,EAAMokC,kBAAkB,GAAGW,iBAAmB,KAAO70C,OAAO8P,EAAMokC,kBAAkB,GAAGY,sBAAuB,YAAYzzC,OAAO,MAAQ,MAAQrB,OAAO8P,EAAMokC,kBAAkB,GAAGa,oBAAqB,YAAY1zC,OAAO,MAAQ,SAErP,IAAIyO,EAAMokC,kBAAkB74C,OAAS,EAAG,CAW3C,GAAI25C,KACJp8C,GAAEC,QAAQiX,EAAMokC,kBAAmB,SAAUe,GACzC,GAAIC,GAAkBD,EAAIJ,iBAAiB10C,QAAQ,KAC/Cg1C,EAAmBF,EAAIJ,iBAAiB10C,QAAQ,IAAK+0C,EAAkB,EAEnD,MAApBA,GAA+C,KAArBC,EAE1BH,EAAQh3C,KAAKi3C,EAAIJ,kBAGjBG,EAAQh3C,KAAK,GAAIkC,QAAO+0C,EAAIJ,kBAAkBn5C,MAAM,EAAGy5C,KAK/D,IAAIC,GAAUx8C,EAAEy8C,KAAKL,EA6FrB,IA3FAp8C,EAAEC,QAAQu8C,EAAS,SAAUE,GAGzB,GAAIC,KACJ38C,GAAEC,QAAQiX,EAAMokC,kBAAmB,SAAUe,GAEzC,GAAIC,GAAkBD,EAAIJ,iBAAiB10C,QAAQ,KAC/Cg1C,EAAmBF,EAAIJ,iBAAiB10C,QAAQ,IAAK+0C,EAAkB,EAIlD,MAApBA,GAA+C,KAArBC,GAA6BG,IAAaL,EAAIJ,iBASlES,IAAa,GAAIp1C,QAAO+0C,EAAIJ,kBAAkBn5C,MAAM,EAAGy5C,KAE1DrlC,EAAMukC,SAENkB,EAAWv3C,MACP49B,IAAKhjC,EAAEygB,KAAK,GAAInZ,QAAO+0C,EAAIJ,kBAAkBn5C,MAAMy5C,EAAkBF,EAAIJ,iBAAiBx5C,QAAQQ,QAAQ,IAAK,KAC/G4F,KAAM,KAIV8zC,EAAWv3C,MACP49B,IAAKhjC,EAAEygB,KAAK,GAAInZ,QAAO+0C,EAAIJ,kBAAkBn5C,MAAMy5C,EAAkBF,EAAIJ,iBAAiBx5C,QAAQQ,QAAQ,IAAK,KAC/G4F,KAAM,KAAOzB,OAAOi1C,EAAIH,sBAAuB,YAAYzzC,OAAO,MAAQ,MAAQrB,OAAOi1C,EAAIF,oBAAqB,YAAY1zC,OAAO,MAAQ,OAnBhJyO,EAAMukC,UAEPkB,EAAWv3C,MACP49B,IAAK,GACLn6B,KAAM,KAAOzB,OAAOi1C,EAAIH,sBAAuB,YAAYzzC,OAAO,MAAQ,MAAQrB,OAAOi1C,EAAIF,oBAAqB,YAAY1zC,OAAO,MAAQ,OAsC7J,IAAIm0C,GAAa58C,EACZ68C,MAAMF,GACNt8B,QAAQ,QACRy8B,UACAh8C,IAAI,SAAUi8C,GACX,MAAO/8C,GAAEg9C,WAAW,OAAQ,QAASD,KAExCt8C,QAIDuJ,IACC4yC,IAAoC,IAAtBA,EAAWn6C,OAK1BzC,EAAEC,QAAQ28C,EAAY,SAAUz6B,GAC5B,GAAI86B,GAAaj9C,EAAEc,IAAIqhB,EAAK+6B,KAAM,OAAOl8C,KAAK,IAC9Ci8C,GAAavB,EAAeuB,IACT,gBAAfA,GAA+C,eAAfA,KAIhCA,EAAa,IAEjBjzC,EAAO5E,KAAKs3C,GAAYO,EAAa,IAAMA,EAAa,KAAO96B,EAAKtZ,OAASqO,EAAMukC,SAAW,IAAMt5B,EAAKtZ,KAAO,OAZpHmB,EAAO5E,KAAKs3C,GAiBhB56C,EAAc9B,EAAEorB,MAAMtpB,EAAakI,KAKnCkN,EAAMskC,oBAAqB,CAC3B,GAAI2B,GAAmBr7C,EAAYd,KAAK,KACxCc,MACAA,EAAYsD,KAAK+3C,SAMxB,IAAIjmC,EAAMokC,kBAIX,GAAuC,IAAnCpkC,EAAMokC,kBAAkB74C,QAA+C,OAA/ByU,EAAMokC,kBAAkB,IAA8C,OAA/BpkC,EAAMokC,kBAAkB,GACvGx5C,EAAYsD,KAAK,aACd,IAAI8R,EAAMokC,kBAAkB74C,OAAS,EAAG,CAK3C,GAAI25C,KACJp8C,GAAEC,QAAQiX,EAAMokC,kBAAmB,SAAUe,GACzC,GAAIC,GAAkBD,EAAI90C,QAAQ,KAC9Bg1C,EAAmBF,EAAI90C,QAAQ,IAAK+0C,EAAkB,EAC1DF,GAAQh3C,KAAK,GAAIkC,QAAO+0C,GAAKv5C,MAAM,EAAGy5C,KAI1C,IAAIC,GAAUx8C,EAAEy8C,KAAKL,EACrB,IAAuB,IAAnBI,EAAQ/5C,OAAc,CAGtB,GAAI26C,KACJp9C,GAAEC,QAAQiX,EAAMokC,kBAAmB,SAAUe,GAEzC,GAAIC,GAAkBD,EAAI90C,QAAQ,KAC9Bg1C,EAAmBF,EAAI90C,QAAQ,IAAK+0C,EAAkB,EAE1Dc,GAAgBh4C,KAAKpF,EAAEygB,KAAK,GAAInZ,QAAO+0C,GAAKv5C,MAAMy5C,EAAkBF,EAAI55C,QAAQQ,QAAQ,IAAK,QAKjGnB,EAAYsD,KAAKo3C,EAAQ,GAAK,IAAMY,EAAgBp8C,KAAK,OAKrE,MAAOc,aAqEnC,WACI,YAOA,SAASu7C,GAAoBz/B,GAQzB,QAAS0/B,GAAsBpmC,EAAOwhB,EAASgP,GAC3C,GACI6V,GAAkB7V,EAAK8V,iBAAmB,GAC1CC,EAAgB/V,EAAK+V,eAAiB,IACtC/pC,EAAU,KACVgqC,EAAgB,IAEpBH,GAAkB7zC,SAAS6zC,EAAiB,IAC5CE,EAAgB/zC,SAAS+zC,EAAe,IAGxC/kB,EAAQphB,KAAK,SAAU,WACnB,GAAIqmC,GAAYjlB,EAAQ,GAAGklB,cAAgBllB,EAAQ,GAAGmlB,aAAenlB,EAAQ,GAAGpuB,UAGhEizC,GAAZI,GAA6D,EAA7BA,EAAYD,IAG5B,OAAZhqC,GACAkK,EAASokB,OAAOtuB,GAEpBA,EAAUkK,EAAS,WACf1G,EAAMmiB,MAAMqO,EAAK2V,qBACjB3pC,EAAU,MACX+pC,IAEPC,EAAgBC,IAjCxB,GAAI7kB,IACAkC,SAAU,IACVhC,KAAMskB,EAGV,OAAOxkB,GAZXn5B,QACKC,OAAO,YACPk5B,UAAU,sBAAuBukB,GAEtCA,EAAoBzvC,SAAW,eA6CnC,WACI,YAEAjO,SAAQC,OAAO,YACVk5B,UAAU,YACP,SAAU,cAAe,qBAAsB,uBAAwB,cAAe,SAAUnH,EAAQxjB,EAAayjB,EAAoB/T,EAAsB7M,GAC3J,OACIgqB,SAAU,KACVnC,YAAY,EACZ3hB,OACI4mC,KAAM,IACN36C,OAAQ,KAEZkgB,YAAalV,EAAYqV,eAAiB,wCAC1CwV,KAAM,SAAU9hB,EAAOyiB,EAAIhB,GAGvBzhB,EAAM6mC,aAAe7mC,EAAM4mC,KAE3B99C,EAAEC,QAAQiX,EAAM6mC,aAAc,SAAUjzC,GAEpC,GAAIA,EAAI8nB,SAAU,CACd,GAAIorB,GAAiBlzC,EAAI8nB,SAAStU,IAAMT,EAAqBhN,aAAa/F,EAAI8nB,SAAStU,KAAOtN,EAE1FitC,EAAiBrsB,EAAmB9T,cAAchT,EAAI8nB,SAASR,iBAEnER,GAAmB/S,gBAAgBo/B,EAAejgC,SAAUigC,EAAehgC,OAAQ+/B,GAAgBlrC,KAAK,SAAUC,GAC9GjI,EAAIozC,QAAUnrC,OAK1BmE,EAAMo5B,SAAW,SAAUxlC,GACvB,GAAIqzC,GAAerzC,EAAIszC,KAAK72C,QAAQ,KAEhC82C,EAAcF,EAAe,GAAKrzC,EAAIszC,KAAKz0C,UAAU,EAAGw0C,GAAgBrzC,EAAIszC,IAGhF,OAAOzsB,GAAOsK,QAAQvvB,OAAS2xC,WAY3D,WACI,aA8BA,SAASC,GAAwB3Y,GAGhC,QAASnmC,KAEL,GAAI++C,GAAe5Y,EAAa9xB,IAAI,kBAG/B0qC,GAAgBA,EAAe,GAAoB,EAAfA,KACrCA,EAAe,GAGnBC,EAAgBC,YAAcF,EAX/B,GAAIC,GAAkBh+C,IAczBhB,KAQD,QAASk/C,KAOL,QAASC,GAAaznC,EAAOwhB,GACzBxhB,EAAMqiB,OAAO,cAAe,WACxB,GAAIqlB,IACAC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MAGPxmB,GAAQuP,KAAMkX,MAASP,EAAO1nC,EAAMunC,iBAjB5C,GAAI3lB,IACAkC,SAAU,IACV9jB,OAASunC,YAAa,KACtBzlB,KAAM2lB,EAiBV,OAAO7lB,GAxEXn5B,QAAQC,OAAO,YAAYk5B,UAAU,iBAAkB,cAAe,SAAU3qB,GAC5E,OACI6sB,SAAU,IACV3X,YAAalV,EAAYqV,eAAiB,mDAC1CkX,QAAS,qBASjB/6B,QAAQC,OAAO,YAAYk5B,UAAU,iBAAkB,cAAe,SAAU3qB,GAC5E,OACI6sB,SAAU,IACVpX,WAAY06B,EACZc,aAAc,sBAItBz/C,QAAQC,OAAO,YAAYk5B,UAAU,WAAY4lB,GAwDjDJ,EAAwB1wC,SAAW,mBAGvC,WACI,YAEA,IAAIyxC,GAAM1/C,QAAQC,OAAO,WAEzBy/C,GAAIvmB,UAAU,qBAAsB,UAAW,WAAY,SAAUgX,EAASlyB,GAC1E,OACIod,SAAU,IACVnC,YAAY,EACZ3hB,OACIooC,cAAe,IACfC,YAAa,KACbC,aAAc,MAElB57B,YAAa,SAAU,WAAY,UAAW,SAAUsV,EAAQ0P,EAAUkH,GAmBtE,QAAS2P,KACL7hC,EAAS,WACL,GAAI8hC,GAAM,CACV1/C,GAAEk5B,EAAO90B,OAAOtD,IAAI,SAASqhB,EAAMphB,GAC/B2+C,GAAOv9B,EAAKuW,QAAQinB,YAAW,GAC3BD,EAAO9W,EAASgX,aAAeL,GAAiBrmB,EAAOsmB,cAAgBz+C,EAAKm4B,EAAOsmB,aAAe,EAC7Fx/C,EAAE8lB,KAAKoT,EAAOomB,cAAen9B,EAAKoZ,WACnCrC,EAAOomB,cAAcl6C,KAAK+c,EAAKoZ,SAC/BpZ,EAAKuW,QAAQ4B,SAAS,YAG1Bt6B,EAAEqV,OAAO6jB,EAAOomB,cAAen9B,EAAKoZ,SACpCpZ,EAAKuW,QAAQ0B,YAAY,aAE9B35B,UAhCXy4B,EAAOomB,iBACPpmB,EAAO90B,QAEP,IAAIy7C,GAAc,IACdC,EAAiB,KAEjBP,EAAermB,EAAOqmB,aAAe,GAEzC/+C,MAAKu/C,aAAe,SAAU59B,GAC1B+W,EAAO90B,MAAMgB,KAAK+c,GAClBs9B,KAGJj/C,KAAKw/C,eAAiB,SAAU79B,GAC5BniB,EAAEqV,OAAO6jB,EAAO90B,MAAO+d,GACvBniB,EAAEqV,OAAO6jB,EAAOomB,cAAen9B,IAqBnCxiB,QAAQ+4B,QAAQoX,GAASx4B,KAAK,SAAU,WACb,OAAnBwoC,GACAG,aAAaH,GAGjBA,EAAiB11C,WAAWq1C,EAAmBI,OAIvD7mB,KAAM,SAAU9hB,EAAOyiB,EAAIhB,EAAOC,EAAMC,GACpCA,EAAW,SAAU+G,GACjBjG,EAAG1jB,OAAO2pB,UAO1Byf,EAAIvmB,UAAU,eAAgB,WAC1B,OACI4B,QAAS,qBACTM,SAAU,IACV9jB,OACIgpC,aAAc,KAElBlnB,KAAM,SAAU9hB,EAAOyiB,EAAIhB,EAAOwnB,GAC9B,GAAIh+B,IACAuW,QAASiB,EACT4B,QAASrkB,EAAMgpC,cAAgBvmB,EAAG,GAAGymB,UACrCvJ,KAAM,WACFld,EAAGW,SAAS,WAEhB8S,KAAM,WACFzT,EAAGS,YAAY,WAIvBT,GAAGW,SAAS,UAEZ6lB,EAAaJ,aAAa59B,GAE1BjL,EAAM7J,IAAI,WAAY,WAClB8yC,EAAaH,eAAe79B,YAShD,WACI,YAEA,IAAIk9B,GAAM1/C,QAAQC,OAAO,WAEzBy/C,GAAIvmB,UAAU,eAAgB,WAC1B,OACIkC,SAAU,IACVhC,KAAM,SAAU9hB,EAAOyiB,GACnBA,EAAGiT,GAAG,QAAS,SAASyT,GACpB,GAAIC,GAAoBD,EAAGhY,cACvBvC,EAAWwa,EAAkBC,wBAAwBx+C,IACrDy+C,EAAeF,EAAkBC,wBAAwB7X,OAEzD+X,EAAe1Y,EAAEuY,GAAmB1gC,KAAK,kBACzC8gC,EAAaD,EAAaE,cAE1BC,EAAO7Y,EAAErpC,OAITonC,GAAW4a,GAAcE,EAAKlY,SAAW5C,EAAW0a,EAAeE,EACnE/mB,EAAGW,SAAS,UAGZX,EAAGS,YAAY,mBAUvC,WACI,YAMA,SAASymB,KAQL,QAASC,GAAO5pC,EAAOwhB,EAASC,GAC5B,QAASooB,KACL,GAAIC,GAAiBtoB,EAAQuoB,QAC7BvoB,GAAQuP,KACJiZ,YAAc,IAAOF,EAAeG,KAAQ,KAC5CC,YAAc,KAAOJ,EAAeG,KAAQ,OAIpDJ,IAEA7pC,EAAM7J,IAAI,oBAAqB0zC,GAC/B7pC,EAAM7J,IAAI,oBAAqB0zC,GAnBnC,GAAIM,IACArmB,SAAU,IACVhC,KAAM8nB,EAGV,OAAOO,GAVX1hD,QAAQC,OAAO,YAAYk5B,UAAU,kBAAmB+nB,GAExDA,EAAgBjzC,cA0BpB,WACC,YACAjO,SAAQC,OAAO,YAAYk5B,UAAU,UAAW,WAC/C,OACCkC,SAAU,IACVhC,KAAM,SAAUE,EAAQR,EAASqO,GAChCrO,EAAQ,GAAG4oB,aAAa,UAAWva,EAAWwa,gBAKlD,WACI,YAOA5hD,SAAQC,OAAO,YAAY0C,OAAO,mBAAoB,WAClD,MAAO,UAAUwrC,GACb,MAAIA,GACOA,EAAMlrC,OAAO,GAAGC,cAAgBirC,EAAMvvB,OAAO,GAAGtb,QAAQ,SAAU,OAElE6qC,QAOvBnuC,QACKC,OAAO,YACP0C,OAAO,aAAc,WAClB,MAAO,UAASwrC,EAAO0T,EAAOC,GAC1B,GAAIx8C,MAAMu8C,GAAQ,MAAO1T,EACzB,IAAa,GAAT0T,EAAY,MAAO,EACvB,IAAI1T,GAASA,EAAMrrC,OAAS++C,EAAO,CAG/B,GAFA1T,EAAQA,EAAMnkC,UAAU,EAAG63C,GAEtBC,EAOD,KAA0C,MAAnC3T,EAAMlrC,OAAOkrC,EAAMrrC,OAAS,IAC/BqrC,EAAQA,EAAMvvB,OAAO,EAAGuvB,EAAMrrC,OAAS,OAR7B,CACd,GAAIi/C,GAAY5T,EAAMpqC,YAAY,IAEhB,MAAdg+C,IACA5T,EAAQA,EAAMvvB,OAAO,EAAGmjC,IAOhC,MAAO5T,GAAQ,MAEnB,MAAOA,MAGnB,WACC,YAEAnuC,SAAQC,OAAO,YAAY0C,OAAO,sBAAsB,UAAW,SAAUF,GAC5E,MAAO,UAAU0rC,EAAOrlC,GACvB,GAAIk5C,GAAsB,KAG1B,IAAI7T,EAAO,CAELrlC,IAAQA,EAAS,wBAGlB,GAAInB,QAAOwmC,GAAOvmC,QAAQ,SAAY,KACzCumC,EAAQpkC,SAAS,GAAIpC,QAAOwmC,GAAOvvB,OAAO,IAG3C,IAAIqjC,GAAax6C,OAAO0mC,EACpB8T,GAAWp6C,YACdm6C,EAAsBv/C,EAAQ,QAAQ,GAAI2C,MAAK+oC,GAAQrlC,IAIzD,MAAOk5C,UAIV,WACI,YACAhiD,SAAQC,OAAO,YAAY0C,OAAO,SAAU,WACxC,MAAO,UAAU4E,EAAMkC,EAAUX,GAO7B,GAJKA,IACDA,EAAS,2BAGPvB,GAAQE,OAAOC,SAASH,IAAWA,EAAKmC,IAAQnC,EAAKmC,KAAM,CAC7D,GAAIw4C,GAAOz4C,GAAYlC,EAAKmC,IAC5B,OAAOnC,GAAKmC,GAAGw4C,GAAMp5C,OAAOA,GAE5B,MAAOrB,QAAOiC,GAAGnC,EAAMkC,GAAUX,OAAOA,SAKxD9I,QAAQC,OAAO,YAAY0C,OAAO,oBAAqB,WACnD,MAAO,UAASwrC,GAEZ,MADAA,GAAQA,EAAM7qC,QAAQ,KAAM,UAKpC,WACI,YACAtD,SAAQC,OAAO,YAAY0C,OAAO,YAAa,WAC3C,MAAO,UAAU4E,GACb,MAAOE,QAAOF,GAAM27B,eAIhC,WACI,YACAljC,SAAQC,OAAO,YAAY0C,OAAO,gBAAiB,WAC/C,MAAO,UAAUw/C,GAEb,MAAOA,GAAEj7C,WAAW5D,QAAQ,KAAM,MAAMA,QAAQ,KAAM,YAIlE,WACI,YACAtD,SAAQC,OAAO,YAChB0C,OAAO,mBAAoB,WACxB,MAAO,UAAUuG,GACb,MAAOzB,QAAOyB,EAAM,YAAYJ,OAAO,gBAIjD,WACI,YAEH9I,SAAQC,OAAO,YAAY0C,OAAO,WAAY,WAC1C,MAAO,UAAUoK,GACb,MAAIC,WAAYA,SAASC,UAAUF,GACxBC,SAASD,GAETA,QAMpB/M,QAAQC,OAAO,YAAY0C,OAAO,WAAY,WAC1C,MAAO,UAAUwrC,GACb,MAAOA,GAAQA,EAAMrhC,aAAe,MAK5C,WACI,YAEA9M,SACKC,OAAO,YACP0C,OAAO,cAAe,WACnB,MAAO,UAAUy/C,GACb,IAAKA,EAAO,MAAO,EAEnB,IAAIthD,GAAQshD,EAAIl7C,WAAW4Z,OAAOxd,QAAQ,MAAO,GAEjD,IAAIxC,EAAM2L,MAAM,UACZ,MAAO21C,EAGX,IAAIC,GAASt0B,EAAMrhB,CAEnB,QAAQ5L,EAAMgC,QACV,IAAK,IACDu/C,EAAU,EACVt0B,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,EACrB,MAEJ,KAAK,IACDk/C,EAAUvhD,EAAM,GAChBitB,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,EACrB,MAEJ,KAAK,IACDk/C,EAAUvhD,EAAMqC,MAAM,EAAG,GACzB4qB,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,EACrB,MAEJ,SACI,MAAOi/C,GASf,MANgB,KAAZC,IACAA,EAAU,IAGd31C,EAASA,EAAOvJ,MAAM,EAAG,GAAK,IAAMuJ,EAAOvJ,MAAM,IAEzCk/C,EAAU,KAAOt0B,EAAO,KAAOrhB,GAAQoU,aAI/D,WACI,YACA9gB,SAAQC,OAAO,YAChB0C,OAAO,cAAe,WACnB,MAAO,UAAU8B,EAAO69C,GACpB,GAAIC,MACAC,EAAMz4C,SAASu4C,EAAUG,UACzBC,EAAM34C,SAASu4C,EAAUK,UAEzBC,EAAe,CAUnB,OARA5iD,SAAQM,QAAQmE,EAAO,SAAU+d,GACzBogC,GAAgBJ,GAAuBE,GAAhBE,GACvBL,EAAS98C,KAAK+c,GAGlBogC,MAGGL,QAIjB,WACI,YACAviD,SAAQC,OAAO,YACV0C,OAAO,wBAAyB,WAC7B,MAAO,UAAUkgD,EAAWlsC,GACxB,GAAKksC,EAAL,CACA,IAAKlsC,EAAY,MAAOksC,EACxB,IAAIC,GAAYnsC,EAAWkJ,aAC3B,OAAOgjC,GAAUlgD,OAAO,SAAS6f,GAC7B,GAAIugC,GAAkB1iD,EAAE2iD,WAAWxgC,EAAK+U,UAAU1X,cAAeijC,GAC7DG,EAAiB5iD,EAAE2iD,WAAWxgC,EAAK8U,SAASzX,cAAeijC,GAC3DI,EAAsB7iD,EAAE2iD,WAAWxgC,EAAK+U,UAAU1X,cAAgB,IAAM2C,EAAK8U,SAASzX,cAAeijC,GACrGK,EAAsB9iD,EAAE2iD,WAAWxgC,EAAK8U,SAASzX,cAAgB,KAAO2C,EAAK+U,UAAU1X,cAAeijC,GACtGM,EAAuB/iD,EAAE2iD,WAAWxgC,EAAK8U,SAASzX,cAAgB,IAAM2C,EAAK+U,UAAU1X,cAAeijC,GACtGO,EAAuBhjD,EAAE2iD,WAAWxgC,EAAK8U,SAASzX,cAAgB,IAAM2C,EAAK+U,UAAU1X,cAAeijC,EAC1G,OAAOC,IAAmBE,GAAkBC,GAAuBC,GAAuBC,GAAwBC,WAMtI,WACI;AAEArjD,QACKC,OAAO,YACP0C,OAAO,YAAa,WACjB,MAAO,UAASy/C,GACZ,IAAKA,EACD,MAAO,EAGX,IAAIthD,GAAQshD,EAAIl7C,WAAW4Z,OAAOxd,QAAQ,MAAO,GAEjD,IAAIxC,EAAM2L,MAAM,UACZ,MAAO21C,EAGX,IAAar0B,GAAMrhB,EAAQshB,CAC3B,OAAIltB,GAAMgC,QAAU,IAChBirB,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,GACrBuJ,EAASA,EAAOvJ,MAAM,EAAG,GAAK,IAAMuJ,EAAOvJ,MAAM,IACzC,KAAO4qB,EAAO,KAAOrhB,GAAQoU,SAErCiN,EAAOjtB,EAAMqC,MAAM,EAAG,GACtBuJ,EAAS5L,EAAMqC,MAAM,EAAG,IACxBuJ,EAASA,EAAOvJ,MAAM,EAAG,GAAK,IAAMuJ,EAAOvJ,MAAM,GACjD6qB,EAAYltB,EAAMqC,MAAM,KAChB,KAAO4qB,EAAO,KAAOrhB,EAAS,SAAWshB,GAAWlN,cAmChF9gB,QACKC,OAAO,YACP0C,OAAO,QAAS,WACb,MAAO,UAAUwrC,EAAOmV,GACpB,GAAIh+C,MAAMg+C,GAAQ,MAAOnV,EACzB,IAAa,GAATmV,EAAY,MAAO,EACvB,IAAInV,EAAO,CACP,GAAIoV,GAAapV,EAAM/nC,MAAM,MACzBm9C,GAAWzgD,OAASwgD,IACpBnV,EAAQoV,EAAWpgD,MAAM,EAAGmgD,GAAOjiD,KAAK,KAAO,OAGvD,MAAO8sC,MAGnB,WACC,YACAnuC,SAAQC,OAAO,YACb0C,OAAO,QAAS,WAChB,MAAO,UAAUsD,EAAMnD,EAAQ0gD,GAC9B,MAAIv9C,GACI,MAED,WASX,WACC,YASA,SAASw9C,GAAuBjgC,EAAWhV,EAAamqB,EAAgBlU,GA4BvE,QAASi/B,KAER/qB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,QAM1G,QAASc,KAEJ+jD,EAAGz2C,QAAU9M,EAAEwjD,SAASD,EAAGz2C,SAAS9M,EAAE8wB,MAAMyyB,EAAGE,cAAeF,EAAGz2C,QAGrEy2C,EAAGG,WAAav1C,EAAyB,aAAkD,OAA7CA,EAAyB,YAAEqR,cAGzE8Y,EAAethB,YAAY,UAAW2sC,GAAc,GAG/CxgC,EAAUI,IAAI,4BAElBggC,EAAGK,kBAAmB,EAGtBL,EAAGM,SAAU,EAGbz/B,EAAwBC,QAAQk/B,EAAGO,UAAUhxC,KAAK,SAASixC,GAE1DR,EAAGQ,oBAAsBA,EAGzBR,EAAGS,wBAA0B71C,EAAY41C,EAAoB39C,KAG7Dm9C,EAAGM,SAAU,KAMhB,QAASF,GAAaxpC,GACjBA,EAAQ5Z,KAAuB,wBAAhB4Z,EAAQ5Z,MAE1BgjD,EAAGU,YAAc9pC,EAAQ1Z,MAAM6iD,QAG3BnpC,EAAQ1Z,MAAM6iD,WAAY,EAAM3jD,QAAQ+4B,QAAQ,QAAQ4B,SAAS,4BAChE36B,QAAQ+4B,QAAQ,QAAQ0B,YAAY,6BA1E3C,GAAImpB,GAAK/iD,IACT+iD,GAAGM,SAAU,EACbN,EAAGK,kBAAmB,EACtBL,EAAGQ,oBAAsB,KACzBR,EAAGS,wBAA0B,GAC7BT,EAAGU,aAAc,EACjBV,EAAGG,YAAa,EAChBH,EAAGE,eACFS,SAAW,EACXC,YAAc,EACdC,YAAc,EACdC,cAAgB,EAChBC,QAAU,EACVC,gBAAkB,EAClBC,cAAgB,GAIjBjB,EAAGF,YAAcA,EAGjB7jD,IA7BDG,QAAQC,OAAO,YAAYgkB,WAAW,2BAA4Bw/B,GAGlEA,EAAuBx1C,SAAW,YAAa,cAAe,kBAAmB,8BAyFlF,WACC,YASA,SAAS62C,GAAsBt2C,GAE9B,OACC6sB,SAAU,IACV/3B,SAAS,EACT41B,YAAY,EACZxV,YAAalV,EAAYqV,eAAiB,4DAC1CI,WAAY,2BACZw7B,aAAc,mBACdsF,kBACCZ,SAAU,IACVa,WAAY,IACZC,uBAAwB,IACxB93C,OAAQ,KAEToK,UArBFvX,QAAQC,OAAO,YAAYk5B,UAAU,eAAgB2rB,GAGrDA,EAAsB72C,SAAW,kBAsBlC,WACC,YAQA,SAASi3C,GAAkChzB,EAAW1jB,EAAaoT,EAAUyS,GAS5E,QAAS8wB,KACR,GAAInK,GAAeoK,GAEfpK,KAAiBqK,EAAarK,EAAa5yC,KAAOX,SAAS4oB,SAAS2qB,EAAazzC,KAAK67B,MAAM,SAC/F/O,EAAOM,QAAQqmB,EAAaxgC,QAASwgC,EAAahtC,OACjD6mB,aAAa,EACbU,QAAS,EACTT,gBAAiB,EACjBmB,SAAU,WACT,GAAIwO,GAAgBvS,EAAUwS,OAAOt+B,MAAM,KACvCu+B,EAAazS,EAAUwS,MACvBD,GAAc3hC,OAAS,IAC1B6hC,EAAaF,EAAcA,EAAc3hC,OAAS,GAAK,IAAM2hC,EAAcA,EAAc3hC,OAAS,IAGnG8e,EAAS,mCAAoCo5B,EAAa5yC,IACzDmqB,KAAM,IACN+yB,QAAQ,EACR1gB,OAAQD,EACR4gB,QAAS,GACTC,eAAgB,aAOrB,QAASJ,KACR,IACC,GAAIpK,GAAevnC,KAAK2jB,MAAM5oB,EAAqC,wBACnE,IAAIwsC,EAAazzC,MAAQyzC,EAAaxgC,SAAWwgC,EAAahtC,MAE7D,MADAgtC,GAAazzC,KAAOE,OAAOuzC,EAAazzC,MACjCyzC,EAGT,MAAO96C,GACN,MAAO,OAIT,QAASmlD,GAAaj9C,GACrB,GAAIq9C,GAAc7jC,EAAS,mCAE3B,OADA/E,SAAQrc,IAAIilD,GACLA,GAAeA,IAAgBr9C,EAnDvC,GAAI6wB,GAAOp4B,IAEXo4B,GAAKysB,QAAU,WACVl3C,EAAqC,yBACxC22C,KAXHnlD,QAAQC,OAAO,YAAY0lD,UAAU,2BACpC1hC,WAAYihC,IAGbA,EAAkCj3C,SAAW,YAAa,cAAe,WAAY,aA2DtF,WACI,YAMJ,SAAS23C,GAAWrsB,EAAQrH,EAAWie,EAAS3hC,EAAa4a,EAAoBzW,EAAOkzC,GAYhF,QAASC,KACL,GAAIC,GAAUF,EAAShvC,QAEvBxW,GAAEC,QAAQylD,EAAS,SAAUrsC,EAAG8sB,GAC5Bqf,EAASnwC,OAAO8wB,KAdxBjN,EAAOoX,SAAW,SAASqV,GACvB,MAAOA,KAAU9zB,EAAUK,QAG/BgH,EAAO0sB,eAAiB,WACpB,GAAIC,GAAiB98B,EAAmBjI,gBAExC,OAAO+kC,IAWX3sB,EAAO4sB,QAAU,WACb,GAAIC,GAAa53C,EAAY63C,YACzBC,EAAc93C,EAAY+3C,gBAE9BT,KAEAnzC,EAAMgD,WAENw6B,EAAQnxC,SAASC,KAAOmnD,EAAa,0BAAiCE,GAhClFtmD,QAAQC,OAAO,YAAYgkB,WAAW,aAAc2hC,GAEpDA,EAAW33C,SAAW,SAAU,YAAa,UAAW,cAAe,qBAAsB,QAAS,eAmCtG,WACI,YAEAjO,SAAQC,OAAO,YACVk5B,UAAU,cACP,cAAe,SAAS3qB,GACpB,OACI6sB,SAAU,MACV9jB,OACI4sC,SAAU,YAC5Bc,uBAAwB,KAEVhhC,WAAY,iBACZP,YAAalV,EAAYqV,eAAiB,6CAC1CwV,KAAM,SAAS9hB,EAAOwhB,EAASytB,SAM1CviC,WAAW,kBACR,SAAU,YAAa,UAAW,OAAQ,cAAe,qBAAsB,aAAc,0BAA2B,eACxH,SAAUsV,EAAQrH,EAAWie,EAAStT,EAAMruB,EAAa4a,EAAoB7b,EAAYkX,EAAyBgiC,GAE9GltB,EAAOmtB,kBAAmB,EAC1BntB,EAAOotB,YAAa,EACpBptB,EAAOqtB,gBACPrtB,EAAOstB,aAAe,KACtBttB,EAAOutB,qBAAuB,0BAC9BvtB,EAAOwtB,cAAgBv4C,EAAyB,aAA0D,OAArD7G,OAAO6G,EAAyB,aAAGqR,cAExF0Z,EAAOoX,SAAW,SAASqV,GACvB,MAAOA,KAAU9zB,EAAUK,QAG/BgH,EAAOytB,gBAAkB,WACrB59B,EAAmB/b,oBAAoB8F,KAAK,SAASwM,GACjD8E,EAAwBC,QAAQ6U,EAAO4qB,UAAUhxC,KAAK,SAAUgB,GAC5D3T,IAAI2T,GACJolB,EAAOstB,aAAe1yC,EACtBolB,EAAO0tB,oBAAsBpqB,EAAKqqB,mBAAmB14C,EAAY+qB,EAAOstB,aAAapgD,WAIjG8yB,EAAOytB,kBAGPztB,EAAO4tB,cAAgB,WACnB/9B,EAAmB/b,oBAAoB8F,KAAK,SAASwM,GACjD8mC,EAAa/0B,UAAU/R,EAAQ,8CAA8CxM,KAAK,SAASi0C,GACvF7tB,EAAO8tB,WAAaD,OAIhC7tB,EAAO4tB,gBAEP5tB,EAAO7rB,IAAI,gCAAiC,SAASC,EAAOwG,GACxDolB,EAAOqtB,aAAezyC,IAG1BolB,EAAO7rB,IAAI,0BAA2B,SAASC,EAAOwG,GAClDolB,EAAOotB,YAAa,IAGxBptB,EAAO7rB,IAAI,4BAA6B,SAAUC,EAAOwG,GACrDolB,EAAOotB,YAAa,IAGxBptB,EAAO0sB,eAAiB,WACpB,GAAIC,GAAiB98B,EAAmBjI,gBAExC,OAAO+kC,IAGX3sB,EAAO+tB,aAAe,WAClB/5C,EAAWye,WAAW,gBACtBuN,EAAOmtB,kBAAmB,GAG9BntB,EAAOguB,WAAa,WAChBh6C,EAAWye,WAAW,0BAA2B,QACjDuN,EAAOotB,YAAa,SAMxC,WACI,YAEH,IAAIa,GAAqB,GAAIztC,OAAM2C,mBAC/B+qC,EAAiB1tC,MAAMkd,cAAc,UAAW,kBAEhDnd,EAAeC,MAAMvL,YACrBwL,EAAuBF,EAAaG,YAAc,sBAEnDja,SAAQC,OAAO,YACVk5B,UAAU,sBAAuB,cAAe,SAAS3qB,GACtD,OACI6sB,SAAU,MACV9jB,OAAQ+sC,YAAY,KACpBrgC,WAAY,yBACZP,YAAalV,EAAYqV,eAAiB,6DAGjDI,WAAW,0BACR,SAAU,qBAAsB,sBAAuB,cAAe,aAAc,WAAY,WAAY,YAAa,kBAAmB,iBAAkB,SAAUsV,EAAQnQ,EAAoB4T,EAAqBxuB,EAAajB,EAAYs4C,EAAUjkC,EAAUsQ,EAAWyG,EAAgBvE,GAkF7R,QAAS0xB,GAAgBnhB,GACrB,GAAIohB,GAAUF,EAAShvC,QAEtCxW,GAAEC,QAAQylD,EAAS,SAAUrsC,EAAG8sB,GAC1BA,EAAEwc,WAAWjpC,MAAMvL,YAAYyL,cACnC2H,EAASlM,OAAO8wB,GAAKjU,KAAM,IAAKqS,OAAQD,MAwB/B,QAAS9kC,KACpBupB,EAAmB/b,oBAAoB8F,KAAK,SAASwM,GACpD4Z,EAAOvB,QAAUrY,EAAQ,6CACzB4Z,EAAOmuB,OAAS/nC,EAAQ,2CACxB4Z,EAAOouB,UAA8D,KAAlDhoC,EAAQ,sCAA+CA,EAAQ,sCAAwC,iBAE1H4Z,EAAOquB,eAAiB5qB,EAAoBzS,YAAYxrB,OAAOg4B,eAAiB,MAAO,KAAM,MAAMle,SAASrK,EAAYyL,aAExH4tC,MAGclvB,EAAethB,YAAY,UAAW2sC,GAAc,GAIpE,QAASA,GAAaxpC,GACjBA,EAAQ5Z,KAAuB,wBAAhB4Z,EAAQ5Z,MAAkC4Z,EAAQ1Z,MAAM6iD,WAAY,GAAUnpC,EAAQ1Z,MAAM6iD,WAAY,GAAiC,yBAAzBnpC,EAAQ1Z,MAAM/B,UAChJw6B,EAAOuuB,2BAA4B,EACnCvuB,EAAO+qB,aAAc,GAIvB,QAASuD,KACHtuB,EAAOquB,iBAIZ7oD,OAAOme,cAAc6qC,GACrBA,EAA2BhpD,OAAOie,YAAY,WAC7C,GAAIgrC,GAAqB5tC,QAAQlG,IAAI8F,IAAwB,GAAO,GAE/Duf,EAAO0uB,kBAAoBD,IAAyBzuB,EAAO0uB,iBAAmBD,IAClFjpD,OAAOC,SAASkpD,UAEf,MAhJJ3uB,EAAOr6B,QAAWs4B,SAAU,IAC5B+B,EAAOquB,gBAAiB,EACxBruB,EAAO0uB,gBAAkB7tC,QAAQlG,IAAI8F,IAAwB,GAAO,EACpEuf,EAAO4uB,kBAAoB/tC,QAAQlG,IAAI8F,GAC3Buf,EAAOuuB,2BAA4B,EACnCvuB,EAAO6uB,YAAc,kBACjC7uB,EAAOvB,QAAU,KACLuB,EAAOmuB,OAAS,KAChBnuB,EAAOouB,UAAY,EAE/B,IAAII,GAA2B,IAEnBxuB,GAAO8uB,mBAAqB,SAAU16C,EAAOwG,GACzColB,EAAOuuB,0BAA4BvuB,EAAOuuB,2BAA4B,GAAQ,EAC1EvuB,EAAOuuB,2BACPv6C,EAAWye,WAAW,0BAA2BuN,EAAO6uB,aAC1EzvB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAM5kD,OAAU,4BAEtFwO,EAAWye,WAAW,4BAA6BuN,EAAO6uB,aAC5EzvB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,UAI/Fw6B,EAAO0sB,eAAiB,WACnC,GAAIC,GAAiB98B,EAAmBjI,gBACzB,OAAO+kC,IAGX3sB,EAAO7rB,IAAI,0BAA2B,SAAUC,EAAOwG,GAC/CA,IAASolB,EAAO6uB,cAChB7uB,EAAOuuB,2BAA4B,KAK3CvuB,EAAO+uB,MAAQ,WACZ3vB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,SAGxHw6B,EAAOgvB,gBAAkB,WACxB,KAAM/wB,GAAW+B,EAAOr6B,OAAOs4B,QAE/B,OAAKA,GAKY,OAAbA,GAAqBA,IAAaz4B,OAAOg4B,YAAYyxB,gBACxDp0B,GAAe/f,MAAM,uEAIL,OAAbmjB,IACHpD,EAAeM,KAAK,sBAAwB8C,EAAW,OAEvDiwB,EAAegB,cAAcjxB,GAAUrkB,KAAK,SAASu1C,GACpD5C,EAAgB0B,EAAmBmB,aAEnCvuC,QAAQ6oB,IAAIjpB,EAAsBwd,GAAYjF,KAAM,IAAK+yB,QAAQ,EAAM1gB,OAAQ4iB,EAAmBmB,cAClGv0B,EAAejY,QAAQ,2CAA6Cqb,EAAW,OAE/E/sB,WAAW,WACV1L,OAAOC,SAASkpD,UACd,MACD,SAAS7zC,GACX+f,EAAe/f,MAAM,8BAtBtB+f,GAAe/f,MAAM,2CA2BvBklB,EAAOqvB,wBAA0B,WAChC9C,EAAgB0B,EAAmBmB,aAEnCvuC,QAAQ1E,OAAOsE,GAAwBuY,KAAM,IAAK+yB,QAAQ,EAAM1gB,OAAQ4iB,EAAmBmB,cAC3Fv0B,EAAejY,QAAQ,oCAAsCod,EAAO4uB,kBAAoB,OAExF19C,WAAW,WACV1L,OAAOC,SAASkpD,UACd,MAaQ3uB,EAAOsvB,QAAU,WACdlwB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,OAEvH,IAEmB0lC,IAFFj2B,EAAY63C,YACI73C,EAAY+3C,iBACVr0B,EAAUwS,OAAOt+B,MAAM,MACvCu+B,EAAazS,EAAUwS,MACvBD,GAAc3hC,OAAS,IACvB6hC,EAAaF,EAAcA,EAAc3hC,OAAO,GAAK,IAAM2hC,EAAcA,EAAc3hC,OAAO,IAGlGgjD,EAAgBnhB,GAE/B6iB,EAAmBsB,UA2CRjpD,UAMhBG,QAAQC,OAAO,YACZiO,QAAQ,QAAS,SAAUX,EAAYw7C,GAOtC,QAASC,GAAUzxC,EAAO0xC,GACxB,GAAIC,GAAa37C,EAAW47C,MAM5B,OALA5xC,GAAQA,MACR0xC,EAAaA,GAAc,gBAE3BjpD,QAAQ2E,OAAOukD,EAAY3xC,GAEpBwxC,EAAUpiD,MACf+c,YAAa,oCACb0lC,YAAaH,EACb1xC,MAAO2xC,IAKX,OAGE1f,SAOE6f,SAAQ,SAASC,GAQf,MAPAA,GAAMA,GAAOtpD,QAAQ4qC,KAOd,WACL,GAEI2e,GAFAh9C,EAAOtH,MAAMsG,UAAUpI,MAAMmI,KAAKkB,WAClCO,EAAOR,EAAKrB,OAGhBq+C,GAAcP,GACZQ,OACEC,aAAa,EACbz7C,MAAO,iBACPu3B,KAAM,8CAAgDx4B,EAAO,kBAC7D28C,UACEC,QAAS,aACT1jD,KAAM,SACN2jD,MAAO,SAAS1pD,GACdqpD,EAAYjB,MAAMpoD,MAGpBypD,QAAS,cACT1jD,KAAM,SACN2jD,MAAO,SAAS1pD,GACdqpD,EAAYM,QAAQ3pD,QAIzB,gBAEHqpD,EAAYn2C,OAAOD,KAAK,SAASxF,GAC/B27C,EAAIhV,MAAM3mC,EAAOpB,WAQ/B,WACI,YACAvM,SAAQC,OAAO,YACVk5B,UAAU,mBAAoB,cAAe,SAAU3qB,GACpD,OACI6sB,SAAU,MACV9jB,OACImvC,iBAAkB,IAClBvC,SAAU,aAEdlgC,WAAY,sBACZP,YAAalV,EAAYqV,eAAiB,mDAC1CwV,KAAM,SAAU9hB,EAAOwhB,EAASytB,SAKvCviC,WAAW,uBACR,SAAU,YAAa,UAAW,cAAe,qBAAsB,aAAc,0BAA2B,UAAW,YAAa,qBAAqB,WAAY,SAAUsV,EAAQrH,EAAWie,EAAS3hC,EAAa4a,EAAoB7b,EAAYkX,EAAyBhiB,EAASqnD,EAAW73B,EAAoBrQ,GACzT2X,EAAO6uB,YAAc,aACrB7uB,EAAOqtB,gBACPrtB,EAAOwwB,YAAa,EACpBxwB,EAAOywB,eAAgB,EAEvBzwB,EAAOoX,SAAW,SAAUqV,GACxB,MAAOA,KAAU9zB,EAAUK,QAG/BgH,EAAO0wB,gBAAkB,WACrB7gC,EAAmB/b,oBAAoB8F,KAAK,SAAUwM,GAClD8E,EAAwBG,aAAazR,KAAK,SAAUgB,GAChDolB,EAAO2wB,aAAc,CACrB,IAAIC,GAAa1nD,EAAQ,WAAW0R,EAAM,mBAAmB,EAC7DolB,GAAOqtB,aAAevmD,EAAE+pD,QAAQD,EAAY9pD,EAAE4f,KAAKkqC,GAAcE,sBAAuBtgD,SAASwvB,EAAO4qB,kBAKpH5qB,EAAO+wB,kBAAoB,SAAU/3B,GAEjCgH,EAAOgxB,mBACPpa,EAAQxpC,KAAK6H,EAAY+jB,KAG7BgH,EAAOgxB,iBAAmB,SAAU58C,GAC5BA,GACAA,EAAMukC,kBAGV3Y,EAAOmtB,iBAAmBntB,EAAOmtB,kBAAmB,GAAQ,EACxDntB,EAAOmtB,iBACPn5C,EAAWye,WAAW,0BAA2BuN,EAAO6uB,aAExD76C,EAAWye,WAAW,4BAA6BuN,EAAO6uB,cAIlE7uB,EAAO7rB,IAAI,0BAA2B,SAAUC,EAAOwG,GAC/CA,IAASolB,EAAO6uB,cAChB7uB,EAAOmtB,kBAAmB,KAIlCntB,EAAO15B,KAAO,WACV05B,EAAO0wB,kBACP1wB,EAAO7rB,IAAI,wBAAyB,SAASC,EAAOwG,GAChDolB,EAAOwwB,YAAa,IAGxBxwB,EAAO7rB,IAAI,wBAAyB,SAAUC,EAAOwG,GACjDolB,EAAOwwB,YAAa,KAI5BxwB,EAAO15B,aAKvB,WACI,YAEAG,SAAQC,OAAO,YACVk5B,UAAU,kBAAmB,cAAe,SAAU3qB,GACnD,OACI6sB,SAAU,MACV9jB,OACX+sC,YAAa,IACbtd,SAAU,KAEX/iB,WAAY,qBACAP,YAAalV,EAAYqV,eAAiB,qDAC1CwV,KAAM,SAAU9hB,EAAOyiB,EAAI+N,SAKlC9jB,WAAW,sBACR,SAAU,gBAAiB,qBAAsB,WAAY,cAAe,UAAW,aAAc,YAAa,kBAAmB,kBAAmB,SAAUsV,EAAQ9X,EAAe2H,EAAoBxH,EAAUpT,EAAa2hC,EAAS5iC,EAAY2kB,EAAWxQ,EAAiBiX,GAYjR,QAAS94B,KACLupB,EAAmB/b,oBAAoB8F,KAAK,SAAUwM,GAClD4Z,EAAO2D,wBAA0B,gCAAkCvd,EAAQ,0CAC3E,IAAIqf,GAA4D,MAA5Cpd,EAAS2X,EAAO2D,yBAAmCtb,EAAS2X,EAAO2D,yBAA2B,IAC5F,QAAlB8B,GACAzF,EAAOixB,qBAAuBxrB,EAC9BzF,EAAOkxB,uBAAuBzrB,EAAgBA,EAAcr9B,UAAY,KAExE43B,EAAOkxB,uBAAuB,2BAElClxB,EAAO7I,eAI1BiI,EAAethB,YAAY,UAAW2sC,GAAc,GAMrD,QAASA,GAAaxpC,GACjBA,EAAQ5Z,KAAuB,wBAAhB4Z,EAAQ5Z,MAAkC4Z,EAAQ1Z,MAAM6iD,WAAY,GAAUnpC,EAAQ1Z,MAAM6iD,WAAY,GAAiC,kCAAzBnpC,EAAQ1Z,MAAM/B,UAChJw6B,EAAOmxB,6BAA8B,GAgI3B,QAASC,GAAsBC,EAAMC,EAAM9lD,GACvC1E,EAAEkY,KAAKsyC,EAAM,SAAUC,GACnB,GAAIC,GAAU1qD,EAAEsC,OAAOioD,EAAM,SAAUG,GACnC,MAAOA,GAAQhmD,KAAU+lD,EAAQ/lD,IAGjCgmD,IACA1qD,EAAEkY,KAAKwyC,EAAS,SAAStpD,GACrBpB,EAAEsE,OAAOlD,EAAQqpD,OAzKjCvxB,EAAOmxB,6BAA8B,EACrCnxB,EAAO6uB,YAAc,gBACrB7uB,EAAOpB,WACPoB,EAAOixB,qBAAuB,KAC9BjxB,EAAOyxB,mBACPzxB,EAAO0xB,aAAe,GACtB1xB,EAAO2xB,qBAAsB,EAC7B3xB,EAAO2D,wBAA0B,KACjC3D,EAAO4xB,8BAAgC,gBACvC5xB,EAAO6xB,gBAAiB,EAmBxBvrD,GASA,IAAIwrD,GAAuBzpC,EAAS2X,EAAO2D,wBAGtCmuB,KACD9xB,EAAO2xB,qBAAsB,GAGjC3xB,EAAO7rB,IAAI,eAAgB,SAAUC,EAAOwG,GACxC,GAAIA,EAAKmuB,gBAAgBxD,QACjB3qB,EAAKmuB,gBAAgBxD,OAAOr6B,MAAM,GAAG2D,KAAOmxB,EAAOixB,qBAAqBlhC,SAAU,CAElF,GAAI7nB,GAASpB,EAAE4f,KAAKsZ,EAAOpB,QAAS,SAAU12B,GAC1C,MAAOA,GAAO6nB,WAAanV,EAAKmuB,gBAAgBxD,OAAOr6B,MAAM,GAAG2D,IAIpEmxB,GAAO+xB,qBAAqB7pD,MAOxC83B,EAAO7rB,IAAI,kCAAmC,SAAUC,EAAOwG,GAG3D,GADAolB,EAAO6xB,gBAAiB,EACpBj3C,EAAKmV,WAAaiQ,EAAOixB,qBAAqBlhC,SAAU,CACxD,GAAI7nB,GAASpB,EAAE4f,KAAKsZ,EAAOpB,QAAS,SAAU12B,GAC1C,MAAOA,GAAO6nB,WAAanV,EAAKmV,UAIpCiQ,GAAO+xB,qBAAqB7pD,GAC5BjB,IAAI,mDAAoDiB,MAOhE83B,EAAO7rB,IAAI,oCAAqC,SAAUC,EAAOwG,GAC7D3T,IAAI,qCACJ+4B,EAAO6xB,gBAAiB,IAI5B7xB,EAAO+xB,qBAAuB,SAAUxqD,GACpC,GAAI2jC,GAAgBvS,EAAUwS,OAAOt+B,MAAM,KACvCu+B,EAAazS,EAAUwS,MACvBD,GAAc3hC,OAAS,IACvB6hC,EAAaF,EAAcA,EAAc3hC,OAAO,GAAK,IAAM2hC,EAAcA,EAAc3hC,OAAO,IAGlG8e,EAAS2X,EAAO2D,wBAAyBp8B,GAAS8jC,OAAQD,EAAYpS,KAAM,MAC5E3Q,EAAS2X,EAAO4xB,8BAA+BrqD,EAAMwoB,UAAYsb,OAAQD,EAAYpS,KAAM,MAE3FgH,EAAOixB,qBAAuB1pD,EAC9ByM,EAAWye,WAAW,kCAAmClrB,GAEpEy4B,EAAOyN,UAAUzN,EAAOyN,SAASlmC,GACtBy4B,EAAO2xB,qBAAsB,EAC7B3xB,EAAOkxB,uBAAuB3pD,EAAQA,EAAMa,UAAY,IAExD43B,EAAOmxB,6BAA8B,EACrCn9C,EAAWye,WAAW,4BAA6BuN,EAAO6uB,aACzEzvB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,SAI9Fw6B,EAAOgyB,gBAAkB,SAAUroC,GAC/B,GAAIsoC,IAAS,EACTC,EAAiB7pC,EAAS2X,EAAO2D,wBAMrC,OALsB,OAAlBuuB,GACIA,EAAe5nD,eAAe,cAC9B2nD,EAASC,EAAiBA,EAAeniC,WAAapG,GAAW,GAGlEsoC,GAGXjyB,EAAO0sB,eAAiB,WACpB,GAAIC,GAAiB98B,EAAmBjI,gBACxC,OAAO+kC,IAGX3sB,EAAO7rB,IAAI,0BAA2B,SAAUC,EAAOwG,GAC/CA,IAASolB,EAAO6uB,cAChB7uB,EAAOmxB,6BAA8B,KAK7CnxB,EAAO7I,WAAa,WAEhBtH,EAAmB/b,oBAAoB8F,KAAK,SAAUwM,GAClD+B,EAAgB7K,SAAS1D,KAAK,SAASu4C,GACnCjqC,EAAcmP,oBAAoBzd,KAAK,SAAUgB,GAiB7C,GAdKlP,MAAM/D,QAAQiT,GAGQ,IAAhBA,EAAKrR,OACZy2B,EAAOkxB,uBAAuB,qBAE9BlxB,EAAOpB,QAAU93B,EAAEsrD,OAAOx3C,EAAM,SAASqO,GACrC,MAAOA,GAAK7gB,aANhB43B,EAAOpB,QAAQ1yB,KAAK0O,GACpBolB,EAAOkxB,uBAAuBt2C,EAAOA,EAAKxS,UAAY,KAS1DgpD,EAAsBpxB,EAAOpB,QAASuzB,EAAQ,WAGV,OAAhCnyB,EAAOixB,qBAA+B,CACtC,GAAIxrB,GAAgB3+B,EAAE4f,KAAKsZ,EAAOpB,QAAS,cAAgBoB,EAAOpB,QAAQ,EAE1EoB,GAAO+xB,qBAAqBtsB,WAsBhDzF,EAAOkxB,uBAAyB,SAASjuB,GACrCjD,EAAOutB,qBAAuBtqB,GAGlCjD,EAAOqyB,qBAAuB,WAEtBryB,EAAO6xB,iBACP7xB,EAAO0xB,aAAe,GACtB1xB,EAAOmxB,4BAA8BnxB,EAAOmxB,6BAA8B,GAAQ,EAC9EnxB,EAAOmxB,6BACPn9C,EAAWye,WAAW,0BAA2BuN,EAAO6uB,aAC7EzvB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAM5kD,OAAU,qCAEnFwO,EAAWye,WAAW,4BAA6BuN,EAAO6uB,aAC/EzvB,EAAe1gB,QAAQ,WAAarX,IAAO,sBAAuBE,OAAW6iD,SAAW,EAAO5kD,OAAU,iBAShH,WACI,YAMA,SAAS8sD,GAA0BtyB,EAAQuyB,EAAmBC,GAK1D,QAASC,KAEL,GADAxrD,IAAI,kDAAmD+4B,EAAOwyB,cAC1DxyB,EAAOwyB,aAAa7mC,kBAAoBqU,EAAOwyB,aAAa7mC,iBAAiBQ,kBAAoB6T,EAAOwyB,aAAa7mC,iBAAiBQ,gBAAgBC,UAAW,CAGjK,GAAIM,GAAQ5lB,EAAEsC,OAAO42B,EAAOwyB,aAAa7mC,iBAAiBQ,gBAAgBO,MAAO,SAAU1M,GACvF,MAAOA,GAAE0yC,eAAgB,IAIzBC,EAAe7rD,EAAEsC,OAAOsjB,EAAO,SAAU1M,GACzC,MAA0B,YAAnBA,EAAE8M,cAIb,OAAQ6lC,GAAappD,SAAWmjB,EAAMnjB,OAG1C,OAAO,EArBXy2B,EAAOwyB,aAAeA,EACtBvrD,IAAI,0CAA2C+4B,EAAOwyB,cAuBtDxyB,EAAO4yB,kBAAoB,WAEvB,MADA3rD,KAAI,oCAAqC+4B,EAAOwyB,eACxCxyB,EAAOwyB,aAAaK,iBAAmBJ,KAInDzyB,EAAO8yB,0BAA4B,WAE/B,MADA7rD,KAAI,4CAA6C+4B,EAAOwyB,cACjDxyB,EAAOwyB,aAAaK,iBAAmBJ,KAIlDzyB,EAAO+yB,gBAAkB,WACrBR,EAAkBxD,OAAQiE,gBAAgB,KAG9ChzB,EAAOizB,WAAa,WAChBV,EAAkBjC,WA/C1B7pD,QAAQC,OAAO,YAAYgkB,WAAW,4BAA6B4nC,GAEnEA,EAA0B59C,SAAW,SAAU,oBAAqB,mBAmDxEjO,QAAQC,OAAO,6BAEdk5B,UAAU,wBAAyB,YAAa,WAAY,WACzD,SAAU+W,EAAWjyB,EAAUkd,GAG3B,OACIE,SAAU,MACVnC,YAAY,EACZ3hB,OACIk1C,QAAS,KACTC,aAAc,KACdC,SAAU,IACVC,SAAU,IACVC,QAAS,IACTC,WAAY,IACZC,SAAU,IACVC,QAAS,IACTC,aAAc,IACdC,eAAgB,IAChBC,aAAc,IACdC,YAAa,IACbC,aAAc,KAElBh0B,KAAM,SAAUE,EAAQS,EAAIhB,GA8BxB,QAASs0B,GAAaxsD,GAClB,GAAIysD,EAAMC,UAAW,CACjB,GAAIA,GAAYD,EAAME,UAAY,QAC9BC,EAAc,GAAInjD,QAAOijD,EAAY,WAAaA,EAAY,QAClE9iD,GAAK+iD,UAAYptD,EAAEygB,KAAKpW,EAAK+iD,UAAUnqD,QAAQoqD,EAAa,KAC5DhjD,EAAK+iD,WAAa,IAAMD,EAAY,IAAM1sD,GA4ClD,QAAS6sD,GAASC,EAAQL,GAClBK,GAAiC,IAAvBA,EAAOC,MAAMrO,QAEvBoO,EAAOC,MAAMrO,MAAQ,MAErBn/C,EAAEkY,KAAKq1C,EAAOnc,SAAU,SAAU1Y,GAC1BA,EAAQ80B,MAAMpZ,QAAU,SAG5B8Y,EAAMO,UAASpjD,EAAKmjD,MAAME,MAAQ,OAClCR,EAAM9nD,OACNiF,EAAKmjD,MAAMzrD,IAAM,MACjBsI,EAAKmjD,MAAME,MAAQ,MACnBrjD,EAAKmjD,MAAMrM,KAAO,QAI1BjoB,EAAOkzB,SAAU,EAEbc,EAAMS,aACN9d,EAAUW,IAAI,UAAWmd,GAG7BV,EAAa,UAIjB,QAASb,GAAQmB,EAAQL,GACM,IAAvBK,EAAOC,MAAMrO,QAEboO,EAAOC,MAAMrO,MAAQ+N,EAAM57B,KACvB47B,EAAMO,UAASpjD,EAAKmjD,MAAME,MAAQR,EAAM57B,MACxC47B,EAAM9nD,OACNiF,EAAKmjD,MAAME,MAAQR,EAAM57B,KACzBjnB,EAAKmjD,MAAMrM,KAAO,IAAM+L,EAAM57B,MAGlC1T,EAAS,WACDsvC,EAAMU,OAAOryB,EAAQ0M,IAAI,UAAW,UAC1B,IAAdilB,EAAMW,OAEV30B,EAAOkzB,SAAU,EACbc,EAAMS,aACN9d,EAAUjD,GAAG,UAAW+gB,GAG5BV,EAAa,QACb5iD,EAAKmjD,MAAM1nB,SAAW,WACtBz7B,EAAKmjD,MAAMrO,MAAQ,QAa3B,QAASwO,GAAY9tD,GACjB,GAAIiuD,GAAU,GACVvtD,EAAMV,EAAE+xC,SAAW/xC,EAAEkuD,KAErBxtD,KAAQutD,GACRR,EAASC,EAAQL,GA9IzB,GAAIA,KAEJA,GAAMW,MAAQ30B,EAAOozB,UAAY,MACjCY,EAAM57B,KAAO4H,EAAOszB,SAAW,QAC/BU,EAAMc,OAAS,IACfd,EAAME,UAAYl0B,EAAOqzB,UAAY,eACrCW,EAAMU,MAAQ10B,EAAOwzB,UAA6C,SAAjCxzB,EAAOwzB,SAASltC,eAA2B,GAAQ,EACpF0tC,EAAMO,QAAUQ,QAAQ/0B,EAAOuzB,cAAe,EAC9CS,EAAM9nD,KAAO6oD,QAAQ/0B,EAAOyzB,WAAY,EACxCO,EAAMgB,UAAYh1B,EAAO0zB,eAAgB,EACzCM,EAAMS,YAAcM,QAAQ/0B,EAAO2zB,kBAAmB,EACtDK,EAAMC,UAAYj0B,EAAO4zB,eAAgB,EACzCI,EAAMpJ,SAAW5qB,EAAO6zB,aAAe,EACvCG,EAAMjyB,UAAY/B,EAAO8zB,cAAgB,KAEzCrzB,EAAGW,SAAS4yB,EAAME,WAClBzzB,EAAGW,SAAS,uCAIZ,IAAIiB,GAAU,KACVgyB,EAAS,KAETljD,EAAO6iD,EAAMgB,UAAYnvD,SAASovD,eAAejB,EAAMgB,WAAanvD,SAASsL,IAajF4iD,GAAa,UAEbM,EAAS5zB,EAAG,GAMZ4B,EAAU57B,QAAQ+4B,QAAQ60B,EAAOnc,UAGjC/mC,EAAK+jD,YAAYb,GAGjBA,EAAOC,MAAMa,OAASnB,EAAMc,OAE5BT,EAAOC,MAAM1nB,SAAY,WACzBynB,EAAOC,MAAMrO,MAAQ,EACrBoO,EAAOC,MAAM9kB,OAAS,EAEtB6kB,EAAOC,MAAMc,mBAAqBpB,EAAMW,MAAQ,IAChDN,EAAOC,MAAMe,yBAA2BrB,EAAMW,MAAQ,IACtDN,EAAOC,MAAMgB,mBAAqB,gBAE9BtB,EAAMO,UACNpjD,EAAKmjD,MAAM1nB,SAAW,WACtBz7B,EAAKmjD,MAAMc,mBAAqBpB,EAAMW,MAAQ,IAC9CxjD,EAAKmjD,MAAMe,yBAA2BrB,EAAMW,MAAQ,IACpDxjD,EAAKmjD,MAAMgB,mBAAqB,4BAGpCjB,EAAOC,MAAM9kB,OAAS/P,EAAM81B,iBAAmB,eAAiB91B,EAAM+1B,cAAgB,QACtFnB,EAAOC,MAAMzrD,IAAM42B,EAAM+1B,cAAgB,MACzCnB,EAAOC,MAAMmB,OAASh2B,EAAMi2B,iBAAmB,MAC/CrB,EAAOC,MAAME,MAAQ/0B,EAAMk2B,gBAAkB,MAE7C31B,EAAOe,OAAS,WACZf,EAAOkzB,SAAWlzB,EAAOkzB,SA6E7BlzB,EAAOK,OAAO,UAAW,SAAS94B,GACxBA,EACF2rD,EAAQmB,EAAQL,GAEhBI,EAASC,EAAQL,KAIzBh0B,EAAOK,OAAO,UAAW,SAASuZ,EAAUC,GACpCA,IAAaD,IACboa,EAAM57B,KAAOwhB,EACbsZ,EAAQmB,EAAQL,MAQxBh0B,EAAO7rB,IAAI,WAAY,WACnBhD,EAAKykD,YAAYvB,KAGjBr0B,EAAOmzB,eACPnzB,EAAO7rB,IAAI,uBAAwB,WAC/BigD,EAASC,EAAQL,KAErBh0B,EAAO7rB,IAAI,oBAAqB,WAC5BigD,EAASC,EAAQL,WASzC,WACC,YAoBA,SAAS6B,KA2BR,QAAS9sD,GAAO+gC,GACfpK,EAAKwF,SAAW4E,EAAI97B,KAChB0xB,EAAKo2B,UAAUp2B,EAAKo2B,SAAShsB,GAIlC,QAASgG,KACR,GAAIA,GAAOpQ,EAAK0V,MAAM1O,OACtBqvB,GAAWjmB,EAAKsF,MAAMtF,EAAKsF,QAAQ,GAAGpnC,KAAK,IAC3C0xB,EAAK0V,MAAMA,MAAM1V,EAAK0V,MAAMA,QAAQ,GACpC4gB,EAAWlmB,EAAMpQ,EAAK0V,OAIvB,QAAS6gB,KACR,GAAIjhB,GAAWtV,EAAK0V,MAAM1O,OAC1BqvB,GAAW/gB,EAASI,MAAMJ,EAASI,QAAQ,GAAGpnC,KAAK,IACnD0xB,EAAK0V,MAAMA,MAAM1V,EAAK0V,MAAMA,QAAQ,GACpC4gB,EAAWhhB,EAAUtV,EAAK0V,OAI3B,QAAS8gB,KACRx2B,EAAK8J,MAAQusB,EAAW7nD,UACxBwxB,EAAKwF,SAAW6wB,EAAWr2B,EAAKwF,UAAYh3B,UAC5CwxB,EAAK0V,MAAQ1V,EAAKwF,SAASwB,QAC3BpgC,IAID,QAAS6vD,GAAWrsB,GAEnB,GAAI5E,IAAW,CAOf,OANAp+B,GAAEC,QAAQ24B,EAAK2O,OAAQ,SAAS8Y,GAC/BA,EAAGn5C,KAAO+nD,EAAW5O,EAAGn5C,MACpBm5C,EAAGn5C,KAAK2jC,OAAO7H,EAAI97B,QAAOk3B,GAAW,KAInCA,EAMR,QAAS5+B,KACR,GAAI8vD,GAAQ12B,EAAK0V,MAAM1O,OACvB0vB,GAAMpoD,KAAK,GACX+nD,EAAWK,EAAMtsB,IAAI,IACrBksB,EAAWI,EAAO12B,EAAK0V,OAIxB,QAAS2gB,GAAW/nD,GACnB,MAAOA,GAAK87B,IAAI,GAAGj6B,KAAK,GAAGC,OAAO,GAAGulC,OAAO,GAAGC,YAAY,GAI5D,QAAS0gB,GAAWI,EAAOhhB,GAC1B1V,EAAK22B,QAKL,KAJA,GAAIC,IAAO,EACPtoD,EAAOooD,EAAM1vB,QACb6vB,EAAavoD,EAAKonC,QAClBnsC,EAAQ,GACJqtD,GACP52B,EAAK22B,MAAMnqD,MAAO83C,KAAMwS,EAAUxoD,EAAK04B,QAAS0O,KAChDpnC,EAAKid,IAAI,EAAG,KACZqrC,EAAOrtD,IAAU,GAAKstD,IAAevoD,EAAKonC,QAC1CmhB,EAAavoD,EAAKonC,QAKpB,QAASohB,GAAUxoD,EAAMonC,GAExB,IAAK,GADD4O,MACKn8C,EAAI,EAAO,EAAJA,EAAOA,IACtBm8C,EAAK93C,MACJsH,KAAMxF,EAAKuB,OAAO,MAAMkB,UAAU,EAAG,GACrC0C,OAAQnF,EAAKA,OACbyoD,eAAgBzoD,EAAKonC,UAAYA,EAAMA,QACvC/C,QAASrkC,EAAK2jC,OAAO,GAAI9lC,MAAQ,OACjCmC,KAAMA,IAEPA,EAAOA,EAAK04B,QACZ14B,EAAKid,IAAI,EAAG,IAEb,OAAO+4B,GA/GR,GAAItkB,GAAOp4B,IAGXo4B,GAAK8J,MAAQusB,EAAW7nD,UACxBwxB,EAAKwF,SAAWxF,EAAKwF,UAAYh3B,SACjCwxB,EAAK0V,MAAQ1V,EAAKwF,SAASwB,QAC3BhH,EAAK22B,SACL32B,EAAK2O,OAAS3O,EAAK2O,WAGnB3O,EAAKwF,SAAW6wB,EAAWr2B,EAAKwF,UAGhCxF,EAAK32B,OAASA,EACd22B,EAAKoQ,KAAOA,EACZpQ,EAAKu2B,KAAOA,EACZv2B,EAAKw2B,UAAYA,EACjBx2B,EAAKy2B,WAAaz2B,EAAKy2B,YAAcA,EAGrC7vD,IAvCDG,QAAQC,OAAO,YAAY0lD,UAAU,iBACpCjiC,aAAc,cAAe,SAASlV,GACrC,MAAOA,GAAYqV,eAAiB,gEAErCI,WAAYmrC,EACZa,UACCxxB,SAAU,KACVmJ,OAAQ,KACR8nB,WAAY,KACZL,SAAU,QAKZD,EAAmBnhD,cAwHpB,WAAY,YAAajO,SAAQC,OAAO,YAAYqN,KAAK,iBAAkB,SAAS8L,GAAiBA,EAAe7E,IAAI,uEAAuE;AAC/L6E,EAAe7E,IAAI,+DAA+D,4gBAClF6E,EAAe7E,IAAI,+DAA+D,uhBAClF6E,EAAe7E,IAAI,mFAAmF,+kDACtG6E,EAAe7E,IAAI,mEAAmE,6TACtF6E,EAAe7E,IAAI,yFAAyF,k/CAC5G6E,EAAe7E,IAAI,mFAAmF,y0DACtG6E,EAAe7E,IAAI,wEAAwE,miBAC3F6E,EAAe7E,IAAI,kGAAkG,k5CACrH6E,EAAe7E,IAAI,0EAA0E,4/CAC7F6E,EAAe7E,IAAI,2FAA2F,+uDAC9G6E,EAAe7E,IAAI,+FAA+F,u1EAClH6E,EAAe7E,IAAI,0EAA0E,iJAC7F6E,EAAe7E,IAAI,yFAAyF,y0BAC5G6E,EAAe7E,IAAI,kFAAkF,gxDACrG6E,EAAe7E,IAAI,gGAAgG,ylDACnH6E,EAAe7E,IAAI,gFAAgF,wyBACnG6E,EAAe7E,IAAI,gFAAgF,gvBACnG6E,EAAe7E,IAAI,gFAAgF,+gHACnG6E,EAAe7E,IAAI,4FAA4F,wkJAC/G6E,EAAe7E,IAAI,kFAAkF,49BACrG6E,EAAe7E,IAAI,kFAAkF,2HACrG6E,EAAe7E,IAAI,4EAA4E;AAC/F6E,EAAe7E,IAAI,qFAAqF,+xFACxG6E,EAAe7E,IAAI,uGAAuG,25CAC1H6E,EAAe7E,IAAI,2FAA2F,iqCAC9G6E,EAAe7E,IAAI,oFAAoF,sUACvG6E,EAAe7E,IAAI,8EAA8E,o6BACjG6E,EAAe7E,IAAI,kFAAkF,0WACrG6E,EAAe7E,IAAI,8FAA8F,oWACjH6E,EAAe7E,IAAI,oGAAoG,6xBACvH6E,EAAe7E,IAAI,4EAA4E,kbAC/F6E,EAAe7E,IAAI,8EAA8E,q0BACjG6E,EAAe7E,IAAI,wGAAwG","file":"core.min.js","sourcesContent":["(function () {\n\t'use strict';\n\n\tvar re = /newsis-qa|mynha.com/g;\n\tif (window.location.href.search(re) > -1) {\n\t\t/** configure the script */\n\t\tvar pingdom = document.createElement('script');\n\t\tpingdom.type = 'text/javascript';\n\t\tpingdom.async = true;\n\t\tpingdom.src = '//rum-static.pingdom.net/pa-5ab3be244c407700070004d2.js';\n\n\t\t/** inject the script */\n\t\tvar s = document.getElementsByTagName('script')[0];\n\t\ts.parentNode.insertBefore(pingdom, s);\n\t} \n})();;\r\n/**\n * utils.angular\n * @namespace Core\n */\n\n(function () {\n\t'use strict';\n\n\t/** initialization */\n\tfunction init() {\n\t\t/** setup _ng object with angular utility methods */\n\t\tvar exports = {\n\t\t\tisModuleLoaded: isModuleLoaded,\n\t\t\tmoduleInit: moduleInit\n\t\t};\n\n\t\t/**\n\t\t * Check if a module is loaded\n\t\t * @param string moduleName \n\t\t * @returns bool\n\t\t */\n\t\tfunction isModuleLoaded(moduleName){\n\t\t\ttry { angular.module(moduleName); return true; }\n\t\t\tcatch (e){ return false; }\n\t\t}\n\n\t\t/**\n\t\t * Take in array of module names and check if they are loaded \n\t\t * if not loaded, create a blank module \n\t\t * return modules array\n\t\t * @param [] modules \n\t\t * @returns [] \n\t\t */\n\t\tfunction moduleInit(modules) {\n\t\t\t/** check that modules are loaded */\n\t\t\t_.forEach(modules, function(m) {\n\t\t\t\tif (!isModuleLoaded(m)) {\n\t\t\t\t\t/** create blank module */\n\t\t\t\t\tangular.module(m, []);\n\t\t\t\t\tlog('Module [' + m + '] is not loaded. Blank module created.');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/** return loaded modules array */\n\t\t\treturn modules;\n\t\t}\n\n\t\t/** return exports */\n\t\treturn exports;\n\t}\n\n\t/** define globally if it doesn't already exist */\n\tif (typeof (_ng) === 'undefined') {\n\t\twindow._ng = init();\n\t}\n})();;\r\n/*\n * This is meant to be our generic library with no dependencies.\n * Function likes lodash library\n * Example usage\n * _utils.getODataRequest({\n 'top': 20\n })\n\n // returns\n Object {$top: 20}\n */\n\n; (function () {\n 'use strict';\n\n function init() {\n\n // ToDo: index by timezoneID & update timezoneLookup. Can we pull as enums from server?\n var validTimezones = [\n 'Etc/UTC', // 0| 0\n 'America/Detroit', // -5|-4\n 'America/Chicago', // -6|-5\n 'America/Denver', // -7|-6\n // 'America/Phoenix', // -7|-7\n 'America/Los_Angeles' // -8/-7\n ];\n\n var exports = {};\n\n exports.regex = {};\n exports.regex.phoneNumber = '^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$';\n exports.regex.emailAddress = \"^[a-zA-Z0-9!#$%&+'._@-]*$\";\n exports.regex.zipCode = '^[0-9]{0,5}$';\n\n /*Returns object representing the OData parameters based on parameters passed in. Angular resources take this as input and is automatically turned into querystring.\n * Input: { skip: 20, top: 20, filter: { FirstName: 'Bob' } }\n * Output: { \"$skip\": 20, \"$top\": 20, \"$filter\": \"FirstName eq 'Bob'\" }\n */\n exports.getODataRequest = function (oDataParams) {\n var returnValue = {};\n\n if (oDataParams) {\n if (typeof (oDataParams.top) != 'undefined') {\n returnValue['$top'] = oDataParams.top;\n };\n\n if (typeof (oDataParams.orderby) != 'undefined') {\n returnValue['$orderby'] = oDataParams.orderby;\n };\n\n if (typeof (oDataParams.select) != 'undefined') {\n returnValue['$select'] = oDataParams.select;\n };\n\n if (typeof (oDataParams.skip) != 'undefined') {\n returnValue['$skip'] = oDataParams.skip;\n };\n\n if (typeof (oDataParams.count) != 'undefined') {\n returnValue['$count'] = oDataParams.count;\n };\n\n if (typeof (oDataParams.filter) != 'undefined') {\n if (typeof (oDataParams.$filter) != 'undefined') {\n returnValue['$filter'] = oDataParams.$filter + \" and \" + this.getODataFilterQuerystringValue(oDataParams.filter);\n } else {\n returnValue['$filter'] = this.getODataFilterQuerystringValue(oDataParams.filter);\n }\n };\n }\n\n return returnValue;\n };\n\n /*Returns full OData url*/\n exports.getODataQuerystringValue = function (oDataParams) {\n var returnValue = '';\n\n var needAmpersand = false; // meh, something has to be more clever than this\n\n if (oDataParams.top > 0) {\n returnValue += '$top=' + oDataParams.top;\n needAmpersand = true;\n }\n\n if (oDataParams.filter.length > 0) {\n returnValue += (needAmpersand ? '&' : '') + '&$filter=' + this.getODataFilterQuerystringValue(oDataParams.filter);\n needAmpersand = true;\n }\n\n if (oDataParams.orderby.length > 0) {\n returnValue += (needAmpersand ? '&' : '') + '$orderby=' + oDataParams.orderby;\n needAmpersand = true;\n }\n\n if (oDataParams.select.length > 0) {\n returnValue += (needAmpersand ? '&' : '') + '$select=' + oDataParams.select;\n needAmpersand = true;\n }\n\n if (oDataParams.skip > 0) {\n returnValue += (needAmpersand ? '&' : '') + '$skip=' + oDataParams.skip;\n needAmpersand = true;\n }\n\n if (oDataParams.count > 0) {\n returnValue += (needAmpersand ? '&' : '') + '$count=' + oDataParams.count;\n }\n\n return returnValue;\n }\n\n exports.capitalizeFirstLetter = function (string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n exports.cleanString = function (dirtyString) {\n dirtyString = dirtyString.replace(/[|&;$%@\"<>()+,]/g, '');\n dirtyString = dirtyString.replace('\\'', '\\'\\'');\n dirtyString = dirtyString.replace(/'/g, '\\'\\'');\n dirtyString = dirtyString.replace(/&/g, '%26');\n return dirtyString;\n }\n\n exports.getODataFilterFromParams = function (params, capitalizeIdString, firstLetterCapitalize) {\n var oDataFilter = {};\n\n // default to always capitalizing first letter\n if (firstLetterCapitalize == null) {\n firstLetterCapitalize = true;\n }\n\n // ensure we have params\n if (params) {\n // loop through our properties of the param json\n for (var propertyName in params) {\n // ensure the propery exists\n if (params.hasOwnProperty(propertyName)) {\n // get the new property name, capitalizing the first character\n var newPropertyName = (firstLetterCapitalize ? this.capitalizeFirstLetter(propertyName) : propertyName);\n\n // some apis have capital ID and some have camelCase Id, handle it!\n if (capitalizeIdString && newPropertyName.lastIndexOf('Id') !== -1) {\n newPropertyName = newPropertyName.replace('Id', 'ID');\n }\n\n // add our new property name\n oDataFilter[newPropertyName] = params[propertyName];\n }\n }\n }\n\n return oDataFilter;\n }\n\n exports.getParsedODataFilter = function (params, capitalizeIdString, firstLetterCapitalize) {\n return this.getODataRequest({ 'filter': this.getODataFilterFromParams(params, capitalizeIdString, firstLetterCapitalize) });\n }\n\n exports.FilterOption = function (key, value, comparer, booleanOperator) {\n this.key = key,\n this.value = value,\n this.comparer = comparer;\n this.booleanOperator = booleanOperator;\n }\n\n exports.updateODataFilterWithNHAFilter = function updateODataFilterWithNHAFilter(nhaFilters, filterPropertyName, key, oDataFilter, options) {\n if (nhaFilters[filterPropertyName]) {\n var selectedItemIds = _.map(_.filter(nhaFilters[filterPropertyName].items, 'selected'), 'id');\n\n // merge passed options with defaults\n var opts = _.extend({\n // if value is an array, default operator to OR, otherwise NULL\n booleanOperator: (selectedItemIds.length > 1 && (!options || !options.booleanOperator)) ? 'or' : undefined,\n\n // default comparer is EQUALS, but can be changes\n comparer: 'eq'\n }, options);\n\n if (selectedItemIds) {\n oDataFilter[filterPropertyName] = new _utils.FilterOption();\n oDataFilter[filterPropertyName].key = key;\n oDataFilter[filterPropertyName].value = selectedItemIds.length === 1 ? selectedItemIds[0] : selectedItemIds;\n oDataFilter[filterPropertyName].comparer = opts.comparer;\n oDataFilter[filterPropertyName].booleanOperator = opts.booleanOperator;\n }\n else {\n oDataFilter[key] = 1;\n }\n }\n }\n /*Returns value for $filter querstring parameter for OData queries: eq */\n exports.getODataFilterQuerystringValue = function (filterLookup) {\n var returnValue = '';\n\n var i = 0;\n\n for (var prop in filterLookup) {\n if (filterLookup.hasOwnProperty(prop)) {\n var filterObject = filterLookup[prop];\n\n if (filterObject) {\n if (typeof (filterObject.value) == 'object' && filterLookup[prop] instanceof this.FilterOption) {\n if (filterObject.value instanceof Array) { //Handles cases like '$filter=(GradeLevelID = 1 or GradeLevelID = 2)'\n var thisFilter = '';\n\n for (var j = 0; j < filterObject.value.length; j++) {\n if (j > 0) {\n thisFilter += ' ' + filterObject.booleanOperator + ' ';\n }\n\n //Array to compare to\n thisFilter += (' ' + filterObject.key + ' ' + filterObject.comparer + ' ' + filterObject.value[j]);\n }\n\n if (i > 0) {\n returnValue += ' and ';\n }\n\n returnValue += '(' + thisFilter + ')';\n } else {\n var value;\n\n if (filterObject.value instanceof Date) {\n value = 'DateTime\\'' + filterObject.value + '\\'';\n } else {\n value = filterObject.value;\n }\n\n returnValue += (' ' + filterObject.key + ' ' + filterObject.comparer + ' ' + value);\n }\n } else if (filterLookup[prop] instanceof this.FilterOption) {\n\n if (i > 0) {\n returnValue += ' and ';\n }\n returnValue += (' ' + filterObject.key + ' ' + filterObject.comparer + ' ' + filterObject.value);\n\n } else {\n var quotePlaceholder = isNaN(filterLookup[prop]) ? '\\'' : '';\n\n if (i > 0) {\n returnValue += ' and ';\n }\n\n //PropertyName eq 'PropertyValue'\n returnValue += (' ' + prop + ' eq ' + quotePlaceholder + filterLookup[prop] + quotePlaceholder);\n }\n } else if (filterObject === null) {\n if (i > 0) {\n returnValue += ' and ';\n }\n returnValue += (' ' + prop + ' eq null ');\n }\n\n i++;\n }\n }\n\n return returnValue;\n }\n\n function filterParam(key) {\n return new function () {\n this.value = '';\n this.key = key;\n this.equals = function (val, operator) {\n if (_.isArray(val)) {\n this.value += '(' + _.map(val, function (i) {\n return key + ' eq ' + i;\n }).join(' ' + (operator || 'or') + ' ') + ')';\n } else {\n this.value += key + ' eq ' + val;\n }\n return this.value;\n }\n this.any = function (val, childkey) {\n if (val) {\n if (_.isArray(val)) {\n this.value += key + '/any(x:(' + _.map(val, function (i) {\n return 'x/' + (childkey ? childkey : key + 'ID') + ' eq ' + i;\n }).join(' or ') + '))';\n } else {\n this.value += this.key + '/any(x:x/' + (childkey ? childkey : this.key + 'ID') + ' eq ' + val + ')';\n }\n } else {\n this.value += this.key + '/any';\n }\n return this.value;\n }\n }\n }\n\n exports.filterQuery = function () {\n return new function () {\n this.parameters = [];\n this.equals = function (key, val, operator) {\n if (!key && !val)\n return this;\n\n this.parameters.push(filterParam(key).equals(val, operator));\n return this;\n }\n this.any = function (key, val, childkey) {\n this.parameters.push(filterParam(key).any(val, childkey));\n return this;\n }\n this.value = function () {\n return this.parameters.join(' and ');\n }\n }\n }\n\n exports.setOrderByParameters = function (parameters, sort) {\n var sortString = '';\n if (sort) {\n for (var i = 0; i < sort.length; i++) {\n sortString += sort[i].criteria + (sort[i].descending ? ' desc' : '');\n if (i + 1 < sort.length) {\n sortString += ', ';\n }\n }\n parameters.$orderby = sortString;\n }\n\n\n }\n\n exports.setSearchFilter = function (parameters, text, searchFields) {\n if (text) {\n var splitText = text.split(' ');\n\n if (splitText.length > 1) {\n _.forEach(splitText, function (word) {\n //Set search filter on each individual word\n exports.setSearchFilter(parameters, word, searchFields);\n });\n }\n else {\n var searchParameter = '(';\n _.forEach(searchFields, function (searchField) {\n searchParameter += 'substringof(\\'' + text + '\\', ' + searchField + ') or ';\n });\n searchParameter = searchParameter.slice(0, searchParameter.length - 4);\n searchParameter += ')';\n if (parameters.$filter) {\n parameters.$filter += ' and ' + searchParameter;\n } else {\n parameters.$filter = searchParameter;\n }\n }\n }\n }\n\n\n exports.openUrl = function (url, openInNewTab) {\n if (openInNewTab) {\n var win = window.open(url, '');\n } else {\n location.href = url;\n }\n }\n\n exports.joinUrl = function (baseUrl, url) {\n var theUrl = new URI(url);\n if (theUrl.is('relative')) {\n theUrl = theUrl.absoluteTo(baseUrl);\n }\n return theUrl.toString();\n }\n\n exports.getHashCode = function (s) {\n for (var h = 0, i = 0; i < s.length; h &= h) {\n h = 31 * h + s.charCodeAt(i++);\n }\n return h;\n }\n\n exports.ensureDateIsValidMomentDate = function (date) {\n\n // this could come in as null, a string, a moment, a js date. Ensure its always a proper moment()\n var momentToReturn = moment();\n\n try {\n if (date) {\n switch (typeof (date)) {\n case 'object':\n momentToReturn = moment(new Date(date));\n case 'string':\n if (moment.isMoment(date)) {\n momentToReturn = date;\n }\n else {\n date = new String(date);\n // no - dashes for FF, it does not like them\n if (date.indexOf('-') > 0) {\n date.replace('-', '/');\n }\n momentToReturn = moment(new Date(date));\n }\n break;\n }\n }\n\n if (!momentToReturn.isValid()) {\n momentToReturn = moment();\n }\n }\n catch (e) {\n // suppress any errors and just give us moment()\n momentToReturn = moment();\n }\n\n return momentToReturn;\n }\n\n exports.setFilterItem = function (filters, filterKey) {\n\n var selectedFilterValue = null;\n if (filters[filterKey]) {\n\n var selectedFilterItem = _.filter(filters[filterKey].items, 'selected');\n if (selectedFilterItem) {\n\n if (selectedFilterItem.length > 1) {\n selectedFilterValue = _.map(selectedFilterItem, 'id');\n } else {\n selectedFilterValue = _.head(selectedFilterItem).id;\n }\n }\n }\n return selectedFilterValue;\n }\n\n exports.setFilterODataItem = function (oDataFilter, filters, filterKey, keyName) {\n\n // if we don't pass this in, default to convention\n if (!keyName) {\n keyName = filterKey + 'ID';\n }\n\n if (filters && filters[filterKey]) {\n var selectedFilter = _.filter(filters[filterKey].items, 'selected');\n if (selectedFilter) {\n\n oDataFilter[filterKey] = new _utils.FilterOption();\n oDataFilter[filterKey].key = keyName;\n oDataFilter[filterKey].comparer = 'eq';\n\n if (selectedFilter.length > 1) {\n oDataFilter[filterKey].booleanOperator = 'or';\n oDataFilter[filterKey].value = _.map(selectedFilter, 'id');\n } else {\n oDataFilter[filterKey].value = _.head(selectedFilter).id;\n }\n }\n }\n }\n\n exports.setFilterItemsByKeys = function (parameters, filters, useCamelCaseId) {\n if (parameters && filters) {\n _.forEach(_.keys(filters), function (filterKey) {\n parameters[filterKey + (useCamelCaseId ? 'Id' : 'ID')] = _utils.setFilterItem(filters, filterKey);\n });\n }\n }\n\n //Date\n\n exports.renderDatesAsStrings = function (parameters) {\n for (var key in parameters) {\n if (parameters[key] instanceof Date) {\n parameters[key] = exports.formatDateAsDate(parameters[key]);\n }\n }\n\n return parameters;\n }\n\n exports.formatDateAsDate = function (date, delimiter) {\n return moment(date).format('MM' + (delimiter ? delimiter : '/') + 'D' + (delimiter ? delimiter : '/') + 'YYYY');\n }\n\n exports.stripTimeFromDate = function (datetime) {\n return moment(datetime).format('YYYY-MM-DD');\n }\n\n exports.getDateFromTimeString = function (time) {\n var returnTime = moment();\n var split = time.split(':');\n returnTime.hour(split[0]);\n returnTime.minute(split[1]);\n return returnTime;\n }\n\n\n function timezoneLookup(school) {\n // todo: Use the new timezone field from the database\n switch (school.summerTimeZone) {\n case '06:00:00':\n return \"America/Denver\";\n break;\n case '05:00:00':\n return \"America/Chicago\";\n break;\n case '04:00:00':\n return \"America/Detroit\";\n break;\n default:\n throw school.shortName + ' timezone of ' + school.summerTimeZone + ' is not recognized.';\n break;\n }\n }\n\n exports.inSchoolTimezone = function (dateTime, school) {\n var timeZoneName;\n\n if (!school.timeZone || !school.timeZone.timeZoneName) {\n if (!!school.timeZoneName) {\n // school came from the getSchoolsForUser call\n timeZoneName = school.timeZoneName;\n } else {\n // log an error\n timeZoneName = timezoneLookup(school);\n }\n } else {\n timeZoneName = school.timeZone.timeZoneName;\n }\n\n return moment(dateTime).tz(timeZoneName);\n };\n\n exports.inSpecifiedTimezone = function(dateTimeString) {\n if (dateTimeString) {\n if (!!dateTimeString.indexOf) { // Warning - they didn't send in an MS Json Date\n var timezoneStart = dateTimeString.indexOf('-');\n if (timezoneStart == -1) {\n timezoneStart = dateTimeString.indexOf('+'); // NHA's branching out!\n }\n\n if (timezoneStart > -1) {\n var serverOffset = parseInt(dateTimeString.substring(timezoneStart, timezoneStart + 3)) * 60;\n\n for (var i = 0, len = validTimezones.length; i < len; i++) {\n var guess = moment.tz(dateTimeString, validTimezones[i]); // let's see if the date in this timezone matches the offset\n\n if (guess.utcOffset() == serverOffset) {\n return guess;\n }\n }\n }\n } else {\n if (moment.isMoment(dateTimeString) && !!dateTimeString.tz && !!dateTimeString.tz()) {\n // they sent in a moment object with timezone - just return it\n return dateTimeString;\n }\n }\n\n // we didn't find the timezone :-|\n // ToDo: is this the best option? Maybe we should return something to indicate that there is a timezone, but we just don't know about it.\n return moment.tz(dateTimeString, ''); // Carry on using the default timezone.\n } else {\n return null;\n }\n\n };\n\n exports.replaceAll = function (target, search, replacement) {\n return target.replace(new RegExp(search, 'g'), replacement);\n };\n\n //sets up auto scroll to top - intended to be wired into $stateChangeSuccess at the module level\n exports.enableScrollToTopOnStateChangeSuccess = function() {\n return window.setTimeout(function() {\n document.body.scrollTop = document.documentElement.scrollTop = 0;\n }, 50);\n }\n\n exports.keyCodes = {\n leftArrow: 37,\n upArrow: 38,\n rightArrow: 39,\n downArrow: 40,\n shift: 16,\n tab: 9,\n enter: 13,\n escape: 27\n };\n\n return exports;\n }\n\n //define globally if it doesn't already exist\n if (typeof (_utils) === 'undefined') {\n window._utils = init();\n }\n}.call(this));\n\nmoment.prototype.zoneNames = {\n EST: 'Eastern Time',\n EDT: 'Eastern Time',\n CST: 'Central Time',\n CDT: 'Central Time',\n MST: 'Mountain Time',\n MDT: 'Mountain Time',\n PST: 'Pacific Time',\n PDT: 'Pacific Time',\n GMT: '', // proposed: dates are UTC, so they wouldn't show timezone. UTC implies \"everywhere\".\n UTC: '',\n};\n\nmoment.prototype.zoneName = function () {\n var abbr = this.zoneAbbr();\n return this.zoneNames[abbr] || abbr;\n};\n\nmoment.prototype.toJSON = function () {\n // preserve timezone from client.\n return this.isValid() ? this.format() : null;\n};\r\n\n// Imitation of .NET String.Format().\nif (!String.prototype.format) {\n String.prototype.format = function () {\n var args = arguments;\n return this.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != 'undefined'\n ? args[number]\n : match\n ;\n });\n };\n}\n\n// Imitation of Java's HashCode function which returns hash representation of an object.\nif (!String.prototype.hashCode) {\n String.prototype.hashCode = function () {\n var hash = 0;\n if (this.length === 0) return hash;\n for (var i = 0; i < this.length; i++) {\n var charCode = this.charCodeAt(i);\n hash = ((hash << 5) - hash) + charCode;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n }\n}\n\nString.prototype.toNameCase = function () {\n var name = this.toString();\n\n if (NameCase.checkName(name)) {\n return NameCase(name, { individualFields: true });\n } else {\n return this;\n }\n};\n;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core', [\n\t\t// Utils\n\t\t'ngSanitize',\n\t\t// Routing\n\t\t'ui.router',\n\t\t'ui.utils',\n\t\t// Cookies\n\t\t'ngCookies', // this is leagacy at this point, please use ipCookie\n\t\t'ipCookie',\n\t\t'restangular',\n\t\t'angular-data.DSCacheFactory',\n\t\t// UI\n\t\t'ui.bootstrap',\n\t\t'ngAnimate',\n\t\t'nsPopover',\n\t\t'as.sortable',\n\t\t'angular-sortable-view',\n\t\t'ng-context-menu',\n\t\t'ncy-angular-breadcrumb',\n\t\t'nsPopover',\n\t\t'tableSort',\n\t\t'angular-ladda',\n\t\t'infinite-scroll',\n\t\t'infinite-scroll-two',\n\t\t'timepickerPop',\n\t\t'toastr',\n\t\t'ui.select',\n\t\t'ngInputModified',\n\t\t// Security\n\t\t'angular-jwt',\n\t\t// Mobile/Touch\n\t\t'matchmedia-ng',\n\t\t'ngTouch',\n\t\t'ngPatternRestrict',\n\t\t'module-sliding-sidebar',\n\t\t'angularSpinner'\n\t]);\n})();\n;\r\n(function () {\r\n\t'use strict';\r\n\r\n\tangular.module('nha.core').config(config);\r\n\r\n\tfunction config() {\r\n\t\treturn UserContextService.ensureUserContext();\r\n\t}\r\n\r\n\tangular.module('nha.core').run(run);\r\n\trun.$inject = ['$rootScope'];\r\n\r\n\tfunction run($rootScope) {\r\n\t\tvar pageTitleAppName = ' | NHA Student Information System';\r\n\t\tvar defaultPageTitle = 'CoreWeb' + pageTitleAppName;\r\n\r\n\t\t$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\r\n\t\t\tif (toState.hasOwnProperty('title')) {\r\n\t\t\t\tdocument.title = toState.title + pageTitleAppName;\r\n\t\t\t} else if (document.title !== defaultPageTitle) {\r\n\t\t\t\tdocument.title = defaultPageTitle;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('CoreRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.coreServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('AttendanceRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.attendanceServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('HouseholdRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.householdManagementServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('ApplicationRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.applicationServicesRootUrlv2);\n });\n }]);\n\n angular.module('nha.core').factory('CaseloadRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.caseloadServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('EnrollmentRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.enrollmentServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('AdminRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.administrationServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('StudentServicesRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.studentServicesServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('MasterSchedulingRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {https://core.mynhadev.com/../directives/dateEntry\n RestangularConfigurer.setBaseUrl(baseService.appSettings.masterSchedulingServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('GradebookRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.gradebookServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('PortalRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.portalServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('CurriculumRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.curriculumServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('LaunchpadRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.launchpadServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('AssessmentRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.assessmentServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('BehaviorRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.behaviorServicesRootUrl);\n });\n }]);\n \n angular.module('nha.core').factory('MasterScheduleBuilderRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.questionnaireServicesRootUrl); \n });\n }]);\n\n angular.module('nha.core').factory('ReportingRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.reportingServicesRootUrl);\n });\n }]);\n\n\tangular.module('nha.core').factory('DataWarehouseRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.dataWarehouseServicesRootUrl);\n });\n\t}]);\n\n\tangular.module('nha.core').factory('ILMRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n\t return Restangular.withConfig(function (RestangularConfigurer) {\n\t RestangularConfigurer.setBaseUrl(baseService.appSettings.ILMServicesRootUrl);\n\t });\n\t}]);\n\n\tangular.module('nha.core').factory('CalendarRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.calendarServicesRootUrl);\n });\n }]);\n\n angular.module('nha.core').factory('RetentionRestangular', ['Restangular', 'baseService', function (Restangular, baseService) {\n return Restangular.withConfig(function (RestangularConfigurer) {\n RestangularConfigurer.setBaseUrl(baseService.appSettings.calendarServicesRootUrl);\n });\n }]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('apiResolutionService', ['AttendanceRestangular', 'CoreRestangular', 'ApplicationRestangular', 'CaseloadRestangular', 'EnrollmentRestangular', 'StudentServicesRestangular', 'AdminRestangular', 'MasterSchedulingRestangular', 'HouseholdRestangular', 'PortalRestangular', 'CurriculumRestangular', 'LaunchpadRestangular', 'AssessmentRestangular', 'BehaviorRestangular', 'MasterScheduleBuilderRestangular', 'GradebookRestangular', 'ReportingRestangular', 'ILMRestangular', 'RetentionRestangular', 'Restangular',\n function (AttendanceRestangular, CoreRestangular, ApplicationRestangular, CaseloadRestangular, EnrollmentRestangular, StudentServicesRestangular, AdministrationRestangular, MasterSchedulingRestangular, HouseholdRestangular, PortalRestangular, CurriculumRestangular, LaunchpadRestangular, AssessmentRestangular, BehaviorRestangular, MasterScheduleBuilderRestangular, GradebookRestangular, ReportingRestangular, ILMRestangular, RetentionRestangular, DefaultRestangular)\n {\n //Perry TODO: change this to be convention based instead of hard-coded\n this.apiLookup = {\n 'Attendance': AttendanceRestangular,\n 'Core': CoreRestangular,\n 'Application': ApplicationRestangular,\n 'CaseloadManagement': CaseloadRestangular,\n 'Enrollment': EnrollmentRestangular,\n 'StudentServices': StudentServicesRestangular,\n 'Administration': AdministrationRestangular,\n 'MasterScheduling': MasterSchedulingRestangular,\n 'HouseholdManagement': HouseholdRestangular,\n 'Portal': PortalRestangular,\n 'Gradebook': GradebookRestangular,\n 'Curriculum': CurriculumRestangular,\n 'LaunchPad': LaunchpadRestangular,\n 'Assessment': AssessmentRestangular,\n 'Behavior': BehaviorRestangular,\n 'ScheduleQuestionnaire': MasterScheduleBuilderRestangular,\n 'Reporting': ReportingRestangular,\n 'ILM': ILMRestangular,\n 'Retention': RetentionRestangular\n };\n\n this.getApiByName = getApiByName;\n this.getApiNameByRestangular = getApiNameByRestangular;\n\n //Returns restangular object by application name\n function getApiByName(name) {\n return this.apiLookup[name] ? this.apiLookup[name] : null;\n }\n\n //Returns api name corresponding to a restangular object\n function getApiNameByRestangular(restangular) {\n if (!restangular) {\n //Fall back to application default restangular if not explicitly defined\n restangular = DefaultRestangular;\n }\n\n for (var key in this.apiLookup) {\n if (this.apiLookup[key].configuration.baseUrl === restangular.configuration.baseUrl) {\n return key;\n }\n }\n\n return null;\n }\n }]);\n\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('baseService', ['appSettings', '$q', 'cache', 'Restangular', function (appSettings, $q, cache, Restangular) {\n\n var service = {\n appSettings: appSettings,\n q: $q,\n cache: cache,\n Restangular: Restangular,\n getList: getList,\n put: put,\n getSingle: getSingle,\n inMemoryCache: {}\n };\n\n return service;\n\n // methods\n\n function getSingle(endpoint, parameters, shouldCache, shouldLog, RestangularFactory, useInMemoryCache) {\n return service.getList(endpoint, parameters, shouldCache, shouldLog, RestangularFactory, useInMemoryCache).then(function (result) {\n return result && result.length > 0 ? result[0] : result; // TODO: Mike Perry - 20150625 - Investigate incorrectly returned restangular object possibility\n });\n }\n\n function getList(endpoint, parameters, shouldCache, shouldLog, RestangularFactory, useInMemoryCache) {\n\n // turning off Cache, no matter what is passed in. Should all be coming from endpoint caching\n shouldCache = false;\n \n var deferred = $q.defer();\n\n //if (shouldLog) {\n // log('Getting _' + endpoint + '_ ...');\n //}\n\n var cacheKey = endpoint;\n\n if (!_.isEmpty(parameters)) {\n cacheKey += \"_\" + JSON.stringify(parameters);\n } \n\n var cachedData = null; \n\n // if we have cache, return it\n if (shouldCache) {\n if (useInMemoryCache && service.inMemoryCache[cacheKey]) {\n cachedData = service.inMemoryCache[cacheKey];\n }\n else {\n cachedData = cache.getByObjectKey(cacheKey);\n }\n\n //if (shouldLog) {\n // log('getting _' + endpoint + '_ from cache ...');\n //}\n\n if (cachedData) {\n //if (shouldLog) {\n // log('found _' + endpoint + '_ in cache ...');\n //}\n\n // returned our cached data back to the caller\n deferred.resolve(cachedData);\n return deferred.promise;\n }\n }\n\n //if (shouldLog && !shouldCache) {\n // log('Cache not used for _' + endpoint + '_ ...');\n //}\n\n var restangular = (!_.isUndefined(RestangularFactory) && RestangularFactory != null ? RestangularFactory : Restangular).one(endpoint);\n\n restangular.get(parameters).then(function (data) {\n\n // turning off Cache, no matter what is passed in. Should all be coming from endpoint caching\n shouldCache = false;\n\n\n if (shouldCache && data != null) {\n if (shouldLog) {\n //if (useInMemoryCache) {\n // log('adding _' + endpoint + '_ to in-memory cache');\n //}\n //else {\n // log('adding _' + endpoint + '_ to cache');\n //}\n }\n\n if (useInMemoryCache) {\n //Store original object in memory so we can rebind to it in subsequent requests\n service.inMemoryCache[cacheKey] = data;\n }\n else {\n // adding to cache\n cache.putByObjectKey(cacheKey, data);\n }\n }\n\n if (data != null) {\n deferred.resolve(data);\n }\n },\n function (error) {\n log('baseService ERROR: ', endpoint, error);\n deferred.reject(error);\n });\n\n return deferred.promise;\n }\n\n // Updates an entity with option of wiping it from cache\n //NOTE: endpoint must match identically in order to be wiped from cache!\n //TODO: remove paramsOriginallyUsedInGetList parameter when we fix caching -- see TODOs below\n function put(endpoint, objectToUpdate, id, shouldLog, RestangularFactory, paramsOriginallyUsedInGetList) {\n var deferred = $q.defer();\n\n //if (shouldLog)\n // log('Calling PUT on _' + endpoint + '_ ...');\n\n var restangular = (RestangularFactory != undefined ? RestangularFactory : Restangular).all(endpoint);\n restangular.customPUT(objectToUpdate, id).then(function (data) {\n \n // Find the object we are updating in the cache and wipe it out\n //if (shouldLog) {\n // log('Wiping _' + endpoint + '_ from cache');\n //}\n\n //TODO: Sending in originally used params to find cache key is pretty ugly. And this doesn't refresh a list of results that we may have cached.\n //What we'll likely need to do is add categorization by endpoint to cache so we can wipe all cache data related to that endpoint\n var cacheKey = endpoint;\n //log('Searching cache for _' + cacheKey + '_');\n if (cache.getByObjectKey(cacheKey)) {\n cache.destroyByObjectKey(cacheKey);\n }\n \n cacheKey = endpoint + '/' + id;\n // log('Searching cache for _' + cacheKey + '_');\n if (cache.getByObjectKey(cacheKey)) {\n cache.destroyByObjectKey(cacheKey);\n }\n\n if (paramsOriginallyUsedInGetList) {\n cacheKey = paramsOriginallyUsedInGetList;\n // log('Searching cache for _' + cacheKey + '_');\n if (cache.getByObjectKey(cacheKey)) {\n cache.destroyByObjectKey(cacheKey);\n }\n }\n\n if (data != null) {\n deferred.resolve(data);\n } else {\n deferred.resolve();\n }\n\n }, function (error) {\n log('baseService PUT ERROR: ', endpoint, error);\n deferred.reject(error);\n });\n\n return deferred.promise;\n }\n\n //TODO: When we fix cache keys, we'll want a custom POST method that wipes related objects from the cache.\n //Say we add a new School. We'd want to wipe out any lists of schools we may have loaded.\n function post() {\n \n }\n }]);\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .factory('cache', ['DSCacheFactory', function (DSCacheFactory) {\n\n var options = {\n onExpire: function (key, value) {\n // log('_Cache Expiration_ ' + key);\n },\n storageMode: (window.localStorage ? 'localStorage' : 'memory'),\n maxAge: 3600000, // Items added to this cache expire after 60 minutes.\n cacheFlushInterval: 60000, // This cache will clear itself every hour.\n deleteOnExpire: 'aggressive', // Items will be deleted from this cache right when they expire.\n capacity: 1000 // only store up to 100 items (key/value pairs)\n };\n\n // we set all the defaults here, but you can change them when using them for each service\n var cacheFactory = DSCacheFactory('cache', options);\n\n var cache = {\n cacheFactory: cacheFactory,\n getByObjectKey: function (obj) {\n var key = this.getHashKey(obj);\n // log('_Cache Object Key Hit!_ ' + key);\n return this.cacheFactory.get(key);\n },\n putByObjectKey: function (obj, data) {\n var key = this.getHashKey(obj);\n // log('_Cache Object Write!_ ' + key);\n try {\n return this.cacheFactory.put(key, data);\n } catch (e) {\n log('Cache failed to Save: [c=\"color: red\"]' + e.description + '[c]');\n return null;\n }\n },\n get: function (key) {\n //log('_Cache Hit!_ ' + key);\n return this.cacheFactory.get(key);\n },\n put: function (key, data) {\n //log('_Cache Write!_ ' + key);\n try {\n return this.cacheFactory.put(key, data);\n } catch (e) {\n log('Cache failed to Save: [c=\"color: red\"]' + e.description + '[c]');\n return null;\n }\n },\n getHashKey: function (key) {\n return getHashCode(JSON.stringify(key));\n },\n destroyByObjectKey: function (obj) {\n var key = this.getHashKey(obj);\n log('_Cache Removed_ ' + key);\n return this.cacheFactory.remove(key);\n },\n clearAll: function() {\n log('_Clearing All Caches_');\n return this.cacheFactory.removeAll(); \n }\n };\n\n return cache;\n }]);\n\n function getHashCode(s) {\n for (var h = 0, i = 0; i < s.length; h &= h) {\n h = 31 * h + s.charCodeAt(i++);\n }\n return h;\n }\n\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .factory('extendedRepositoryFactory', ['repositoryFactory', function (repositoryFactory) {\n\n return function (endpoint, restangular, endpointOptions) {\n\n var svc = this;\n\n //Extend base repository functionality\n _.assign(svc, new repositoryFactory(endpoint, restangular, endpointOptions));\n\n svc.endpoint = endpoint;\n svc.restangular = restangular;\n\n svc.defaultOptions = _.assign({\n shouldCache: true, // this will client side cache into local storage\n shouldLog: false, // this will show console log messages\n isOData: true, // the getAll is an OData call\n capitalizeIdString: true, // for oData calls, determine whether to make it Id or ID\n firstLetterCapitalize: true, // for OData calls, capitalize the first string to match the server side OData call. Example schoolID to SchoolID\n urlAppendString: '',\n requireODataFilter: false, // this will require at least one OData filter so we don't kill an endpoint\n pageSize: 50,\n append: true\n }, endpointOptions);\n\n svc.moreExist = true;\n svc.loadedCount = 0;\n\n /**\n * @name getPage\n * @description gets a page of entities\n * @returns collection of entities\n * @memberOf extendedRepositoryFactory\n */\n svc.getPage = function (params, options) {\n\n // defaulted options, but allow them to be overidden\n var _options = options ? _.assign(this.defaultOptions, options) : this.defaultOptions;\n\n if (!options.append) {\n svc.loadedCount = 0;\n svc.moreExist = true;\n }\n\n if (_options.isOData) {\n params.top = _options.pageSize;\n params.skip = svc.loadedCount;\n if (params.sort) {\n _utils.setOrderByParameters(params, params.sort);\n }\n if (params.searchText) {\n _utils.setSearchFilter(params, params.searchText, svc.textSearchFields);\n }\n }\n\n return this.getAll(params, _options).then(function (response) {\n svc.loadedCount += response.length;\n if (response.length < _options.pageSize) {\n svc.moreExist = false;\n }\n return response;\n });\n }\n\n }\n\n }]);\n})();\n;\r\n/**\n * pub-sub.factory\n * @namespace core\n */\n\n(function () {\n 'use strict';\n\n /** add factory */\n angular.module('nha.core').factory('pub-sub.factory', pubSubFactory);\n\n /** injection */\n pubSubFactory.$inject = ['DSCacheFactory'];\n\n /** implementation */\n function pubSubFactory(DSCacheFactory) {\n /** create pub sub class */\n function PubSubManager(keys, storageMode, appName) {\n /** private properties */\n var cacheName = _.uniqueId((appName || 'myNHA') + '_');\n var cache = DSCacheFactory(cacheName, {\n storageMode: (storageMode ? storageMode : (window.localStorage ? 'localStorage' : 'memory')),\n maxAge: 3600000,\n deleteOnExpire: 'aggressive'\n });\n\n /** public properties */\n this.keys = {};\n\n /** public methods */\n this.hasKey = hasKey;\n this.addData = addData;\n this.addCallback = addCallback;\n this.removeCallback = removeCallback;\n this.getData = getData;\n this.setData = setData;\n this.removeData = removeData;\n this.removeAllData = removeAllData;\n this.resetData = resetData;\n\n /** add initial keys */\n if (!keys) keys = [];\n _.each(keys, function (key) {\n this.addData(key, null);\n }.bind(this));\n\n /** public method implementations */\n\n /** check for a key */\n function hasKey(key) {\n return this.keys.hasOwnProperty(key);\n }\n\n /** add a data value */\n function addData(key, data, callback) {\n /** check for existing key */\n if (!this.hasKey(key)) {\n this.keys[key] = [];\n }\n\n /** add the data value */\n cache.put(key, data);\n\n /** check for a callback and add to callbacks array */\n if (callback) addCallback(key, callback);\n }\n\n /** add a callback for when the data value changes */\n function addCallback(key, callback, clean, scope) {\n /** check for existing key */\n if (this.hasKey(key)) {\n\t\t\t\t\t/** add properties to callback for cleanup */\n\t\t\t\t\tcallback.signature = callback.toString() + (scope ? '-' + scope.$id : '');\n\n\t\t\t\t\t/** check if we're cleaning up duplicate methods (by signature) */\n if (clean) this.removeCallback(key, callback);\n this.keys[key].push(callback);\n\n\t\t\t\t\t/** check for scope */\n\t\t\t\t\tif (scope) {\n\t\t\t\t\t\t/** capture when scope is destroyed (callback cleanup) */\n\t\t\t\t\t\tscope.$on('$destroy', function() {\n\t\t\t\t\t\t\t/** remove the callback */\n\t\t\t\t\t\t\tthis.removeCallback(key, callback);\n\t\t\t\t\t\t}.bind(this));\n\t\t\t\t\t}\n }\n }\n\n /** remove a callback */\n function removeCallback(key, callback) {\n /** check for existing key */\n if (this.hasKey(key)) {\n /** get callback signature */\n var signature = callback.signature;\n\n /** cycle through key to remove matching callback */\n _.forEach(this.keys[key], function (cb, index) {\n /** check for callback */\n\t\t\t\t\t\tif (cb) {\n\t\t\t\t\t\t\t/** get callback signature */\n\t\t\t\t\t\t\tvar cbSignature = cb.signature;\n\n\t\t\t\t\t\t\t/** check for match and remove */\n\t\t\t\t\t\t\tif (signature === cbSignature) {\n\t\t\t\t\t\t\t\tthis.keys[key].splice(index, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t/** remove undefined callback */\n\t\t\t\t\t\t\tthis.keys[key].splice(index, 1);\n\t\t\t\t\t\t}\n }.bind(this));\n }\n }\n\n /** get the data value for the given key */\n function getData(key) {\n /** return data */\n if (!this.hasKey(key)) return null;\n return cache.get(key) || null;\n }\n\n /** set the data value for the given key */\n function setData(key, data) {\n /** check for existing key */\n if (!this.hasKey(key)) {\n this.keys[key] = [];\n }\n\n /** get the old data */\n var oldData = angular.copy(cache.get(key));\n\n /** set the value for the data key */\n if (data === null || data === undefined) cache.remove(key);\n else cache.put(key, data);\n\n /** fire off each callback passing new and old values */\n _.forEach(this.keys[key], function (callback) {\n callback(cache.get(key) || null, oldData);\n });\n }\n\n /** remove data for key */\n function removeData(key) {\n /** remove from cache */\n cache.remove(key);\n\n /** remove the key */\n delete this.keys[key];\n }\n\n /** remove all data */\n function removeAllData() {\n /** remove all from cache */\n cache.removeAll();\n\n /** clear keys */\n this.keys = {};\n }\n\n /** reset all data to nulls */\n function resetData(keys) {\n _.each(keys, function (key) {\n this.setData(key, null);\n }.bind(this));\n }\n }\n\n /** return PubSubManager class definition */\n return PubSubManager;\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .factory('repositoryFactory', ['baseService', 'Restangular', '$q', function (baseService, Restangular, $q) {\n\n return function (endpoint, restangular, endpointOptions) {\n\n // You have to have an endpoint specified\n if (!endpoint) {\n log('no endpoint specified in the repository factory!');\n return 'No endpoint specified!';\n }\n\n this.endpoint = endpoint;\n this.restangular = (restangular ? restangular : Restangular); // default to the default Restangular that the app has configured\n this.defaultOptions = _.assign({\n shouldCache: true, // this will client side cache into local storage\n shouldLog: false, // this will show console log messages\n isOData: true, // the getAll is an OData call\n capitalizeIdString: true, // for oData calls, determine whether to make it Id or ID\n firstLetterCapitalize: true, // for OData calls, capitalize the first string to match the server side OData call. Example schoolID to SchoolID\n urlAppendString: '',\n requireODataFilter: false // this will require at least one OData filter so we don't kill an endpoint\n }, endpointOptions);\n\n /**\n * @name getOne\n * @description get a single entity by id\n * @returns entity\n * @memberOf repositoryFactory\n */\n this.get = function (id, options) {\n\n // this supports either a json object or an int passed in\n if (typeof (id) !== 'object') {\n id = { id: id };\n }\n\n // defaulted options, but allow them to be overidden\n var _options = options ? _.assign(this.defaultOptions, options) : this.defaultOptions;\n\n return baseService.getSingle(this.endpoint.concat(_options.urlAppendString), id, _options.shouldCache, _options.shouldLog, this.restangular);\n }\n\n /**\n * @name getAll\n * @description gets a collection of entities\n * @returns collection of entities\n * @memberOf repositoryFactory\n */\n this.getAll = function (params, options) {\n\n // defaulted options, but allow them to be overidden\n var _options = options ? _.assign(this.defaultOptions, options) : this.defaultOptions;\n var apiParameters = {};\n\n // check to see if at least one Odata parameter is required\n if (_options.isOData && _options.requireODataFilter && _.isEmpty(params)) {\n return $q.reject({ error: 'This endpoint is configured to require at least one OData Filter, usually for performance reasons' });\n }\n\n // if no filter property, then assume this is older style and that all parms are filters\n if (!_.isEmpty(params)) {\n\n // make sure this is configured as an Odata call before we bother with any of this OData\n if (_options.isOData) {\n\n // only go into this if we have a valid odata parm passed in\n if ((params.filter || params.top || params.count || params.skip || params.orderBy || params.select)) {\n\n // loop through our params to see if we have an OData properties to capitalize/fix IDs\n _.forEach(_.keys(params), function(key) {\n\n // we only care about these three because they could have a column name\n if (_.includes(['filter', 'select', 'orderBy'], key)) {\n\n // ensure they have a value\n if (!_.isEmpty(params[key])) {\n \n // dynamically setup filter model with proper capitalization and ids to match backend\n params[key] = _utils.getODataFilterFromParams(params[key], _options.capitalizeIdString, _options.firstLetterCapitalize);\n } else {\n // its empty, let's just remove it and get it out of the equation\n delete params[key];\n }\n } \n });\n\n // setup our OData properties for everything now that its ready.\n // This assumes its all just an OData filter\n apiParameters = _utils.getODataRequest(params);\n\n } else {\n // if no params, don't run it through the odata filters, also is the caller is saying its not OData.\n apiParameters = _utils.getParsedODataFilter(params, _options.capitalizeIdString, _options.firstLetterCapitalize);\n }\n } else {\n apiParameters = params;\n }\n }\n\n // ensure we have something in here\n var endpointUrl = this.endpoint;\n if (_options.urlAppendString) {\n endpointUrl = endpointUrl.concat(_options.urlAppendString);\n }\n\n return baseService.getList(endpointUrl, apiParameters, _options.shouldCache, _options.shouldLog, this.restangular);\n }\n\n /**\n * @name put\n * @description updates an existing entity\n * @returns promise\n * @memberOf repositoryFactory\n */\n this.put = function (entity, id, options) {\n\n // defaulted options, but allow them to be overidden\n var _options = options ? _.assign(this.defaultOptions, options) : this.defaultOptions;\n\n // ensure we have something in here\n var endpointUrl = this.endpoint;\n if (_options.urlAppendString) {\n endpointUrl = endpointUrl.concat(_options.urlAppendString);\n }\n\n return restangular.all(endpointUrl).customPUT(entity, id);\n }\n\n /**\n * @name post\n * @description inserts new entity\n * @returns promise\n * @memberOf repositoryFactory\n */\n this.post = function (entity, options) {\n\n // defaulted options, but allow them to be overidden\n var _options = options ? _.assign(this.defaultOptions, options) : this.defaultOptions;\n\n // ensure we have something in here\n var endpointUrl = this.endpoint;\n if (_options.urlAppendString) {\n endpointUrl = endpointUrl.concat(_options.urlAppendString);\n }\n\n return restangular.all(endpointUrl).customPOST(entity);\n }\n\n /**\n * @name save\n * @description saves or updates an entity. This is a convenience method\n * @returns promise\n * @memberOf repositoryFactory\n */\n this.save = function (entity, id) {\n return (id ? this.put(entity, id) : this.post(entity));\n }\n\n /**\n * @name patch\n * @description updates parts of an existing entity\n * @returns promise\n * @memberOf repositoryFactory\n */\n this.patch = function (entity, id) {\n return restangular.one(endpoint).patch(entity, id);\n }\n\n /**\n * @name remove\n * @description removes the entity by id\n * @returns promise\n * @memberOf repositoryFactory\n */\n this.remove = function (id) {\n return restangular.one(this.endpoint, id).remove();\n }\n }\n\n }]);\n\n})();\n;\r\n(function () {\r\n\t'use strict';\r\n\r\n\tangular.module('nha.core').factory('htmlTemplateInjector', ['$templateCache', function ($templateCache) {\r\n\t\tfunction guid() {\r\n\t\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n\t\t\t\tconst r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);\r\n\t\t\t\treturn v.toString(16);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\trequest: function (config) {\r\n\t\t\t\tif (config.url.includes('.html') && !$templateCache.get(config.url)) {\r\n\t\t\t\t\tconfig.url += '?v=' + (window.cacheKey ? window.cacheKey : guid());\r\n\t\t\t\t\treturn config;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn config;\r\n\t\t\t}\r\n\t\t};\r\n\t}]);\r\n\r\n\tangular.module('nha.core').config(['$httpProvider', function ($httpProvider) {\r\n\t\t$httpProvider.interceptors.push('htmlTemplateInjector');\r\n\t}]);\r\n})();\r\n;\r\n(function () {\r\n\t'use strict';\r\n\r\n\tvar _appSettings = myNHA.appSettings;\r\n\tvar IMPERSONATION_COOKIE = _appSettings.environment + '-mynha-impersonation';\r\n\r\n\tangular.module('nha.core').factory('impersonationInjector', [\r\n\t\tfunction () {\r\n\t\t\tfunction addImpersonationHeader(config) {\r\n\t\t\t\tconfig.headers['impersonation-user'] = Cookies.get(IMPERSONATION_COOKIE);\r\n\t\t\t\tconfig.headers['impersonation-user-type'] = 'staff';\r\n\t\t\t\tconfig.headers['impersonation-application'] = 'mynha';\r\n\t\t\t\treturn config;\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\trequest: function (config) {\r\n\t\t\t\t\tif (!config.url.includes('/api')) {\r\n\t\t\t\t\t\treturn config;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (Cookies.get(IMPERSONATION_COOKIE)) {\r\n\t\t\t\t\t\treturn addImpersonationHeader(config);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn config;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t]);\r\n\r\n\tangular.module('nha.core').config([\r\n\t\t'$httpProvider',\r\n\t\tfunction ($httpProvider) {\r\n\t\t\t$httpProvider.interceptors.push('impersonationInjector');\r\n\t\t}\r\n\t]);\r\n})();\r\n;\r\n'use strict';\n\n/**\n * nha.interceptors\n *\tInterceptors for $http requests made in NHA applications\n */\n\n/**\n * nha.interceptors.responseErrorInterceptor\n *\tA default response error interceptor\n */\nangular.module('nha.core').factory('responseErrorInterceptor', [, function(notifySvc){\n\t/** create object of status codes */\n\tvar statusCodes = {\n\t\t'400': { 'title': 'Bad Request', 'message': 'The request cannot be fulfilled due to bad syntax' },\n\t\t'401': { 'title': 'Unauthorized', 'message': 'The request was a legal request, but the server is refusing to respond to it. For use when authentication is possible but has failed or not yet been provided' },\n\t\t'403': { 'title': 'Forbidden', 'message': 'The request was a legal request, but the server is refusing to respond to it' },\n\t\t'404': { 'title': 'Not Found', 'message': 'The requested page could not be found but may be available again in the future' },\n\t\t'405': { 'title': 'Method Not Allowed', 'message': 'A request was made of a page using a request method not supported by that page' },\n\t\t'406': { 'title': 'Not Acceptable', 'message': 'The server can only generate a response that is not accepted by the client' },\n\t\t'407': { 'title': 'Proxy Authentication Required', 'message': 'The client must first authenticate itself with the proxy' },\n\t\t'408': { 'title': 'Request Timeout', 'message': 'The server timed out waiting for the request' },\n\t\t'409': { 'title': 'Conflict', 'message': 'The request could not be completed because of a conflict in the request' },\n\t\t'410': { 'title': 'Gone', 'message': 'The requested page is no longer available' },\n\t\t'411': { 'title': 'Length Required', 'message': 'The \"Content-Length\" is not defined. The server will not accept the request without it' },\n\t\t'412': { 'title': 'Precondition Failed', 'message': 'The precondition given in the request evaluated to false by the server' },\n\t\t'413': { 'title': 'Request Entity Too Large', 'message': 'The server will not accept the request, because the request entity is too large' },\n\t\t'414': { 'title': 'Request-URI Too Long', 'message': 'The server will not accept the request, because the URL is too long. Occurs when you convert a POST request to a GET request with a long query information' },\n\t\t'415': { 'title': 'Unsupported Media Type', 'message': 'The server will not accept the request, because the media type is not supported' },\n\t\t'416': { 'title': 'Requested Range Not Satisfiable', 'message': 'The client has asked for a portion of the file, but the server cannot supply that portion' },\n\t\t'417': { 'title': 'Expectation Failed', 'message': 'The server cannot meet the requirements of the Expect request-header field' },\n\t\t'500': { 'title': 'Internal Server Error', 'message': 'A generic error message, given when no more specific message is suitable' },\n\t\t'501': { 'title': 'Not Implemented', 'message': 'The server either does not recognize the request method, or it lacks the ability to fulfill the request' },\n\t\t'502': { 'title': 'Bad Gateway', 'message': 'The server was acting as a gateway or proxy and received an invalid response from the upstream server' },\n\t\t'503': { 'title': 'Service Unavailable', 'message': 'The server is currently unavailable (overloaded or down)' },\n\t\t'504': { 'title': 'Gateway Timeout', 'message': 'The server was acting as a gateway or proxy and did not receive a timely response from the upstream server' },\n\t\t'505': { 'title': 'HTTP Version Not Supported', 'message': 'The server does not support the HTTP protocol version used in the request' },\n\t\t'511': { 'title': 'Network Authentication Required', 'message': 'The client needs to authenticate to gain network access' }\n\t};\n\n\t/** create interceptor */\n\tvar interceptor = {\n\t\t/** intercept response errors */\n\t\t'responseError': function(response){\n\t\t\t/** create notification */\n\t\t\tnotifySvc.error(statusCodes[response.status].title, statusCodes[response.status].message);\n\n\t\t\t/** return an empty array */\n\t\t\treturn { 'data': { 'success': false, 'error': { 'title': statusCodes[response.status].title, 'message': statusCodes[response.status].message } } };\n\t\t}\n\t};\n\n\t/** return the interceptor */\n\treturn interceptor;\n}]);\n\n/** modify nha configuration to include interceptor */\nangular.module('nha.core').config(function () {\n /** add interceptor */\n\n // TODO: don't push this interceptor quite yet\n\n\t//$httpProvider.interceptors.push('responseErrorInterceptor');\n});;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core').factory('sessionInjector', [function () {\n\t\t/** set myNHA const */\n\t\tvar _myNHA = window['myNHA'];\n\t\tvar _appSettings = _myNHA.appSettings;\n\t\tvar _userSessionService = new _myNHA.UserSessionService();\n\t\tvar _refreshInProgress = false;\n\n\t\t/** track the session cookie name for token */\n\t\tvar SESSION_COOKIE = _appSettings.environment + '-user-token';\n\n\t\t/** get the token */\n\t\tfunction getToken() {\n\t\t\t/** get the jwt token and return */\n\t\t\tvar token = Cookies.get(SESSION_COOKIE);\n\t\t\treturn token;\n\t\t}\n\n\t\t/** add the authentication header */\n\t\tfunction addAuthToken(config) {\n\t\t\t/** add the token */\n\t\t\tconfig.headers['Authorization'] = 'Bearer ' + getToken();\n\t\t\treturn config;\n\t\t}\n\n\t\t/** create the interceptor methods */\n\t\treturn {\n\t\t\trequest: function (config) {\n\t\t\t\t/** check the request to see if it is an api request */\n\t\t\t\tif (!config.url.includes('/api')) {\n\t\t\t\t\treturn config;\n\t\t\t\t}\n\n\t\t\t\tif (_appSettings.enableSessionInjectorApiRequestLogging) {\n\t\t\t\t\tconsole.log('API Request: ' + config.url);\n\t\t\t\t}\n\n\t\t\t\t/** check to see if the refresh is in progress */\n\t\t\t\tif (_refreshInProgress) {\n\t\t\t\t\tconsole.log('Token Refresh In Progress');\n\n\t\t\t\t\t/** wait for refresh to produce new token */\n\t\t\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t\t\tconsole.log('Waiting For Token');\n\n\t\t\t\t\t\tvar check = null;\n\t\t\t\t\t\tcheck = window.setInterval(function () {\n\t\t\t\t\t\t\tif (_userSessionService.hasUserToken()) {\n\t\t\t\t\t\t\t\tconsole.log('Token Is Ready');\n\t\t\t\t\t\t\t\tresolve(addAuthToken(config));\n\t\t\t\t\t\t\t\twindow.clearInterval(check);\n\t\t\t\t\t\t\t\tcheck = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t/** get the token */\n\t\t\t\t\tvar token = getToken(config);\n\n\t\t\t\t\t/** check if the token is expired */\n\t\t\t\t\tif (_myNHA.JWT.isTokenExpired(token)) {\n\t\t\t\t\t\tconsole.log('%cToken Is Expired. Refresh It.', 'color: blue; font-weight: bold;');\n\n\t\t\t\t\t\t/** flip refreshing flag */\n\t\t\t\t\t\t_refreshInProgress = true;\n\n\t\t\t\t\t\t/** refresh the token, emit new token, continue request */\n\t\t\t\t\t\treturn _userSessionService.refreshToken().then(function (jwt) {\n\t\t\t\t\t\t\tconsole.log('Token Refreshed: ' + jwt);\n\n\t\t\t\t\t\t\t/** flip refreshing flag */\n\t\t\t\t\t\t\t_refreshInProgress = false;\n\n\t\t\t\t\t\t\tconsole.log('%cContinue Request', 'color: red; font-weight: bold;');\n\n\t\t\t\t\t\t\t/** get the token */\n\t\t\t\t\t\t\treturn addAuthToken(config);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/** return the config with auth header */\n\t\t\t\t\t\treturn addAuthToken(config);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}]);\n\n\t/** add interceptors to pipeline */\n\tangular.module('nha.core').config(['$httpProvider', function ($httpProvider) {\n\t\t$httpProvider.interceptors.push('sessionInjector');\n\t}]);\n})();\n;\r\n/**\n * academic-year.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('academicYearRepository', academicYearRepository);\n\n // protect against minification\n /* @ngInject */\n academicYearRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name academicYearRepository\n * @description Constructor for academic-year.repository\n * @memberOf core\n */\n function academicYearRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAllAcademicYears = getAllAcadmicYears;\n service.getByAcademicYearId = getByAcademicYearId;\n service.getCurrentAcademicYear = getCurrentAcademicYear;\n\n return service;\n\n /**\n * @name getAllAcadedmicYears\n * @description retrieves list of academicYears from storage\n * @returns List List of objects containing a subset of academicYear properties\n * @memberOf academic-year.repository\n */\n function getAllAcadmicYears() {\n return baseService.getList(\"academicyear\", null, true, true, coreRestangular);\n }\n\n /**\n * @name getByAcademicYearId\n * @description retrieves a single academicYear by academicYearId from storage\n * @returns a single academicYear object\n * @memberOf academic-year.repository\n */\n function getByAcademicYearId(academicYearId) {\n return baseService.getSingle('academicyear', { id: academicYearId }, false, true, coreRestangular);\n }\n\n /**\n * @name getCurrentAcademicYear\n * @description retrieves the current academicYear from storage\n * @returns a single academicYear object\n * @memberOf academic-year.repository\n */\n function getCurrentAcademicYear() {\n var oDataFilter = {\n IsCurrent: true\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n return baseService.getSingle('academicyear', params, false, true, coreRestangular);\n }\n\n }\n\n})();;\r\n/**\n * academic-year.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('accessibleResourceRepository', accessibleResourceRepository);\n\n // protect against minification\n /* @ngInject */\n accessibleResourceRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name academicYearRepository\n * @description Constructor for academic-year.repository\n * @memberOf core\n */\n function accessibleResourceRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n service.getAll = getAll;\n\n function getAll() {\n return baseService.getList(\"AccessibleResource\", null, false, true, coreRestangular);\n }\n\n return service;\n }\n\n})();;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core').service('apiSecurityService', ApiSecurityService);\n\n\tApiSecurityService.$inject = ['baseService', 'userContextService', '$q', 'appSettings', 'accessibleResourceRepository', '$timeout', 'apiResolutionService'];\n\n\tfunction ApiSecurityService(baseService, UserContextService, $q, appSettings, accessibleResourceRepository, $timeout, apiResolutionService) {\n\t\tvar service = {\n\t\t\tdoesUserHaveClaim: doesUserHaveClaim,\n\t\t\tisAccessAllowed: isAccessAllowed,\n\t\t\tgetClaimValue: getClaimValue,\n\t\t\tisFeatureAccessible: isFeatureAccessible,\n\t\t\tparseResource: parseResource,\n\t\t\tparseApiResourceAction: parseApiResourceAction,\n\t\t\taccessibleResources: null,\n\t\t\tdoesPolicyAllowAccess: doesPolicyAllowAccess,\n\t\t\tsetAccessibleResources: setAccessibleResources,\n\t\t\tloadAccessibleResources: loadAccessibleResources,\n\t\t\twaitForAccessibleResources: waitForAccessibleResources,\n\t\t\tisAccessAllowedBulk: isAccessAllowedBulk,\n\t\t\tisAccessAllowedSingle: isAccessAllowedSingle,\n\t\t\thasSaviyntEntitlement: hasSaviyntEntitlement,\n\t\t\tisBulkLoadingAccess: false\n\t\t};\n\n\t\treturn service;\n\n\t\tfunction parseResource(singleResourceString) {\n\t\t\tvar returnValue = {};\n\n\t\t\tif (singleResourceString) {\n\t\t\t\tif (singleResourceString.indexOf(':') > -1) {\n\t\t\t\t\tvar splitText = singleResourceString.split(':');\n\t\t\t\t\treturnValue.resource = splitText.shift();\n\n\t\t\t\t\tif (splitText.length > 0) {\n\t\t\t\t\t\treturnValue.action = splitText.join(':');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturnValue.resource = singleResourceString;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!returnValue.action) {\n\t\t\t\treturnValue.action = 'Get';\n\t\t\t}\n\n\t\t\treturn returnValue;\n\t\t}\n\n\t\tfunction parseApiResourceAction(apiResourceAction, defaultApi) {\n\t\t\tvar apiTokenIndex = apiResourceAction.indexOf('\\\\');\n\t\t\tvar api = apiTokenIndex > 0 ? apiResourceAction.substr(0, apiTokenIndex) : defaultApi;\n\n\t\t\tvar resourceAction = apiTokenIndex > 0 ? apiResourceAction.substr(apiTokenIndex + 1) : apiResourceAction;\n\t\t\tvar parsedResourceAction = parseResource(resourceAction);\n\n\t\t\treturn {\n\t\t\t\tapi: api,\n\t\t\t\tresource: parsedResourceAction.resource,\n\t\t\t\taction: parsedResourceAction.action\n\t\t\t};\n\t\t}\n\n\t\tfunction doesPolicyAllowAccess(resource, action, application) {\n\t\t\tif (service.accessibleResources) {\n\t\t\t\tvar returnValue =\n\t\t\t\t\tservice.accessibleResources[application] &&\n\t\t\t\t\tservice.accessibleResources[application][resource] &&\n\t\t\t\t\tservice.accessibleResources[application][resource][action];\n\n\t\t\t\tif (!_.isUndefined(returnValue)) {\n\t\t\t\t\treturn returnValue;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfunction isAccessAllowed(resource, action, restangular) {\n\t\t\tif (appSettings.disableApiSecurity) {\n\t\t\t\tvar deferred = $q.defer();\n\t\t\t\tdeferred.resolve(true);\n\t\t\t\treturn deferred.promise;\n\t\t\t}\n\n\t\t\t// this wil force this ti always to go the more performant bulk loading\n\t\t\tif (appSettings.forceBulkAccessCall !== true && (appSettings.debug || appSettings.disableBulkAuthorizationRetrieval)) {\n\t\t\t\treturn service.isAccessAllowedSingle(resource, action, restangular);\n\t\t\t} else {\n\t\t\t\treturn service.isAccessAllowedBulk(resource, action, restangular);\n\t\t\t}\n\t\t}\n\n\t\tfunction hasSaviyntEntitlement(entitlement) {\n\t\t\treturn UserContextService.ensureUserContext().then(function (context) {\n\t\t\t\tvar entitlementParts = entitlement.toLowerCase().split('|');\n\t\t\t\tvar entitlementType = entitlementParts[0];\n\t\t\t\tvar entitlementName = entitlementParts[1];\n\n\t\t\t\tif (\n\t\t\t\t\tcontext.entitlements.find(function (entitlement) {\n\t\t\t\t\t\treturn entitlement.entitlementType.toLowerCase() === entitlementType && entitlement.entitlementName.toLowerCase() === entitlementName;\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction isAccessAllowedBulk(resource, action, restangular) {\n\t\t\tvar deferred = $q.defer();\n\n\t\t\tif (service.accessibleResources) {\n\t\t\t\tvar applicationName = apiResolutionService.getApiNameByRestangular(restangular);\n\t\t\t\tdeferred.resolve(service.doesPolicyAllowAccess(resource, action, applicationName));\n\t\t\t} else {\n\t\t\t\tif (!service.isBulkLoadingAccess) {\n\t\t\t\t\tservice.loadAccessibleResources(resource, action, restangular, deferred);\n\t\t\t\t} else {\n\t\t\t\t\tservice.waitForAccessibleResources(resource, action, restangular, deferred);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\tfunction waitForAccessibleResources(resource, action, restangular, deferred) {\n\t\t\t$timeout(function () {\n\t\t\t\tif (service.accessibleResources) {\n\t\t\t\t\tvar applicationName = apiResolutionService.getApiNameByRestangular(restangular);\n\t\t\t\t\tdeferred.resolve(service.doesPolicyAllowAccess(resource, action, applicationName));\n\t\t\t\t} else {\n\t\t\t\t\tservice.waitForAccessibleResources(resource, action, restangular, deferred);\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t}\n\n\t\tfunction loadAccessibleResources(resource, action, restangular, deferred) {\n\t\t\tservice.isBulkLoadingAccess = true;\n\n\t\t\taccessibleResourceRepository.getAll().then(\n\t\t\t\tfunction (result) {\n\t\t\t\t\tservice.setAccessibleResources(result);\n\n\t\t\t\t\tvar applicationName = apiResolutionService.getApiNameByRestangular(restangular);\n\n\t\t\t\t\tdeferred.resolve(service.doesPolicyAllowAccess(resource, action, applicationName));\n\t\t\t\t\tservice.isBulkLoadingAccess = false;\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tservice.isBulkLoadingAccess = false;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tfunction isAccessAllowedSingle(resource, action, restangular) {\n\t\t\treturn baseService.getSingle('Access', { resource: resource, action: action }, false, true, restangular, false).then(function (result) {\n\t\t\t\treturn result && result.isAllowed;\n\t\t\t});\n\t\t}\n\n\t\tfunction setAccessibleResources(accessibleResources) {\n\t\t\tvar tmpResources = {};\n\t\t\tvar applicationResources = _.groupBy(accessibleResources, 'application');\n\n\t\t\tfor (var applicationName in applicationResources) {\n\t\t\t\tif (!tmpResources[applicationName]) {\n\t\t\t\t\ttmpResources[applicationName] = {};\n\t\t\t\t}\n\n\t\t\t\tvar groupedResources = _.groupBy(applicationResources[applicationName], 'resource');\n\n\t\t\t\tfor (var resourceName in groupedResources) {\n\t\t\t\t\tvar trimmedResourceName = _.trim(resourceName);\n\n\t\t\t\t\tif (!tmpResources[applicationName][trimmedResourceName]) {\n\t\t\t\t\t\ttmpResources[applicationName][trimmedResourceName] = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tvar resources = groupedResources[trimmedResourceName];\n\n\t\t\t\t\t_.forEach(resources, function (individualResource) {\n\t\t\t\t\t\tif (individualResource.action.indexOf(',') > -1) {\n\t\t\t\t\t\t\t_.forEach(individualResource.action.split(','), function (action) {\n\t\t\t\t\t\t\t\ttmpResources[applicationName][_.trim(individualResource.resource)][_.trim(action)] = true;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttmpResources[applicationName][_.trim(individualResource.resource)][_.trim(individualResource.action)] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tservice.accessibleResources = tmpResources;\n\t\t}\n\n\t\tfunction doesUserHaveClaim(claimType) {\n\t\t\tvar context = UserContextService.getUserContext();\n\t\t\treturn context && context[claimType];\n\t\t}\n\n\t\tfunction isFeatureAccessible(claimType) {\n\t\t\treturn doesUserHaveClaim(claimType);\n\t\t}\n\n\t\tfunction getClaimValue(claimType) {\n\t\t\tvar context = UserContextService.getUserContext();\n\t\t\treturn context[claimType];\n\t\t}\n\t}\n})();\n;\r\n/**\n * core-app-context.factory\n * @namespace core\n * @remarks '.factory' is a sub-classification of service, including exclusively business logic\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .factory('appContextFactory', appContextFactory);\n\n // protect against minification\n /* @ngInject */\n appContextFactory.$inject = ['$stateParams', '$q', 'appContextModel',\n 'schoolService', 'stateRepository', 'academicYearRepository', 'schoolAcademicYearRepository', 'ipCookie'];\n\n /**\n * @name appContextFactory\n * @description Define app-context.factory\n * @memberOf core\n */\n function appContextFactory($stateParams, $q, appContextModel,\n schoolService, stateRepository, academicYearRepository, schoolAcademicYearRepository, ipCookie) {\n\n return function(modelExtension, retrievalMethodExtension) {\n var service = this;\n\n // extend the model if new fields provided\n if (modelExtension) {\n appContextModel = _.assign(appContextModel, modelExtension);\n }\n\n // define methods\n service.ensureAppContext = ensureAppContext;\n service.getContext = getContext;\n\n function ensureAppContext() {\n return loadContext().then(function() { return getContext(); });\n }\n\n function getContext() {\n var context = appContextModel;\n return context;\n }\n\n function compileMethods() {\n // initial core methods to load, generate promises and store in array\n service.retrievalMethods = [\n loadAcademicYear(),\n loadState(),\n loadSchool(),\n loadSchoolAcademicYear()\n ];\n\n // unpack the promises from the methods and extend the retrievalMethods\n if (retrievalMethodExtension) {\n _.forEach(retrievalMethodExtension, function(item) {\n service.retrievalMethods.push(item());\n });\n }\n }\n\n function loadContext() {\n compileMethods();\n var deferred = $q.defer();\n $q.all(service.retrievalMethods).then(function () {\n deferred.resolve();\n });\n return deferred.promise;\n }\n\n function getPersistedAcademicYearId() {\n var academicYearId = ipCookie('filter-AcademicYear');\n if (!academicYearId) {\n academicYearId = -1;\n }\n return academicYearId;\n }\n\n function loadAcademicYear() {\n var deferred = $q.defer();\n //Needs to not be dependent on $stateParams\n if (!appContextModel.academicYear || ($stateParams.academicYearId && (appContextModel.academicYear.academicYearID != $stateParams.academicYearId))) {\n academicYearRepository.getAllAcademicYears().then(function (academicYears) {\n if ($stateParams.academicYearId) {\n appContextModel.academicYear = _.find(academicYears, function (year) { return year.academicYearID === (+$stateParams.academicYearId) }); //TODO: Get current year\n } else {\n var persistedAcademicYearId = getPersistedAcademicYearId();\n if (persistedAcademicYearId > 0) {\n appContextModel.academicYear = _.find(academicYears, { academicYearID: persistedAcademicYearId });\n }\n if (!appContextModel.academicYear) {\n appContextModel.academicYear = _.find(academicYears, { isCurrent: true });\n }\n }\n deferred.resolve();\n });\n } else {\n deferred.resolve();\n }\n\n return deferred.promise;\n }\n\n function loadState() {\n var deferred = $q.defer();\n if ($stateParams.stateId) {\n var stateId = $stateParams.stateId;\n stateRepository.get(stateId).then(function (state) {\n appContextModel.state = state;\n deferred.resolve();\n });\n } else {\n appContextModel.state = null;\n deferred.resolve();\n }\n return deferred.promise;\n }\n\n function loadSchool() {\n var deferred = $q.defer();\n if ($stateParams.schoolId) {\n var schoolId = $stateParams.schoolId;\n schoolService.get(schoolId).then(function (school) {\n appContextModel.school = school;\n deferred.resolve();\n });\n } else {\n appContextModel.school = null;\n deferred.resolve();\n }\n return deferred.promise;\n }\n\n function loadSchoolAcademicYear() {\n var deferred = $q.defer();\n // If we have a selected year, set school year to that\n if (!appContextModel.schoolAcademicYear) {\n if ($stateParams.schoolId) {\n var schoolId = $stateParams.schoolId;\n\n schoolAcademicYearRepository.getBySchoolId(schoolId).then(function (schoolAcademicYears) {\n appContextModel.schoolAcademicYear = _.find(schoolAcademicYears, { academicYearID: $stateParams.academicYearID });\n\n if (appContextModel.schoolAcademicYear)\n deferred.resolve();\n else { // If we can't find the selected academic year, default to the school's current year\n schoolAcademicYearRepository.getBySchoolId(schoolId).then(function (schoolAcademicYears) {\n var persistedAcademicYearId = getPersistedAcademicYearId();\n if (persistedAcademicYearId > 0) {\n appContextModel.schoolAcademicYear = _.find(schoolAcademicYears, { academicYearID: persistedAcademicYearId });\n }\n if (!appContextModel.schoolAcademicYear) {\n appContextModel.schoolAcademicYear = _.find(schoolAcademicYears, { isCurrentYear: true });\n }\n deferred.resolve();\n });\n }\n });\n } else {\n appContextModel.school = null;\n deferred.resolve();\n }\n } else {\n deferred.resolve();\n }\n return deferred.promise;\n }\n }\n\n }\n})();;\r\n/**\n * app-context.model\n * @namespace core\n * @remarks '.model' is a sub-classification of service, including exclusively stateful model information (context)\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('appContextModel', appContextModel);\n\n // protect against minification\n /* @ngInject */\n appContextModel.$inject = [];\n\n /**\n * @name appContextModel\n * @description Define app-context.model\n * @memberOf core\n * @instructions Add object to model for each entity, and set to null\n * @remarks This service acts as a stateful model. This shouldn't be for http calls or defining methods\n */\n function appContextModel() {\n var model = { \n state: null,\n school: null,\n academicYear: null,\n schoolAcademicYear: null\n };\n return model;\n }\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('availabilityService', ['$injector', 'appSettings',\n\n function ($injector, appSettings) {\n var svc = {\n getView: getView,\n getController: getController,\n getTemplateUrl: getTemplateUrl\n\n };\n\n return svc;\n\n function getTemplateUrl(templateUrl, serviceName) {\n if ($injector.has(serviceName)) {\n return templateUrl;\n } else {\n return appSettings.coreWebRootUrl + '/app/templates/offline.html';\n }\n\n }\n\n function getController(serviceName, controllerExpression) {\n return $injector.has(serviceName) ? controllerExpression : null;\n\n }\n\n function getView(templateUrl, serviceName, controllerExpression) {\n return {\n templateUrl: getTemplateUrl(templateUrl, serviceName),\n controller: getController(serviceName, controllerExpression)\n }\n }\n\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('businessApplicationLastViewedRecordRepository', businessApplicationLastViewedRecordRepository);\n\n // protect against minification\n /* @ngInject */\n businessApplicationLastViewedRecordRepository.$inject = ['baseService', 'CoreRestangular', '$http', 'appSettings'];\n\n function businessApplicationLastViewedRecordRepository(baseService, coreRestangular, $http, appSettings) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getByApplicationNameAndStaffId = getByApplicationNameAndStaffId;\n service.update = update;\n service.add = add;\n\n return service;\n\n function getByApplicationNameAndStaffId(applicationName, staffId) {\n return baseService.getList('businessApplicationLastViewedRecord/' + applicationName + '/' + staffId, null, false, true, coreRestangular);\n }\n\n function update(businessApplicationLastViewedRecord) {\n return $http.put(appSettings.coreServicesRootUrl + 'businessApplicationLastViewedRecord', businessApplicationLastViewedRecord);\n }\n\n function add(businessApplicationLastViewedRecord) {\n return $http.post(appSettings.coreServicesRootUrl + 'businessApplicationLastViewedRecord', businessApplicationLastViewedRecord);\n }\n }\n\n})();;\r\n(function() {\n \"use strict\";\n\n // define one component per file (single responsibility)\n angular\n .module(\"nha.core\")\n .service(\"businessApplicationsSvc\", businessApplicationsSvc);\n\n // protect against minification\n /* @ngInject */\n businessApplicationsSvc.$inject = [\"baseService\", \"CoreRestangular\", \"$rootScope\"];\n\n \n function businessApplicationsSvc(baseService, CoreRestangular, $rootScope) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n\t\tservice.getAll = getAll;\n service.getById = getById;\n service.getByRoles = getByRoles;\n service.getForUser = getForUser;\n\n return service;\n\n function get() {\n return baseService.getList(\"businessApplication\", null, true, true, CoreRestangular);\n }\n\n\t\tfunction getAll() {\n\t\t\treturn baseService.getList(\"businessApplication/all\", null, true, true, CoreRestangular);\n\t\t}\n \n function getById(businessApplicationId) {\n var params = null;\n return baseService.getList('businessApplication/getById/'+businessApplicationId, params, true, true, CoreRestangular);\n }\n\n function getForUser() {\n return baseService.getList(\"businessApplication/getforuser\", null, true, true, CoreRestangular);\n }\n\n function getByRoles(roles) {\n var params = { roleNames: roles };\n return baseService.getList(\"businessApplication\", params, true, true, CoreRestangular);\n }\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').service('businessResponseService', businessResponseService);\n\n businessResponseService.$inject = [\"$q\"];\n\n function businessResponseService($q) {\n\n var service = {\n showBusinessResponse: showBusinessResponse\n };\n\n function showBusinessResponse(businessResponse, title, customMessageToDisplay) {\n\n var deferred = $q.defer();\n\n var messageTitle = (title || 'Operation was not successful!');\n var messageText = '';\n var swalType = 'error';\n\n var messages = (customMessageToDisplay ? [ customMessageToDisplay ] : []);\n\n var isOverride = false;\n var isException = false;\n\n // get business messages\n if (businessResponse && businessResponse.operationResult) {\n\n // any exceptions\n if (businessResponse.operationResult.exception) {\n\n var exception = businessResponse.operationResult.exception;\n\n isException = true;\n\n var errorMessage = exception.Message;\n \n messages.push('A technical error occurred with this operation:');\n messages.push(errorMessage);\n\n // the real error is usually two levels deep in the inner exception\n if (exception.InnerException && exception.InnerException.InnerException) {\n var innerExceptionMessage = exception.InnerException.InnerException.Message;\n if (innerExceptionMessage) {\n messages.push(innerExceptionMessage);\n }\n }\n }\n\n if (!isException) {\n\n // model state, if any\n if (businessResponse.modelState) {\n messages.push(businessResponse.modelState);\n }\n\n if (businessResponse.operationResult.rules) {\n\n var errorsExist = _.some(businessResponse.operationResult.rules, function (rule) { return rule.ruleSeverity === 'Error' || rule.ruleSeverity === 'Critical' });\n if (errorsExist) {\n // if we have errors, we don't want to offer an overide yes/no prompt\n businessResponse.operationResult.rules = _.reject(businessResponse.operationResult.rules, { ruleSeverity: 'Warning' });\n }\n else {\n // determine rule severity so we can show correct swal type: \"warning\", \"error\", \"success\" and \"info\"\n if (_.every(businessResponse.operationResult.rules, { ruleSeverity: 'Warning' })) {\n swalType = 'warning';\n isOverride = true;\n }\n\n if (_.every(businessResponse.operationResult.rules, { ruleSeverity: 'Info' })) {\n swalType = 'info';\n }\n }\n\n // rule messages\n _.forEach(businessResponse.operationResult.rules, function (rule) {\n _.forEach(rule.messages, function (message) {\n messages.push(message);\n });\n });\n }\n }\n }\n\n // put all of our messages together for display, if we have any\n if (!_.isEmpty(messages)) {\n messageText = messages.join('\\n\\n');\n }\n\n var swalOptions = { title: messageTitle, type: swalType };\n\n if (messageText) {\n swalOptions.text = messageText;\n }\n\n if (isOverride) {\n swalOptions.showCancelButton = true;\n swalOptions.confirmButtonText = 'Override';\n swalOptions.closeOnConfirm = true;\n }\n\n // show the swal and then resolve the promise\n if (isOverride) {\n swal(swalOptions, function (isConfirm) {\n deferred.resolve(isConfirm);\n });\n }\n else {\n swal(swalOptions);\n }\n\n return deferred.promise;\n }\n\n return service;\n }\n\n})();;\r\n/**\n * core-app-context.manager\n * @namespace core\n * @remarks '.manager' is a sub-classification of service, including exclusively business logic\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('coreAppContextManager', coreAppContextManager);\n\n // protect against minification\n /* @ngInject */\n coreAppContextManager.$inject = ['appContextFactory', 'appContextModel', 'coreAppContextModel'];\n\n /**\n * @name coreAppContextManager\n * @description Define core-app-context.manager\n * @memberOf core\n */\n function coreAppContextManager(appContextFactory, appContextModel, coreAppContextModel) {\n\n ///**\n // * @name loadSample\n // * @description Defines a deferred method to retrieve and set model context\n // * @returns promise for factory consumption\n // * @memberOf gradebook-app-context.manager\n // * @remarks assignment is made to appContextModel, not local model\n // * and should explicitly clear out model context if no state param is available\n // */\n //function loadSample() {\n // var deferred = $q.defer();\n // if ($stateParams.sampleId) {\n // var sampleId = $stateParams.sampleId;\n // sampleService.get(sampleId).then(function (sample) {\n // appContextModel.sample = sample; // needs to be appContextModel\n // deferred.resolve();\n // });\n // } else {\n // appContextModel.sample = null; // explicitly null this out if no $stateParam exists\n // deferred.resolve();\n // }\n // return deferred.promise; // method needs to return a promise\n //}\n\n // package methods for injection into factory - no parenthesis\n var retrievalMethodExtensions = []; // [loadSample];\n\n // Instantiate service from factory\n return new appContextFactory(coreAppContextModel, retrievalMethodExtensions);\n }\n\n})();;\r\n/**\n * core-app-context.model\n * @namespace core\n * @remarks '.model' is a sub-classification of service, including exclusively stateful model information (context)\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('coreAppContextModel', coreAppContextModel);\n\n /**\n * @name coreAppContextModel\n * @description Define core-app-context.model\n * @memberOf core\n * @instructions Add object to model for each entity to add to app-context.model, and set to null\n * @remarks This service acts as a stateful model. This shouldn't be for http calls or defining methods\n */\n function coreAppContextModel() {\n var model = {\n // sample: null\n };\n return model;\n\n }\n})();\n;\r\n/**\n * country.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('countryRepository', countryRepository);\n\n // protect against minification\n /* @ngInject */\n countryRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name countryRepository\n * @description Constructor for country.repository\n * @memberOf core\n */\n function countryRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getCountries = getCountries;\n\n return service;\n\n /**\n * @name getCountries\n * @description retrieves countries from storage\n * @returns List List of objects containing a subset of country properties\n * @memberOf country.repository\n */\n function getCountries() {\n return baseService.getList('country', { $orderby: 'CountrySortOrderID' }, false, true, CoreRestangular);\n }\n\n }\n})();;\r\n/**\n * course-section.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('courseSectionGroupMarkingPeriodRepository', courseSectionGroupMarkingPeriodRepository);\n\n // protect against minification\n /* @ngInject */\n courseSectionGroupMarkingPeriodRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name courseSectionRepository\n * @description Constructor for course-section.repository\n * @memberOf core\n */\n function courseSectionGroupMarkingPeriodRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves course sections from storage\n * @returns List List of objects containing course section properties\n * @memberOf course-section.repository\n */\n function get(courseSectionGroupID) {\n return baseService.getList('courseSectionGroupMarkingPeriod', _utils.getODataRequest({ filter: { CourseSectionGroupID: courseSectionGroupID }}), true, true, CoreRestangular);\n }\n }\n})();;\r\n/**\n * course-section-group.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('courseSectionGroupRepository', courseSectionGroupRepository);\n\n // protect against minification\n /* @ngInject */\n courseSectionGroupRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name courseSectionGroupRepository\n * @description Constructor for course-section-group.repository\n * @memberOf core\n */\n function courseSectionGroupRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.get = get;\n service.remove = remove; // DELETE but delete is a reserved word, so using remove\n service.put = put;\n service.post = post;\n service.getByCourseSectionId = getByCourseSectionId;\n service.getByAcademicYearSchoolAndGrade = getByAcademicYearSchoolAndGrade;\n\t\tservice.getByAcademicYearSchool = getByAcademicYearSchool;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves courseSectionGroups from storage\n * @returns List List of objects containing courseSectionGroup properties\n * @memberOf course-section-group.repository\n */\n function getAll() {\n return baseService.getList('courseSectionGroup', null, true, true, CoreRestangular);\n }\n\n function getByAcademicYearSchoolAndGrade(academicYearId, schoolId, gradeLevelId) {\n var oDataParameters = _utils.getODataRequest({\n filter: {\n AcademicYearID: academicYearId,\n SchoolID: schoolId,\n GradeLevelID: gradeLevelId\n }\n });\n\n if (!oDataParameters || !oDataParameters.$filter) { return null; }\n\n return baseService.getList('courseSectionGroup', oDataParameters, true, true, CoreRestangular);\n }\n\n\t\tfunction getByAcademicYearSchool(academicYearId, schoolId) {\n var oDataParameters = _utils.getODataRequest({\n filter: {\n AcademicYearID: academicYearId,\n SchoolID: schoolId\n }\n });\n\n if (!oDataParameters || !oDataParameters.$filter) { return null; }\n\n return baseService.getList('courseSectionGroup', oDataParameters, true, true, CoreRestangular);\n }\n\n /**\n * @name get\n * @description retrieves an courseSectionGroup from storage\n * @param int courseSectionGroupId identifier of the courseSectionGroup object\n * @returns object object containing courseSectionGroup properties\n * @memberOf course-section-group.repository\n */\n function get(courseSectionGroupId) {\n return baseService.getSingle('courseSectionGroup', { id: courseSectionGroupId }, true, true, CoreRestangular);\n }\n /**\n * @name remove\n * @description deletes an courseSectionGroup from storage\n * @param int courseSectionGroupId identifier of the courseSectionGroup object\n * @returns promise\n * @memberOf course-section-group.repository\n * @remarks DELETE is a reserved word, so using name REMOVE\n */\n function remove(courseSectionGroupId) {\n return CoreRestangular.one('courseSectionGroup', courseSectionGroupId).remove();\n }\n /**\n * @name put\n * @description updates an courseSectionGroup to storage\n * @param object courseSectionGroup courseSectionGroup object to update\n * @param int courseSectionGroupId identifier of the courseSectionGroup object\n * @returns promise\n * @memberOf course-section-group.repository\n */\n function put(courseSectionGroup, courseSectionGroupId) {\n return CoreRestangular.all('courseSectionGroup').customPUT(courseSectionGroup, courseSectionGroupId);\n }\n /**\n * @name remove\n * @description deletes an courseSectionGroup from storage\n * @param object courseSectionGroup courseSectionGroup object to update\n * @returns promise\n * @memberOf course-section-group.repository\n */\n function post(courseSectionGroup) {\n return CoreRestangular.all('courseSectionGroup').customPOST(courseSectionGroup);\n }\n /**\n * @name getByCourseSectionId\n * @description retrieves an courseSectionGroup from storage for a courseSectionId\n * @param int courseSectionId identifier for the courseSectionGroup object\n * @returns object object containing courseSectionGroup properties\n * @memberOf course-section-group.repository\n */\n function getByCourseSectionId(courseSectionId) {\n //return CoreRestangular.all('courseSectionGroup').one('getByCourseSectionId', courseSectionId);\n return baseService.getSingle('courseSectionGroup/getByCourseSectionId/' + courseSectionId, null, true, true, CoreRestangular);\n }\n\n }\n})();;\r\n/**\n * courseSectionRosterOrder.repository\n * @namespace gradebook \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('courseSectionRosterOrderRepository', courseSectionRosterOrderRepository);\n\n // protect against minification\n /* @ngInject */\n courseSectionRosterOrderRepository.$inject = ['baseService', 'CoreRestangular'];\n\n function courseSectionRosterOrderRepository(baseService, CoreRestangular) {\n var service = this;\n\n service.saveRosterOrders = saveRosterOrders;\n\n function saveRosterOrders(rosterOrders) {\n return CoreRestangular.all('courseSectionRosterOrder').customPUT(rosterOrders);\n }\n\n return service;\n }\n})();;\r\n/**\n * course-section-roster.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('courseSectionRosterRepository', courseSectionRosterRepository);\n\n // protect against minification\n /* @ngInject */\n courseSectionRosterRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name courseSectionRosterRepository\n * @description Constructor for course-section-roster.repository\n * @memberOf core\n */\n function courseSectionRosterRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n service.getAll = getAll;\n service.getByCourseSection = getByCourseSection;\n service.getActiveRostersForMarkingPeriod = getActiveRostersForMarkingPeriod;\n service.remove = remove; // DELETE but delete is a reserved word, so using remove\n service.put = put;\n service.post = post;\n\n return service;\n\n /**\n * @name get\n * @description retrieves an courseSectionRoster from storage\n * @param int courseSectionRosterId identifier of the courseSectionRoster object\n * @returns object object containing courseSectionRoster properties\n * @memberOf course-section-roster.repository\n */\n function get(courseSectionRosterId) {\n return baseService.getSingle('courseSectionRoster', { id: courseSectionRosterId }, true, true, CoreRestangular);\n }\n /**\n * @name getAll\n * @description retrieves courseSectionRosters from storage\n * @returns List List of objects containing courseSectionRoster properties\n * @memberOf course-section-roster.repository\n */\n function getAll() {\n return baseService.getList('courseSectionRoster', null, true, true, CoreRestangular);\n }\n /**\n * @name getByCourseSection\n * @description retrieves an courseSectionRoster from storage\n * @param int courseSectionId identifier of the courseSectionRoster object\n * @returns List list of objects containing courseSectionRoster properties\n * @memberOf course-section-roster.repository\n */\n function getByCourseSection(courseSectionId) {\n var oDataParameters = _utils.getODataRequest({ filter: { CourseSectionID: courseSectionId } });\n return baseService.getList('courseSectionRoster', oDataParameters, true, true, CoreRestangular);\n }\n\n function getActiveRostersForMarkingPeriod(courseSectionID, markingPeriodID) {\n return baseService.getList('courseSectionRoster/activeRosters', { courseSectionID: courseSectionID, markingPeriodID : markingPeriodID}, true, true, CoreRestangular);\n }\n /**\n * @name remove\n * @description deletes an courseSectionRoster from storage\n * @param int courseSectionRosterId identifier of the courseSectionRoster object\n * @returns promise\n * @memberOf course-section-roster.repository\n * @remarks DELETE is a reserved word, so using name REMOVE\n */\n function remove(courseSectionRosterId) {\n return CoreRestangular.one('courseSectionRoster', courseSectionRosterId).remove();\n }\n /**\n * @name put\n * @description updates an courseSectionRoster to storage\n * @param object courseSectionRoster courseSectionRoster object to update\n * @param int courseSectionRosterId identifier of the courseSectionRoster object\n * @returns promise\n * @memberOf course-section-roster.repository\n */\n function put(courseSectionRoster, courseSectionRosterId) {\n return CoreRestangular.all('courseSectionRoster').customPUT(courseSectionRoster, courseSectionRosterId);\n }\n /**\n * @name remove\n * @description deletes an courseSectionRoster from storage\n * @param object courseSectionRoster courseSectionRoster object to update\n * @returns promise\n * @memberOf course-section-roster.repository\n */\n function post(courseSectionRoster) {\n return CoreRestangular.all('courseSectionRoster').customPOST(courseSectionRoster);\n }\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('courseSectionStaffRepository', ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var svc = {\n getAll: getAll\n };\n\n return svc;\n\n function getAll(parameters) {\n return baseService.getList('CourseSectionStaff', _utils.getODataRequest({ filter: parameters }), true, true, CoreRestangular);\n }\n }]);\n})();;\r\n/**\n * course-section.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('courseSectionRepository', courseSectionRepository);\n\n // protect against minification\n /* @ngInject */\n courseSectionRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name courseSectionRepository\n * @description Constructor for course-section.repository\n * @memberOf core\n */\n function courseSectionRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getBySchoolAndStaff = getBySchoolAndStaff;\n service.getBySchoolAndAcademicYear = getBySchoolAndAcademicYear;\n service.getByStudentInSchool = getByStudentInSchool;\n service.get = get;\n service.remove = remove; // DELETE but delete is a reserved word, so using remove\n service.put = put;\n service.post = post;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves course sections from storage\n * @returns List List of objects containing course section properties\n * @memberOf course-section.repository\n */\n function getAll() {\n return baseService.getList('courseSection', null, true, true, CoreRestangular);\n }\n\n function getBySchoolAndStaff(schoolId, staffId, acadademicYearId) {\n return baseService.getList('coursesection/GetBySchoolAndStaff/' + schoolId + '/' + staffId + '/' + acadademicYearId, null, true, true, CoreRestangular);\n }\n\n function getBySchoolAndAcademicYear(schoolId, acadademicYearId) {\n return baseService.getList('coursesection/GetBySchoolAndAcademicYear/' + schoolId + '/' + acadademicYearId, null, true, true, CoreRestangular);\n }\n\n function getByStudentInSchool(studentInSchoolId) {\n return baseService.getList('courseSection/GetByStudentInSchool/' + studentInSchoolId, null, true, true, CoreRestangular);\n }\n\n /**\n * @name get\n * @description retrieves a course section from storage\n * @param int courseSectionId identifier of the course section object\n * @returns object object containing course section properties\n * @memberOf course-section.repository\n */\n function get(courseSectionId) {\n return baseService.getSingle('courseSection', { id: courseSectionId }, false, true, CoreRestangular);\n }\n /**\n * @name remove\n * @description deletes a course section from storage\n * @param int courseSectionId identifier of the course section object\n * @returns promise\n * @memberOf course-section.repository\n * @remarks DELETE is a reserved word, so using name REMOVE\n */\n function remove(courseSectionId) {\n return CoreRestangular.one('courseSection', courseSectionId).remove();\n }\n /**\n * @name put\n * @description updates a course section to storage\n * @param object courseSection course section object to update\n * @param int courseSectionId identifier of the course section object\n * @returns promise\n * @memberOf course-section.repository\n */\n function put(courseSection, courseSectionId) {\n return CoreRestangular.all('courseSection').customPUT(courseSection, courseSectionId);\n }\n /**\n * @name remove\n * @description deletes a course section from storage\n * @param object courseSection course section object to update\n * @returns promise\n * @memberOf course-section.repository\n */\n function post(courseSection) {\n return CoreRestangular.all('courseSection').customPOST(courseSection);\n }\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('courseSummaryMarkingPeriodRollupRepository', ['repositoryFactory', 'CoreRestangular', 'baseService',\n function (repositoryFactory, coreRestangular, baseService) {\n var repo = new repositoryFactory('CourseSummaryMarkingPeriodRollup', coreRestangular);\n\n repo.getByCourseSection = getByCourseSection;\n\n /**\n * @name getByCourseSection\n * @description retrieves an courseSummaryMarkingPeriodRollup from storage for a courseSectionId\n * @param int courseSectionId identifier for the courseSummaryMarkingPeriodRollup object\n * @returns object object containing courseSummaryMarkingPeriodRollup properties\n * @memberOf course-summary-marking-period.repository\n */\n function getByCourseSection(courseSectionId) {\n //return CoreRestangular.all('courseSummaryMarkingPeriodRollup').one('getByCourseSection', courseSectionId);\n return baseService.getSingle('courseSummaryMarkingPeriodRollup/getByCourseSection/' + courseSectionId, null, true, true, coreRestangular);\n }\n\n return repo;\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('courseSummaryMeetingBlockRollupRepository', ['repositoryFactory', 'CoreRestangular', 'baseService',\n function (repositoryFactory, coreRestangular, baseService) {\n var repo = new repositoryFactory('CourseSummaryMeetingBlockRollup', coreRestangular);\n\n repo.getByCourseSection = getByCourseSection;\n\n /**\n * @name getByCourseSection\n * @description retrieves an courseSummaryMeetingBlockRollup from storage for a courseSectionId\n * @param int courseSectionId identifier for the courseSummaryMeetingBlockRollup object\n * @returns object object containing courseSummaryMeetingBlockRollup properties\n * @memberOf course-summary-meeting-block.repository\n */\n function getByCourseSection(courseSectionId) {\n //return CoreRestangular.all('courseSummaryMeetingBlockRollup').one('getByCourseSection', courseSectionId);\n return baseService.getSingle('courseSummaryMeetingBlockRollup/getByCourseSection/' + courseSectionId, null, true, true, coreRestangular);\n }\n\n return repo;\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('courseSummaryStaffRollupRepository', ['repositoryFactory', 'CoreRestangular', 'baseService',\n function (repositoryFactory, coreRestangular, baseService) {\n var repo = new repositoryFactory('CourseSummaryStaffRollup', coreRestangular);\n\n repo.getByCourseSection = getByCourseSection;\n\n /**\n * @name getByCourseSection\n * @description retrieves an courseSummaryStaffRollup from storage for a courseSectionId\n * @param int courseSectionId identifier for the courseSummaryStaffRollup object\n * @returns object object containing courseSummaryStaffRollup properties\n * @memberOf course-summary-staff-rollup.repository\n */\n function getByCourseSection(courseSectionId) {\n //return CoreRestangular.all('courseSummaryStaffRollup').one('getByCourseSection', courseSectionId);\n return baseService.getSingle('courseSummaryStaffRollup/getByCourseSection/' + courseSectionId, null, true, true, coreRestangular);\n }\n\n return repo;\n }\n ]);\n})();;\r\n(function () {\n\t\"use strict\";\n\n\tangular.module(\"nha.core\")\n\t\t.service(\"dataSecurityService\", ['userContextService', '$q',\n\t\t\tfunction (userContextService, $q) {\n\t\t\t\tvar adminroles = [\"SIS Admin\"];\n\n\t\t\t\tvar service = {\n\t\t\t\t\tdoesUserHaveAccessToSchool: doesUserHaveAccessToSchool,\n\t\t\t\t\tdoesUserHaveAdminRole: doesUserHaveAdminRole,\n\t\t\t\t\tisSingleSchoolUser: isSingleSchoolUser,\n\t\t\t\t\tisStaffUser: isStaffUser,\n\t\t\t\t\tisAdminUser: isAdminUser\n\t\t\t\t}\n\n\t\t\t\tfunction doesUserHaveAccessToSchool(schoolID) {\n\n\t\t\t\t\tvar deferred = $q.defer();\n\n\t\t\t\t\tuserContextService.ensureUserContext().then(function (context) {\n\t\t\t\t\t\tvar hasAccessToSchool = false;\n\t\t\t\t\t\tvar validSchoolID = context['http://schemas.mynha.com/ILM/SchoolID'];\n\n\t\t\t\t\t\tif (Array.isArray(validSchoolID)) {\n\t\t\t\t\t\t\t//This user has multiple school associated\n\t\t\t\t\t\t\thasAccessToSchool = _.some(validSchoolID, function (s) {\n\t\t\t\t\t\t\t\treturn s === '000' || schoolID === (+s);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//Single school association\n\t\t\t\t\t\t\thasAccessToSchool = validSchoolID === '000' || schoolID === (+validSchoolID) || _.find(context['http://schemas.mynha.com/ILM/Department'], 'Administration');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (context.role.includes('Service Center')) {\n\t\t\t\t\t\t\thasAccessToSchool = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Array.isArray(context.role)) {\n\t\t\t\t\t\t\tif (_.intersection(adminroles, context.role).length > 0) {\n\t\t\t\t\t\t\t\thasAccessToSchool = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (_.includes(adminroles, context.role)) {\n\t\t\t\t\t\t\t\thasAccessToSchool = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdeferred.resolve(hasAccessToSchool || hasServiceCenterRole);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * @description Returns true if user's school array contains 1 school ID > 0\n\t\t\t\t */\n\t\t\t\tfunction isSingleSchoolUser(context) {\n\t\t\t\t\tvar deferred = $q.defer();\n\n\t\t\t\t\t$q.all([\n\t\t\t\t\t\tuserContextService.ensureUserContext(),\n\t\t\t\t\t\tdoesUserHaveAdminRole()\n\t\t\t\t\t]).then(_.spread(function (context, hasAdminRole) {\n\n\t\t\t\t\t\tvar userSchools = context['http://schemas.mynha.com/ILM/SchoolID'];\n\n\t\t\t\t\t\tif (!Array.isArray(userSchools) && (+userSchools) > 0 && !hasAdminRole) {\n\t\t\t\t\t\t\tdeferred.resolve(true);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdeferred.resolve(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tfunction isMultiRoleUser(context) {\n\t\t\t\t\tvar returnValue = false;\n\n\t\t\t\t\tif (Array.isArray(context.role)) {\n\t\t\t\t\t\tif (_.filter(context.role, function (role) {\n\t\t\t\t\t\t\t\treturn role != 'Employee'\n\t\t\t\t\t\t\t}).length > 1) {\n\t\t\t\t\t\t\treturnValue = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn returnValue;\n\t\t\t\t}\n\n\t\t\t\tfunction isMultiDepartmentUser(context) {\n\t\t\t\t\treturn context['http://schemas.mynha.com/ILM/Department'] &&\n\t\t\t\t\t\tArray.isArray(context['http://schemas.mynha.com/ILM/Department']) &&\n\t\t\t\t\t\tcontext['http://schemas.mynha.com/ILM/Department'].length > 1;\n\t\t\t\t}\n\n\t\t\t\tfunction isMultiPositionUser(context) {\n\t\t\t\t\treturn context['http://schemas.mynha.com/ILM/Position'] &&\n\t\t\t\t\t\tArray.isArray(context['http://schemas.mynha.com/ILM/Position']) &&\n\t\t\t\t\t\tcontext['http://schemas.mynha.com/ILM/Position'].length > 1;\n\t\t\t\t}\n\n\t\t\t\tfunction isMultiTeamUser(context) {\n\t\t\t\t\treturn context['http://schemas.mynha.com/ILM/Team'] &&\n\t\t\t\t\t\tArray.isArray(context['http://schemas.mynha.com/ILM/Team']) &&\n\t\t\t\t\t\tcontext['http://schemas.mynha.com/ILM/Team'].length > 1;\n\t\t\t\t}\n\n\t\t\t\t/*Returns whether or not user is more than just a teacher.*/\n\t\t\t\tfunction isStaffUser(context) {\n\t\t\t\t\treturn isMultiRoleUser(context) ||\n\t\t\t\t\t\tisMultiDepartmentUser(context) ||\n\t\t\t\t\t\tisMultiPositionUser(context) ||\n\t\t\t\t\t\tisMultiTeamUser(context);\n\t\t\t\t}\n\n\t\t\t\tfunction isAdminUser(context) {\n\t\t\t\t\tif (Array.isArray(context.role)) {\n\t\t\t\t\t\tif (_.intersection(adminroles, context.role).length > 0) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (_.includes(adminroles, context.role)) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Returns true if user has role of SIS Admin\n\t\t\t\t */\n\t\t\t\tfunction doesUserHaveAdminRole() {\n\n\t\t\t\t\tvar deferred = $q.defer();\n\n\t\t\t\t\tvar hasAdminRole = false;\n\n\t\t\t\t\tuserContextService.ensureUserContext().then(function (context) {\n\t\t\t\t\t\thasAdminRole = isAdminUser(context);\n\n\t\t\t\t\t\tdeferred.resolve(hasAdminRole);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\treturn service;\n\t\t\t}\n\t\t]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('enumService', ['baseService', 'CoreRestangular',\n\n function (baseService, CoreRestangular) {\n var svc = {\n get: get\n };\n\n return svc;\n\n function get(restangularToInvoke) {\n return baseService.getList('enum', {}, false, true, restangularToInvoke || CoreRestangular).then(function (result) {\n var returnValue = {};\n\n /*TODO: Performance enhancement: move all processing before cache call. This code currently caches web call and always converts \n *results results into Enum objects real time instead of caching Enum objects*/\n if (result) {\n for (var enumSet in result) {\n if (Object.prototype.toString.call(result[enumSet]) === '[object Array]') {\n var allEnums = {};\n\n _.forEach(result[enumSet], function (individualEnumValue) {\n allEnums[individualEnumValue.name] = individualEnumValue.value;\n });\n\n returnValue[enumSet] = new Enum(allEnums);\n }\n }\n }\n\n return returnValue;\n });\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n /*Service to persist in memory transaction errors when calling backend services. Can be used to see if the user has any transaction errors that need to be addressed.*/\n angular.module('nha.core').factory('errorSvc',\n ['$http', 'appSettings', '$q',\n\n function ($http, appSettings, $q) {\n var svc = {\n recordErrors: recordErrors,\n getActiveErrors: getActiveErrors,\n dismissAllErrors: dismissAllErrors, \n areErrorsPresent: areErrorsPresent,\n getUnhandledError: getUnhandledError,\n allErrors: [],\n gatherAllErorrs: gatherAllErorrs\n };\n\n return svc;\n\n function recordErrors(errorObj) {\n if (!errorObj) return;\n\n if (errorObj instanceof Array) {\n _.forEach(errorObj, function (error) {\n svc.allErrors.push(error);\n });\n }\n else if (errorObj) {\n svc.allErrors.push(errorObj);\n }\n }\n\n function getActiveErrors() {\n return svc.allErrors;\n }\n\n function dismissAllErrors() {\n _.remove(svc.allErrors, function () { return true; });\n }\n\n function areErrorsPresent(type) {\n return _.find(svc.allErrors, function (item) { return item.severity == type || item.type == type || _.isUndefined(type); });\n }\n\n function getUnhandledError(error, userMessage) {\n if (error != null) {\n\n if (userMessage == null) {\n userMessage = 'An error has occurred.';\n }\n\n svc.recordErrors({ 'message': userMessage, 'type': 'error', 'detail': JSON.stringify(error) });\n }\n }\n\n function gatherAllErorrs(obj, result) {\n var result = result || [];\n\n if (obj) {\n for (var propertyName in obj) {\n if (propertyName == 'errors') {\n result = _.union(result, obj[propertyName]);\n }\n else if (typeof (obj[propertyName]) == 'object') {\n result = _.union(result, svc.gatherAllErorrs(obj[propertyName], result));\n }\n else if (typeof (obj[propertyName]) == 'array') {\n _.forEach(obj[propertyName], function () {\n result = _.union(result, svc.gatherAllErorrs(obj[propertyName], result));\n });\n }\n }\n }\n\n return result;\n }\n }]);\n\n})();;\r\n/**\n * file-reader.factory\n * @namespace core\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('fileReaderFactory', fileReaderFactory);\n\n // protect against minification\n /* @ngInject */\n fileReaderFactory.$inject = ['$q'];\n\n /**\n * @name fileReaderFactory\n * @description Constructor for file-reader.factory\n * @memberOf core\n */\n function fileReaderFactory($q) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.onLoad = onLoad;\n service.onError = onError;\n service.onProgress = onProgress;\n service.readAsArrayBuffer = readAsArrayBuffer; \n service.readAsBinaryString = readAsBinaryString;\n service.readAsDataUrl = readAsDataUrl;\n service.readAsText = readAsText;\n\n return service;\n\n /**\n * @name onLoad\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function onLoad(reader, deferred, scope) {\n return function () {\n scope.$apply(function () {\n deferred.resolve(reader.result);\n });\n }\n }\n\n /**\n * @name onError\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function onError(reader, deferred, scope) {\n return function () {\n scope.$apply(function () {\n deferred.reject(reader.result);\n });\n }\n }\n\n /**\n * @name onProgress\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function onProgress() {\n return function (event) {\n scope.$broadcast('fileProgress', {\n total: event.total,\n loaded: event.loaded\n });\n }\n }\n\n /**\n * @name getReader\n * @description \n * @returns \n * @memberOf file-reader.factory\n * @remarks https://developer.mozilla.org/en-US/docs/Web/API/FileReader\n */\n function getReader(deferred, scope) {\n var reader = new FileReader();\n reader.onload = onLoad(reader, deferred, scope);\n reader.onerror = onError(reader, deferred, scope);\n reader.onProgress = onProgress(reader, scope);\n return reader;\n }\n\n /**\n * @name readAsArrayBuffer\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function readAsArrayBuffer(file, scope) {\n var deferred = $q.defer();\n var reader = getReader(deferred, scope);\n reader.readAsArrayBuffer(file);\n\n return deferred.promise;\n }\n\n /**\n * @name readAsBinaryString\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function readAsBinaryString(file, scope) {\n var deferred = $q.defer();\n var reader = getReader(deferred, scope);\n reader.readAsBinaryString(file);\n\n return deferred.promise;\n }\n\n /**\n * @name readAsDataUrl\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function readAsDataUrl(file, scope) {\n var deferred = $q.defer();\n var reader = getReader(deferred, scope);\n reader.readAsDataURL(file);\n\n return deferred.promise;\n }\n\n /**\n * @name readAsText\n * @description \n * @returns \n * @memberOf file-reader.factory\n */\n function readAsText(file, scope) {\n var deferred = $q.defer();\n var reader = getReader(deferred, scope);\n reader.readAsText(file);\n\n return deferred.promise;\n }\n\n }\n})();;\r\n/**\n * form-received.repository\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** add the repo */\n\tangular.module('nha.core').service('form-received.repository', formReceivedRepo);\n\n\t/** setup injection */\n\tformReceivedRepo.$inject = ['repositoryFactory', 'CoreRestangular'];\n\n\t/** implement the repo */\n\tfunction formReceivedRepo(repositoryFactory, coreRestangular) {\n\t\t/** create the repo */\n\t\tvar repo = new repositoryFactory('FormReceived', coreRestangular);\n\n\t\t/** return the repo */\n\t\treturn repo;\n\t}\n})();;\r\n/**\n * gender.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('genderRepository', genderRepository);\n\n // protect against minification\n /* @ngInject */\n genderRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name genderRepository\n * @description Constructor for gender.repository\n * @memberOf core\n */\n function genderRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getGenders = getGenders;\n\n return service;\n\n /**\n * @name getGenders\n * @description retrieves genders from storage\n * @returns List List of objects containing gender properties\n * @memberOf gender.repository\n */\n function getGenders() {\n return baseService.getList('gender', { $orderby: 'GenderID' }, true, true, CoreRestangular);\n }\n\n }\n})();;\r\n/**\n * grade-level.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('gradeLevelRepository', gradeLevelRepository);\n\n // protect against minification\n /* @ngInject */\n gradeLevelRepository.$inject = ['CoreRestangular', 'baseService'];\n\n /**\n * @name gradeLevelRepository\n * @description Constructor for grade-level.repository\n * @memberOf core\n */\n function gradeLevelRepository(coreRestangular, baseService) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n service.getAll = getAll;\n service.getByStudentInSchool = getByStudentInSchool;\n service.getForAcademicYearAndState = getForAcademicYearAndState;\n service.getForScoolIDAndAcademicYearID = getForScoolIDAndAcademicYearID;\n service.getForCourseSection = getForCourseSection;\n service.getForCourseSectionGroup = getForCourseSectionGroup;\n\n return service;\n\n /**\n * @name get\n * @description retrieves a grade level from storage\n * @returns object Object containing grade level properties\n * @memberOf grade-level.repository\n */\n function get(gradeLevelId, options) {\n if (!options) {\n options = { shouldCache: true, shouldLog: true };\n }\n return baseService.getList('GradeLevel', { id: gradeLevelId }, options.shouldCache, options.shouldLog, coreRestangular);\n }\n /**\n * @name getAll\n * @description retrieves grade levels from storage\n * @returns List List of objects containing a subset of grade level properties\n * @memberOf grade-level.repository\n */\n function getAll(options) {\n if (!options) {\n options = { shouldCache: true, shouldLog: true };\n } \n return baseService.getList('GradeLevel', {}, options.shouldCache, options.shouldLog, coreRestangular);\n }\n\n function getByStudentInSchool(studentInSchoolId, options) {\n if (!options) {\n options = { shouldCache: true, shouldLog: true };\n }\n return baseService.getList('GradeLevel/studentinschool/' + studentInSchoolId, {}, options.shouldCache, options.shouldLog, coreRestangular);\n }\n\n\t\tfunction getForAcademicYearAndState(academicYearID, stateID, options) {\n\t\t\tif (!options) options = { shouldCache: true, shouldLog: true };\n\t\t\treturn baseService.getList('gradelevel/academicyearstate/' + academicYearID + '/' + stateID, {}, options.shouldCache, options.shouldLog, coreRestangular);\n\t\t}\n\n\t\tfunction getForScoolIDAndAcademicYearID(schoolID, academicYearID, options) {\n\t\t if (!options) options = { shouldCache: true, shouldLog: true };\n\t\t return baseService.getList('gradelevel/academicyear/' + schoolID + '/' + academicYearID, {}, options.shouldCache, options.shouldLog, coreRestangular);\n\t\t}\n\n\t\tfunction getForCourseSection(courseSectionID, options) {\n\t\t if (!options) options = { shouldCache: true, shouldLog: true };\n\t\t return baseService.getList('gradelevel/courseSection/' + courseSectionID, {}, options.shouldCache, options.shouldLog, coreRestangular);\n\t\t}\n\n\t\tfunction getForCourseSectionGroup(courseSectionGroupID, options) {\n\t\t if (!options) options = { shouldCache: true, shouldLog: true };\n\t\t return baseService.getList('gradelevel/courseSectionGroup/' + courseSectionGroupID, {}, options.shouldCache, options.shouldLog, coreRestangular);\n\t\t}\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('languageService', ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var service = {\n get: get\n };\n\n return service;\n\n function get(languageId) {\n return baseService.getList('Language', { id: languageId }, true, true, CoreRestangular);\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('markingPeriodGroupRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, coreRestangular) {\n return new repositoryFactory('MarkingPeriodGroup', coreRestangular);\n }\n ]);\n})();;\r\n/**\n * marking-period.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('markingPeriodRepository', MarkingPeriodRepository);\n\n // protect against minification\n /* @ngInject */\n MarkingPeriodRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name markingPeriodRepository\n * @description Constructor for marking-period.repository\n * @memberOf core\n */\n function MarkingPeriodRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n\n return service;\n\n function get(markingPeriodID) {\n return baseService.getSingle('markingPeriod', { id: markingPeriodID }, true, true, CoreRestangular);\n }\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('markingPeriodService', ['baseService', 'CoreRestangular',\n\n function (baseService, coreRestangular) {\n var svc = {\n get: get\n };\n\n return svc;\n\n function get() {\n return baseService.getList('MarkingPeriod', null, true, true, coreRestangular);\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('masterScheduleTypeRepository', ['repositoryFactory', 'MasterSchedulingRestangular',\n function (repositoryFactory, masterSchedulingRestangular) {\n return new repositoryFactory('masterScheduleTypes', masterSchedulingRestangular, { capitalizeIdString: false });\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('masterStatusService', ['baseService',\n\n function (baseService) {\n var svc = {\n getAll: getAll,\n get: get\n };\n\n return svc;\n\n // this method should be the only one, but i don't know what is using the get().\n function getAll(parameters) {\n return baseService.getList('MasterStatus', parameters || {}, true, true);\n }\n\n function get(masterStatusTypeID) {\n var params = {};\n\n if (masterStatusTypeID) {\n params = _utils.getODataRequest({ filter: { MasterStatusTypeID: masterStatusTypeID } });\n }\n\n return baseService.getList('masterStatus', params, true, true);\n }\n }]);\n\n})();;\r\n/**\n * nha-timezone.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('nhaTimezoneRepository', nhaTimezoneRepository);\n\n // protect against minification\n /* @ngInject */\n nhaTimezoneRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name nhaTimezoneRepository\n * @description Constructor for nha-timezone.repository\n * @memberOf core\n */\n function nhaTimezoneRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getNHATimezones = getNHATimezones;\n\n return service;\n\n /**\n * @name getNHATimezones\n * @description retrieves NHA timezones from storage\n * @returns List List of objects containing NHA timezone properties\n * @memberOf nha-timezone.repository\n */\n function getNHATimezones() {\n return baseService.getList('NHATimezone', { $orderby: 'DisplayOrder' }, false, true, CoreRestangular);\n }\n }\n})();;\r\n/**\n * Phone Format Service\n * @namespace app.services\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('phoneFormatService', phoneFormatService);\n\n // protect against minification\n /* @ngInject */\n phoneFormatService.$inject = ['baseService'];\n\n /**\n * @namespace PhoneFormatService\n * @description Instantiate PhoneFormatService\n * @memberOf app.services\n */\n function phoneFormatService(baseService) {\n var svc = {\n formatPhoneNumberForStorage: formatPhoneNumberForStorage\n };\n\n return svc;\n\n /**\n * @name formatPhoneNumberForStorage\n * @description Format passed in phone number in standard arrangement for storage (e.g. to database)\n * @param string phoneNumber Number to be formatted\n * @returns string Formatted phone number\n * @memberOf phone-format.service\n */\n function formatPhoneNumberForStorage(phoneNumber) {\n if (!phoneNumber) { return ''; }\n\n var value = phoneNumber.toString().trim().replace(/^\\+/, '');\n var city, number, extension;\n\n if (value.length <= 10) {\n city = value.slice(0, 3);\n number = value.slice(3);\n number = number.slice(0, 3) + '-' + number.slice(3);\n return (city + '-' + number).trim();\n } else {\n city = value.slice(0, 3);\n number = value.slice(3, 10);\n number = number.slice(0, 3) + '-' + number.slice(3);\n extension = value.slice(10);\n return (city + '-' + number + 'x' + extension).trim();\n }\n }\n\n }\n})();;\r\n/**\n * race.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('raceRepository', raceRepository);\n\n // protect against minification\n /* @ngInject */\n raceRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name raceRepository\n * @description Constructor for race.repository\n * @memberOf core\n */\n function raceRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getRaces = getRaces;\n\n return service;\n\n /**\n * @name getRaces\n * @description retrieves races from storage\n * @returns List List of objects containing race properties\n * @memberOf race.repository\n */\n function getRaces() {\n return baseService.getList('race', { $orderby: 'RaceId' }, true, true, CoreRestangular);\n }\n\n }\n})();;\r\n/**\n * role-type.repository\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** add the repo */\n\tangular.module('nha.core').service('role-type.repository', roleTypeRepo);\n\n\t/** injection */\n\troleTypeRepo.$inject = ['repositoryFactory', 'CoreRestangular'];\n\n\t/** implementation */\n\tfunction roleTypeRepo(repositoryFactory, coreRestangular) {\n\t\t/** create the repo */\n\t\tvar repo = new repositoryFactory('RoleType', coreRestangular);\n\n\t\t/** return the repo */\n\t\treturn repo;\n\t}\n})();;\r\n/**\n * role.repository\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** add the repo */\n\tangular.module('nha.core').service('role.repository', roleRepo);\n\n\t/** injection */\n\troleRepo.$inject = ['repositoryFactory', 'CoreRestangular'];\n\n\t/** implementation */\n\tfunction roleRepo(repositoryFactory, coreRestangular) {\n\t\t/** create the repo */\n\t\tvar repo = new repositoryFactory('Role', coreRestangular);\n\n\t\t/** return the repo */\n\t\treturn repo;\n\t}\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('roomRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, CoreRestangular) {\n return new repositoryFactory('Room', CoreRestangular);\n }\n ]);\n})();;\r\n/**\n * salutation.repository\n * @namespace core \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('salutationRepository', salutationRepository);\n\n // protect against minification\n /* @ngInject */\n salutationRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name salutationRepository\n * @description Constructor for assignment.repository\n * @memberOf core\n */\n function salutationRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.get = get; \n\n return service;\n\n /**\n * @name getAll\n * @description retrieves salutations from storage\n * @returns List List of objects containing salutations properties\n * @memberOf salutation.repository\n */\n function getAll() {\n return baseService.getList('salutation', null, true, true, CoreRestangular);\n }\n \n /**\n * @name get\n * @description retrieves a salutation from storage\n * @param int salutationID identifier of the salutation object\n * @returns object object containing salutation properties\n * @memberOf salutation.repository\n */\n function get(salutationID) {\n return baseService.getSingle('salutation', { id: salutationID }, true, true, CoreRestangular);\n } \n\n }\n})();\n\n\n;\r\n/**\n * schoolAcademicYear.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('schoolAcademicYearRepository', schoolAcademicYearRepository);\n\n // protect against minification\n /* @ngInject */\n schoolAcademicYearRepository.$inject = ['baseService', 'repositoryFactory', 'CoreRestangular'];\n\n /**\n * @name schoolAcademicYearRepository\n * @description Constructor for schoolAcademicYear.repository\n * @memberOf core\n */\n function schoolAcademicYearRepository(baseService, repositoryFactory, coreRestangular) {\n\n //Adding base repository functionality. Allowing these other methods to tag along.\n var service = new repositoryFactory('SchoolAcademicYear', coreRestangular);;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getBySchoolId = getBySchoolId;\n service.getSchoolsByYear = getSchoolsByYear;\n\t\tservice.getSchoolsByYearAndState = getSchoolsByYearAndState;\n service.getSchoolByYear = getSchoolByYear;\n service.updateSchoolByYear = updateSchoolByYear;\n service.addSchoolByYear = addSchoolByYear;\n\n return service;\n\n /**\n * @name get\n * @description retrieves a schoolAcademicYear from storage by the primary key\n * @returns object Object containing schoolAcademicYear properties\n * @memberOf schoolAcademicYear.repository\n */\n function getBySchoolId(schoolId) {\n var oDataFilter = {\n SchoolID: schoolId\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n baseService.cache.destroyByObjectKey(params);\n return baseService.getList(\"schoolacademicyear\", params, true, true, coreRestangular);\n }\n\n function getSchoolsByYear(academicYearId) {\n var oDataFilter = {\n AcademicYearID: academicYearId\n };\n var params = _utils.getODataRequest({ 'filter': oDataFilter, 'orderby': 'School/SchoolName' });\n return baseService.getList('schoolacademicyear', params, true, true, coreRestangular);\n }\n\n\t\tfunction getSchoolsByYearAndState(academicYearId, stateID) {\n\t\t\tvar oDataFilter = {\n\t\t\t\tAcademicYearID: academicYearId,\n\t\t\t\t'School/StateID': stateID\n\t\t\t};\n\t\t\tvar params = _utils.getODataRequest({ 'filter': oDataFilter, 'orderby': 'School/SchoolName' });\n\t\t\treturn baseService.getList('schoolacademicyear', params, true, true, coreRestangular);\n\t\t};\n\n\t\tfunction getSchoolByYear(schoolId, academicYearId) {\n var oDataFilter = {\n SchoolID: schoolId,\n AcademicYearID: academicYearId\n };\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n return baseService.getList('schoolacademicyear', params, true, true, coreRestangular);\n }\n\n function updateSchoolByYear(school) {\n //TODO: Remove params when we fix caching\n var oDataFilter = {\n SchoolID: school.schoolID,\n AcademicYearID: school.academicYearID\n };\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n return baseService.put('schoolacademicyear', school, school.schoolAcademicYearID, true, coreRestangular, params);\n }\n\n function addSchoolByYear(school) {\n return coreRestangular.all('schoolacademicyear').post(school);\n }\n\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('schoolDateService', ['repositoryFactory', 'CoreRestangular', 'baseService',\n function (repositoryFactory, coreRestangular, baseService) {\n var repo = new repositoryFactory('SchoolDate', coreRestangular);\n\n repo.getActiveSchoolDates = getActiveSchoolDates;\n\n function getActiveSchoolDates(schoolId, academicYearId, beginDate, endDate) {\n\n var beginDateStr = beginDate.format('YYYY-MM-DD');\n var endDateStr = endDate.format('YYYY-MM-DD');\n\n var filter = \"?$filter=SchoolID+eq+\" + schoolId + \"+and+AcademicYearID+eq+\" + academicYearId + \"+and+IsCancelled+ne+true+and+Date+ge+datetime'\" + beginDateStr + \"'+and+Date+le+datetime'\" + endDateStr + \"'\";\n\n return baseService.getList(\"SchoolDate\" + filter, {}, false, false, coreRestangular)\n }\n\n return repo;\n }\n ]);\n})(); ;\r\n/**\n * school-form.repository\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** add the repo */\n\tangular.module('nha.core').service('school-form.repository', schoolFormRepo);\n\n\t/** setup injection */\n\tschoolFormRepo.$inject = ['repositoryFactory', 'CoreRestangular'];\n\n\t/** implement the repo */\n\tfunction schoolFormRepo(repositoryFactory, coreRestangular) {\n\t\t/** create the repo */\n\t\tvar repo = new repositoryFactory('SchoolForm', coreRestangular);\n\n\t\t/** add the method */\n\t\trepo.getBySchoolAndYear = getBySchoolAndYear;\n\n\t\t/** get school forms by school id and academic year id */\n\t\tfunction getBySchoolAndYear(schoolID, academicYearID){\n\t\t\treturn coreRestangular.all('schoolform').customGET(academicYearID + '/' + schoolID).then(function(schoolForms){\n\t\t\t\treturn schoolForms;\n\t\t\t});\n\t\t}\n\n\t\t/** return the repo */\n\t\treturn repo;\n\t}\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('schoolGradeLevelSectionRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, CoreRestangular) {\n return new repositoryFactory('SchoolGradeLevelSection', CoreRestangular);\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('schoolGradeLevelService', ['baseService', 'CoreRestangular',\n\n function (baseService, coreRestangular) {\n var svc = {\n get: get\n };\n\n return svc;\n\n function get(schoolId, academicYearId) {\n var filter = {};\n\n if (!_.isUndefined(schoolId)) {\n filter.SchoolID = schoolId;\n }\n\n if (!_.isUndefined(academicYearId)) {\n filter.AcademicYearID = academicYearId;\n }\n\n return baseService.getList('SchoolGradeLevel', _utils.getODataRequest({ filter: filter }), true, true, coreRestangular);\n }\n }]);\n\n})();;\r\n/**\n * schoolInstructionalAcademicYear.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('schoolInstructionalAcademicYearRepository', schoolInstructionalAcademicYearRepository);\n\n // protect against minification\n /* @ngInject */\n schoolInstructionalAcademicYearRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name schoolInstructionalAcademicYearRepository\n * @description Constructor for schoolInstructionalAcademicYear.repository\n * @memberOf core\n */\n function schoolInstructionalAcademicYearRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getSchoolInstructionalAcademicYears = getSchoolInstructionalAcademicYears;\n service.getByAcademicYearAndSchool = getByAcademicYearAndSchool;\n\n return service;\n\n /**\n * @name get\n * @description retrieves a list of schoolInstructionalAcademicYear from storage by schoolId\n * @returns object Object containing schoolInstructionalAcademicYear properties\n * @memberOf schoolInstructionalAcademicYear.repository\n */\n function getSchoolInstructionalAcademicYears(schoolId) {\n return baseService.getList(\"schoolinstructionalacademicyear\", { $filter: \"SchoolID eq \" + schoolId }, true, true, coreRestangular);\n }\n\n\n function getByAcademicYearAndSchool(academicYearId, schoolId) {\n var oDataParameters = _utils.getODataRequest({\n filter: {\n AcademicYearID: academicYearId,\n SchoolID: schoolId\n }\n });\n\n return baseService.getList('SchoolInstructionalAcademicYear', oDataParameters, true, true, coreRestangular);\n }\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('schoolMarkingPeriodCombinedService', ['baseService', 'CoreRestangular',\n\n function (baseService, coreRestangular) {\n\n var svc = {\n get: get,\n getByAcademicYear: getByAcademicYear,\n getByStudentInSchool: getByStudentInSchool,\n getByCourseSection: getByCourseSection,\n getByCourseSectionGroup: getByCourseSectionGroup,\n getBySchoolIdsAndAcademicYear: getBySchoolIdsAndAcademicYear\n };\n\n return svc;\n\n function get(schoolId, academicYearId, isDisplayedInFilters) {\n var filter = {};\n\n if (!_.isUndefined(schoolId)) {\n filter.SchoolID = schoolId;\n }\n\n if (!_.isUndefined(academicYearId)) {\n filter.AcademicYearID = academicYearId;\n }\n\n // by default, we show everything, but if you pass this in, we show only values that are supposed to be shown in filters/dropdowns\n if (isDisplayedInFilters) {\n filter.isDisplayedInFilters = isDisplayedInFilters;\n }\n\n return baseService.getList('SchoolMarkingPeriodCombined', _utils.getODataRequest({ filter: filter }), true, true, coreRestangular);\n }\n\n function getByAcademicYear(academicYearId) {\n var filter = {};\n\n if (!_.isUndefined(academicYearId)) {\n filter.AcademicYearID = academicYearId;\n }\n\n return baseService.getList('SchoolMarkingPeriodCombined', _utils.getODataRequest({ filter: filter }), true, true, coreRestangular);\n }\n\n function getByStudentInSchool(studentInSchoolId) {\n return baseService.getList('SchoolMarkingPeriodCombined/GetByStudentInSchool/' + studentInSchoolId, null, true, true, coreRestangular);\n }\n\n function getByCourseSection(courseSectionID) {\n return baseService.getList('SchoolMarkingPeriodCombined/GetByCourseSection/' + courseSectionID, null, true, true, coreRestangular);\n }\n\n function getByCourseSectionGroup(courseSectionGroupID) {\n return baseService.getList('SchoolMarkingPeriodCombined/GetByCourseSectionGroup/' + courseSectionGroupID, null, true, true, coreRestangular);\n }\n\n function getBySchoolIdsAndAcademicYear(schoolIds, academicYearId) {\n var filter = {};\n\n if (!_.isUndefined(schoolIds)) {\n filter.schoolIds = _.isArray(schoolIds) ? schoolIds : [schoolIds];\n }\n\n return baseService.getList('SchoolMarkingPeriodCombined/GetBySchoolIdsAndAcademicYear/' + academicYearId, filter, true, true, coreRestangular);\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').service('schoolMarkingPeriodManager', ['baseService', 'CoreRestangular', 'schoolMarkingPeriodService', '$q',\n\n function (baseService, coreRestangular, schoolMarkingPeriodService, $q) {\n var service = this;\n\n service.getCurrentSchoolMarkingPeriod = getCurrentSchoolMarkingPeriod;\n\n /*\n * @description Get current marking period for school\n */\n function getCurrentSchoolMarkingPeriod(schoolId, academicYearId) {\n var deferred = $q.defer();\n\n var now = moment();\n\n schoolMarkingPeriodService.get(schoolId, academicYearId).then(function (results) {\n var currentMarkingPeriod = _.find(results, function (schoolMarkingPeriod) {\n return moment(schoolMarkingPeriod.beginDate).isBefore(now)\n && moment(schoolMarkingPeriod.endDate).isAfter(now);\n });\n\n deferred.resolve(currentMarkingPeriod);\n });\n\n return deferred.promise;\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('schoolMarkingPeriodService', ['baseService', 'CoreRestangular',\n\n function (baseService, coreRestangular) {\n\n var svc = {\n get: get,\n getByAcademicYear: getByAcademicYear,\n getByStudentInSchool: getByStudentInSchool,\n getByCourseSection: getByCourseSection,\n getByCourseSectionGroup: getByCourseSectionGroup,\n getBySchoolIdsAndAcademicYear: getBySchoolIdsAndAcademicYear\n };\n\n return svc;\n\n function get(schoolId, academicYearId, isDisplayedInFilters) {\n var filter = {};\n\n if (!_.isUndefined(schoolId)) {\n filter.SchoolID = schoolId;\n }\n\n if (!_.isUndefined(academicYearId)) {\n filter.AcademicYearID = academicYearId;\n }\n\n // by default, we show everything, but if you pass this in, we show only values that are supposed to be shown in filters/dropdowns\n if (isDisplayedInFilters) {\n filter.isDisplayedInFilters = isDisplayedInFilters;\n }\n\n return baseService.getList('SchoolMarkingPeriod', _utils.getODataRequest({ filter: filter }), true, true, coreRestangular);\n }\n\n function getByAcademicYear(academicYearId) {\n var filter = {};\n \n if (!_.isUndefined(academicYearId)) {\n filter.AcademicYearID = academicYearId;\n }\n\n return baseService.getList('SchoolMarkingPeriod', _utils.getODataRequest({ filter: filter }), true, true, coreRestangular);\n }\n\n function getByStudentInSchool(studentInSchoolId) {\n return baseService.getList('SchoolMarkingPeriod/GetByStudentInSchool/' + studentInSchoolId, null, true, true, coreRestangular);\n }\n\n function getByCourseSection(courseSectionID) {\n return baseService.getList('SchoolMarkingPeriod/GetByCourseSection/' + courseSectionID, null, true, true, coreRestangular);\n }\n\n function getByCourseSectionGroup(courseSectionGroupID) {\n return baseService.getList('SchoolMarkingPeriod/GetByCourseSectionGroup/' + courseSectionGroupID, null, true, true, coreRestangular);\n }\n\n function getBySchoolIdsAndAcademicYear(schoolIds, academicYearId) {\n var filter = {};\n\n if (!_.isUndefined(schoolIds)) {\n filter.schoolIds = _.isArray(schoolIds) ? schoolIds : [schoolIds];\n }\n\n return baseService.getList('SchoolMarkingPeriod/GetBySchoolIdsAndAcademicYear/' + academicYearId, filter, true, true, coreRestangular);\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('schoolYearRepository', ['repositoryFactory','baseService', 'CoreRestangular',\n function (repositoryFactory, baseService, coreRestangular) {\n var repository = new repositoryFactory('SchoolAcademicYear', coreRestangular);\n\n repository.getSystemCurrentYear = getSystemCurrentYear;\n repository.getByAcademicYearAndSchool = getByAcademicYearAndSchool;\n\n function getSystemCurrentYear() {\n return baseService.getList(\"schoolYear/getSystemCurrentYear\", null, true, true, coreRestangular);\n }\n\n function getByAcademicYearAndSchool(academicYearId, schoolId) {\n var oDataParameters = _utils.getODataRequest({\n filter: {\n AcademicYearID: academicYearId,\n SchoolID: schoolId\n }\n });\n\n return baseService.getList('SchoolAcademicYear', oDataParameters, true, true, coreRestangular);\n }\n\n return repository;\n }\n ]);\n})();\n\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('schoolService',\n ['CoreRestangular', 'baseService',\n\n function (coreRestangular, baseService) {\n var service = {\n get: get, // getsingle\n getSchool: getSchool, // getlist\n getSchools: getSchools,\n getSchoolsForUser: getSchoolsForUser,\n getSchoolsByState: getSchoolsByState,\n getStartEndTimes: getStartEndTimes,\n getSchoolAcademicYears: getSchoolAcademicYears,\n getSchoolAcademicYearsWithDates: getSchoolAcademicYearsWithDates,\n getSchoolInstructionalAcademicYear: getSchoolInstructionalAcademicYear,\n updateSchoolAcademicYear: updateSchoolAcademicYear,\n updateSchool: updateSchool,\n deleteSchool: deleteSchool\n };\n\n return service;\n\n function get(schoolID) {\n return getSchool(schoolID);\n }\n\n function getSchool(schoolId) {\n return baseService.getSingle(\"school\", _utils.getODataRequest({ filter: { SchoolID: schoolId }}), false, true, coreRestangular);\n }\n\n function getSchools(params) {\n if (params) {\n var oDataFilter = {};\n if (params.academicYearID) {\n oDataFilter.AcademicYearID = params.academicYearID;\n }\n if (params.stateID) {\n oDataFilter.StateID = params.stateID;\n }\n if (params.schoolID) {\n oDataFilter.SchoolID = params.schoolID;\n }\n params = _utils.getODataRequest({ 'filter': oDataFilter });\n }\n return baseService.getList(\"School\", params, false, true, coreRestangular);\n }\n\n function getSchoolsForUser() {\n return baseService.getList('getschoolsforuser', null, false, true, coreRestangular);\n }\n\n function getSchoolsByState(stateId) {\n var oDataFilter = {\n StateID: stateId\n };\n var params = _utils.getODataRequest({ 'filter': oDataFilter, 'orderby': 'SchoolName' });\n return baseService.getList('school', params, false, true, coreRestangular);\n }\n\n function getStartEndTimes(schoolID, academicYearID) {\n var oDataFilter = {\n SchoolID: schoolID,\n AcademicYearID: academicYearID\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n return baseService.getSingle('schoolstartendtime', params, true, true, coreRestangular);\n }\n\n function getSchoolAcademicYears(schoolID) {\n var oDataFilter = {\n SchoolID: schoolID\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n return baseService.getList(\"schoolacademicyear\", params, true, true, coreRestangular);\n }\n\n // Call in to SchoolInstructionalAcademicYears to get start date of first marking period and end date of last marking period\n // Did this to keep support of having BeginDate and EndDate on SchoolAcademicYears after they were removed from the table\n function getSchoolAcademicYearsWithDates(schoolID) {\n var oDataFilter = {\n SchoolID: schoolID\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n\n return baseService.getList(\"schoolinstructionalacademicyear\", params, true, true, coreRestangular).then(function(schoolInstYears) {\n return baseService.getList(\"schoolacademicyear\", params, true, true, coreRestangular).then(function(schoolYears) {\n return _.merge(schoolInstYears, schoolYears);\n });\n });\n }\n\n function getSchoolInstructionalAcademicYear(schoolId, academicYearId) {\n var oDataFilter = {\n SchoolID: schoolId,\n AcademicYearID: academicYearId\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n\n return baseService.getList(\"schoolinstructionalacademicyear\", params, true, true, coreRestangular);\n }\n\n function updateSchoolAcademicYear(schoolAcademicYear) {\n return baseService.put('schoolacademicyear', schoolAcademicYear, schoolAcademicYear.schoolAcademicYearID, true, coreRestangular);\n }\n\n function updateSchool(school) {\n return baseService.put('school', school, school.schoolID, true, coreRestangular);\n }\n\n function deleteSchool(parms) {\n return coreRestangular.remove(parms);\n }\n\n }]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('screenFieldUsageRepository', ['repositoryFactory','baseService', 'CoreRestangular',\n function (repositoryFactory, baseService, coreRestangular) {\n var repository = new repositoryFactory('ScreenFieldUsage', coreRestangular);\n\n //repository.getSystemCurrentYear = getSystemCurrentYear;\n //repository.getByAcademicYearAndSchool = getByAcademicYearAndSchool;\n\n //function getSystemCurrentYear() {\n // return baseService.getList(\"schoolYear/getSystemCurrentYear\", null, true, true, coreRestangular);\n //}\n\n //function getByAcademicYearAndSchool(academicYearId, schoolId) {\n // var oDataParameters = _utils.getODataRequest({\n // filter: {\n // AcademicYearID: academicYearId,\n // SchoolID: schoolId\n // }\n // });\n\n // return baseService.getList('SchoolAcademicYear', oDataParameters, true, true, coreRestangular);\n //}\n\n return repository;\n }\n ]);\n})();\n\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('staffImageService', ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var svc = {\n get: get\n\n };\n\n return svc;\n\n function get(id) {\n return baseService.getList('StaffImage', { id: id }, false, true, CoreRestangular);\n }\n\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('staffPositionSchoolSummaryRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, coreRestangular) {\n return new repositoryFactory('StaffPositionSchoolSummary', coreRestangular);\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('staffPositionRepository', ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var svc = {\n getAll: getAll\n };\n\n return svc;\n\n function getAll(parameters) {\n return baseService.getList('StaffPosition', _utils.getODataRequest({ filter: parameters }), true, true, CoreRestangular);\n }\n }]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('staffService', ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var svc = {\n get: get,\n getAll: getAll,\n getBySchool: getBySchool,\n getAvatar: getAvatar\n };\n\n return svc;\n\n function get(staffId) {\n return baseService.getList('Staff', { id: staffId }, true, true, CoreRestangular);\n }\n\n function getAll(parameters) {\n return baseService.getList('Staff', _utils.getODataRequest({ filter: parameters }), true, true, CoreRestangular);\n }\n\n function getBySchool(schoolId) {\n return baseService.getList('staff/getbyschool/' + schoolId, null, true, true, CoreRestangular);\n }\n\n function getAvatar(staffId, size) {\n if (!size) {size = 60;}\n return baseService.getSingle('staff/' + staffId + '/avatar/' + size, null, true, true, CoreRestangular);\n }\n\n }]);\n\n})();;\r\n/**\n * state-academic-year.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('stateAcademicYearRepository', stateAcademicYearRepository);\n\n // protect against minification\n /* @ngInject */\n stateAcademicYearRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name stateAcademicYearRepository\n * @description Constructor for state-academic-year.repository\n * @memberOf core\n */\n function stateAcademicYearRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getByAcademicYearId = getByAcademicYearId;\n service.getByStateId = getByStateId;\n service.post = post;\n service.put = put;\n service.remove = remove;\n\n return service;\n\n function remove(stateAcademicYearId) {\n return coreRestangular.one('stateAcademicYear', stateAcademicYearId).remove();\n }\n\n /**\n * @name getByAcademicYearId\n * @description retrieves list of stateAcademicYears by academicYearId from storage\n * @returns List List of objects containing a subset of stateAcademicYear properties\n * @memberOf state-academic-year.repository\n */\n function getByAcademicYearId(academicYearId) {\n var oDataFilter = {\n AcademicYearID: academicYearId\n };\n var params = _utils.getODataRequest({ 'filter': oDataFilter, 'orderby': 'State/Name' });\n return baseService.getList('stateacademicyear', params, false, true, coreRestangular);\n }\n /**\n * @name getByStateId\n * @description retrieves list of stateAcademicYears by stateId from storage\n * @returns List List of objects containing a subset of stateAcademicYear properties\n * @memberOf state-academic-year.repository\n */\n function getByStateId(stateId) {\n var oDataFilter = {\n StateID: stateId\n };\n\n var params = _utils.getODataRequest({ 'filter': oDataFilter });\n baseService.cache.destroyByObjectKey(params);\n return baseService.getList(\"stateacademicyear\", params, true, true, coreRestangular);\n }\n\n /**\n * @name post\n * @description adds a stateAcademicYear to storage\n * @returns undefined\n * @memberOf state-academic-year.repository\n */\n function post(state) {\n return coreRestangular.all('stateacademicyear').post(state);\n }\n\n /**\n * @name put\n * @description updates a stateAcademicYear to storage\n * @returns undefined\n * @memberOf state-academic-year.repository\n */\n function put(state) {\n return baseService.put('stateacademicyear', state, state.stateAcademicYearID, true, coreRestangular);\n }\n\n }\n\n})();;\r\nangular.module(\"nha.core\").service(\"stateTransitionSecurityCheck\", [\n\t\"$state\",\n\t\"$q\",\n\t\"$rootScope\",\n\t\"apiSecurityService\",\n\t\"appSettings\",\n\t\"Restangular\",\n\t\"apiResolutionService\",\n\t\"$location\",\n\t\"$timeout\",\n\tfunction (\n\t\t$state,\n\t\t$q,\n\t\t$rootScope,\n\t\tapiSecurityService,\n\t\tappSettings,\n\t\trestangular,\n\t\tapiResolutionService,\n\t\t$location,\n\t\t$timeout\n\t) {\n\t\t$rootScope.forbiddenStateName = \"403\";\n\n\t\tvar service = {\n\t\t\tattachStateChangeListener: attachStateChangeListener,\n\t\t\tresolveAuthorization: resolveAuthorization,\n\t\t\tgoToForbiddenState: goToForbiddenState,\n\t\t};\n\t\treturn service;\n\n\t\tfunction goToForbiddenState() {\n\t\t\tif ($state.get($rootScope.forbiddenStateName)) {\n\t\t\t\t$state.go($rootScope.forbiddenStateName);\n\t\t\t} else if (appSettings && appSettings.defaultState) {\n\t\t\t\t$state.go(appSettings.defaultState);\n\t\t\t} else {\n\t\t\t\t// redirect to root of application\n\t\t\t\t$location.path(\"/\");\n\t\t\t}\n\t\t}\n\n\t\tfunction isAuthorized(requiredResource, api) {\n\t\t\tif (!requiredResource) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst resources = requiredResource.split(',');\n\n\t\t\t// Make sure current user has access to security claim required for this state\n\t\t\tvar apiRestangular = api\n\t\t\t\t? apiResolutionService.getApiByName(api) // if an api is specified, get it\n\t\t\t\t: restangular; // otherwise use the modules default\n\n\t\t\tvar allRequests = [];\n\n\t\t\t_.forEach(resources, function(resource) {\n\t\t\t\tif (resource.contains('|')) {\n\t\t\t\t\tallRequests.push(apiSecurityService.hasSaviyntEntitlement(resource))\n\t\t\t\t} else {\n\t\t\t\t\t// split by resource:action\n\t\t\t\t\tvar action = \"Get\"; // default to :Get when not included\n\t\t\t\t\tif (resource.indexOf(\":\") > -1) {\n\t\t\t\t\t\tvar splitText = resource.split(\":\");\n\t\t\t\t\t\tresource = splitText.shift();\n\t\t\t\t\t\taction = splitText.join(\":\");\n\t\t\t\t\t}\n\n\t\t\t\t\tallRequests.push(apiSecurityService.isAccessAllowed(resource, action, apiRestangular))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn $q.all(allRequests).then(function (results) {\n\t\t\t\treturn _.find(results, function (x) { return x; });\n\t\t});\n\t\t}\n\n\t\tfunction resolveAuthorization(requiredResource, api) {\n\t\t\treturn isAuthorized(requiredResource, api).then(function (result) {\n\t\t\t\t//\tcheck resource authorization\n\t\t\t\tif (result) {\n\t\t\t\t\t//\tresolve/promise continuation\n\t\t\t\t\treturn $q.when();\n\t\t\t\t} else {\n\t\t\t\t\t//\twait for promise to be rejected, then go to forbidden\n\t\t\t\t\t$timeout(function () {\n\t\t\t\t\t\tgoToForbiddenState(); //\tthis code runs after the resolve promise has been rejected.\n\t\t\t\t\t});\n\n\t\t\t\t\t//\tresolve/promise rejection\n\t\t\t\t\treturn $q.reject();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction attachStateChangeListener(forbiddenStateName) {\n\t\t\t$rootScope.forbiddenStateName =\n\t\t\t\tforbiddenStateName || $rootScope.forbiddenStateName;\n\n\t\t\t$rootScope.$on(\n\t\t\t\t\"$stateChangeStart\",\n\t\t\t\tfunction (e, toState, toParams, fromState, fromParams) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!toState ||\n\t\t\t\t\t\t!toState.data ||\n\t\t\t\t\t\t!toState.data.security ||\n\t\t\t\t\t\t!toState.data.security.requiredResource\n\t\t\t\t\t) {\n\t\t\t\t\t\tlog(\n\t\t\t\t\t\t\t\"No requiredResource setup for \" +\n\t\t\t\t\t\t\t\ttoState.name +\n\t\t\t\t\t\t\t\t', security check not run. The ui route would need \"data.security.requiredResource\" defined. Example: Students:Get or Students (defaults to Get) '\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlog('[c=\"color: purple\"]toState.data[c]', toState.data);\n\n\t\t\t\t\tisAuthorized(\n\t\t\t\t\t\ttoState.data.security.requiredResource,\n\t\t\t\t\t\ttoState.data.security.api\n\t\t\t\t\t).then(function (result) {\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tlog(\n\t\t\t\t\t\t\t\t\"State change validation successful for \" +\n\t\t\t\t\t\t\t\t\ttoState.name\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlog(\n\t\t\t\t\t\t\t\t\"User does not have permission to navigate to \" +\n\t\t\t\t\t\t\t\t\ttoState.name +\n\t\t\t\t\t\t\t\t\t\"! Required Resource checked:'\" +\n\t\t\t\t\t\t\t\t\ttoState.data.security.requiredResource +\n\t\t\t\t\t\t\t\t\t\"'\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tgoToForbiddenState();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t},\n]);\n;\r\n/**\n * state.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('stateRepository', stateRepository);\n\n // protect against minification\n /* @ngInject */\n stateRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name stateRepository\n * @description Constructor for state.repository\n * @memberOf core\n */\n function stateRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n service.getAll = getAll;\n service.getSchoolsForStateByAcademicYear = getSchoolsForStateByAcademicYear;\n\n return service;\n\n /**\n * @name get\n * @description retrieves a state from storage by the primary key\n * @returns object Object containing state properties\n * @memberOf state.repository\n */\n function get(stateId) {\n return baseService.getList('state', { id: stateId }, true, true, coreRestangular);\n }\n\n /**\n * @name getAll\n * @description retrieves list of states from storage\n * @returns List List of objects containing a subset of state properties\n * @memberOf state.repository\n */\n function getAll() {\n var params = _utils.getODataRequest({ 'orderby': 'Name' });\n return baseService.getList('state', params, true, true, coreRestangular);\n }\n /**\n * @name getSchoolsForStateByAcademicYear\n * @description retrieves a list of states and child schools from storage by academic year\n * @returns List Object containing a list of states and child schools properties\n * @memberOf state.repository\n */\n function getSchoolsForStateByAcademicYear(academicYearId) {\n return baseService.getList('state/getSchoolsForStateByAcademicYear/' + academicYearId, null, true, true, coreRestangular);\n }\n\n }\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('studentInSchoolRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, coreRestangular) {\n return new repositoryFactory('StudentInSchool', coreRestangular);\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').factory('studentInSchoolService',\n ['CoreRestangular', 'baseService',\n\n function (CoreRestangular, baseService) {\n var service = {\n get: get,\n getAllForStudentByStudentInSchool: getAllForStudentByStudentInSchool,\n getByStudentID: getByStudentID,\n getByStudentIDandYear: getByStudentIDandYear\n };\n\n return service;\n\n function get(studentInSchoolId) {\n return baseService.getSingle('StudentInSchool', { id: studentInSchoolId }, true, true, CoreRestangular);\n }\n\n function getAllForStudentByStudentInSchool(studentInSchoolId) {\n return baseService.getList('StudentInSchool/GetAllForStudentByStudentInSchool/' + studentInSchoolId, null, true, true, CoreRestangular);\n }\n\n function getByStudentID(academicYearID, studentID) {\n return baseService.getSingle('StudentInSchool', { StudentID: studentID, AcademicYearID: academicYearID }, true, true, CoreRestangular);\n }\n \n function getByStudentIDandYear(academicYearID, studentID) {\n return baseService.getList('StudentInSchool', { StudentID: studentID, AcademicYearID: academicYearID }, true, true, CoreRestangular);\n }\n\n\n }]);\n\n})();;\r\n/**\n * student-status-history.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('studentStatusHistoryRepository', studentStatusHistoryRepository);\n\n // protect against minification\n /* @ngInject */\n studentStatusHistoryRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name studentStatusHistoryRepository\n * @description Constructor for student-status-history.repository\n * @memberOf core\n */\n function studentStatusHistoryRepository(baseService, CoreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getStudentStatusHistories = getStudentStatusHistories;\n\n return service;\n\n /**\n * @name getStudentStatusHistories\n * @description retrieves student status histories from storage\n * @returns List List of objects containing a subset of student status history properties\n * @memberOf student-status-history.repository\n */\n function getStudentStatusHistories(studentInSchoolId) {\n return null; // baseService.getList('studentStatusHistory', { $filter: { studentInSchoolID: studentInSchoolId } }, true, true, CoreRestangular);\n }\n\n }\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('studentRepository', ['repositoryFactory', 'CoreRestangular',\n function (repositoryFactory, coreRestangular) {\n return new repositoryFactory('Student', coreRestangular);\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .service('termService', ['baseService', 'MasterSchedulingRestangular',\n function (baseService, masterSchedulingRestangular) {\n\n var service = {\n termDisplay: termDisplay\n };\n\n return service;\n\n function termDisplay(s, schoolMarkingPeriods) {\n\n if (s && s.markingPeriods) {\n\n // unique list of marking periods\n var markingPeriods = _.map(schoolMarkingPeriods, 'markingPeriod');\n\n if (markingPeriods) {\n // get list of school marking periods that match our row\n var courseSchoolMarkingPeriods = _.filter(schoolMarkingPeriods, function (smp) {\n return _.includes(s.markingPeriods, smp.markingPeriodID);\n });\n\n if (courseSchoolMarkingPeriods) {\n var markingPeriodGroup = _.head(courseSchoolMarkingPeriods);\n if (markingPeriodGroup && markingPeriodGroup.markingPeriod) {\n // get our MarkingPeriodGroupId off of any record, the first will do, since they should all be the same\n var markingPeriodGroupId = markingPeriodGroup.markingPeriod.markingPeriodGroupID;\n\n // count the number of records that we have MarkingPeriodGroup, that should be the total possible for that AY/School\n var count = _.filter(markingPeriods, { markingPeriodGroupID: markingPeriodGroupId }).length;\n\n // if the number of items in the two matches the number totally available, then that means we have all of them, so return 'Year'\n\t\t\t\t\t\t\t\t\t// also have to check to see if it is a recapture group, because we'll want to show the short name then\n if (courseSchoolMarkingPeriods.length === count && markingPeriodGroupId !== 9) {\n return 'Year';\n } else {\n return _.map(courseSchoolMarkingPeriods, 'markingPeriodShortName').join(', ');\n }\n }\n }\n }\n }\n }\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').service('uiAlertService', uiAlertService);\n\n uiAlertService.$inject = ['toastr', 'toastrConfig', '$q'];\n\n function uiAlertService(toastr, toastrConfig, $q) {\n\n function success(message, title, optionOverrides, toastrConfigOverrides) {\n // default these values, so you don't need to send anything in\n title = title || 'Success'; // TODO: Consider defaulting to no title, if not provided - EdLang\n message = message || 'Changes were saved successfully.';\n \n // send to main toastr\n toast(message, title, 'success', optionOverrides, toastrConfigOverrides);\n }\n\n function info(message, title, optionOverrides, toastrConfigOverrides) {\n // default these values, so you don't need to send anything in\n title = title || 'Info'; // TODO: Consider defaulting to no title, if not provided - EdLang\n message = message || 'Saving changes...';\n\n // send to main toastr\n toast(message, title, 'info', optionOverrides, toastrConfigOverrides);\n }\n\n function warning(message, title, optionOverrides, toastrConfigOverrides) {\n // default these values, so you don't need to send anything in\n title = title || 'Warning'; // TODO: Consider defaulting to no title, if not provided - EdLang\n message = message || 'There was an issue saving changes.';\n\n // send to main toastr\n toast(message, title, 'warning', optionOverrides, toastrConfigOverrides);\n }\n\n function error(message, title, error, optionOverrides, toastrConfigOverrides) {\n // default these values, so you don't need to send anything in\n title = title || 'Error'; // TODO: Consider defaulting to no title, if not provided - EdLang\n message = message || 'There was an error saving changes.';\n\n // this is the javascript error we catch \n if (error) {\n message = error.message;\n }\n\n // send to main toastr\n toast(message, title, 'error', optionOverrides, toastrConfigOverrides);\n }\n\n function toast(message, title, toastType, optionOverrides, toastrConfigOverrides) {\n // default toastr options\n var _options = {\n closeButton: true,\n debug: false,\n extendedTimeOut: '1000',\n hideDuration: '1000',\n hideEasing: 'linear',\n hideMethod: 'fadeOut',\n onclick: null,\n progressBar: false, // progress bar for this toast notification\n showDuration: '300',\n showEasing: 'swing',\n showMethod: 'fadeIn',\n timeOut: '5000'\n };\n\n // default toastrConfig options\n var _toastrConfig = {\n allowHtml: false,\n autoDismiss: false,\n closeButton: false,\n closeHtml: '',\n containerId: 'toast-container',\n extendedTimeOut: 1000,\n iconClasses: {\n error: 'toast-error',\n info: 'toast-info',\n success: 'toast-success',\n warning: 'toast-warning'\n },\n maxOpened: 0,\n messageClass: 'toast-message',\n newestOnTop: false,\n onHidden: null,\n onShown: null,\n onTap: null,\n positionClass: 'toast-bottom-left',\n preventDuplicates: false,\n preventOpenDuplicates: false,\n progressBar: false, // progress bar for ??? Seems to work as well as toastrOptions.progressBar. Need further investigation.\n tapToDismiss: true,\n target: 'body',\n templates: {\n toast: 'directives/toast/toast.html',\n progressbar: 'directives/progressbar/progressbar.html'\n },\n timeOut: 5000,\n titleClass: 'toast-title',\n toastClass: 'toast'\n };\n\n // override passed in toastrConfig overrides\n if (toastrConfigOverrides) {\n _toastrConfig = _.assign(_toastrConfig, toastrConfigOverrides);\n }\n\n // override injected toastrConfig entries within toastr \n if (_toastrConfig) {\n toastrConfig = _.assign(toastrConfig, _toastrConfig);\n }\n\n // if we want to overide, merge our objects\n if (optionOverrides) {\n _options = _.assign(_options, optionOverrides);\n }\n\n // set the toastr options\n toastr.options = _options;\n \n // default our values if they don't exist\n title = title || 'Success'; // TODO: Consider defaulting to no title, if not provided - EdLang\n message = message || 'Changes were saved successfully.';\n \n // default to success\n if (!toastType) {\n toastType = 'success';\n }\n\n // send the toastr (note: expects message, title parameter order)\n switch (toastType) {\n case 'error':\n toastr.error(message, title, _options);\n break;\n case 'warning':\n toastr.warning(message, title, _options);\n break;\n case 'info':\n toastr.info(message, title, _options);\n break;\n case 'success':\n default:\n toastr.success(message, title, _options);\n }\n }\n\n function alert(options) {\n if (options.message && options.title) {\n swal(options.message, options.title);\n }\n else if(options.message && !options.title) {\n swal(options.message);\n }\n }\n\n function prompt(message, title) {\n var deferred = $q.defer();\n\n swal({\n title: title || \"Are you sure?\",\n text: message,\n type: \"warning\",\n showCancelButton: true,\n confirmButtonText: \"Yes\",\n closeOnConfirm: true\n }, function () {\n deferred.resolve(true);\n });\n\n return deferred.promise;\n }\n\n return {\n success: success,\n info: info,\n warning: warning,\n fail: error, // alias\n error: error, \n toast: toast,\n alert: alert,\n prompt: prompt\n };\n }\n\n})();;\r\nvar UserContextService = {\n\tensureUserContext: function () {\n\t\treturn new Promise(function(resolve) {\n\t\t\tif (window.userContext) {\n\t\t\t\tresolve(window.userContext);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar userService = myNHA.GetApiService('Account', 'UserService');\n\t\t\tuserService.get(null, null, false).then(function(user) {\n\t\t\t\tuser = UserContextService.modifyUserObjectForBackwardsCompatibility(JSON.parse(user));\n\t\t\t\twindow.userContext = user;\n\t\t\t\tresolve(window.userContext);\n\t\t\t});\n\t\t});\n\t},\n\n\tgetUserContext: function () {\n\t\treturn window.userContext;\n\t},\n\n\tmodifyUserObjectForBackwardsCompatibility: function (user) {\n\t\tuser['common_name'] = user.fullName;\n\t\tuser['family_name'] = user.lastName;\n\t\tuser['given_name'] = user.firstName;\n\t\tuser['nameid'] = user.username;\n\t\tuser['unique_name'] = user.username;\n\t\tuser['winaccountname'] = user.username;\n\n\t\tuser['role'] = user.roles.map(function(r) {\n\t\t\treturn r.roleName;\n\t\t});\n\n\t\tvar department = user.roles.find(function(r) {\n\t\t\treturn r.roleType === 'Department';\n\t\t})\n\t\tif (department) {\n\t\t\tuser['http://schemas.mynha.com/ILM/Department'] = department.roleName;\n\t\t}\n\n\t\tuser['http://schemas.mynha.com/AtSchool/SchoolID'] = user.schoolIDs;\n\t\tuser['http://schemas.mynha.com/ILM/LocationID'] = user.locationID;\n\t\tuser['http://schemas.mynha.com/ILM/SchoolID'] = user.schoolIDs;\n\t\tuser['http://schemas.mynha.com/ILM/Title'] = user.jobTitle;\n\t\tuser['http://schemas.mynha.com/ILM/UserGuid'] = user.userGuid;\n\t\tuser['http://schemas.mynha.com/SIS/Core/StaffID'] = user.staffID;\n\t\tuser['http://schemas.mynha.com/Savyint/Location'] = '';\n\t\tuser['http://schemas.mynha.com/Savyint/UserID'] = user.userID;\n\n\t\treturn user;\n\t},\n\n\tgetDefaultSchool: function () {\n\t\tvar context = UserContextService.getUserContext();\n\t\tvar schools = context[\"http://schemas.mynha.com/ILM/SchoolID\"];\n\n\t\tif (_.isArray(schools)) {\n\t\t\treturn _.parseInt(_.head(schools));\n\t\t}\n\n\t\treturn _.parseInt(schools);\n\t},\n\n\tgetStaffId: function () {\n\t\tvar context = UserContextService.getUserContext();\n\t\tvar staffId = context[\"http://schemas.mynha.com/SIS/Core/StaffID\"];\n\n\t\tif (staffId) {\n\t\t\treturn _.parseInt(staffId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tdoesUserHaveRole: function (role) {\n\t\tvar doesHaveRole = false;\n\t\tvar context = UserContextService.getUserContext();\n\n\t\tif (Array.isArray(context.role)) {\n\t\t\tif (context.role.indexOf(role) > -1) {\n\t\t\t\tdoesHaveRole = true;\n\t\t\t}\n\t\t} else {\n\t\t\tif (context.role == role) {\n\t\t\t\tdoesHaveRole = true;\n\t\t\t}\n\t\t}\n\n\t\treturn doesHaveRole;\n\t}\n};\n\nangular.module('nha.core').service('userContextService', function () {\n\treturn UserContextService;\n});;\r\n/**\n * wing.repository\n * @namespace core\n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('wingRepository', wingRepository);\n\n // protect against minification\n /* @ngInject */\n wingRepository.$inject = ['baseService', 'CoreRestangular'];\n\n /**\n * @name wingRepository\n * @description Constructor for wing.repository\n * @memberOf core\n */\n function wingRepository(baseService, coreRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.get = get;\n service.getAll = getAll;\n service.getGradeLevelWingsMap = getGradeLevelWingsMap;\n\n return service;\n\n /**\n * @name get\n * @description retrieves a wing from storage by the primary key\n * @returns object Object containing wing properties\n * @memberOf wing.repository\n */\n function get(wingId) {\n return baseService.getList('wing', { wingID: wingId }, true, true, coreRestangular);\n }\n\n /**\n * @name getAll\n * @description retrieves list of wings from storage\n * @returns List List of objects containing a subset of wing properties\n * @memberOf wing.repository\n */\n function getAll() {\n return baseService.getList('wing', {}, true, true, coreRestangular);\n }\n /**\n * @name getGradeLevelWingsMap\n * @description creates a manual mapping of grade levelids to wing id - // TODO: Confirm: PRESUME THIS TO BE TEMPORARY\n * @returns List List of objects containing a subset of wing properties\n * @memberOf wing.repository\n */\n function getGradeLevelWingsMap() {\n var map =\n [\n { 'gradeLevelId': 1, 'wingId': 1 },\n { 'gradeLevelId': 2, 'wingId': 1 },\n { 'gradeLevelId': 3, 'wingId': 1 },\n { 'gradeLevelId': 4, 'wingId': 2 },\n { 'gradeLevelId': 5, 'wingId': 2 },\n { 'gradeLevelId': 6, 'wingId': 2 },\n { 'gradeLevelId': 7, 'wingId': 3 },\n { 'gradeLevelId': 8, 'wingId': 3 },\n { 'gradeLevelId': 9, 'wingId': 3 },\n { 'gradeLevelId': 322, 'wingId': 1 },\n { 'gradeLevelId': 323, 'wingId': 1 },\n { 'gradeLevelId': 399, 'wingId': 1 },\n { 'gradeLevelId': 403, 'wingId': 1 }\n ];\n return map;\n }\n\n }\n\n})();;\r\n/**\n * message.manager\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** add model */\n\tangular.module('nha.core').service('message.manager', messageManager);\n\n\t/** setup injection */\n\tmessageManager.$inject = ['pub-sub.factory'];\n\n\t/** implement the model */\n\tfunction messageManager(pubSubFactory) {\n\t\t/** create pub sub manager */\n\t\tvar pubSubManager = new pubSubFactory(['message'], 'memory', 'core');\n\n\t\t/** add an empty message */\n\t\tpubSubManager.addData('message', { 'key': null, 'value': null });\n\n\t\t/** return the pub sub */\n\t\treturn pubSubManager;\n\t}\n})();;\r\n(function () {\n 'use strict';\n\n // sample usage: {{state.Name}} \n // $attrs.lookup: collection of objects to search based on the find expression. During an async web service call populating the collection, a $watch() will wait for the data to be retrieved.\n // $attrs.find: expression that returns a boolean indicating the row is a match in the call to _.find()\n // $attrs.result: name of the object returned from the call to _.find()\n angular\n .module('nha.core')\n .directive('bindLookup', bindLookupDirective);\n\n function bindLookupDirective() {\n var directive = {\n transclude: true,\n template: '',\n scope: false, //Inherited scope so we can watch on parent scope for changes to lookup\n link: bindLookupLink,\n controller: bindLookupController\n }\n return directive;\n\n function bindLookupLink(scope, element, attrs, ctrl, transclude) {\n\n }\n }\n \n bindLookupController.$inject = ['$scope', '$attrs'];\n \n function bindLookupController($scope, $attrs) {\n function setResult() {\n if ($attrs.find) {\n $scope.find = $scope.$eval($attrs.find);\n }\n if ($attrs.lookup) {\n $scope.lookup = $scope.$eval($attrs.lookup);\n }\n if ($attrs.result && \n $scope.find && JSON.stringify($scope.find) !== '{}'\n && $scope.lookup) {\n $scope[$attrs.result] = _.find($scope.lookup, $scope.find);\n }\n }\n\n if ($attrs.lookup && $attrs.find && $attrs.result) {\n setResult();\n\n $scope.$watch($attrs.lookup, function (newVal, oldVal) {\n setResult();\n });\n $scope.$watch($attrs.find, function (newVal, oldVal) {\n setResult();\n });\n }\n }\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').directive('businessResponse', ['$timeout', '$parse', 'appSettings', function ($timeout, $parse, appSettings) {\n return {\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/business-response/business-response.html',\n scope: {\n businessResponse: '='\n },\n link: function(scope, el, attrs) {\n scope.showRuleAlert = function (rule) {\n //Show only if not a overrideable warning. If overrideable warning, only show if there are no errors.\n return rule.ruleSeverity !== \"Warning\" || !_(scope.businessResponse.operationResult.rules).reject('criteriaMet').some({ 'ruleSeverity': 'Error' });\n }\n }\n }\n }]\n );\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('tableSort', function () {\n return {\n scope: {\n sortExpression: '=?',\n sortChanged: '&'\n },\n controller: ['$scope', '$timeout' ,function ($scope, $timeout) {\n $scope.headings = [];\n if(!$scope.sortExpression)\n {\n $scope.sortExpression = [];\n }\n\n this.setSortField = function (criteria, element, toggle, append) {\n var expr = { criteria: criteria, descending: false };\n if (!append) {\n _.forEach($scope.headings, function (heading) {\n heading.removeClass('tablesort-asc');\n heading.removeClass('tablesort-desc');\n });\n }\n\n if (_.some($scope.sortExpression, { 'criteria': criteria }) && toggle) {\n var selectedCriteria = _.find($scope.sortExpression, { 'criteria': criteria });\n selectedCriteria.descending = !selectedCriteria.descending;\n if (selectedCriteria.descending) {\n element.removeClass(\"tablesort-asc\");\n element.addClass(\"tablesort-desc\");\n }\n else {\n element.removeClass(\"tablesort-desc\");\n element.addClass(\"tablesort-asc\");\n }\n if (!append) {\n $scope.sortExpression = [selectedCriteria];\n }\n } else {\n //this logic prevents sort direction from changing on First Name/Lastname change\n if ($scope.sortExpression.length > 0 ) {\n expr.descending = $scope.sortExpression[0].descending;\n if (expr.descending) {\n element.removeClass(\"tablesort-asc\");\n element.addClass(\"tablesort-desc\");\n }\n else {\n element.removeClass(\"tablesort-desc\");\n element.addClass(\"tablesort-asc\");\n }\n }\n \n if (append) {\n $scope.sortExpression.push(expr);\n } else {\n $scope.sortExpression = [expr];\n }\n \n }\n $scope.notifySortChanged();\n }\n\n\n\n $scope.notifySortChanged = function() {\n $timeout(function() {\n $scope.sortChanged({ expression: $scope.sortExpression });\n });\n }\n\n this.registerHeading = function (element, criteria) {\n element.addClass('tablesort-sortable');\n $scope.headings.push(element);\n\n var selectedCriteria = _.find($scope.sortExpression, { 'criteria': criteria });\n if (selectedCriteria) {\n if (selectedCriteria.descending) {\n element.removeClass(\"tablesort-asc\");\n element.addClass(\"tablesort-desc\");\n }\n else {\n element.removeClass(\"tablesort-desc\");\n element.addClass(\"tablesort-asc\");\n }\n }\n\n };\n }]\n }\n }\n )\n .directive('tableSortCriteria',['$timeout', function ($timeout) {\n return {\n require: '^tableSort',\n link: function (scope, el, attrs, tableSortCtrl) {\n el.bind('click', function (e) {\n if (e.shiftKey) {\n $timeout(function () {\n tableSortCtrl.setSortField(attrs.tableSortCriteria, el, true, true);\n });\n } else {\n $timeout(function () {\n tableSortCtrl.setSortField(attrs.tableSortCriteria, el, true);\n });\n }\n\n });\n\n tableSortCtrl.registerHeading(el, attrs.tableSortCriteria);\n\n }\n }\n }]\n )\n .directive('tableSortCriteriaGroup', ['$timeout', '$compile', function ($timeout, $compile) {\n return {\n require: '^tableSort',\n scope: {\n criteria : '=tableSortCriteriaGroup'\n },\n template: '{{selectedCriteria.displayName}}' +\n '
' +\n '' +\n '' +\n '
',\n link: function (scope, el, attrs, tableSortCtrl) {\n scope.selectedCriteria = scope.criteria && scope.criteria.length > 0 ? scope.criteria[0] : '';\n\n el.find('#selected-criteria').bind('click', function (e) {\n if (e.shiftKey) {\n $timeout(function () {\n tableSortCtrl.setSortField(scope.selectedCriteria.criteria, el, true, true);\n });\n } else {\n $timeout(function () {\n tableSortCtrl.setSortField(scope.selectedCriteria.criteria, el, true);\n });\n }\n });\n\n scope.setSelected = function (criteria) {\n scope.selectedCriteria = criteria;\n tableSortCtrl.setSortField(scope.selectedCriteria.criteria, el, false);\n }\n\n tableSortCtrl.registerHeading(el, scope.selectedCriteria.criteria);\n\n }\n\n }\n }]\n )\n ;\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('avatar', [\n 'appSettings', function (appSettings) {\n return {\n restrict: 'EA',\n scope: {\n studentId: '=?',\n staffId: '=?',\n altText: '=?',\n avatarWidth: '=?'\n },\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/avatar/avatar.html',\n link: function (scope, el, attrs) {\n scope.$watch('studentId', function (newVal, oldVal) {\n if (newVal) {\n scope.avatarUrl = scope.getAvatarUrl();\n }\n });\n },\n controller: ['$scope', 'appSettings', function ($scope, appSettings) {\n var avatarWidth = 60; // default width\n if ($scope.avatarWidth) {\n avatarWidth = $scope.avatarWidth;\n }\n\n $scope.getAvatarUrl = function () {\n var type = !_.isUndefined($scope.studentId) ? 'student' : 'staff';\n return appSettings.coreServicesRootUrl + type + '/' + (($scope.staffId || $scope.studentId) || 0) + '/avatar/' + avatarWidth;\n }\n $scope.avatarUrl = $scope.getAvatarUrl();\n }]\n }\n }\n ]);\n})();;\r\n/**\n * concat.directive\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** get the angular module and add directive */\n\tangular.module('nha.core').directive('concat', concatDirective);\n\n\t/** implementation */\n\tfunction concatDirective() {\n\t\t/** return directive */\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tscope: {\n\t\t\t\tlength: '=?'\n\t\t\t},\n\t\t\tlink: link\n\t\t};\n\n\t\t/** define the link function */\n\t\tfunction link(scope, element, attrs) {\n\t\t\t/** check for length */\n\t\t\tif (!scope.length || parseInt(scope.length) < 1) scope.length = 100;\n\n\t\t\t/** check the concat length */\n\t\t\tvar content = attrs.concat;\n\t\t\tif (attrs.concat.length > scope.length) {\n\t\t\t\t/** concatenate string */\n\t\t\t\tcontent = attrs.concat.substring(0, scope.length) + '...';\n\t\t\t}\n\n\t\t\t/** set the element content */\n\t\t\telement.text(content);\n\t\t}\n\t}\n})();;\r\n/**\n * assignment.repository\n * @namespace gradebook \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .service('breadcrumbContextManager', BreadcrumbContextManager);\n\n // protect against minification\n /* @ngInject */\n BreadcrumbContextManager.$inject = ['baseService', 'GradebookRestangular'];\n\n /**\n * @name assignmentRevisionRepository\n * @description Constructor for assignment.repository\n * @memberOf gradebook\n */\n function BreadcrumbContextManager() {\n\n /*jshint validthis: true */\n var service = this;\n\n service.customSteps = [];\n\n service.setCustomStep = setCustomStep;\n \n return service;\n\n function setCustomStep(step) {\n var existingStep = _.find(service.customSteps, function (item) { return item.key == step.key; });\n\n if (existingStep) {\n _.extend(existingStep, step);\n }\n else {\n service.customSteps.push(step);\n }\n }\n }\n})();;\r\n/**\n * assignment-copy.controller\n * @namespace gradebook\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .controller('coreBreadcrumbController', CoreBreadcrumbController);\n\n // protect against minification\n /* @ngInject */\n CoreBreadcrumbController.$inject = ['$state', '$scope', '$controller', 'breadcrumbContextManager'];\n\n /**\n * @name AssignmentCopyController\n * @description Constructor for assignment-copy.controller\n * @memberOf gradebook\n */\n function CoreBreadcrumbController($state, $scope, $controller, breadcrumbContextManager) {\n\n // Controller as vm - see route configuration\n var coreBreadcrumbVM = this;\n\n coreBreadcrumbVM.customSteps = breadcrumbContextManager.customSteps;\n\n coreBreadcrumbVM.currentState = currentState;\n\n function currentState(step) {\n return step.state == $state.current.name;\n }\n }\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').directive('navDropdown', [\n function () {\n return {\n restrict: 'E',\n scope: {\n items: '=ddItems',\n label: '=',\n goToState: '&',\n href:'@?'\n },\n template:\n '',\n link: function (scope, el, attrs) {\n // Pass through to the controller to handle state change\n scope.goToPage = function (item) {\n scope.goToState({ item: item });\n }\n \n }\n }\n }\n ]);\n})();;\r\n/**\n * filters.directive\n * @namespace core\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .directive('filters', filters);\n\n // protect against minification\n /* @ngInject */\n filters.$inject = ['appSettings'];\n\n /**\n * @name filters\n * @description Define filters.directive\n * @memberOf core\n */\n function filters(appSettings) {\n var directive = {\n restrict: 'EA',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/filters/filters.html',\n link: filtersLink,\n controller: filtersController //,\n //controllerAs: 'filtersVM',\n //bindToController: true\n\n };\n return directive;\n\n /**\n * @name filtersLink\n * @description link function for filters.directive\n * @memberOf core\n */\n function filtersLink(scope, element, attrs, ctrl) {\n\n }\n }\n\n // protect against minification\n /* @ngInject */\n filtersController.$inject = ['$scope', '$q', '$rootScope', '$sce', '$location', '$timeout', 'filterService', 'ipCookie',\n 'errorSvc', 'userContextService', 'dataSecurityService', 'message.manager'];\n\n /**\n * @name filtersController\n * @description controller function for filters.directive\n * @memberOf core\n */\n function filtersController($scope, $q, $rootScope, $sce, $location, $timeout, filterService, ipCookie,\n errorService, userContextService, dataSecurityService, messageManager) {\n //TODO: Convert to use controllerAs, remove $scope, and change all usages of this directive to accomodate these changes\n\n /*jshint validthis: true */\n //var filtersVM = this;\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View\n var defaultFilterSetName = 'default';\n var lastStateFilterSetName = 'last'; // this represents the last state before you do something like change a school\n\n // Controller methods associated to view model (init, reset, submit)\n //var filtersVM.init = init;\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View\n // - None at this time\n\n // Methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View\n\n // Events ($watch, $on, $broadcast, $emit) related to the view model\n $scope.$on('nha:core:default-school-changed', function (event, school) {\n\n // listen for Navbar school selector changes\n if (school.schoolID !== $scope.selectedSchoolId) {\n $scope.selectedSchoolId = school.schoolID;\n $scope.selectRadio($scope.selectedSchoolId, 'School', true);\n $scope.selectedFilter();\n }\n });\n $scope.$watch(function () {\n return $scope.filterConfig;\n }, function (newVal, oldVal) {\n init();\n });\n\n /**\n * @name init\n * @description Initialize state of controller\n * @returns undefined\n * @memberOf filters.controller\n */\n function init() {\n // just a check to ensure we actually have a filter config, else get out\n if ($scope.filterConfig === undefined) {\n log('no filter config specified in this view.');\n return;\n }\n\n userContextService.ensureUserContext().then(function (context) {\n $scope.defaultSchoolCookieName = 'nha.core.user-default-school.' + context['http://schemas.mynha.com/Savyint/UserID'];\n });\n\n $scope.viewState = { filtersLoading: true };\n $scope.filterTimer = false;\n $scope.selectedSchoolId = -1;\n $scope.selectedAcademicYearIds = [];\n\t\t\t$scope.selectedGradeLevelIds = [];\n $scope.filters = {};\n\n //Items for mobile implementation\n $scope.isPhone = false;\n $scope.mobileAcademicYearSelection = \"\";\n if ($scope.filterConfig.isPhone) {\n $scope.isPhone = $scope.filterConfig.isPhone;\n }\n $scope.isTeacher = false;\n if ($scope.filterConfig.isTeacher) {\n $scope.isTeacher = true;\n }\n $scope.oneSchool = false;\n //End mobile implementation items\n\n log('[c=\\'color: green\\']Calling filters query...[c]');\n\n // our default and preset filtersets\n $scope.filterSets = [\n { name: defaultFilterSetName }, // this is our default state when the user first comes to the app\n { name: lastStateFilterSetName } // this represents the last state before you do something like change a school\n ];\n\n $scope.requestedTypes = _.omitBy($scope.filterConfig.filters, function (filter) {\n return filter.items != null;\n });\n\n // go get the actual filter data now\n $scope.loadFilterData();\n\n }\n\n $scope.saveFilterSet = function (filterSetName, notThisFilter) {\n\n // default to the default filterset, although we can use other filterset too, such as last state\n if (!filterSetName) {\n filterSetName = defaultFilterSetName;\n }\n\n var filterSet = _.find($scope.filterSets, { name: filterSetName });\n\n // reset the data\n filterSet.data = {};\n\n // go through these and get our default values that are set\n _.forEach($scope.filterConfig.filters, function (key) {\n\n if (key.name !== 'School' && key.name !== 'MarkingPeriod' && key.name !== notThisFilter) {\n // update our default filter set with these keys\n filterSet.data[key.name] = {\n name: key.name,\n values: $scope.getSelectedFilterValue(key)\n };\n }\n });\n\n log('saved filterSet', defaultFilterSetName, filterSet);\n }\n\n $scope.loadFilterSet = function (filterSetName, fromFilterName) {\n\n // default to the default filterset, although we can use other filterset too, such as last state\n if (!filterSetName) {\n filterSetName = defaultFilterSetName;\n }\n\n // get our filter set that we want to work with, in this case the default one\n var filterSet = _.find($scope.filterSets, { 'name': filterSetName });\n\n // go through these and get our default values that are set\n _.forEach(filterSet.data, function (key) {\n\n // look up in our data and set these defaults back to this list\n var filter = _.find($scope.filterConfig.filters, { 'name': key.name });\n if (filter) {\n\n if (key.name !== 'School' || key.name !== fromFilterName) {\n\n // we found it, now get set it back to its default when we first loaded this list\n _.forEach(filter.items, function (filterItem) {\n // find any of these matching values\n var keyValueMatch = _.find(key.values, function (v) {\n return v === filterItem.id;\n });\n\n if (keyValueMatch != null) {\n\n // update the item in the filter list to be selected\n filterItem.selected = true;\n\n // if we only have one value, such as a radio button selection, set this too\n if (key.values.length === 1) {\n filter.selectedID = keyValueMatch;\n }\n }\n });\n }\n }\n });\n\n //log('loaded filterSet', defaultFilterSetName, filterSet);\n }\n\n $scope.getSelectedFilterValue = function (filter) {\n if (filter) {\n var selectedItems = _.filter(filter.items, { selected: true });\n if (selectedItems) {\n return _.map(selectedItems, 'id');\n }\n }\n return null;\n }\n\n $scope.loadFilterData = function (dontSaveDefaultFilterSet, fromFilterName) {\n\n log('[c=\\'color: green\\']Loading Filter data...[c]');\n\n // these are the keys we will use to run our query to the db\n $scope.requestTypeKeys = _.clone(_.keys($scope.requestedTypes));\n\n // get our school key\n if ($scope.requestedTypes.School) {\n\n userContextService.ensureUserContext().then(function (userContext) {\n\n ensureSchoolID().then(function () {\n var i = 0;\n // create our endpoint lookup keys, mainly with any schoolIds added to request token, or AcademicYear\n // Example: https://core-services.mynhadev.com/api/Filters?types=AcademicYear-2014|2015,School-338\n\n _.forEach($scope.requestTypeKeys, function (key) {\n\n if (key === 'School' && $scope.selectedSchoolId != undefined) {\n $scope.requestTypeKeys[i] = key + '-' + $scope.selectedSchoolId;\n }\n else if (key === 'State') {\n // school ID is the primary key of all of filters, however, States can filter that down.\n var stateElement = _.filter($scope.requestedTypes.State.items, 'selected');\n if (stateElement != null && stateElement.length > 0) {\n $scope.requestTypeKeys[i] = key + '-' + _.head(stateElement).id;\n }\n }\n else if (key === 'AcademicYear' && $scope.selectedAcademicYearIds) {\n $scope.selectedAcademicYearIds = _.filter($scope.requestedTypes.AcademicYear.items, 'selected');\n\n //log('$scope.selectedAcademicYearIds', $scope.selectedAcademicYearIds);\n var academicYearString = _.map($scope.selectedAcademicYearIds, 'id').join('|');\n log('academicYearString', academicYearString);\n\n\n if (academicYearString) {\n $scope.requestTypeKeys[i] = key + '-' + academicYearString;\n }\n }\n\t\t\t\t\t\t\telse if (key === 'GradeLevel' && $scope.selectedGradeLevelIds) {\n\t\t\t\t\t\t\t\t$scope.selectedGradeLevelIds = _.filter($scope.requestedTypes.GradeLevel.items, 'selected');\n\n\t\t\t\t\t\t\t\tvar gradeLevelString = _.map($scope.selectedGradeLevelIds, 'id').join('|');\n\t\t\t\t\t\t\t\tlog('gradeLevelString', gradeLevelString);\n\n\t\t\t\t\t\t\t\tif (gradeLevelString) {\n\t\t\t\t\t\t\t\t\t$scope.requestTypeKeys[i] = key + '-' + gradeLevelString;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n i++;\n });\n\n filterService.getFilters($scope.requestTypeKeys, $scope.filterConfig.source).then(function (result) {\n\n// log('Got filters...');\n\n // Don't auto-select current AY if persistence is desired\n if ($scope.filterConfig.filters.AcademicYear && $scope.filterConfig.filters.AcademicYear.persist) {\n var cachedYearSelections = getPersistedFilter('AcademicYear');\n\n if (cachedYearSelections) {\n if (_.isInteger(cachedYearSelections) || !_.isEmpty(cachedYearSelections)) {\n _.forEach(result, function (item) {\n if (item.typeName === 'AcademicYear') {\n _.forEach(item.items, function (year) {\n year.selected = false;\n });\n }\n });\n }\n }\n }\n\n _.forEach($scope.requestedTypes, function (filter) {\n\n filter.items = _.find(result, { 'typeName': filter.name }).items;\n\n if(filter.name === 'GradeLevel') {\n if ($scope.shouldShowHighSchoolInGradeLevels) { // This should change to the highschool filter for academic years after 2021\n var selectedAcademicYear = _.find(\n\t\t\t\t\t\t\t\t\t\t\t$scope.filterConfig.filters.AcademicYear.items,\n\t\t\t\t\t\t\t\t\t\t\t\"selected\"\n\t\t\t\t\t\t\t\t\t\t);\n if(selectedAcademicYear.id > 2021) {\n // remove highschool grades except for 9th grade\n var highSchoolGradeLevelsToExclude = [ 405/*10th grade*/, 406/*11th grade*/, 407/*12th grade*/, 410/*13th grade*/ ];\n _.forEach(filter.items, function (item) {\n if (_.includes(highSchoolGradeLevelsToExclude, item.id)) {\n filter.items = filter.items.filter(function(item2) {\n return item2.id !== item.id\n });\n }\n // rename 9th grade in the UI to \"High school\" because that is where all highschool grade levels put their classes\n if (item.id === 404) {\n item.description = \"High School\";\n }\n })\n }\n }\n }\n\n // Set the default item supplied in the 'defaultId' prop and select its corresponding control\n // if persist (meaning save as a cookie, we don't want to use the default)\n if (filter.defaultId && !filter.persist) {\n\n if (filter.type === 'radio') {\n var selectedId = parseInt(filter.defaultId, 10);\n if (filter.name === 'School') {\n selectedId = $scope.selectedSchoolId;\n }\n\n // we need this to be an int to do a proper filter\n selectedId = parseInt(selectedId, 10);\n\n var item = _.head(_.filter(filter.items, { id: selectedId }));\n if (item != null) {\n item.selected = true;\n $scope.selectRadio(item.id, filter.name);\n }\n }\n if (filter.type === 'checkbox') {\n var selectedIds = _.isArray(filter.defaultId) ?\n _.map(filter.defaultId, _.parseInt) :\n [_.parseInt(filter.defaultId, 10)];\n\n _.each(selectedIds, function (id) {\n var item = _.head(_.filter(filter.items, { id: id }));\n if (item != null) {\n $scope.selectCheckbox(item.id, filter.name);\n }\n });\n }\n }\n else if (filter.persist) {\n if (filter.type === 'radio') {\n var selectedId = getPersistedFilter(filter.name);\n\n if (filter.name === 'AcademicYear' && !selectedId) {\n setCurrentAcademicYear();\n return;\n }\n\n // we need this to be an int to do a proper filter\n selectedId = parseInt(selectedId, 10);\n\n var item = _.head(_.filter(filter.items, { id: selectedId }));\n if (item != null) {\n item.selected = true;\n $scope.selectRadio(item.id, filter.name);\n }\n }\n if (filter.type === 'checkbox') {\n var idArray = [];\n var checkboxIds = getPersistedFilter(filter.name);\n\n if (checkboxIds) {\n if (_.isString(checkboxIds)) {\n checkboxIds = checkboxIds.split('|').map(function (item) {\n return parseInt(item, 10);\n });\n }\n\n idArray = idArray.concat(checkboxIds);\n\n _.forEach(idArray, function (id) {\n $scope.selectCheckbox(id, filter.name, false);\n });\n }\n }\n }\n else if (!_.isUndefined(filter.defaultIndex) && filter.defaultIndex != null) {\n var item = filter.items[filter.defaultIndex];\n\n if (item != null) {\n item.selected = true;\n\n if (filter.type === 'radio') {\n $scope.selectRadio(item.id, filter.name);\n }\n if (filter.type === 'checkbox') {\n $scope.selectCheckbox(item.id, filter.name);\n }\n }\n }\n\n // filter out subTypes if specified, this is mainly for MasterStatus and MasterStatusTypeId\n if (filter.subType) {\n filter.items = _.filter(filter.items, { 'subType': filter.subType });\n }\n\n // you can configure a filter to prepend items to a list\n if (filter.prependItems) {\n _.forEach(filter.prependItems.reverse(), function (item) {\n filter.items.unshift(item);\n });\n }\n });\n\n if ($scope.selectedSchoolId) {\n $scope.selectRadio($scope.selectedSchoolId, 'School');\n } else {\n //Default to first school\n $scope.selectRadio(_.head($scope.filterConfig.filters.School.items).id, 'School');\n }\n\n // set to current year\n if ($scope.filterConfig.filters.AcademicYear && !$scope.filterConfig.filters.AcademicYear.persist) {\n setCurrentAcademicYear();\n }\n\n // Set default marking period\n if ($scope.filterConfig.filters.MarkingPeriod && $scope.filterConfig.filters.MarkingPeriod.type === 'radio') {\n var selectedItem = _.find($scope.filterConfig.filters.MarkingPeriod.items, 'selected');\n\n if (selectedItem) {\n $scope.selectRadio(selectedItem.id, 'MarkingPeriod');\n }\n }\n\n // Letter Items Type (Send/Resend filter)\n if ($scope.filterConfig.filters.LetterType != undefined) {\n var defaultLetterType = _.find($scope.filterConfig.filters.LetterType.items, 'selected');\n if (defaultLetterType != null) {\n $scope.selectRadio(defaultLetterType.id, $scope.filterConfig.filters.LetterType.name);\n //$scope.selectItem(defaultLetterType, defaultLetterType);\n }\n }\n\n //Load Preset Filters - See '$scope.filterSets'\n $scope.loadPreset();\n\n // this is our default filter set that we will reload if a user clicks reset button\n if (!dontSaveDefaultFilterSet) {\n $scope.saveFilterSet();\n } else {\n\n // load our last state since a user changed a school\n $scope.loadFilterSet(lastStateFilterSetName, fromFilterName);\n\n // always ensure we have an AY selected\n var selectedAcademicYear = _.find($scope.filterConfig.filters.AcademicYear.items, 'selected');\n if (selectedAcademicYear == null) {\n\n }\n }\n\n if ($scope.filterConfig.filters.School.items.length === 1) {\n $scope.oneSchool = true;\n }\n\n //Broadcast selected filters\n $scope.selectedFilter();\n\n $scope.viewState.filtersLoading = false;\n\t\t\t\t\t\t\tmessageManager.setData('message', { 'key': 'filters', 'value': 'loaded' });\n });\n });\n }, function (error) {\n $scope.viewState.filtersLoading = false;\n errorService.getUnhandledError(error, 'An error occurred loading Filters');\n });\n }\n }\n\n function setCurrentAcademicYear() {\n if ($scope.filterConfig.filters.AcademicYear != undefined) {\n var academicYear = _.find($scope.filterConfig.filters.AcademicYear.items, 'selected');\n if (academicYear != null) {\n $scope.selectRadio(academicYear.id, 'AcademicYear');\n }\n // if user has selected years manually overwrite with those selections.\n if (!_.isEmpty($scope.selectedAcademicYearIds)) {\n\t\t\t\t\tvar selectedIds = $scope.selectedAcademicYearIds.map(function (ay) { return ay.id; });\n\n\t\t\t\t\t// if none of the values in `selectedAcademicYearIds` are in\n\t\t\t\t\t// `$scope.filterConfig.filters.AcademicYear.items` then\n\t\t\t\t\t// don't update the filter items `selected` properties\n\t\t\t\t\tvar hasValidAySelection = _.some($scope.filterConfig.filters.AcademicYear.items, function (i) {\n\t\t\t\t\t\treturn _.includes(selectedIds, i.id);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (hasValidAySelection) {\n\t\t\t\t\t\t_.forEach($scope.filterConfig.filters.AcademicYear.items, function (i) {\n\t\t\t\t\t\t\ti.selected = _.includes(selectedIds, i.id);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n }\n }\n }\n\n function ensureSchoolID() {\n\n var deferred = $q.defer();\n\n if ($scope.selectedSchoolId !== -1) {\n deferred.resolve();\n } else {\n var persistedSchoolID = getPersistedSchool();\n\n dataSecurityService.doesUserHaveAccessToSchool(persistedSchoolID).then(function (permission) {\n //Use the school id retrieved from the cookie if we have permission. Otherwise default the school\n if (permission) {\n $scope.selectedSchoolId = persistedSchoolID;\n } else {\n if (userContextService.getDefaultSchool()) {\n $scope.selectedSchoolId = userContextService.getDefaultSchool();\n } else {\n $scope.selectedSchoolId = $scope.requestedTypes.School.defaultId;\n }\n }\n\n deferred.resolve();\n });\n }\n\n return deferred.promise;\n }\n\n $scope.showCountForItem = function (item) {\n if (item) {\n if ($scope.filterConfig.hideCountsIfZero && item.count < 1) {\n return false;\n }\n\n return (item.count < 9999);\n }\n\n return false;\n }\n\n //Helper function to allow filters in ng-repeat to be rendered in the order that they are declared.\n $scope.notSorted = function (obj) {\n if (!obj) {\n return [];\n }\n return (Object != null ? Object.keys(obj) : null);\n }\n\n $scope.selectedFilter = function (overrideClick) {\n if (overrideClick) return;\n\n var filters = $scope.getAppliedFilters();\n\n log('[c=\\'color:blue\\']Subscribe to me for selected filters on \\'filterChange\\' [c]', filters);\n\n if ($scope.filterTimer) {\n var isCancelled = $timeout.cancel($scope.filterTimer);\n }\n\n $scope.filterTimer = $timeout(function () {\n $rootScope.$broadcast('filterChange', { selectedFilters: filters });\n\n // always scroll to top after a selection\n _utils.enableScrollToTopOnStateChangeSuccess();\n\n }, 1000);\n }\n\n $scope.selectItem = function (item, filter) {\n if (filter.type !== 'radio') {\n return;\n }\n // Clear other selections\n _.forEach(_.find($scope.filterConfig.filters, { 'name': filter.name }).items, function (i) {\n i.selected = false;\n });\n //Select the new item\n item.selected = true;\n $scope.selectedFilter();\n }\n\n $scope.selectCheckbox = function (id, filterName, isClick) {\n if (isClick) {\n var filter = _.find($scope.filterConfig.filters, { 'name': filterName });\n // someone actually clicked this, not just calling the function\n\n // persist means save that preference in a cookie\n if (filter.persist) {\n $scope.persistMultipleFilterSelection(filterName);\n }\n if (filterName === \"AcademicYear\" || filterName === 'GradeLevel') {\n\n // save our last filter set off before we load other stuff\n $scope.saveFilterSet(lastStateFilterSetName);\n\n // if this is School, we should trigger an update if we have filters for Staff, Homeroom, GradeLevel, AcademicYear (ones that rely on school id)\n if ($scope.filterConfig.filters.Staff || $scope.filterConfig.filters.Homeroom || $scope.filterConfig.filters.GradeLevel || $scope.filterConfig.filters.AcademicYear) {\n // now trigger reload of data:\n $scope.loadFilterData(true, filterName);\n }\n\t\t\t\t} else {\n $scope.selectedFilter();\n }\n\n } else {\n var filterItems = _.find($scope.filterConfig.filters, { 'name': filterName }).items;\n var foundCheckBox = _.find(filterItems, { 'id': id });\n if (foundCheckBox != null) {\n foundCheckBox.selected = true;\n }\n }\n }\n\n $scope.selectRadio = function (id, filterName, isClick) {\n\n log('Filter radio selected', id, filterName);\n\n // get our filter by name from the collection\n var filter = _.find($scope.filterConfig.filters, { 'name': filterName });\n\n // persist means save that preference in a cookie\n if (filter.persist || filter.name === 'School') {\n $scope.persistFilterSelection(filterName, id);\n }\n\n // ensure we have items data\n if (filter.items) {\n var item;\n // Mark All items as unselected, select the new item.\n _.forEach(filter.items, function (i) {\n if (i.id === id) {\n i.selected = true;\n item = i;\n }\n else { i.selected = false; }\n });\n // set our selectedID with the id that we passed in\n filter.selectedID = id;\n\n // This is only for the DateRange selection specifically and should be ignored by everything else\n if (filterName === 'DateRange') {\n var today = moment().format('MM/DD/YYYY');\n switch (id) {\n case 0:\n item.startDate = moment(today).set('date', 1).toDate(); // 1st of month\n item.endDate = moment(today).set('date', moment(today).daysInMonth()).endOf('day').toDate(); // Last day of month\n break;\n case 1:\n item.startDate = moment(today).day(0).toDate(); // Past Sunday\n item.endDate = moment(today).day(6).endOf('day').toDate(); // Next Saturday\n break;\n case 2:\n item.startDate = moment(today).startOf('day').toDate();\n item.endDate = moment(today).endOf('day').toDate();\n break;\n default:\n var dateFilter = _.find($scope.filterConfig.filters, { 'name': 'DateRange' });\n if (dateFilter) {\n item.startDate = moment(dateFilter.customStart).startOf('day');\n item.endDate = moment(dateFilter.customEnd).endOf('day');\n }\n break;\n }\n }\n\n // for mobile, default to current year for academic year dropdown selector\n if (filterName === 'AcademicYear') { $scope.mobileAcademicYearSelection = item.description };\n\n log('Our selected filter item', item);\n }\n\n // someone actually clicked this, not just calling the function\n if (isClick && filterName === 'School' && $scope.filterConfig.filters.School) {\n\n // save our last filter set off before we load other stuff\n $scope.saveFilterSet(lastStateFilterSetName);\n\n // if this is School, we should trigger an update if we have filters for Staff, Homeroom, GradeLevel, AcademicYear, Marking Period (ones that rely on school id)\n if ($scope.filterConfig.filters.Staff || $scope.filterConfig.filters.Homeroom || $scope.filterConfig.filters.GradeLevel || $scope.filterConfig.filters.AcademicYear || $scope.filterConfig.filters.MarkingPeriod) {\n\n // we have our selected id, which is id\n $scope.selectedSchoolId = id;\n\n // now trigger reload of data:\n $scope.loadFilterData(true);\n }\n }\n\n // someone actually clicked this, not just calling the function\n if (isClick && filterName === 'AcademicYear' && $scope.filterConfig.filters.AcademicYear) {\n\n // save our last filter set off before we load other stuff\n $scope.saveFilterSet(lastStateFilterSetName);\n\n // if this is School, we should trigger an update if we have filters for Staff, Homeroom, GradeLevel, AcademicYear (ones that rely on school id)\n if ($scope.filterConfig.filters.Staff || $scope.filterConfig.filters.Homeroom || $scope.filterConfig.filters.GradeLevel || $scope.filterConfig.filters.AcademicYear) {\n // now trigger reload of data:\n $scope.loadFilterData(true, filterName);\n }\n }\n\n // someone actually clicked this, not just calling the function\n if (isClick && filterName === 'State' && $scope.filterConfig.filters.State) {\n\n // save our last filter set off before we load other stuff\n $scope.saveFilterSet(lastStateFilterSetName);\n\n // if this is School, we should trigger an update if we have filters for Staff, Homeroom, GradeLevel, AcademicYear (ones that rely on school id)\n if ($scope.filterConfig.filters.Staff || $scope.filterConfig.filters.Homeroom || $scope.filterConfig.filters.GradeLevel || $scope.filterConfig.filters.AcademicYear) {\n // now trigger reload of data:\n $scope.loadFilterData(true, filterName);\n }\n }\n\n // Clear filter selections for filters configured.\n if (filter.clearOnSelect) {\n if (filter.type === 'checkbox') {\n log(_.find($scope.filterConfig.filters, { 'name': filter.clearOnSelect }));\n _.find($scope.filterConfig.filters, { 'name': filter.clearOnSelect }).selectedID = null;\n } else {\n _.forEach(_.find($scope.filterConfig.filters, { 'name': filter.clearOnSelect }).items, function (i) {\n i.selected = false;\n });\n }\n }\n }\n\n // this is when we uncheck a filter item\n $scope.deselectItem = function (name, id) {\n var filter = _.find($scope.filterConfig.filters, { 'name': name });\n _.find(filter.items, { 'id': id }).selected = false;\n\n // Want to remove date selection even though it's a radio\n if (name == 'DateRange') {\n filter.selectedID = null;\n }\n\n // Want to remove academic year selection from cache\n if (name === 'AcademicYear' && $scope.filterConfig.filters['AcademicYear'].persist) {\n $scope.persistMultipleFilterSelection('AcademicYear');\n }\n\n $scope.selectedFilter();\n }\n\n // sync item counts with the filter list, this is called per filter section (i.e. AcademicyYear, School, etc)\n $scope.syncItemCounts = function (fetchItems, syncItems) {\n\n _.forEach(syncItems, function (item) {\n\n var countItem = _.find(fetchItems, function (fetchItem) {\n return fetchItem && item.id === fetchItem.id;\n });\n\n if (countItem) {\n item.count = countItem.count;\n } else {\n item.count = 0; //item wasn't present in the latest filter counts, so force to zero to clear previous binging.\n }\n });\n };\n\n if (!$scope.resetFilters) {\n $scope.resetFilters = function () {\n\n $scope.loadPreset('default');\n\n // loop through and clear out values\n _.forEach($scope.filterConfig.filters, function (f) {\n\n // do not reset school or (if radio button, marking period either)\n if (f.name !== 'School' && !(f.name === 'MarkingPeriod' && f.type === 'radio')) {\n _.forEach(f.items, function (i) {\n i.selected = false;\n });\n\n f.selectedID = null;\n }\n });\n // need to reset our cached academic years if we reset the filters\n if ($scope.filterConfig.filters['AcademicYear'].persist) {\n $scope.persistMultipleFilterSelection('AcademicYear');\n }\n\n $scope.loadFilterSet();\n $scope.selectedFilter();\n }\n }\n\n $scope.loadPreset = function (preset) {\n if (!preset)\n preset = $location.search()['preset'];\n if (preset) {\n var filterset = _.find($scope.filterSets, { 'name': preset });\n if (filterset) {\n //set attendance code\n if (filterset.attendanceCodes)\n $scope.selectCheckbox(filterset.AttendanceCode, 'AttendanceCode');\n }\n }\n $scope.selectedFilter();\n }\n\n $scope.getAppliedFilters = function () {\n\t\t\t/** initialize filters */\n\t\t\tvar filters = {};\n\n\t\t\t/** cycle through filter configs to get selected values */\n\t\t\t_.forEach($scope.filterConfig.filters, function (filter) {\n\t\t\t\t/** get the selected items, and check if any exist */\n\t\t\t\tvar selectedItems = _.filter(filter.items, 'selected');\n\t\t\t\tif (selectedItems.length > 0) {\n\t\t\t\t\t/** add to filters */\n\t\t\t\t\tfilters[filter.name] = {\n\t\t\t\t\t\t'name': filter.name,\n\t\t\t\t\t\t'required': filter.type === 'radio' && filter.name !== 'DateRange'\n\t\t\t\t\t};\n\n\t\t\t\t\t/** copy over filter values */\n\t\t\t\t\t_.forOwn(filter, function(value, key) {\n\t\t\t\t\t\tfilters[filter.name][key] = value;\n\t\t\t\t\t});\n\n\t\t\t\t\t/** only get selected items */\n\t\t\t\t\tfilters[filter.name].items = selectedItems;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/** return filters */\n\t\t\treturn filters;\n }\n\n\t\t/** add getAppliedFilters to filterService for sharing out */\n\t\tfilterService.getAppliedFilters = $scope.getAppliedFilters;\n\n function getPersistedSchool() {\n var schoolID = -1;\n var schoolID = ipCookie('filter-School');\n //If filter cookie has not been initialized yet, check for user default school cookie.\n if (!schoolID) {\n var defaultSchool = ipCookie($scope.defaultSchoolCookieName);\n if (defaultSchool) {\n schoolID = defaultSchool.schoolID;\n }\n }\n return schoolID;\n }\n\n function getPersistedFilter(filterName) {\n var id = ipCookie('filter-' + filterName);\n return id;\n }\n\n // Filter Peristance\n $scope.persistFilterSelection = function (filterName, id) {\n var hostnameParts = $location.host().split('.');\n var domainName = $location.host();\n if (hostnameParts.length > 2) {\n domainName = hostnameParts[hostnameParts.length-2] + '.' + hostnameParts[hostnameParts.length-1];\n }\n var key = 'filter-' + filterName;\n var value = id;\n log('Persisting with key: ' + key + ' ID: ' + id + ' Domain: ' + domainName);\n\n ipCookie(key, value, { domain: domainName, path: '/' });\n }\n\n $scope.persistMultipleFilterSelection = function (filterName) {\n var hostnameParts = $location.host().split('.');\n var domainName = $location.host();\n if (hostnameParts.length > 2) {\n domainName = hostnameParts[hostnameParts.length-2] + '.' + hostnameParts[hostnameParts.length-1];\n }\n var key = 'filter-' + filterName;\n var idValues = '';\n\n _.forEach($scope.filterConfig.filters[filterName].items, function(option) {\n if (option.selected) {\n idValues = _.isEmpty(idValues) ? option.id.toString() : (idValues + '|' + option.id.toString());\n }\n });\n\n log('Persisting with key: ' + key + ' ID: ' + idValues + ' Domain: ' + domainName);\n\n ipCookie(key, idValues, { domain: domainName, path: '/' });\n }\n\n $scope.applyDateFilter = function (filter) {\n var myFilter = _.find($scope.filterConfig.filters, { 'name': 'DateRange' });\n var customDateItem = _.find(myFilter.items, { id: 3 });\n\n $scope.selectRadio(customDateItem.id, 'DateRange');\n $scope.selectedFilter();\n };\n\n $scope.initDate = function (filter, isStart) {\n if (isStart) {\n var daysOffset = ($scope.filterConfig.customStartDaysOffset !== undefined\n && $scope.filterConfig.customStartDaysOffset !== null) ?\n $scope.filterConfig.customStartDaysOffset :\n -30;\n filter.customStart = moment().add(daysOffset, 'days');\n } else {\n filter.customEnd = moment();\n }\n }\n\n $scope.trust = function (html) {\n return $sce.trustAsHtml(html);\n }\n\n // Initialize\n init();\n\n }\n\n})();;\r\nangular.module('nha.core')\n .service('filterService', ['baseService', 'CoreRestangular', 'appSettings', function (baseService, coreRestangular, appSettings) {\n\n \t/*Set name casing for filters that need name casing*/\n \tvar setNameCasing = function (filters) {\n \t if (filters) {\n\n\t var homeRoomTeacherNameFilters = _.find(filters, { 'typeName': 'Homeroom' });\n \t\t\tif (homeRoomTeacherNameFilters && homeRoomTeacherNameFilters.items) {\n \t\t\t\t_.forEach(homeRoomTeacherNameFilters.items, function (item) { item.description = item.description.toNameCase().toString(); });\n \t\t\t}\n\n \t\t\tvar staffFilters = _.find(filters, { 'typeName': 'Staff' });\n if (staffFilters && staffFilters.items) {\n _.forEach(staffFilters.items, function (item) { item.description = item.description.toNameCase().toString(); });\n \t\t\t}\n }\n \t}\n\n \tvar getFilters = function (filterTypes, sourceRestangular) {\n\n \t var moduleID = appSettings.moduleID || 0;\n\n \t log('moduleID', moduleID);\n\n // default to Core\n \t if (sourceRestangular == undefined) {\n\t sourceRestangular = coreRestangular;\n\t }\n\n \t return baseService.getList('Filters', { types: filterTypes.join(','), moduleID: moduleID }, false, true, sourceRestangular);\n \t}\n\n \treturn {\n \t\tgetFilters: getFilters,\n \t\tsetNameCasing: setNameCasing\n \t};\n }]);;\r\n(function() {\n 'use strict';\n\n angular.module('nha.core')\n .directive('selectedFilters', [\n 'appSettings', '$sce', function(appSettings, $sce) {\n return {\n restrict: 'E',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/filters/selected-filters.html',\n controller: ['$scope', '$location', '$cookieStore', '$attrs', function($scope, $location, $cookieStore, $attrs) {\n //Using attributes for options because we're not using isolated scope (opted not to rewrite and use isolated scope)\n $scope.showFilters = $attrs.defaultState == 'open';\n\n $scope.getCookiedPosition = function() {\n var path = $location.url().match(/[^?]*/)[0];\n var position = $cookieStore.get('filterPosition-' + path);\n if (position) {\n $scope.showFilters = position;\n }\n }\n\n $scope.getCookiedPosition();\n\n $scope.togglePosition = function() {\n var path = $location.url().match(/[^?]*/)[0];\n $scope.showFilters = !$scope.showFilters;\n $cookieStore.put('filterPosition-' + path, $scope.showFilters);\n if ($scope.showFilters) {\n $scope.$broadcast('filterPanelOpened');\n } else {\n $scope.$broadcast('filterPanelClosed');\n }\n \n }\n\n $scope.removeFilterSelection = function(filter, item) {\n log(filter);\n if (!filter.required) {\n log('Removing ' + filter.name + ': ' + item.id);\n $scope.deselectItem(filter.name, item.id);\n }\n }\n\n\t\t\t\t\t\t$scope.removeFilterGroup = function(filter) {\n\t\t\t\t\t\t\tlog(filter);\n if (!filter.required) {\n log('Removing ' + filter.name + ': All Items');\n\t\t\t\t\t\t\t\t_.forEach(filter.items, function(item) {\n\t\t\t\t\t\t\t\t\t$scope.deselectItem(filter.name, item.id);\n\t\t\t\t\t\t\t\t});\n }\n\t\t\t\t\t\t};\n\n $scope.$on('filterChange', function(event, data) {\n //Get Selected filters and convert to array to be sorted by index rather than alphabetically by key name.\n $scope.selectedFiltersToShow = Object.keys(data.selectedFilters).map(function(k) { return data.selectedFilters[k] });\n });\n\n $scope.trust = function (html) {\n return $sce.trustAsHtml(html);\n }\n\n }]\n }\n }\n ]);\n})();;\r\n/**\n * file-input.directive\n * @namespace core\n * @usage \n * In Markup: \n *
\n * \n * In a controller:\n * function MyController($scope, fileReader) {\n * var myVM = this;\n * myVM.file = 'somefile.jpg';\n * myVM.imageSrc = ''; \n * function readFile() {\n * fileReader.readAsDataUrl(myVM.file, $scope).then(function(result) {\n * myVM.imageSrc = result;\n * });\n * }\n * }\n * @references\n * http://odetocode.com/blogs/scott/archive/2013/07/03/building-a-filereader-service-for-angularjs-the-service.aspx\n * http://odetocode.com/blogs/scott/archive/2013/07/05/a-file-input-directive-for-angularjs.aspx\n * http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.core')\n .directive('fileInput', fileInput);\n\n // protect against minification\n /* @ngInject */\n fileInput.$inject = ['$parse', 'appSettings'];\n\n /**\n * @name fileInputDirective\n * @description Constructor for file-input.directive\n * @memberOf core\n */\n function fileInput($parse, appSettings) {\n var directive = {\n restrict: 'EA',\n scope: {\n buttonText: '@',\n acceptFilter: '@'\n },\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/file-input/file-input.html',\n replace: true,\n link: fileInputLink\n };\n return directive;\n\n /**\n * @name fileInputLink\n * @description link function for file-input.directive\n * @memberOf core\n */\n function fileInputLink(scope, element, attrs) {\n var modelGet = $parse(attrs.fileInput);\n var modelSet = modelGet.assign;\n var onChange = $parse(attrs.onChange);\n\n function updateModel() {\n scope.$apply(function () {\n modelSet(scope.$parent, element[0].childNodes[1].files[0]); // assumes strict adherence to file-input.html object hierarchy\n onChange(scope.$parent);\n });\n }\n\n element.bind('change', updateModel);\n }\n }\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core').directive('scrollIf', function () {\n return function (scope, element, attributes) {\n function scrollTo() {\n var innerTopPosition = element[0].offsetTop;\n var containerTopPosition = element[0].parentElement.offsetTop;\n element[0].parentElement.scrollTop = innerTopPosition - containerTopPosition;\n }\n setTimeout(function () {\n if (scope.$eval(attributes.scrollIf)) {\n scrollTo();\n }\n });\n \n if (attributes.scrollWhen) {\n var events = attributes.scrollWhen.split(',');\n _.each(events, function (eventName) {\n // Enable ability to broadcast a scrollTo with scroll-when=\"\"\n scope.$on(eventName, function (e) {\n setTimeout(function () {\n if (scope.$eval(attributes.scrollIf)) {\n scrollTo();\n }\n });\n });\n });\n }\n\n }\n });\n\n})();;\r\nangular.module('nha.core')\n.directive('focusOn', function () {\n\treturn function (scope, elem, attr) {\n\t\tscope.$on(attr.focusOn, function (e) {\n\t\t\telem[0].focus();\n\t\t});\n\t};\n});;\r\n/**\n * horizontal-grid.directive\n * @namespace assessment\n */\n\n(function () {\n\t'use strict';\n\n\t/** create directive */\n\tangular.module('nha.core').directive('horizontalGrid', horizontalGrid);\n\n\t/** implementation */\n\tfunction horizontalGrid() {\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tscope: {},\n\t\t\tlink: link\n };\n\n\t\t/** link implementation */\n\t\tfunction link(scope, elem) {\n\t\t\t/** get the scrollbar area */\n\t\t\tvar scrollBar = $('.scrollbar', elem);\n\n\t\t\t/** get the default height */\n\t\t\tvar defaultHeight = parseInt(scrollBar.css('height'));\n\n\t\t\t/** get the table */\n\t\t\tvar table = $('table', elem);\n\n\t\t\t/** set the function to tie the scrolling action of the inner scroll to the table */\n\t\t\t$('.scroll', scrollBar).scroll(function(e){\n\t\t\t\t/** get the amount to scroll */\n\t\t\t\tvar $step = $(e.currentTarget).scrollLeft();\n\n\t\t\t\t/** move the table */\n\t\t\t\ttable.css('margin-left', -$step);\n\t\t\t});\n\n\t\t\t/** adjust the scrollbar size on window resize */\n\t\t\t$(window).resize(function(){\n\t\t\t\t/** get the scrollbar position top */\n\t\t\t\tvar posTop = scrollBar.position().top;\n\n\t\t\t\t/** calculate the desired height */\n\t\t\t\tvar newHeight = ($(window).height() - posTop) - 5; // there's some sort of padding issue\n\n\t\t\t\t/** set the scrollbar height (only if greater than height off scrollbar as set by css file) */\n\t\t\t\tif (newHeight > defaultHeight) scrollBar.css('height', newHeight + 'px');\n\t\t\t\telse scrollBar.css('height', defaultHeight + 'px');\n\n\t\t\t\t/** get the scrollable area width */\n\t\t\t\tvar scrollableAreaWidth = parseInt(table.css('width')) - parseInt($('.spacer', scrollBar).css('width'));\n\n\t\t\t\t/** set the width of the inner scroll */\n\t\t\t\t$('.inner', scrollBar).css('width', scrollableAreaWidth + 'px');\n\t\t\t});\n\n\t\t\t/** run the resize */\n\t\t\t$(window).resize();\n\t\t}\n };\n}());;\r\n(function() {\n 'use strict';\n\n angular.module('nha.core').directive('promptIfDirty',['$rootScope', '$timeout', '$location', function($rootScope, $timeout, $location) {\n return {\n scope: false, // Needs to be false. Stuff blows up when true.\n restrict: 'A',\n controller: ['$scope', '$element', function($scope, $element) {\n // Initialize the stateManagement obj for use in the parent/page controller\n if (!$rootScope.stateManagement) {\n $rootScope.stateManagement = {};\n $rootScope.stateManagement.isDirty = false;\n }\n }],\n link: function(scope, element, attrs, ngModelCtrl) {\n var message = attrs.message ? attrs.message :\n \"Some changes you have made have not been saved. Click \\\"Cancel\\\" to remain on this page and prevent your changes from being lost.\";\n\n //When the user navigates away from the SPA\n $(window).bind('beforeunload', function() {\n if ($rootScope.stateManagement.isDirty) {\n return \"Some changes you have made have not been saved. Click \\\"Don't reload\\\" to remain on this page and prevent your changes from being lost.\";\n }\n });\n\n //When the user navigates within the SPA\n scope.$on('$locationChangeStart', function(event, next, current) {\n if ($rootScope.stateManagement.isDirty && !$rootScope.stateManagement.ignorePendingChanges) {\n var answer = confirm(message);\n\n if (!answer) {\n event.preventDefault();\n } else {\n $rootScope.stateManagement.ignorePendingChanges = true;\n $rootScope.stateManagement.isDirty = false;\n\n $timeout(function() {\n $location.url($location.url(next).hash());\n });\n }\n }\n\n // Need this to reset AFTER everything has executed\n // Unfortunately, these events occur in different order depending on the situation\n $timeout(function() {\n $rootScope.stateManagement.ignorePendingChanges = false;\n }, 100);\n });\n\n //The previous event wasn't catching some state changes in ui-router so added this\n scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\n if ($rootScope.stateManagement.isDirty && !$rootScope.stateManagement.ignorePendingChanges) {\n var answer = confirm(message);\n\n if (!answer) {\n event.preventDefault();\n } else {\n $rootScope.stateManagement.ignorePendingChanges = true;\n $rootScope.stateManagement.isDirty = false;\n }\n }\n\n $timeout(function() {\n $rootScope.stateManagement.ignorePendingChanges = false;\n }, 100);\n });\n }\n }\n }]);\n})();;\r\n/**\n * @author http://jsfiddle.net/ExpertSystem/w8kZn/\n */\n(function () {\n 'use strict';\n\n angular\n .module('nha.core')\n .directive('requiredAny', function () {\n // Hash for holding the state of each group\n var groups = {};\n\n // Helper function: Determines if at least one control\n // in the group is non-empty\n function determineIfRequired(groupName) {\n var group = groups[groupName];\n if (!group) return false;\n\n var keys = Object.keys(group);\n return keys.every(function (key) {\n return (key === 'isRequired') || !group[key];\n });\n }\n\n return {\n restrict: 'A',\n require: '?ngModel',\n scope: {}, // an isolate scope is used for easier/cleaner\n // $watching and cleanup (on destruction)\n link: function postLink(scope, elem, attrs, modelCtrl) {\n // If there is no `ngModel` or no groupName has been specified,\n // then there is nothing we can do\n if (!modelCtrl || !attrs.requiredAny) return;\n\n // Get a hold on the group's state object\n // (if it doesn't exist, initialize it first)\n var groupName = attrs.requiredAny;\n if (groups[groupName] === undefined) {\n groups[groupName] = { isRequired: true };\n }\n var group = scope.group = groups[groupName];\n\n // Clean up when the element is removed\n scope.$on('$destroy', function () {\n delete (group[scope.$id]);\n if (Object.keys(group).length <= 1) {\n delete (groups[groupName]);\n }\n });\n\n // Updates the validity state for the 'required' error-key\n // based on the group's status\n function updateValidity() {\n if (group.isRequired) {\n modelCtrl.$setValidity('required', false);\n } else {\n modelCtrl.$setValidity('required', true);\n }\n }\n\n // Updates the group's state and this control's validity\n function validate(value) {\n group[scope.$id] = !modelCtrl.$isEmpty(value);\n group.isRequired = determineIfRequired(groupName);\n updateValidity();\n return group.isRequired ? undefined : value;\n };\n\n // Make sure re-validation takes place whenever:\n // either the control's value changes\n // or the group's `isRequired` property changes\n modelCtrl.$formatters.push(validate);\n modelCtrl.$parsers.unshift(validate);\n scope.$watch('group.isRequired', updateValidity);\n }\n };\n });\n})();;\r\nangular.module('nha.core').directive('slideBottomPanel', function () {\n return {\n restrict: 'EA',\n templateUrl: '/core/app/directives/slideBottomPanel/slideBottomPanel.html',\n controller: function ($scope) {\n }\n }\n});\n;\r\n/**\n * loader.directive\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** get the angular module and add directive */\n\tangular.module('nha.core').directive('loader', loaderDirective);\n\n\t/** setup injection */\n\tloaderDirective.$inject = ['appSettings'];\n\n\t/** implementation */\n\tfunction loaderDirective(appSettings) {\n\t\t/** return directive */\n\t\treturn {\n\t\t\trestrict: 'EA',\n\t\t\ttransclude: true,\n\t\t\ttemplateUrl: appSettings.coreWebRootUrl + 'app/directives/loader/loader.directive.html',\n\t\t\tscope: {\n\t\t\t\tisLoading: '=',\n\t\t\t\tmini: '=',\n\t\t\t\tmessage: '@'\n\t\t\t}\n\t\t};\n\t}\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('spinner', ['appSettings', function (appSettings) {\n return {\n restrict: 'EA',\n replace: true,\n transclude: true,\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/spinner/spinner.html',\n scope: {\n isLoading: '=',\n message: '@',\n noMessage: '=?'\n }\n }\n }\n ]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('datePanel', ['appSettings', function (appSettings) {\n return {\n restrict: 'EA',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/datePanel/datePanel.html',\n scope: {\n viewOptions: '=',\n events: '=?',\n dateChanged: '&',\n },\n link: function (scope, element, attrs, ngModelCtrl) {\n scope.init(attrs);\n if (!attrs.dateChanged) { scope.dateChanged = angular.noop };\n },\n controller: ['$scope', '$rootScope', '$state', '$stateParams', '$location', 'appContextModel', function ($scope, $rootScope, $state, $stateParams, $location, appContextModel) {\n\n var unbindLocationChange = $rootScope.$on('$locationChangeSuccess', function (val) {\n if (!moment($stateParams.startDate).isSame(moment($scope.viewOptions.startDate), 'day') ||\n !moment($stateParams.endDate).isSame(moment($scope.viewOptions.endDate), 'day')) {\n\n $scope.viewOptions.startDate = moment($stateParams.startDate).toDate();\n $scope.viewOptions.endDate = moment($stateParams.endDate).toDate();\n \n $scope.updateDtpViewValue($stateParams.startDate);\n $scope.dateChanged();\n }\n });\n\n $scope.$on('$destroy', function () {\n unbindLocationChange();\n });\n\n $scope.viewOptions = $scope.viewOptions || {};\n\n $scope.isCurrentTimePeriod = function () {\n\n var isCurrentTimePeriod = true;\n if ($scope.isMultiDayView()) {\n isCurrentTimePeriod = moment().startOf('week').isSame(moment($scope.viewOptions.startDate).startOf('week'), \"day\");\n }\n else {\n isCurrentTimePeriod = moment().isSame(moment($scope.viewOptions.startDate), \"day\");\n }\n\n return isCurrentTimePeriod;\n }\n\n $scope.init = function (attrs) {\n\n // default date Panel options\n $scope.datePanelOptions = {\n selectedDateView: 'dayView',\n showDayWeekSelector: true,\n showCalendarSelector: true,\n currentDateRangePosition: 'left',\n maxDate: null // moment()\n };\n\n // if we have options, merge them with the defaults\n if (!_.isEmpty(attrs.datePanelOptions)) {\n $scope.datePanelOptions = angular.extend($scope.datePanelOptions, angular.fromJson(attrs.datePanelOptions));\n }\n\n if (!$scope.viewOptions.startDate) {\n $scope.viewOptions.startDate = $scope.datePanelOptions.selectedDateView == 'dayView' ? new Date() : moment(new Date()).startOf('week').toDate();\n }\n\n if (!$scope.viewOptions.endDate) {\n $scope.viewOptions.endDate = $scope.datePanelOptions.selectedDateView == 'dayView' ? new Date() : moment(new Date()).endOf('week').toDate();\n }\n\n $scope.isToday = true;\n\n if (_utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate).isSame(_utils.ensureDateIsValidMomentDate($scope.viewOptions.endDate), \"day\")) {\n $scope.datePanelOptions.selectedDateView = 'dayView';\n }\n else {\n $scope.datePanelOptions.selectedDateView = 'weekView';\n }\n }\n\n $scope.isMaxDateReached = function () {\n\n if ($scope.datePanelOptions.maxDate != null && $scope.viewOptions.endDate != null && $scope.viewOptions.endDate !== undefined) {\n return (-moment($scope.datePanelOptions.maxDate).diff(moment($scope.viewOptions.endDate), 'days') >= 0);\n }\n\n return false;\n }\n\n $scope.isMultiDayView = function () {\n var startDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate);\n var endDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.endDate);\n return $scope.viewOptions && !startDate.isSame(endDate, \"day\");\n }\n\n $scope.getCurrentTimePeriodDescription = function () {\n if ($scope.isMultiDayView()) {\n return 'This week';\n }\n else {\n return 'Today';\n }\n }\n\n $scope.isWeekDisabled = function () {\n return $state.current.name === 'behavior-students.grid' || $state.current.name === 'takeattendance.grid';\n }\n\n // Navication functions\n $scope.showNextDay = navigateToDateByOffset(1);\n $scope.showPreviousDay = navigateToDateByOffset(-1);\n\n function navigateToDateByOffset(offsetFromCurrentDay) {\n return function () {\n var startDate, endDate;\n\n if ($scope.isMultiDayView()) {\n startDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate).add('weeks', offsetFromCurrentDay).startOf('week'); // TODO add('weeks', offsetFromCurrentDay) is deprecated, make add(offsetFromCurrentDay, 'weeks')\n endDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.endDate).add('weeks', offsetFromCurrentDay).endOf('week');\n }\n else {\n startDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate).add('days', offsetFromCurrentDay);\n endDate = startDate;\n }\n\n $scope.navigateToDates(startDate, endDate);\n }\n }\n \n $scope.showCurrentTimePeriod = function () {\n var startDate, endDate;\n\n // get to either today or to current week\n if ($scope.isMultiDayView()) {\n startDate = moment().startOf('week');\n endDate = moment().endOf('week');\n }\n else {\n startDate = moment();\n endDate = moment();\n }\n\n $scope.navigateToDates(startDate, endDate);\n }\n\n $scope.showDayView = function () {\n if (!$scope.isMultiDayView()) {\n return;\n }\n\n var startDate, endDate;\n // if we have a last start date that was remembered, change our start date to it\n if (appContextModel.lastStartDate != null) {\n $scope.viewOptions.startDate = _utils.ensureDateIsValidMomentDate(appContextModel.lastStartDate);\n }\n\n startDate = moment($scope.viewOptions.startDate);\n endDate = startDate;\n $scope.datePanelOptions.selectedDateView = 'dayView';\n\n $scope.navigateToDates(startDate, endDate);\n }\n\n $scope.showWeekView = function () {\n if ($scope.isMultiDayView()) {\n return;\n }\n\n var startDate, endDate;\n // remember what day they were on\n appContextModel.lastStartDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate);\n\n if (!$scope.isWeekDisabled()) {\n startDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.startDate).startOf('week');\n endDate = _utils.ensureDateIsValidMomentDate($scope.viewOptions.endDate).endOf('week');\n $scope.datePanelOptions.selectedDateView = 'weekView';\n }\n\n $scope.navigateToDates(startDate, endDate);\n }\n }]\n }\n }]);\n\n\n angular.module('nha.core').directive('datePickerButton', ['$state', function ($state) {\n return {\n restrict: \"A\",\n require: \"ngModel\",\n link: function (scope, element, attrs, ngModelCtrl) {\n\n scope.preventNavigation = false;\n scope.navigateToDates = navigateToDates;\n scope.updateDtpViewValue = updateDtpViewValue;\n\n var parent = $(element).parent();\n var dtp = parent.datetimepicker({\n format: \"LL\",\n showTodayButton: false,\n defaultDate: scope.viewOptions.startDate\n });\n\n // Fired when date picker is used\n dtp.on(\"dp.change\", function (e) {\n if (!scope.preventNavigation) {\n var startDate,\n endDate;\n\n if (scope.isMultiDayView()) {\n startDate = moment(e.date).startOf('week'); // Sunday \n endDate = moment(e.date).endOf('week'); // Saturday\n } else {\n startDate = moment(e.date);\n endDate = startDate;\n }\n\n navigateToDates(startDate, endDate);\n scope.$applyAsync();\n }\n });\n\n // Updates the date time picker's date() value, but prevents navigateToDates() in the \"dp.change\" event.\n // This should be called after navigation so the date picker matches the viewOptions.startDate.\n function updateDtpViewValue(startDate) {\n var startDate = moment(startDate);\n\n scope.preventNavigation = true;\n $(dtp).data('DateTimePicker').date(startDate); // Will emit \"dp.change\" event\n scope.preventNavigation = false;\n }\n\n function navigateToDates(startDate, endDate) {\n var newStartDate = moment(startDate);\n var newEndDate = moment(endDate);\n\n var params = _.assign($state.params, { startDate: startDate.format('YYYY-MM-DD'), endDate: endDate.format('YYYY-MM-DD') });\n $state.transitionTo($state.current.name, params, { location: true, inherit: true, relative: $state.current, notify: false });\n }\n }\n };\n }]);\n\n})();;\r\n//document.createElement('swipedrag');\n\n//(function () {\n// 'use strict';\n\n// angular.module('nha.core').directive('draggable', ['$timeout', '$rootScope', '$location', function ($timeout, $rootScope, $location) {\n// return {\n// restrict: 'A',\n// scope: {\n// datePickerOptions: '@'\n// },\n// link: function (scope, element, attrs, ngModelCtrl) {\n// scope.animateRight = function () {\n// $(element).animate({\n// left: \"+=100\"\n// }, 100, function () {\n// });\n// }\n\n// scope.animateLeft = function () {\n// $(element).animate({\n// left: \"-=100\"\n// }, 100, function () {\n// });\n// }\n\n// scope.swipe = {};\n\n// var options = {\n// dragLockToAxis: true,\n// dragBlockHorizontal: true\n// };\n\n// var hammer = Hammer($(element)[0], options);\n\n// hammer.on(\"swipeleft\", function (event) {\n// scope.animateLeft();\n// scope.animateRight();\n\n// if (attrs.swipeLeft) {\n// scope.$apply(function () {\n// scope.$eval(attrs.swipeLeft);\n// });\n// }\n\n// log('attendance swipe left');\n// });\n\n// hammer.on(\"swiperight\", function (event) {\n// scope.animateRight();\n// scope.animateLeft();\n\n// if (attrs.swipeRight) {\n// scope.$apply(function () {\n// scope.$eval(attrs.swipeRight);\n// });\n// }\n\n// log('attendance swipe right');\n// });\n// }\n// }\n// }\n// ]);\n//})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').directive('datePicker', ['$timeout', function ($timeout) {\n return {\n require: '?ngModel',\n restrict: 'AE',\n scope: {\n datePickerOptions: '@',\n dynamicDatePickerOptions: '=?'\n },\n link: function (scope, element, attrs, ngModelCtrl) {\n if (!ngModelCtrl) {\n var input = element.find('input').data('$ngModelController');\n ngModelCtrl = input ? input : console.error('ngModel required by datePicker directive.');\n }\n\n var defaultOptions = {\n format: 'MM/DD/YYYY', extraFormats: ['MM.DD.YY'],\n icons: {\n time: \"nha-circle-clock\",\n date: \"fa fa-calendar\",\n up: 'fa fa-chevron-up',\n down: 'fa fa-chevron-down',\n previous: 'fa fa-chevron-left',\n next: 'fa fa-chevron-right'\n }\n };\n\n var passedInOptions = scope.$eval(attrs.datePickerOptions);\n var options = angular.extend({}, defaultOptions, passedInOptions);\n\n var extensionOptions = scope.$eval(attrs.datePickerExtensionOptions) || {};\n\n // add a parser to preserve timezone if it exists\n ngModelCtrl.$parsers.push(function (newDate) {\n // if the original model was a moment with a timezone that was set...\n if (!!ngModelCtrl.$modelValue && moment.isMoment(ngModelCtrl.$modelValue) && !!ngModelCtrl.$modelValue.tz && !!ngModelCtrl.$modelValue.tz()) {\n if (moment.isMoment(newDate)) {\n // return a new version of the datetime within the original timezone\n return moment.tz(ngModelCtrl.$modelValue.tz()).set({\n 'year': newDate.get('year'),\n 'month': newDate.get('month'),\n 'date': newDate.get('date'),\n 'hour': newDate.get('hour'),\n 'minute': newDate.get('minute'),\n 'second': newDate.get('second'),\n 'millisecond': newDate.get('millisecond'),\n });\n } else {\n // it was a moment, and now it's not (now it's empty?). Let moment try to parse it, then set the timezone. We could get offset problems, but at least we get something.\n return moment(newDate, options.format).tz(ngModelCtrl.$modelValue.tz()); // Ensure we're using the format they want, in case it's simply a Time.\n }\n }\n\n return newDate; // by default, just return whatever they entered.\n });\n\n element.on('dp.change', function (e) {\n $timeout(function () {\n var dtp = element.data('DateTimePicker');\n ngModelCtrl.$setViewValue(dtp.date());\n });\n });\n\n // Clear keybinds when datepicker is closed to user can type and use arrow keys.\n element.on('dp.hide', function (e) {\n disableKeyBinds();\n });\n\n // Apply keybinds back to datepicker now that it is open.\n element.on('dp.show', function (e) {\n enableKeyBinds();\n });\n\n function disableKeyBinds() {\n element.data(\"__DPKeys\", element.data(\"DateTimePicker\").options().keyBinds);\n element.data(\"DateTimePicker\").keyBinds({\n // Down arrow for opening datepicker.\n down: function (widget) {\n if (!widget) {\n this.show();\n }\n }\n });\n }\n\n function enableKeyBinds() {\n var keys = element.data(\"__DPKeys\");\n if (keys) {\n element.data(\"DateTimePicker\").keyBinds(keys);\n element.data(\"__DPKeys\", null);\n }\n }\n\n function setPickerValue() {\n var result = null;\n // verify we have a model with a value\n if (!!ngModelCtrl) {\n // if we've already got a moment object, keep it. It could have offset information in there.\n if (!!ngModelCtrl.$modelValue && moment.isMoment(ngModelCtrl.$modelValue)) {\n result = ngModelCtrl.$modelValue;\n } else {\n if (!!ngModelCtrl.$viewValue) {\n result = moment(ngModelCtrl.$viewValue);\n }\n }\n }\n\n var dtp = element.data('DateTimePicker');\n\n if (extensionOptions.maxDateIsCurrent) {\n dtp.maxDate(moment());\n }\n\n dtp.date(result);\n }\n\n function setToolTip() {\n if (!!ngModelCtrl.$modelValue && moment.isMoment(ngModelCtrl.$modelValue) && !!ngModelCtrl.$modelValue.zoneAbbr && ngModelCtrl.$modelValue.zoneAbbr() != '') {\n var midnight = ngModelCtrl.$modelValue.clone().startOf('day');\n if (!midnight.diff(ngModelCtrl.$modelValue, 'minutes') == 0) {\n attrs.$set('title', ngModelCtrl.$modelValue.zoneName());\n }\n }\n }\n\n ngModelCtrl.$render = function (value) {\n setPickerValue();\n disableKeyBinds();\n setToolTip();\n };\n\n element.datetimepicker(options);\n setPickerValue();\n\n //Watch for changes in options and apply them to the date picker\n scope.$watch('dynamicDatePickerOptions', function (newVal, oldVal) {\n if (newVal) {\n var allOptions = angular.extend({}, defaultOptions, passedInOptions, newVal);\n $(element).data('DateTimePicker').options(allOptions);\n }\n })\n }\n }\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n /**\n * Generic hierarchical/tree selection control. It can either have the whole data structure\n * or asynchronously load each level.\n *\n * Allows auto-complete searching of the tree, optional multiple selection\n */\n angular.module('nha.core')\n .directive('hierarchicalSelector', ['$compile', 'selectorUtils', 'appSettings', function ($compile, selectorUtils, appSettings) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/hierarchicalSelector/hierarchical-selector.html',\n scope: {\n syncData: '=data',\n multiSelect: '=?',\n onSelectionChanged: '&',\n selectOnlyLeafs: '=?',\n canSelectItem: '&',\n loadChildItems: '&',\n itemHasChildren: '&',\n selection: '=',\n tagName: '&',\n placeholder: '@',\n },\n link: function (scope, element, attrs) {\n // is there a better way to know the callbacks are actually set. So we have make decisions on what to use\n if (attrs.canSelectItem) {\n scope.useCanSelectItemCallback = true;\n }\n if (attrs.loadChildItems) {\n scope.isAsync = true;\n }\n if (attrs.noButton === undefined) {\n scope.showButton = true;\n }\n if (attrs.tagName) {\n scope.useTagName = true;\n }\n if (attrs.selectAllLeafs) {\n scope.selectAllLeafs = true;\n }\n\n // init async\n // if we have no data and have the callback\n if (!scope.syncData && scope.isAsync) {\n scope.data = [];\n var items = scope.loadChildItems({ parent: null });\n if (angular.isArray(items)) {\n scope.data = items;\n }\n else {\n items.then(function (data) {\n scope.data = data;\n });\n }\n }\n\n if (scope.syncData) {\n scope.data = scope.syncData;\n scope.$watch('syncData', function () {\n scope.data = scope.syncData;\n });\n }\n },\n controller: ['$scope', '$document', '$window', '$interpolate', function ($scope, $document, $window, $interpolate) {\n var activeItem;\n\n $scope.showTree = false;\n $scope.selectedItems = [];\n $scope.multiSelect = $scope.multiSelect || false;\n // we need somewhere to hold the async loaded children to reference them in navigation etc.\n $scope.asyncChildCache = {};\n\n function docClickHide(e) {\n closePopup();\n $scope.$apply();\n }\n\n function closePopup() {\n $scope.showTree = false;\n if (activeItem) {\n var itemMeta = selectorUtils.getMetaData(activeItem);\n itemMeta.isActive = false;\n activeItem = undefined;\n }\n // clear cache\n $scope.asyncChildCache = {};\n $document.off('click', docClickHide);\n $document.off('keydown', keyboardNav);\n }\n\n function findItemOwnerAndParent(item, array, parentArray, parentIndex) {\n if (!array) {\n // we don't know where we are, find the array that we belong to\n return;\n }\n var itemIndex = array.indexOf(item);\n if (itemIndex > -1) {\n return { currentArray: array, parentArray: parentArray, parentIndex: parentIndex, itemIndex: itemIndex };\n }\n var newArray;\n for (var i = 0; i < array.length; i++) {\n if (selectorUtils.hasChildren(array[i], $scope.isAsync)) {\n newArray = findItemOwnerAndParent(item, selectorUtils.getChildren(array[i], $scope.isAsync, $scope.asyncChildCache), array, i);\n if (newArray) {\n break;\n }\n }\n }\n return newArray;\n }\n\n function findLowestExpandedItem(item) {\n var children = selectorUtils.getChildren(item, $scope.isAsync, $scope.asyncChildCache);\n var c = children[children.length - 1];\n if (selectorUtils.getMetaData(c).isExpanded) {\n return findLowestExpandedItem(c);\n }\n return c;\n }\n\n /*\n * Get the next or previous item from a item in the tree\n */\n function getNextItem(down, item, array) {\n var itemData = findItemOwnerAndParent(item, array);\n var itemMeta = selectorUtils.getMetaData(item);\n\n if (down) {\n if (itemMeta.isExpanded) {\n // go down the branch\n return selectorUtils.getChildren(item, $scope.isAsync, $scope.asyncChildCache)[0];\n }\n if (itemData.itemIndex < itemData.currentArray.length - 1) {\n // next item at this level\n return itemData.currentArray[itemData.itemIndex + 1];\n }\n if (itemData.itemIndex == itemData.currentArray.length - 1 && itemData.parentArray && itemData.parentIndex < itemData.parentArray.length - 1) {\n // Next item up a level\n return itemData.parentArray[itemData.parentIndex + 1];\n }\n }\n else {\n if (itemData.itemIndex > 0) {\n // previous item at this level\n var previousAtSameLevel = itemData.currentArray[itemData.itemIndex - 1];\n if (selectorUtils.getMetaData(previousAtSameLevel).isExpanded) {\n // find the lowest item\n return findLowestExpandedItem(previousAtSameLevel);\n }\n return previousAtSameLevel;\n }\n if (itemData.itemIndex === 0 && itemData.parentArray) {\n // go to parent\n return itemData.parentArray[itemData.parentIndex];\n }\n }\n\n return item;\n }\n\n function changeActiveItem(down) {\n if (!activeItem) {\n // start at the top or bottom\n idx = down ? 0 : $scope.data.length - 1;\n $scope.onActiveItem($scope.data[idx]);\n } else {\n $scope.onActiveItem(getNextItem(down, activeItem, $scope.data));\n }\n $scope.$apply();\n }\n\n // handle keyboard navigation\n function keyboardNav(e) {\n switch (e.keyCode) {\n // backspace\n // case 8: {\n\n // break;\n // }\n // ESC closes\n case 27: {\n e.preventDefault();\n e.stopPropagation();\n closePopup();\n $scope.$apply();\n break;\n }\n // space/enter - select item\n case 32:\n case 13: {\n e.preventDefault();\n e.stopPropagation();\n if (activeItem) {\n $scope.itemSelected(activeItem);\n $scope.$apply();\n }\n break;\n }\n // down arrow - move down list (next item, child or not)\n case 40: {\n e.preventDefault();\n e.stopPropagation();\n changeActiveItem(true);\n break;\n }\n // up arrow - move up list (previous item, child or not)\n case 38: {\n e.preventDefault();\n e.stopPropagation();\n changeActiveItem(false);\n break;\n }\n // left arrow - colapse node if open\n case 37: {\n e.preventDefault();\n e.stopPropagation();\n if (activeItem) {\n selectorUtils.getMetaData(activeItem).isExpanded = false;\n $scope.$apply();\n }\n break;\n }\n // right arrow - expand node if has children\n case 39: {\n e.preventDefault();\n e.stopPropagation();\n if (activeItem) {\n selectorUtils.getMetaData(activeItem).isExpanded = true;\n $scope.$apply();\n }\n break;\n }\n }\n }\n\n $scope.onActiveItem = function (item) {\n if (activeItem != item) {\n if (activeItem) {\n var itemMeta = selectorUtils.getMetaData(activeItem);\n itemMeta.isActive = false;\n }\n activeItem = item;\n var itemMeta2 = selectorUtils.getMetaData(activeItem);\n itemMeta2.isActive = true;\n }\n };\n\n $scope.deselectItem = function (item, $event) {\n $event.stopPropagation();\n $scope.selectedItems.splice(findIndexForItemById(item), 1);\n\n closePopup();\n\n //Search for the item in our options collection so we can uncheck it.\n var dataItem = _.find($scope.data, { id: item.id });\n //If not found at base level search children.\n if (!dataItem) {\n _.each($scope.data, function (grp) {\n dataItem = _.find(grp.children, { id: item.id });\n if (dataItem)\n return false;\n });\n }\n var itemMeta = selectorUtils.getMetaData(dataItem);\n itemMeta.selected = false;\n\n // if there are children, deselect them.\n if (item.children) {\n _.forEach(dataItem.children, function (child) {\n var childMeta = selectorUtils.getMetaData(child);\n //var indexOfItem = $scope.selectedItems.indexOf(child);\n var indexOfItem = findIndexForItemById(child);\n childMeta.selected = false;\n delete childMeta.isParentSelected;\n $scope.selectedItems.splice(indexOfItem, 1);\n });\n }\n\n if ($scope.onSelectionChanged) {\n $scope.onSelectionChanged({ items: $scope.selectedItems.length ? $scope.selectedItems : undefined });\n }\n };\n\n $scope.onButtonClicked = function ($event) {\n if ($scope.showTree) {\n closePopup();\n }\n else {\n $scope.onControlClicked($event);\n }\n };\n\n $scope.onControlClicked = function ($event) {\n $event.stopPropagation();\n if (!$scope.showTree) {\n $scope.showTree = true;\n\n $document.on('click', docClickHide);\n $document.on('keydown', keyboardNav);\n }\n };\n\n $scope.showSelectedItem = function (item) {\n var itemMeta = selectorUtils.getMetaData(item);\n if (itemMeta && itemMeta.isParentSelected) {\n return false;\n }\n\n return true;\n }\n\n $scope.itemSelected = function (item) {\n if (($scope.useCanSelectItemCallback && $scope.canSelectItem({ item: item }) === false) || ($scope.selectOnlyLeafs && selectorUtils.hasChildren(item, $scope.isAsync))) {\n return;\n }\n var itemMeta = selectorUtils.getMetaData(item);\n if (!$scope.multiSelect) {\n closePopup();\n for (var i = 0; i < $scope.selectedItems.length; i++) {\n selectorUtils.getMetaData($scope.selectedItems[i]).selected = false;\n }\n\n itemMeta.selected = true;\n $scope.selectedItems = [];\n $scope.selectedItems.push(item);\n } else {\n itemMeta.selected = true;\n log(item, itemMeta);\n\n //var indexOfItem = $scope.selectedItems.indexOf(item);\n var indexOfItem = findIndexForItemById(item);\n if (indexOfItem > -1) {\n itemMeta.selected = false;\n $scope.selectedItems.splice(indexOfItem, 1);\n } else {\n $scope.selectedItems.push(item);\n }\n\n // if there are children, always selected them all (or toggle unselect)\n if ($scope.selectAllLeafs) {\n if (item.children) {\n _.forEach(item.children, function (child) {\n\n var childMeta = selectorUtils.getMetaData(child);\n //var indexOfItem = $scope.selectedItems.indexOf(child);\n var indexOfItem = findIndexForItemById(child);\n\n if (!itemMeta.selected) {\n childMeta.selected = false;\n delete childMeta.isParentSelected;\n $scope.selectedItems.splice(indexOfItem, 1);\n } else {\n childMeta.selected = true;\n childMeta.isParentSelected = true;\n\n if (indexOfItem === -1) {\n $scope.selectedItems.push(child);\n } else {\n $scope.selectedItems[indexOfItem]._hsmeta.isParentSelected = true;\n }\n }\n });\n }\n }\n }\n\n if ($scope.onSelectionChanged) {\n $scope.onSelectionChanged({ items: $scope.selectedItems.length ? $scope.selectedItems : undefined });\n }\n };\n\n function findIndexForItemById(item) {\n return _.findIndex($scope.selectedItems, { id: item.id });\n }\n\n $scope.clearSelection = function () {\n $scope.selectedItems = [];\n if ($scope.onSelectionChanged) {\n $scope.onSelectionChanged({ items: undefined });\n }\n };\n\n $scope.$watch('selection', function (newValue, oldValue) {\n if (newValue) {\n if (angular.isArray(newValue)) {\n for (var i = 0; i < newValue.length; i++) {\n $scope.itemSelected(angular.copy(newValue[i]));\n }\n }\n else {\n $scope.itemSelected(angular.copy(newValue));\n }\n }\n else if ($scope.selectedItems.length > 0) { // only clear if it is changing/don't trigger a onSelectionChanged\n $scope.clearSelection();\n }\n });\n\n $scope.getTagName = function (i) {\n if ($scope.useTagName) {\n return $scope.tagName({ item: i });\n }\n return i.name;\n };\n }]\n };\n }])\n ;\n\n /**\n * The recursive tree item used in the hierarchical/tree selector control\n */\n angular.module('nha.core')\n .directive('treeItem', ['$compile', '$q', 'selectorUtils', 'appSettings', function ($compile, $q, selectorUtils, appSettings) {\n return {\n restrict: 'E',\n replace: true,\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/hierarchicalSelector/tree-item.html',\n scope: {\n item: '=',\n itemSelected: '&',\n onActiveItem: '&',\n multiSelect: '=?',\n isActive: '=', // the item is active - means it is highlighted but not selected\n selectOnlyLeafs: '=?',\n useCanSelectItem: '=',\n canSelectItem: '=', // reference from the parent control\n loadChildItems: '=', // reference from parent\n itemHasChildren: '&',\n async: '=',\n asyncChildCache: '='\n },\n controller: ['$scope', function ($scope) {\n $scope.metaData = selectorUtils.getMetaData($scope.item);\n $scope.metaData.isExpanded = false;\n\n $scope.theChildren = $scope.item.children;\n\n $scope.showExpando = function (item) {\n return selectorUtils.hasChildren(item, $scope.async);\n };\n\n $scope.onExpandoClicked = function (item, $event) {\n $event.stopPropagation();\n var meta = selectorUtils.getMetaData(item);\n meta.isExpanded = !meta.isExpanded;\n };\n\n $scope.clickSelectItem = function (item, $event) {\n $event.stopPropagation();\n if ($scope.itemSelected) {\n var itemMeta = selectorUtils.getMetaData(item);\n if (itemMeta.isParentSelected) {\n return false;\n }\n\n $scope.itemSelected({ item: item });\n }\n };\n\n $scope.subItemSelected = function (item, $event) {\n if ($scope.itemSelected) {\n $scope.itemSelected({ item: item });\n }\n };\n\n $scope.activeSubItem = function (item, $event) {\n if ($scope.onActiveItem) {\n $scope.onActiveItem({ item: item });\n }\n };\n\n $scope.onMouseOver = function ($event) {\n $event.stopPropagation();\n if (angular.isFunction($scope.onActiveItem)) {\n $scope.onActiveItem({ item: $scope.item });\n }\n };\n\n $scope.showCheckbox = function () {\n if (!$scope.multiSelect) {\n return false;\n }\n // it is multi select\n // canSelectItem callback takes preference\n if ($scope.useCanSelectItem) {\n return $scope.canSelectItem({ item: $scope.item });\n }\n return !$scope.selectOnlyLeafs || ($scope.selectOnlyLeafs && !selectorUtils.hasChildren($scope.item, $scope.async));\n };\n }],\n /**\n * Manually compiles the element, fixing the recursion loop.\n * @param element\n * @param [link] A post-link function, or an object with function(s) registered via pre and post properties.\n * @returns An object containing the linking functions.\n */\n compile: function (element, attrs, link) {\n // Normalize the link parameter\n if (angular.isFunction(link)) {\n link = { post: link };\n }\n\n // Break the recursion loop by removing the contents\n var contents = element.contents().remove();\n var compiledContents;\n return {\n pre: (link && link.pre) ? link.pre : null,\n /**\n * Compiles and re-adds the contents\n */\n post: function (scope, element, attrs) {\n // Compile the contents\n if (!compiledContents) {\n compiledContents = $compile(contents);\n }\n // Re-add the compiled contents to the element\n compiledContents(scope, function (clone) {\n element.append(clone);\n });\n\n // Call the post-linking function, if any\n if (link && link.post) {\n link.post.apply(null, arguments);\n }\n\n // when someone expands a node fetch data if needed\n if (scope.async) {\n scope.$watch('item.' + selectorUtils.getMetaPath() + '.isExpanded', function (newVal) {\n if (!newVal) {\n return;\n }\n if (scope.asyncChildCache[scope.item.$$hashKey]) {\n return scope.asyncChildCache[scope.item.$$hashKey];\n }\n\n scope.theChildren = [{ placeholder: true }];\n if (angular.isFunction(scope.loadChildItems) && scope.item) {\n var items = scope.loadChildItems({ parent: scope.item });\n if (angular.isArray(items)) {\n scope.theChildren = items;\n }\n items.then(function (data) {\n scope.theChildren = data;\n // cache the children\n scope.asyncChildCache[scope.item.$$hashKey] = data;\n });\n }\n });\n }\n }\n };\n }\n };\n }])\n ;\n\n /**\n * Service contianing shared fuctions between the two directives\n */\n angular.module('nha.core')\n .factory('selectorUtils', ['$q', function ($q) {\n return {\n getMetaPath: function () {\n return '_hsmeta'; // change below if you change this\n },\n\n getMetaData: function (item) {\n // we store some meta data on the object - maybe we shouldn't but it is easy now\n // they should be passing us a 'view-model' anyway as we require a few fields (children, name, hasChildren)\n if (!item._hsmeta) {\n item._hsmeta = {};\n }\n return item._hsmeta;\n },\n\n hasChildren: function (item, async) {\n return async ? item.hasChildren : item.children && item.children.length > 0;\n },\n\n getChildren: function (item, async, cache) {\n var children = async ? cache[item.$$hashKey] : item.children;\n if (async && !children && item.hasChildren) {\n // we haven't loaded them yet. Return palceholder\n return [];\n }\n return children;\n }\n };\n }])\n ;\n\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('searchBox', ['appSettings', '$timeout', function (appSettings, $timeout) {\n return {\n restrict: 'EA',\n replace:true,\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/search-box/search-box.html',\n scope: {\n placeholder: '@placeholder', //watermark placeholder text\n search: '=', //the bound property to use in your search\n display: '=?', //the bound property that maintains the original text entered by the user (optional)\n changed: '&?' //a callback function for reporting changes to the directive consumer (optional)\n },\n link: function (scope, el) {\n var searchPlaceholderText = 'Enter search criteria...';\n\n if (scope.placeholder) {\n searchPlaceholderText = scope.placeholder;\n }\n scope.searchPlaceholderText = searchPlaceholderText;\n\n function cleanString(dirtyString) {\n var clean = dirtyString;\n clean = clean.replace(/[|&;$%@\"<>()+,]/g, '');\n clean = clean.replace('\\'', '\\'\\'');\n //clean = clean.replace(/'/g, '\\'\\''); -- removed as it double processes the apostrophe\n clean = clean.replace(/&/g, '%26');\n return clean;\n }\n\n scope.updateSearch = function () {\n \n scope.search = cleanString(scope.display);\n $timeout(function () {\n if (scope.changed) {\n scope.changed({ value: scope.search, display: scope.display });\n }\n }, 0);\n }\n }\n }\n }\n ]);\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('crudPanel', [\n 'appSettings', function (appSettings) {\n return {\n restrict: 'E',\n scope: {\n saveCall: '&',\n saving: '=',\n deleting: '=',\n disabled: '=',\n cancelCall: '&',\n deleteCall: '&',\n lastSavedDate: '=',\n lastSavedBy: '@'\n },\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/crudPanel/crudPanel.html',\n link: function (scope, el, attrs) {\n scope.showSave = attrs.saveCall;\n scope.showDelete = attrs.deleteCall;\n scope.showCancel = attrs.cancelCall;\n\n if (attrs.cancelLabel) {\n scope.cancelLabel = attrs.cancelLabel;\n } else {\n scope.cancelLabel = 'Cancel';\n }\n\n if (attrs.saveLabel) {\n scope.saveLabel = attrs.saveLabel;\n } else {\n scope.saveLabel = 'Save';\n }\n\n if (attrs.deleteLabel) {\n scope.deleteLabel = attrs.deleteLabel;\n } else {\n scope.deleteLabel = 'Delete';\n }\n\n scope.save = function () {\n // Call the callback function passed in from consuming controller.\n scope.saveCall();\n }\n scope.delete = function () {\n scope.deleteCall();\n }\n scope.cancel = function () {\n scope.cancelCall();\n }\n }\n }\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('errorPanel', [\n 'appSettings', function (appSettings) {\n return {\n restrict: 'EA',\n scope: {\n studentId: '=',\n altText: '='\n },\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/errorPanel/errorPanel.html',\n controller: function ($scope) {\n\n $scope.showErrorPanel = function (isLoading) {\n\n // don't show while the view is still loading\n if (isLoading)\n return false;\n\n // if we have an error, show this panel, else don't\n return !_.isEmpty($scope.error);\n };\n\n $scope.handleError = function (error) {\n\n log('An error occurred', error);\n\n // check data response for errors\n if (error.status) {\n if (!_.isEmpty(error.data)) {\n $scope.error = {};\n $scope.error.errorMessage = (error.data.errorException ? error.data.errorException : error.data.message);\n $scope.error.errorDetails = JSON.stringify(error.data);\n }\n }\n }\n }\n }\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('transactionErrorPanel', ['appSettings', function (appSettings) {\n return {\n restrict: 'E',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/transactionErrorPanel/transactionErrorPanel.html',\n scope: false,\n controller: ['$scope', '$attrs', 'errorSvc', function ($scope, $attrs, errorSvc) {\n $scope.errorPanelVM = { errorArray: errorSvc.allErrors, displayClass: 'alert-danger' };\n\n // this will default to the X showing up in the upper right hand corner to clear the errors and hide the panel\n $scope.allowDismiss = true;\n\n // default to all, you can categorize what error messages go where. for example. have a filter errors and a list errors seperate.\n $scope.category = 'all';\n\n // this will show tech details\n $scope.showDetails = false;\n\n if ($attrs.displayType) {\n $scope.errorPanelVM.displayType = $attrs.displayType;\n\n switch($attrs.displayType) {\n case 'notification':\n case 'Notification':\n $scope.errorPanelVM.displayClass = 'alert-warning';\n break;\n case 'error':\n case 'Alert':\n case 'alert':\n case 'validation':\n case 'Validation':\n $scope.errorPanelVM.displayClass = 'alert-danger';\n break;\n }\n }\n\n $scope.isVisible = function () {\n return _.filter($scope.errorPanelVM.errorArray, { type: $attrs.displayType }).length > 0;\n }\n\n $scope.dismissErrorPanel = function() {\n $scope.errorPanelVM = [];\n }\n }],\n link: function (scope, element, attrs, ngModelCtrl) { }\n }\n }\n ]);\n\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core').directive('dateEntry', ['$state', '$rootScope', '$window', 'appSettings', function ($state, $rootScope, $window, appSettings) {\n return {\n restrict: 'E',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/dateEntry/dateEntry.html',\n scope: {\n date: '=',\n inputName: '@?',\n isRequired: '@?',\n isDisabled: '=',\n isReadOnly: '=?',\n options: '@?',\n onChange: '&?',\n scaled: '=',\n iconClass: '@',\n dynamicDatePickerOptions: '=?'\n },\n link: function(scope, element, attrs, ngModelCtrl) {\n // Check to see if element is within a disabled fieldset\n scope.isFieldSetDisabled = element.closest('fieldset').prop('disabled') || false;\n\n // ensure we have the correct placeholder text\n scope.placeholderMessage = scope.iconClass === 'nha-circle-clock' ? 'Enter a time' : 'Enter a date';\n\n if (scope.isReadOnly === undefined) scope.isReadOnly = false;\n\n // define default input control name, if none supplied\n if (!scope.inputName) {\n scope.inputName = 'dateField';\n }\n if (scope.onChange) {\n scope.changed = function() {\n scope.onChange();\n };\n }\n }\n };\n }]);\n})();;\r\nangular.module('nha.core')\n.directive('dateFormatter', function () {\n return {\n require: 'ngModel',\n link: function (scope, element, attrs, ngModelController) {\n ngModelController.$parsers.push(function (data) {\n //View -> Model\n return data;\n });\n ngModelController.$formatters.push(function (data) {\n //Model -> View\n return moment(data).format(\"MMM DD, YYYY\");\n });\n }\n }\n})\n.directive('timeFormatter', function () {\n return {\n require: 'ngModel',\n link: function (scope, element, attrs, ngModelController) {\n ngModelController.$parsers.push(function (data) {\n return data;\n });\n ngModelController.$formatters.push(function (data) {\n return moment(data).format(\"h:mm:ss a\");\n });\n }\n }\n});\n;\r\n(function () {\n\t\"use strict\";\n\n\tangular.module(\"nha.core\").directive(\"ifHasEntitlement\", [\n\t\tfunction () {\n\t\t\treturn {\n\t\t\t\trestrict: \"A\",\n\t\t\t\tlink: function (scope, element, attrs) {\n\t\t\t\t\t$(element).hide();\n\n\t\t\t\t\tvar entitlementParts = attrs.ifHasEntitlement\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.split(\"|\");\n\t\t\t\t\tvar entitlementType = entitlementParts[0];\n\t\t\t\t\tvar entitlementName = entitlementParts[1];\n\n\t\t\t\t\tvar userContext = window.userContext;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tuserContext.entitlements.find(function (entitlement) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tentitlement.entitlementType.toLowerCase() ===\n\t\t\t\t\t\t\t\t\tentitlementType &&\n\t\t\t\t\t\t\t\tentitlement.entitlementName.toLowerCase() ===\n\t\t\t\t\t\t\t\t\tentitlementName\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t) {\n\t\t\t\t\t\t$(element).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(element).remove();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t]);\n})();\n;\r\n(function () {\n\t\"use strict\";\n\n\tvar featureFlagService = myNHA.GetApiService(\"Core\", \"FeatureFlagService\");\n\n\tangular.module(\"nha.core\").directive(\"ifHasFeatureFlag\", [\n\t\t\"$parse\",\n\t\tfunction ($parse) {\n\t\t\treturn {\n\t\t\t\trestrict: \"A\",\n\t\t\t\tlink: function (scope, element, attrs) {\n\t\t\t\t\t$(element).hide();\n\n\t\t\t\t\tfeatureFlagService\n\t\t\t\t\t\t.checkFeatureFlagStatus(attrs.ifHasFeatureFlag)\n\t\t\t\t\t\t.then(function (status) {\n\t\t\t\t\t\t\tif (status) {\n\t\t\t\t\t\t\t\t$(element).show();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t]);\n})();\n;\r\n/* @name ifAtLeastOneResourceAccessible.directive\n * @description Only shows element if at least 1 resource defined in attribute is accessible to the current user\n * @syntax ifAtLeastOneResourceAccessible: [{api}\\]{resource}[:{action}]\n */\n(function () {\n 'use strict';\n angular.module('nha.core').directive('ifAtLeastOneResourceAccessible', ['$parse', 'apiSecurityService', 'apiResolutionService', '$q', function ($parse, apiSecurityService, apiResolutionService, $q) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n \t//debugger;\n //\thide this element until we've verified at least 1 resource is accessible\n $(element).hide(); \n\n\t\t\t\t//\tbegin parsing ifAtLeastOneResourceAccessible\n\t var apiResourceActions = [];\n\t\t\t\tvar parsedArray = [];\n var saviyntEntitlements = [];\n\t if (attrs.ifAtLeastOneResourceAccessible) {\n\t \tif (attrs.ifAtLeastOneResourceAccessible.indexOf(',') > -1) {\n\t\t\t\t\t\tapiResourceActions = attrs.ifAtLeastOneResourceAccessible.split(',');\n\t \t} else {\n\t \t\tapiResourceActions.push(attrs.ifAtLeastOneResourceAccessible);\n\t\t }\n\n\t \t//\tparse apiResourceActions\n _.forEach(apiResourceActions, function (apiResourceAction) {\n // If is new entitlement\n if (apiResourceAction.contains('|')) {\n saviyntEntitlements.push(apiResourceAction);\n } else {\n parsedArray.push(apiSecurityService.parseApiResourceAction(apiResourceAction, attrs.api));\n }\n \n });\n }\n\n var allRequests = [];\n\n _.forEach(parsedArray, function (parsed) {\n \tvar restangular = apiResolutionService.getApiByName(parsed.api);\n allRequests.push(apiSecurityService.isAccessAllowed(parsed.resource, parsed.action, restangular));\n });\n\n _.forEach(saviyntEntitlements, function (saviyntEntitlement) {\n allRequests.push(apiSecurityService.hasSaviyntEntitlement(saviyntEntitlement))\n })\n\n //If at least 1 resource is accessible, show this element\n $q.all(allRequests).then(function (results) {\n if (_.find(results, function (individualResult) {\n return individualResult;\n })) {\n $(element).show();\n };\n });\n }\n }}]);\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core').directive('ifResourceAccessible', ['$parse', 'apiSecurityService', 'apiResolutionService', function ($parse, apiSecurityService, apiResolutionService) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n \t$(element).hide();\n\n var parsed = apiSecurityService.parseApiResourceAction(attrs.ifResourceAccessible, attrs.api);\n var restangular = apiResolutionService.getApiByName(parsed.api);\n apiSecurityService.isAccessAllowed(parsed.resource, parsed.action, restangular).then(function (result) {\n if (result) {\n $(element).show();\n }\n });\n }\n }}]);\n})();;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core')\n\t\t.directive('httpSrc', ['$http', function ($http) {\n\t\t\treturn {\n\t\t\t\trestrict: 'A',\n\t\t\t\tscope: {\n\t\t\t\t\thttpSrc: '='\n\t\t\t\t},\n\t\t\t\ttemplate: '

{{name}}

',\n\t\t\t\tlink: function (scope, element, attrs) {\n\t\t\t\t\tscope.$watch('httpSrc', function (newVal, oldVal) {\n\t\t\t\t\t\tif (newVal) {\n\t\t\t\t\t\t\tvar requestConfig = {\n\t\t\t\t\t\t\t\tmethod: 'Get',\n\t\t\t\t\t\t\t\turl: scope.httpSrc,\n\t\t\t\t\t\t\t\tresponseType: 'arraybuffer',\n\t\t\t\t\t\t\t\tcache: 'true'\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t$http(requestConfig)\n\t\t\t\t\t\t\t\t.success(function (data) {\n\t\t\t\t\t\t\t\t\tvar arr = new Uint8Array(data);\n\n\t\t\t\t\t\t\t\t\tvar raw = '';\n\t\t\t\t\t\t\t\t\tvar i, j, subArray, chunk = 5000;\n\t\t\t\t\t\t\t\t\tfor (i = 0, j = arr.length; i < j; i += chunk) {\n\t\t\t\t\t\t\t\t\t\tsubArray = arr.subarray(i, i + chunk);\n\t\t\t\t\t\t\t\t\t\traw += String.fromCharCode.apply(null, subArray);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar b64 = btoa(raw);\n\n\t\t\t\t\t\t\t\t\tattrs.$set('src', 'data:image/jpeg;base64,' + b64);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t}]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('dropdownSubmenu', ['appSettings', '$timeout', function (appSettings, $timeout) {\n return {\n restrict: 'EA',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/dropdownSubmenu/dropdownSubmenu.html',\n scope: {\n options: '=',\n selectedModel: '=',\n customSettings: '=?settings',\n customTexts: '=?texts',\n showTagCloud: '=?',\n disabled: '=',\n onChange: '&',\n },\n link: function (scope, el, attrs) {\n\n scope.grpSelectAll = {};\n\n //Default settings that can be overridden by customSettings.\n var defaultSettings = {\n optionID: 'id',\n optionLabel: 'label',\n selectionLimit: 1, /* 0 = Infinite Multiselct*/\n selectAll: false\n }\n\n //Default texts that can be overridden by customTexts.\n var defaultTexts = {\n selectAll: 'Select All'\n }\n\n // If no on change callback is provided, use angular.noop function.\n if (!attrs.onChange) { scope.onChange = angular.noop };\n\n //Override default settings with passed in settings\n scope.settings = _.assign(defaultSettings, scope.customSettings || {});\n scope.texts = _.assign(defaultTexts, scope.customTexts || {});\n\n scope.$watch('customSettings', function() {\n scope.settings = _.assign(defaultSettings, scope.customSettings || {});\n scope.texts = _.assign(defaultTexts, scope.customTexts || {});\n\n scope.singleSelection = scope.settings.selectionLimit === 1;\n });\n\n\n function getFindObj(id) {\n var findObj = {};\n findObj[scope.settings.optionID] = id;\n\n return findObj;\n }\n\n if (scope.settings.groupBy) {\n scope.$watch('options', function(newValue) {\n if (newValue) {\n scope.groupedOptions = _.groupBy(scope.options, scope.settings.groupBy);\n\n //Default Select All if all options are selected on init\n if (scope.settings.selectAll) {\n _.each(_.keys(scope.groupedOptions), function(key) {\n scope.grpSelectAll[key] = _.every(scope.groupedOptions[key], function(i) {\n return scope.isChecked(scope.getPropertyForObject(i, scope.settings.optionID));\n });\n });\n }\n }\n });\n }\n\n scope.checkboxClick = function ($event, id, key) {\n $event.stopPropagation();\n if (!scope.grpSelectAll[key])\n scope.setSelectedItem(id);\n \n };\n\n scope.selectAll = function ($event, grpItems, key, allowRemove) {\n if (scope.singleSelection) {\n if (grpItems.length > 1) {\n return;\n }\n scope.selectedModel = _.head(grpItems);\n $timeout(function () {\n scope.onChange();\n });\n return;\n }\n $event.stopPropagation();\n\n scope.grpSelectAll[key] = !scope.grpSelectAll[key];\n\n _.forEach(grpItems, function (value) {\n scope.setSelectedItem(value[scope.settings.optionID], !allowRemove);\n });\n };\n\n scope.setSelectedItem = function (id, preventRemove) {\n var findObj = getFindObj(id);\n var item = _.find(scope.options, findObj);\n\n if (scope.singleSelection) {\n scope.selectedModel = item;\n $timeout(function () {\n scope.onChange();\n });\n return;\n } else {\n if (!_.isArray(scope.selectedModel)) {\n scope.selectedModel = [];\n }\n }\n\n preventRemove = preventRemove || item.disabled || false;\n\n var exists = _.findIndex(scope.selectedModel, findObj) !== -1;\n\n if (!preventRemove && exists) {\n scope.selectedModel.splice(_.findIndex(scope.selectedModel, findObj), 1);\n scope.onChange();\n } else if (!exists && !item.disabled && (scope.settings.selectionLimit === 0 || scope.selectedModel.length < scope.settings.selectionLimit)) {\n scope.selectedModel.push(item);\n scope.onChange();\n }\n };\n\n scope.getPropertyForObject = function (object, property) {\n if (object && object.hasOwnProperty(property)) {\n return object[property];\n }\n return '';\n };\n\n scope.isChecked = function (id) {\n if (!scope.selectedModel)\n return 0;\n\n if (scope.singleSelection) {\n if (_.isArray(scope.selectedModel)) {\n var item = _.head(scope.selectedModel);\n return item && item[scope.settings.optionID] && item[scope.settings.optionID] === getFindObj(id)[scope.settings.optionID];\n } else {\n return scope.selectedModel !== null && scope.selectedModel[scope.settings.optionID] && scope.selectedModel[scope.settings.optionID] === getFindObj(id)[scope.settings.optionID];\n }\n }\n\n return _.findIndex(scope.selectedModel, getFindObj(id)) !== -1;\n };\n\n scope.getModelDisplayValue = function () {\n if (!scope.selectedModel || _.isEmpty(scope.selectedModel)) {\n return \"Select...\";\n } else {\n \n var selectedItems = [];\n if (scope.settings.groupBy && scope.groupedOptions) {\n _.forOwn(scope.groupedOptions, function (opts, key) {\n var allSelected = _.every(opts, function(opt) {\n return scope.isChecked(scope.getPropertyForObject(opt, scope.settings.optionID));\n });\n if (allSelected) {\n selectedItems.push(key);\n } else {\n _.each(opts, function (opt) {\n if (scope.isChecked(scope.getPropertyForObject(opt, scope.settings.optionID))) {\n selectedItems.push(scope.getPropertyForObject(opt, scope.settings.optionLabel));\n }\n });\n }\n });\n } else {\n _.each(scope.options, function(opt) {\n if (scope.isChecked(scope.getPropertyForObject(opt, scope.settings.optionID))) {\n selectedItems.push(scope.getPropertyForObject(opt, scope.settings.optionLabel));\n }\n });\n }\n return selectedItems.length > 1 ? \"Multiple\" : _.head(selectedItems);\n }\n\n };\n\n }\n }\n }\n ]);\n\n})();;\r\n(function () {\n 'use strict';\n\n\n angular.module('nha.core')\n .directive('tagCloud', ['appSettings', function (appSettings) {\n return {\n restrict: 'EA',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/tagCloud/tagCloud.html',\n scope: {\n data: '='\n },\n link: function (scope, el) {\n\n // example structure\n // [{ \"id\": 21, \"name\": \"Every day\", \"disableOtherItemsIfSelected\": true }, { \"id\": 22, \"name\": \"Monday\", \"disabled\": true }, { \"id\": 23, \"name\": \"Tuesday\", \"disabled\": true }, { \"id\": 24, \"name\": \"Wednesday\", \"disabled\": true }, { \"id\": 25, \"name\": \"Thursday\", \"disabled\": true }, { \"id\": 26, \"name\": \"Friday\", \"disabled\": true }, { \"id\": 51, \"name\": \"Every day\", \"disableOtherItemsIfSelected\": true }, { \"id\": 52, \"name\": \"Monday\", \"disabled\": true }, { \"id\": 53, \"name\": \"Tuesday\", \"disabled\": true }, { \"id\": 54, \"name\": \"Wednesday\", \"disabled\": true }, { \"id\": 55, \"name\": \"Thursday\", \"disabled\": true }, { \"id\": 56, \"name\": \"Friday\", \"disabled\": true }, { \"id\": 12, \"name\": \"Monday\" }, { \"id\": 13, \"name\": \"Tuesday\" }]\n\n scope.unselectItem = function ($index, tag) {\n if (tag && !tag.disabled) {\n scope.data.splice($index, 1);\n }\n }\n\n var init = function () {\n\n }\n\n init();\n }\n }\n }\n ]);\n\n //angular.module('nha.core').filter('selectedItemsFilter', function () {\n // return function (items) {\n // log('item', items);\n // return (items);\n\n // var selectedItems = [];\n\n // if (items) {\n // //var selectedFirstLevelItems = _.filter(items, 'selected');\n // //log('selectedFirstLevelItems', selectedFirstLevelItems);\n // //if (selectedFirstLevelItems) {\n // //// selectedItems.push(selectedFirstLevelItems);\n // //}\n // //log(_.filter(items, 'selected'));\n // //selectedItems.push(_.filter(items, 'selected'));\n // _.forEach(items, function(i) {\n // if (i.items) {\n // selectedItems.push(_.filter(i.items, 'selected'));\n // }\n // });\n // }\n\n // return selectedItems;\n // };\n //});\n \n\n})();\n\n\n;\r\n(function () {\n 'use strict';\n angular.module('nha.core')\n .directive('actionSaveStatus', function () {\n return {\n restrict: 'E',\n scope: {\n // Array of promises\n saveQueue: '='\n },\n template: '{{currentState}}',\n controller: ['$scope', '$q', '$timeout', function ($scope, $q, $timeout) {\n\n //Watch our queue for new promises.\n $scope.$watchCollection('saveQueue', function () {\n if ($scope.saveQueue.length) {\n $scope.currentState = 'Saving...';\n log('Save Queue Count', $scope.saveQueue.length);\n // Catch any notifications from the latest singular promise.\n _.last($scope.saveQueue).then(null,null,function(notification) {\n $scope.currentState = notification || 'Notification Recieved';\n });\n\n //Wait for empty queue.\n $q.all($scope.saveQueue).then(\n // Success\n function (success) {\n $scope.currentState = _.last(success) || 'All Changes Saved';\n },\n // Rejected\n function (failed) {\n $scope.currentState = failed || 'Error Saving Changes!';\n }).finally(function () {\n $scope.saveQueue = [];\n log('Save Queue Count', $scope.saveQueue.length);\n });\n }\n });\n }]\n }\n }\n );\n})();;\r\n(function () {\n 'use strict';\n\n /**\n * @name confirmOnExit\n * \n * @description\n * Prompts user while he navigating away from the current route (or, as long as this directive \n * is not destroyed) if any unsaved form changes present.\n * \n * @element Attribute\n * @scope\n * @param confirmOnExit Scope function which will be called on window refresh/close or AngularS $route change to\n * decide whether to display the prompt or not.\n * @param confirmMessageWindow Custom message to display before browser refresh or closed.\n * @param confirmMessageRoute Custom message to display before navigating to other route.\n * @param isolateArea Allows you to not prompt for confirmation if the next state/url contains this string.\n * \n * @example\n * Usage:\n * Example Controller: (using controllerAs syntax in this example)\n * \n * angular.module('AppModule', []).controller('pageCtrl', [function () {\n * this.isDirty = function () {\n * // do your logic and return 'true' to display the prompt, or 'false' otherwise.\n * return true;\n * };\n * }]);\n * \n * Template:\n * \n *
\n * \n * @see\n * http://stackoverflow.com/a/28905954/340290\n * \n * @author Manikanta G\n */\n angular.module('nha.core').directive('confirmOnExit', function () {\n return {\n scope: {\n confirmOnExit: '&',\n confirmMessageWindow: '@',\n confirmMessageRoute: '@',\n ignoredUrls: '=?',\n isolateArea: '@'\n },\n link: function ($scope, elem, attrs) {\n var defaultConfirmMessageWindowMessage = 'All your changes will be lost!';\n var defaultConfirmMessageRouteMessage = 'All your changes will be lost. Are you sure you want to do this?';\n if (!$scope.ignoredUrls) {\n $scope.ignoredUrls = [];\n }\n window.onbeforeunload = function () {\n if ($scope.confirmOnExit()) {\n return $scope.confirmMessageWindow || defaultConfirmMessageWindowMessage;\n }\n }\n var $locationChangeStartUnbind = $scope.$on('$locationChangeStart', function (event, next, current) {\n if ($scope.confirmOnExit()) {\n log('$locationChangeStart event', event, next, current);\n\n //If next is not within a specified isolated area.\n if (!$scope.isolateArea || ($scope.isolateArea && !_.includes(next, '/' + $scope.isolateArea + '/'))) {\n // If next is not one of the specified ignored urls\n if (!$scope.ignoredUrls.length || !(_.some($scope.ignoredUrls, function (url) { return _.includes(next, url) }))) {\n if (!confirm($scope.confirmMessageRoute || defaultConfirmMessageRouteMessage)) {\n event.preventDefault();\n }\n }\n }\n }\n });\n\n $scope.$on('$destroy', function () {\n window.onbeforeunload = null;\n $locationChangeStartUnbind();\n });\n }\n };\n });\n\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('meetingBlockDisplay', ['appSettings',\n function (appSettings) {\n return {\n restrict: 'EA',\n template: '
  • {{meetingBlock}}
',\n scope: {\n meetingBlockTimes: '=',\n masterScheduleTypeId: '=?',\n displayHorizontally: '=?',\n hideTime: '=?'\n },\n controller: ['$scope', function (scope) {\n scope.getNewMeetingBlockTimes = function () {\n var returnValue = [];\n\n if (scope.masterScheduleTypeId && scope.meetingBlockTimes && _.isArray(scope.meetingBlockTimes)) {\n // meetingBlockTime expected object: {MeetingBlockName, MeetingBlockStartTime, MeetingBlockEndTime} \n // where start and end time are derived from TimeSpan (time only, no date). \n // Retrieve formatted string using: moment(timeSpan, 'HH:mm:ss').format('LT')\n if (scope.masterScheduleTypeId === 3) {\n // self contained full day\n if (scope.meetingBlockTimes.length === 2\n && _.find(scope.meetingBlockTimes, { meetingBlockName: 'AM' })\n && _.find(scope.meetingBlockTimes, { meetingBlockName: 'PM' })) {\n returnValue.push('AM/PM'); // No time added, as per requirement\n }\n } else if (scope.meetingBlockTimes.length === 1) {\n // replace with e.g. 'AM (8:00am - 11:30am)'\n if (scope.hideTime) {\n // do not add time\n returnValue.push(scope.meetingBlockTimes[0].meetingBlockName);\n } else {\n // add time\n returnValue.push(scope.meetingBlockTimes[0].meetingBlockName + ' (' + moment(scope.meetingBlockTimes[0].meetingBlockStartTime, 'HH:mm:ss').format('LT') + ' - ' + moment(scope.meetingBlockTimes[0].meetingBlockEndTime, 'HH:mm:ss').format('LT') + ')');\n }\n } else if (scope.meetingBlockTimes.length > 1) {\n \n // if we come in here, we have multiple values. let's check to see if we can concat them to show them friendler\n // Expects to process records like:\n // 3rd Period - Tu\n // 3rd Period - W\n // 3rd Period - Th\n // into: 3rd Period - Tu/W/Th (8:00am - 11:30am)\n\n // get the left side so we can see if they are all the same\n // e.g. matches: ['3rd Period']\n var matches = [];\n _.forEach(scope.meetingBlockTimes, function (mbt) {\n var firstSpaceIndex = mbt.meetingBlockName.indexOf(' ');\n var secondSpaceIndex = mbt.meetingBlockName.indexOf(' ', firstSpaceIndex + 1);\n\n if (firstSpaceIndex === -1 || secondSpaceIndex === -1) {\n // if not in expected format, just push name as it is\n matches.push(mbt.meetingBlockName);\n } else {\n // otherwise, slice it up\n matches.push(new String(mbt.meetingBlockName).slice(0, secondSpaceIndex));\n }\n });\n\n // get unique items for the left side\n var uniques = _.uniq(matches);\n\n _.forEach(uniques, function (leftSide) {\n\n // now go through and figure out our right side\n var dayAndTime = [];\n _.forEach(scope.meetingBlockTimes, function (mbt) {\n\n var firstSpaceIndex = mbt.meetingBlockName.indexOf(' ');\n var secondSpaceIndex = mbt.meetingBlockName.indexOf(' ', firstSpaceIndex + 1);\n\n // process those that match left side\n // e.g. { day: 'M', time: '12:00pm - 1:00pm'}\n if ((firstSpaceIndex === -1 || secondSpaceIndex === -1) && (leftSide === mbt.meetingBlockName)) {\n // if not in expected format, just use name as it is\n if (!scope.hideTime) {\n // only push if time is requested\n dayAndTime.push({\n day: '',\n time: ' (' + moment(mbt.meetingBlockStartTime, 'HH:mm:ss').format('LT') + ' - ' + moment(mbt.meetingBlockEndTime, 'HH:mm:ss').format('LT') + ')'\n });\n }\n } else if (leftSide === new String(mbt.meetingBlockName).slice(0, secondSpaceIndex)) {\n // otherwise, slice it up\n if (scope.hideTime) {\n // do not add time\n dayAndTime.push({\n day: _.trim(new String(mbt.meetingBlockName).slice(secondSpaceIndex, mbt.meetingBlockName.length).replace('-', '')),\n time: ''\n });\n } else {\n // add time\n dayAndTime.push({\n day: _.trim(new String(mbt.meetingBlockName).slice(secondSpaceIndex, mbt.meetingBlockName.length).replace('-', '')),\n time: ' (' + moment(mbt.meetingBlockStartTime, 'HH:mm:ss').format('LT') + ' - ' + moment(mbt.meetingBlockEndTime, 'HH:mm:ss').format('LT') + ')'\n });\n }\n }\n\n });\n\n // group days together by times\n // e.g. [\n // { time: '12:00pm - 1:00pm', \n // days: [\n // { day: 'M', time: '12:00pm - 1:00pm'}, \n // { day: 'Tu', time: '12:00pm - 1:00pm'}, \n // { day: 'Th', time: '12:00pm - 1:00pm'}\n // ]\n // },\n // { time: '2:00pm - 3:00pm', \n // days: [\n // { day: 'W', time: '2:00pm - 3:00pm'}, \n // { day: 'F', time: '2:00pm - 3:00pm'}\n // ]\n // }\n // ]\n var daysByTime = _\n .chain(dayAndTime)\n .groupBy('time')\n .toPairs()\n .map(function (currentItem) {\n return _.zipObject(['time', 'days'], currentItem);\n })\n .value();\n\n // build out the day / times and append to leftSide\n // e.g. '3rd Period M/Tu/Th (12:00pm - 1:00pm)' and '3rd Period W/F (2:00pm - 3:00pm)'\n var target = [];\n if (!daysByTime || daysByTime.length === 0) {\n // if there are no days and hideTime is true, still need left side\n target.push(leftSide);\n } else {\n // tack days and times to the leftside\n _.forEach(daysByTime, function (item) {\n var joinedDays = _.map(item.days, 'day').join('/');\n joinedDays = sortJoinedDays(joinedDays);\n if (joinedDays === 'M/Tu/W/Th/F' || joinedDays === 'M/T/W/Th/F') {\n // If all days are included, don't need to display them; just display the ;\n // Instead of: 3rd Period M/Tu/W/Th/F\n // ...just display: 3rd Period\n joinedDays = '';\n }\n target.push(leftSide + (joinedDays ? ' ' + joinedDays : '') + (item.time && !scope.hideTime ? ' ' + item.time : ''));\n });\n }\n\n // ...and replace meeting block\n returnValue = _.union(returnValue, target);\n\n });\n\n // transform to comma separated list as single array element, if need to display horizontally\n if (scope.displayHorizontally) {\n var horizontalValues = returnValue.join(', ');\n returnValue = [];\n returnValue.push(horizontalValues);\n }\n\n }\n }\n\n else if (scope.meetingBlockTimes) {\n // original implementation\n\n // if this is a self contained with only AM and PM\n if (scope.meetingBlockTimes.length === 2 && scope.meetingBlockTimes[0] === 'AM' && scope.meetingBlockTimes[1] === 'PM') {\n returnValue.push('AM/PM');\n } else if (scope.meetingBlockTimes.length > 1) {\n\n // if we come in here, we have multiple values. let's check to see if we can concat them to show them friendler\n\n // get the left side so we can see if they are all the same\n var matches = [];\n _.forEach(scope.meetingBlockTimes, function (mbt) {\n var firstSpaceIndex = mbt.indexOf(' ');\n var secondSpaceIndex = mbt.indexOf(' ', firstSpaceIndex + 1);\n matches.push(new String(mbt).slice(0, secondSpaceIndex));\n });\n\n // if they are all the same, its a candidate for concat\n var uniques = _.uniq(matches);\n if (uniques.length === 1) {\n\n // now go through and figure out our right side\n var concattedResult = [];\n _.forEach(scope.meetingBlockTimes, function (mbt) {\n\n var firstSpaceIndex = mbt.indexOf(' ');\n var secondSpaceIndex = mbt.indexOf(' ', firstSpaceIndex + 1);\n\n concattedResult.push(_.trim(new String(mbt).slice(secondSpaceIndex, mbt.length).replace('-', '')));\n\n });\n\n // finally, bring it all together\n returnValue.push(uniques[0] + ' ' + concattedResult.join('/'));\n }\n }\n }\n\n return returnValue;\n }\n\n function sortJoinedDays(strJoinedDays) {\n\n if (strJoinedDays && strJoinedDays.length > 0) {\n var str = strJoinedDays.split(\"/\");\n if (str.length > 0) {\n str.sort(compareDays);\n strJoinedDays = str.join(\"/\");\n }\n }\n return strJoinedDays;\n }\n\n\n function compareDays(day1, day2) {\n switch (day1) {\n case 'M':\n if (day2 === 'T' || day2 === 'W' || day2 === 'Th' || day2 === 'F') {\n return -1;\n }\n break;\n case 'T':\n if (day2 === 'W' || day2 === 'Th' || day2 === 'F') {\n return -1;\n }\n else if (day2 === 'M') {\n return 1;\n }\n break;\n case 'W':\n if (day2 === 'Th' || day2 === 'F') {\n return -1;\n }\n else if (day2 === 'M' || day2 === 'T') {\n return 1;\n }\n break;\n\n case 'Th':\n if (day2 === 'F') {\n return -1;\n }\n else if (day2 === 'M' || day2 === 'T' || day2 === 'W') {\n return 1;\n }\n break;\n\n case 'F':\n if (day2 === 'M' || day2 === 'T' || day2 === 'W' || day2 === 'Th') {\n return 1;\n }\n break;\n }\n return 0;\n }\n }]\n }\n }\n ]);\n\n})();;\r\n/* modified version of infinite scroll\n * originial directive found here: https://github.com/lorenzofox3/lrInfiniteScroll\n * \n * had to seek out an alternative as ngInfiniteScroll would not work in modals because of its reliance on $window elements \n */\n\n(function () {\n 'use strict';\n angular\n .module('nha.core')\n .directive('infiniteScrollModal', infiniteScrollModal);\n\n infiniteScrollModal.$inject = ['$timeout'];\n\n function infiniteScrollModal($timeout) {\n var directive = {\n restrict: 'A',\n link: nhaInfiniteScrollLink\n };\n\n return directive;\n\n function nhaInfiniteScrollLink(scope, element, attr) {\n var\n lengthThreshold = attr.scrollThreshold || 50,\n timeThreshold = attr.timeThreshold || 400,\n promise = null,\n lastRemaining = 9999;\n\n lengthThreshold = parseInt(lengthThreshold, 10);\n timeThreshold = parseInt(timeThreshold, 10);\n\n\n element.bind('scroll', function () {\n var remaining = element[0].scrollHeight - (element[0].clientHeight + element[0].scrollTop);\n\n //if we have reached the threshold and we scroll down\n if (remaining < lengthThreshold && (remaining - lastRemaining) < 0) {\n\n //if there is already a timer running which has no expired yet we have to cancel it and restart the timer\n if (promise !== null) {\n $timeout.cancel(promise);\n }\n promise = $timeout(function () {\n scope.$eval(attr.infiniteScrollModal);\n promise = null;\n }, timeThreshold);\n }\n lastRemaining = remaining;\n });\n\n }\n }\n\n})();\n\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core')\n .directive('pageTabs', [\n '$state', 'appSettings', 'apiSecurityService', 'apiResolutionService', 'Restangular', function ($state, appSettings, apiSecurityService, apiResolutionService, restangular) {\n return {\n restrict: 'EA',\n transclude: true,\n scope: {\n tabs: '=',\n params: '='\n },\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/pageTabs/pageTabs.html',\n link: function (scope, el, attrs) {\n\n // we have to bind to a local variable inside this directive in order for two way binding to work, because of how we are passing in the json array as a value parm. that make perfect sense, right?\n scope.tabToDisplay = scope.tabs;\n\n _.forEach(scope.tabToDisplay, function (tab) {\n\n if (tab.security) {\n var tabRestangular = tab.security.api ? apiResolutionService.getApiByName(tab.security.api) : restangular;\n\n var parsedResource = apiSecurityService.parseResource(tab.security.requiredResource);\n\n apiSecurityService.isAccessAllowed(parsedResource.resource, parsedResource.action, tabRestangular).then(function (result) {\n tab.hidden = !result;\n });\n }\n });\n\n scope.isActive = function (tab) {\n var indexOfParen = tab.sref.indexOf('(');\n\n var srefToCheck = indexOfParen > -1 ? tab.sref.substring(0, indexOfParen) : tab.sref;\n\n //return $state.current.name.indexOf(srefToCheck) > -1; // Includes srefToCheck; may have unexpected matches\n return $state.current.name === srefToCheck;\n }\n }\n }\n }\n ]);\n})();;\r\n/// \n/**\n * avatar-resizer.directive\n * @namespace Core\n */\n(function () {\n 'use strict;';\n\n angular.module('nha.core').directive('avatarResizer', ['appSettings', function (appSettings) {\n return {\n restrict: 'E',\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/avatarResizer/avatar-resizer.html',\n require: '^resizeWrapper'\n };\n }]);\n\n /**\n * @name resizeWrapper\n * @description Add to element that contains the elements to be resized.\n * @memberOf Behavior & Attendance (probably need to place in core).\n */\n angular.module('nha.core').directive('resizeWrapper', ['appSettings', function (appSettings) {\n return {\n restrict: 'A',\n controller: resizeWrapperController,\n controllerAs: 'resizeWrapperVM',\n };\n }]);\n\n angular.module('nha.core').directive('resizeMe', resizeMe);\n\n /**\n * @name resizeWrapperController\n * @description Controller for resizeWrapper directive. Contains logic for element scale storage.\n * @memberOf Behavior & Attendance (probably need to place in core).\n */\n function resizeWrapperController($cookieStore) {\n var resizeWrapperVM = this;\n\t\t\t\n\t function init() {\n\t // Retreive from storage;\n\t var defaultScale = $cookieStore.get('avatar-scale');\n\n\t // Make sure it's in our range\n\t if (!defaultScale || defaultScale > 6 || defaultScale < 1) {\n\t defaultScale = 3;\n\t }\n\n\t resizeWrapperVM.avatarScale = defaultScale; // Update VM with scale;\n\t }\n\n\t init();\n }\n\n /**\n * @name resizeMe\n * @description Attaches to the elements to be resized.\n * @memberOf Behavior & Attendance (probably need to place in core).\n */\n function resizeMe() {\n var directive = {\n restrict: 'A',\n scope: { avatarScale: '=' },\n link: resizeMeLink\n };\n\n function resizeMeLink(scope, element) {\n scope.$watch('avatarScale', function () {\n var widths = {\n 6: '25%',\n 5: '22%',\n 4: '19%',\n 3: '16%',\n 2: '13%',\n 1: '10%'\n };\n\n element.css({ 'width': widths[scope.avatarScale] });\n });\n }\n return directive;\n }\n\n // protect against minification\n /* @ngInject */\n resizeWrapperController.$inject = ['$cookieStore'];\n})();\n;\r\n(function () {\n 'use strict';\n\n var app = angular.module('nha.core');\n\n app.directive('overflowContainer', ['$window', '$timeout', function ($window, $timeout) {\n return {\n restrict: 'A',\n transclude: true,\n scope: {\n overflowItems: '=',\n rightBuffer: '=?',\n maxItemCount: '=?'\n },\n controller: ['$scope', '$element', '$window', function ($scope, $element, $window) {\n $scope.overflowItems = [];\n $scope.items = [];\n\n var resizeDelay = 200;\n var delayedHandler = null;\n\n var rightBuffer = ($scope.rightBuffer || 150);\n\n this.registerItem = function (item) {\n $scope.items.push(item);\n checkForOverflows();\n }\n\n this.deregisterItem = function (item) {\n _.remove($scope.items, item);\n _.remove($scope.overflowItems, item);\n }\n\n function checkForOverflows() {\n $timeout(function () {\n var sum = 0;\n _($scope.items).map(function(item, i) {\n sum += item.element.outerWidth(true);\n if (sum > ($element.innerWidth() - rightBuffer) || ($scope.maxItemCount && i > ($scope.maxItemCount - 1))) {\n if (!_.some($scope.overflowItems, item.content)) {\n $scope.overflowItems.push(item.content);\n item.element.addClass('hidden');\n }\n } else {\n _.remove($scope.overflowItems, item.content);\n item.element.removeClass('hidden');\n }\n }).value();\n });\n }\n\n angular.element($window).bind('resize', function () {\n if (delayedHandler !== null) {\n clearTimeout(delayedHandler);\n }\n \n delayedHandler = setTimeout(checkForOverflows, resizeDelay);\n });\n\n }],\n link: function (scope, el, attrs, ctrl, transclude) {\n transclude(function (clone) {\n el.append(clone);\n });\n }\n\n };\n }]);\n\n app.directive('overflowItem', function () {\n return {\n require: '^overflowContainer',\n restrict: 'A',\n scope: {\n overflowItem: '='\n },\n link: function (scope, el, attrs, overflowCtrl) {\n var item = {\n element: el,\n content: scope.overflowItem || el[0].innerText,\n hide: function() {\n el.addClass('hidden');\n },\n show: function() {\n el.removeClass('hidden');\n }\n }\n //Hide by default until registered.\n el.addClass('hidden');\n //Register the item with the container controller\n overflowCtrl.registerItem(item);\n\n scope.$on(\"$destroy\", function handleDestroyEvent() {\n overflowCtrl.deregisterItem(item);\n });\n }\n\n };\n });\n\n})();\n;\r\n(function () {\n 'use strict';\n\n var app = angular.module('nha.core');\n\n app.directive('dropPosition', function () {\n return {\n restrict: 'A',\n link: function (scope, el) {\n el.on(\"click\", function(ev) {\n var dropdownContainer = ev.currentTarget;\n var position = dropdownContainer.getBoundingClientRect().top;\n var buttonHeight = dropdownContainer.getBoundingClientRect().height;\n\n var dropdownMenu = $(dropdownContainer).find('.dropdown-menu');\n var menuHeight = dropdownMenu.outerHeight();\n\n var $win = $(window);\n\n //alert('Position: ' + position + '. MenuHeight: ' + menuHeight + '. WinHeight: ' + $win.height() + '. ButtonHeight: ' + buttonHeight + '. WindowHeight - Position: ' + ($win.height() - position) + '. ButtonHeight + MenuHeight: ' + (buttonHeight + menuHeight));\n \n if (position > menuHeight && $win.height() - position < buttonHeight + menuHeight) {\n el.addClass('dropup');\n }\n else {\n el.removeClass('dropup');\n }\n });\n }\n\n };\n });\n\n})();\n;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').directive('widthConstraint', widthConstraint);\n\n widthConstraint.$inject = [];\n\n function widthConstraint() {\n var directiveObj = {\n restrict: 'A',\n link: linkFn\n };\n\n return directiveObj;\n\n function linkFn(scope, element, attrs) {\n function setConstraints() {\n var offsetPosition = element.offset();\n element.css({\n \"min-width\": (1000 - offsetPosition.left) + 'px',\n \"max-width\": (1800 - offsetPosition.left) + 'px'\n });\n }\n\n setConstraints();\n\n scope.$on('filterPanelOpened', setConstraints);\n scope.$on('filterPanelClosed', setConstraints);\n }\n }\n})();;\r\n(function () {\n\t'use strict';\n\tangular.module('nha.core').directive('nhaTest', function () {\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\tlink: function ($scope, element, attributes) {\n\t\t\t\telement[0].setAttribute('data-cy', attributes.nhaTest);\n\t\t\t}\n\t\t}\r\n\t});\n})();;\r\n(function () {\n 'use strict';\n\n // camelCase To Human Filter\n // ---------------------\n // Converts a camelCase string to a human readable string.\n // i.e. myVariableName => My Variable Name\n\n angular.module('nha.core').filter('camelCaseToHuman', function () {\n return function (input) {\n if (input)\n return input.charAt(0).toUpperCase() + input.substr(1).replace(/[A-Z]/g, ' $&');\n else {\n return input;\n }\n\n }\n });\n\n})();;\r\nangular\n .module('nha.core')\n .filter('characters', function () {\n return function(input, chars, breakOnWord) {\n if (isNaN(chars)) return input;\n if (chars <= 0) return '';\n if (input && input.length > chars) {\n input = input.substring(0, chars);\n\n if (!breakOnWord) {\n var lastspace = input.lastIndexOf(' ');\n //get last space\n if (lastspace !== -1) {\n input = input.substr(0, lastspace);\n }\n } else {\n while (input.charAt(input.length - 1) === ' ') {\n input = input.substr(0, input.length - 1);\n }\n }\n return input + '...';\n }\n return input;\n };\n });;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core').filter('dateFilterNullable',['$filter', function ($filter) {\n\t\treturn function (input, format) {\n\t\t\tvar formattedDateString = 'N/A';\n\t\t\t\n\t\t\t/** check for input */\n\t\t\tif (input) {\n\t\t\t\t/** default the format if none set */\n\t\t\t\tif (!format) format = 'MMMM d, yyyy hh:mm a'; // September 3, 2013 7:43 AM\n\n\t\t\t\t// check to see if this is a msdate\n\t\t\t\tif (new String(input).indexOf('\\/Date') > -1) {\n\t\t\t\t\tinput = parseInt(new String(input).substr(6));\n\t\t\t\t}\n\n\t\t\t\tvar momentDate = moment(input);\n\t\t\t\tif (momentDate.isValid()) {\n\t\t\t\t\tformattedDateString = $filter('date')(new Date(input), format);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn formattedDateString;\n\t\t}\n\t}]);\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core').filter('dateTz', function () {\n return function (date, timeZone, format) {\n\n // default our format if not passed in\n if (!format) {\n format = 'MM/DD/YYYY hh:mm:ss a z';\n }\n\n if (!!date && moment.isMoment(date) && !!date.tz && !!date.tz()) {\n var zone = timeZone || date.tz();\n return date.tz(zone).format(format);\n } else {\n return moment.tz(date, timeZone).format(format);\n }\n };\n });\n})();;\r\nangular.module(\"nha.core\").filter(\"escapeSingleQuote\", function() {\r\n return function(input) {\r\n input = input.replace(/'/g, '\\\\\\'');\r\n return input;\r\n };\r\n});\r\n;\r\n(function () {\n 'use strict';\n angular.module('nha.core').filter('localTime', function () {\n return function (date) {\n return moment(date).toDate();\n };\n });\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core').filter('lowercaseTime', function () {\n return function (d) {\n // Simply replaces uppercase AM:PM timestamps with lowercase version.\n return d.toString().replace(\"AM\", \"am\").replace(\"PM\", \"pm\");\n };\n });\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core')\n\t\t.filter('militaryTo12Hour', function () {\n\t\t return function (time) {\n\t\t return moment(time, \"HH:mm:ss\").format('h:mm a');\n\t\t }\n\t\t});\n})();;\r\n(function () {\n 'use strict';\n\n\tangular.module('nha.core').filter('namecase', function () {\n\t return function (name) {\n\t if (NameCase && NameCase.checkName(name)) {\n\t return NameCase(name);\n\t } else {\n\t return name;\n\t }\n\t };\n\t});\n\n})();;\r\nangular.module('nha.core').filter('namecase', function () {\n return function (input) {\n return input ? input.toNameCase() : '';\n };\n});\n\n;\r\n(function () {\n 'use strict';\n\n angular\n .module('nha.core')\n .filter('phoneNumber', function () {\n return function (tel) {\n if (!tel) { return ''; }\n\n var value = tel.toString().trim().replace(/^\\+/, '');\n\n if (value.match(/[^0-9]/)) {\n return tel;\n }\n\n var country, city, number;\n\n switch (value.length) {\n case 10: // +1PPP####### -> C (PPP) ###-####\n country = 1;\n city = value.slice(0, 3);\n number = value.slice(3);\n break;\n\n case 11: // +CPPP####### -> CCC (PP) ###-####\n country = value[0];\n city = value.slice(1, 4);\n number = value.slice(4);\n break;\n\n case 12: // +CCCPP####### -> CCC (PP) ###-####\n country = value.slice(0, 3);\n city = value.slice(3, 5);\n number = value.slice(5);\n break;\n\n default:\n return tel;\n }\n\n if (country === 1) {\n country = '';\n }\n\n number = number.slice(0, 3) + '-' + number.slice(3);\n\n return (country + ' (' + city + ') ' + number).trim();\n };\n });\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core')\n\t\t.filter('rangeFilter', function () {\n\t\t return function (items, rangeInfo) {\n\t\t var filtered = [];\n\t\t var min = parseInt(rangeInfo.minIndex);\n\t\t var max = parseInt(rangeInfo.maxIndex);\n\n\t\t var currentIndex = 0;\n\n\t\t angular.forEach(items, function (item) {\n\t\t if (currentIndex >= min && currentIndex <= max) {\n\t\t filtered.push(item);\n\t\t }\n\n\t\t currentIndex++;\n\t\t });\n\n\t\t return filtered;\n\t\t };\n\t\t});\n})();;\r\n(function () {\n 'use strict';\n angular.module('nha.core')\n .filter('startsWithFirstOrLast', function () {\n return function (dataArray, searchText) {\n if (!dataArray) return;\n if (!searchText) return dataArray;\n var termLower = searchText.toLowerCase();\n return dataArray.filter(function(item) {\n var startsWithFirst = _.startsWith(item.firstName.toLowerCase(), termLower);\n var startsWithLast = _.startsWith(item.lastName.toLowerCase(), termLower);\n var startsWithFirstLast = _.startsWith(item.firstName.toLowerCase() + \" \" + item.lastName.toLowerCase(), termLower);\n var startsWithLastFirst = _.startsWith(item.lastName.toLowerCase() + \", \" + item.firstName.toLowerCase(), termLower);\n var startsWithLastFirst2 = _.startsWith(item.lastName.toLowerCase() + \" \" + item.firstName.toLowerCase(), termLower);\n var startsWithLastFirst3 = _.startsWith(item.lastName.toLowerCase() + \",\" + item.firstName.toLowerCase(), termLower);\n return startsWithFirst || startsWithLast || startsWithFirstLast || startsWithLastFirst || startsWithLastFirst2 || startsWithLastFirst3;\n });\n };\n });\n})();;\r\n/** Formats bound phone numbers to appropriate display based on length **/\n(function() {\n 'use strict';\n\n angular\n .module('nha.core')\n .filter('telephone', function() {\n return function(tel) {\n if (!tel) {\n return '';\n }\n\n var value = tel.toString().trim().replace(/^\\+/, '');\n\n if (value.match(/[^0-9]/)) {\n return tel;\n }\n\n var country, city, number, extension;\n if (value.length <= 10) {\n city = value.slice(0, 3);\n number = value.slice(3);\n number = number.slice(0, 3) + '-' + number.slice(3);\n return (\" (\" + city + \") \" + number).trim();\n } else {\n city = value.slice(0, 3);\n number = value.slice(3, 10);\n number = number.slice(0, 3) + '-' + number.slice(3);\n extension = value.slice(10);\n return (\" (\" + city + \") \" + number + \" ext:\" + extension).trim();\n }\n //switch (value.length) {\n // case 10: // +1PPP####### -> C (PPP) ###-####\n // country = 1;\n // city = value.slice(0, 3);\n // number = value.slice(3);\n // break;\n\n // case 11: // +CPPP####### -> CCC (PP) ###-####\n // country = value[0];\n // city = value.slice(1, 4);\n // number = value.slice(4);\n // break;\n\n // case 12: // +CCCPP####### -> CCC (PP) ###-####\n // country = value.slice(0, 3);\n // city = value.slice(3, 5);\n // number = value.slice(5);\n // break;\n\n // default:\n // return tel;\n //}\n\n //if (country == 1) {\n // country = \"\";\n //}\n\n //number = number.slice(0, 3) + '-' + number.slice(3);\n\n //return (\" (\" + city + \") \" + number).trim();\n };\n });\n})();;\r\nangular\n .module('nha.core')\n .filter('words', function () {\n return function (input, words) {\n if (isNaN(words)) return input;\n if (words <= 0) return '';\n if (input) {\n var inputWords = input.split(/\\s+/);\n if (inputWords.length > words) {\n input = inputWords.slice(0, words).join(' ') + '...';\n }\n }\n return input;\n };\n });;\r\n(function () {\n\t'use strict';\n\tangular.module('nha.core')\n\t\t.filter('yesNo', function () {\n\t\t\treturn function (text, length, end) {\n\t\t\t\tif (text) {\n\t\t\t\t\treturn 'Yes';\n\t\t\t\t}\n\t\t\t\treturn 'No';\n\t\t\t}\n\t\t});\n})();;\r\n/**\n * module-navbar.controller\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** get the angular module and add controller */\n\tangular.module('nha.core').controller('module-navbar.controller', moduleNavbarController);\n\n\t/** setup injection */\n\tmoduleNavbarController.$inject = ['$injector', 'appSettings', 'message.manager', 'businessApplicationsSvc'];\n\n\t/** implementation */\n\tfunction moduleNavbarController($injector, appSettings, messageManager, businessApplicationsSvc) {\n\t\t/** public properties */\n\t\tvar vm = this;\n\t\tvm.loading = false;\n\t\tvm.hasPortalAppLogo = true;\n\t\tvm.businessApplication = null;\n\t\tvm.businessApplicationLink = '';\n\t\tvm.maskVisible = false;\n\t\tvm.isTraining = false;\n\t\tvm.defaultConfig = {\n\t\t\t'appIcon': true,\n\t\t\t'breadcrumb': true,\n\t\t\t'miniSearch': true,\n\t\t\t'miniLauncher': true,\n\t\t\t'walkMe': true,\n\t\t\t'schoolSelector': true,\n\t\t\t'userSettings': true\n\t\t};\n\n\t\t/** public methods */\n\t\tvm.hideCallout = hideCallout;\n\n\t\t/** run init */\n\t\tinit();\n\n\t\t/** public methods implementations */\n\n\t\t/** hide the callout */\n\t\tfunction hideCallout() {\n\t\t\t/** send message */\n\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null }});\n\t\t}\n\n\t\t/** private methods */\n\n\t\t/** initialize */\n\t\tfunction init() {\n\t\t\t/** check for configuration object */\n\t\t\tif (vm.config && _.isObject(vm.config)) _.merge(vm.defaultConfig, vm.config);\n\n\t\t\t/** check for training environment */\n\t\t\tvm.isTraining = appSettings['environment'] && appSettings['environment'].toLowerCase() === 'tr';\n\n\t\t\t/** set the message receiver */\n\t\t\tmessageManager.addCallback('message', messageCheck, true);\n\n\t\t\t/** check for the portal-app-logo directive */\n\t\t\tif (!$injector.has('portalAppLogoDirective')) {\n\t\t\t\t/** show fallback app name */\n\t\t\t\tvm.hasPortalAppLogo = false;\n\n\t\t\t\t/** flip loading flag */\n\t\t\t\tvm.loading = true;\n\n\t\t\t\t/** load the business application as fallback */\n\t\t\t\tbusinessApplicationsSvc.getById(vm.moduleId).then(function(businessApplication) {\n\t\t\t\t\t/** set the business application */\n\t\t\t\t\tvm.businessApplication = businessApplication;\n\n\t\t\t\t\t/** set the business application link */\n\t\t\t\t\tvm.businessApplicationLink = appSettings[businessApplication.url];\n\n\t\t\t\t\t/** flip loading flag */\n\t\t\t\t\tvm.loading = false;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t/** receive a message */\n\t\tfunction messageCheck(message) {\n\t\t\tif (message.key && message.key === 'module-callout-mask') {\n\t\t\t\t/** set the visible flag */\n\t\t\t\tvm.maskVisible = message.value.visible;\n\n\t\t\t\t/** toggle body scrolling */\n\t\t\t\tif (message.value.visible === true) angular.element('body').addClass('module-callout-mask-open');\n\t\t\t\telse angular.element('body').removeClass('module-callout-mask-open');\n\t\t\t}\n\t\t}\n\t}\n})();;\r\n/**\n * module-navbar.directive\n * @namespace core\n */\n\n(function () {\n\t'use strict';\n\n\t/** get the angular module and add directive */\n\tangular.module('nha.core').directive('moduleNavbar', moduleNavbarDirective);\n\n\t/** injection */\n\tmoduleNavbarDirective.$inject = ['appSettings'];\n\n\t/** implementation */\n\tfunction moduleNavbarDirective(appSettings) {\n\t\t/** return directive */\n\t\treturn {\n\t\t\trestrict: 'E',\n\t\t\treplace: true,\n\t\t\ttransclude: true,\n\t\t\ttemplateUrl: appSettings.coreWebRootUrl + 'app/components/module-navbar/module-navbar.directive.html',\n\t\t\tcontroller: 'module-navbar.controller',\n\t\t\tcontrollerAs: 'moduleNavbarCtrl',\n\t\t\tbindToController: {\n\t\t\t\tmoduleId: '=',\n\t\t\t\tsettingKey: '=',\n\t\t\t\tschoolSelectorOnChange: '=',\n\t\t\t\tconfig: '='\n\t\t\t},\n\t\t\tscope: {}\n\t\t};\n\t}\n})();;\r\n(function () {\n\t'use strict';\n\n\tangular.module('nha.core').component('maintenanceNotification', {\n\t\tcontroller: maintenanceNotificationController\n\t});\n\n\tmaintenanceNotificationController.$inject = ['$location', 'appSettings', 'ipCookie', 'toastr'];\n\n\tfunction maintenanceNotificationController($location, appSettings, ipCookie, toastr) {\n\t\tvar ctrl = this;\n\n\t\tctrl.$onInit = function () {\n\t\t\tif (appSettings['maintenanceNotification']) {\n\t\t\t\tshowMaintenanceNotification();\n\t\t\t}\n\t\t};\n\n\t\tfunction showMaintenanceNotification() {\n\t\t\tvar notification = parseAppSetting();\n\n\t\t\tif (notification && !hasDismissed(notification.id) && moment().isBefore(notification.date.endOf('day'))) {\n\t\t\t\ttoastr.warning(notification.message, notification.title, {\n\t\t\t\t\tcloseButton: true,\n\t\t\t\t\ttimeOut: 0,\n\t\t\t\t\textendedTimeOut: 0,\n\t\t\t\t\tonHidden: function () {\n\t\t\t\t\t\tvar hostnameParts = $location.host().split('.');\n\t\t\t\t\t\tvar domainName = $location.host();\n\t\t\t\t\t\tif (hostnameParts.length > 2) {\n\t\t\t\t\t\t\tdomainName = hostnameParts[hostnameParts.length - 2] + '.' + hostnameParts[hostnameParts.length - 1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tipCookie('maintenanceNotificationDismissed', notification.id, {\n\t\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\t\tsecure: true,\n\t\t\t\t\t\t\tdomain: domainName,\n\t\t\t\t\t\t\texpires: 24,\n\t\t\t\t\t\t\texpirationUnit: 'hours'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction parseAppSetting() {\n\t\t\ttry {\n\t\t\t\tvar notification = JSON.parse(appSettings['maintenanceNotification']);\n\t\t\t\tif (notification.date && notification.message && notification.title) {\n\t\t\t\t\tnotification.date = moment(notification.date);\n\t\t\t\t\treturn notification;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tfunction hasDismissed(id) {\n\t\t\tvar dismissedID = ipCookie('maintenanceNotificationDismissed');\n\t\t\tconsole.log(dismissedID);\n\t\t\treturn dismissedID && dismissedID === id;\n\t\t}\n\t}\n})();\n;\r\n(function () {\n 'use strict';\n\nangular.module('nha.core').controller('NavbarCtrl', NavbarCtrl);\n\nNavbarCtrl.$inject = ['$scope', '$location', '$window', 'appSettings', 'userContextService', 'cache', '$cookies'];\n\nfunction NavbarCtrl($scope, $location, $window, appSettings, userContextService, cache, $cookies) {\n\n $scope.isActive = function(route) {\n return route === $location.path();\n };\n\n $scope.getCurrentUser = function() {\n var currentContext = userContextService.getUserContext(); \n\n return currentContext;\n }\n\n function clearAllCookies() {\n var cookies = $cookies.getAll();\n\n _.forEach(cookies, function (v, k) {\n $cookies.remove(k);\n });\n }\n\n $scope.signOut = function() {\n var signOutUrl = appSettings.adfsBaseUrl;\n var redirectUrl = appSettings.moduleWebRootUrl;\n\n clearAllCookies();\n\n cache.clearAll();\n\n $window.location.href = signOutUrl + '?wa=wsignout1.0' + '&wreply=' + redirectUrl;\n }\n }\n\n})();;\r\n(function() {\n 'use strict';\n\n angular.module(\"nha.core\")\n .directive(\"coreNavbar\", [\n 'appSettings', function(appSettings) {\n return {\n restrict: \"AEC\",\n scope: {\n moduleId: \"@moduleid\",\n\t\t\t\t\t\tschoolSelectorOnChange: '='\n },\n controller: \"CoreNavbarCtrl\",\n templateUrl: appSettings.coreWebRootUrl + \"app/components/core-navbar/coreNavbar.html\",\n link: function(scope, element, attribute) {\n\n }\n };\n }\n ])\n .controller(\"CoreNavbarCtrl\", [\n '$scope', '$location', '$window', '$sce', 'appSettings', 'userContextService', '$rootScope', 'businessApplicationsSvc', 'staffService',\n function ($scope, $location, $window, $sce, appSettings, userContextService, $rootScope, businessApplicationsSvc, staffService) {\n //console.log('navbar controller initialized');\n $scope.appCalloutActive = false;\n $scope.maskActive = false;\n $scope.applications = [];\n $scope.activeModule = null;\n $scope.profileDropDownLabel = 'Loading Profile Info...';\n $scope.isTrainingEnv = appSettings['environment'] && String(appSettings['environment']).toLowerCase() === 'tr';\n\n $scope.isActive = function(route) {\n return route === $location.path();\n };\n\n $scope.getActiveModule = function() {\n userContextService.ensureUserContext().then(function(context) {\n businessApplicationsSvc.getById($scope.moduleId).then(function (data) {\n log(data)\n $scope.activeModule = data;\n $scope.activeModuleRootUrl = $sce.trustAsResourceUrl(appSettings[$scope.activeModule.url]);\n });\n });\n };\n $scope.getActiveModule();\n\n //TODO: consider using the core avatar.directive.js\n $scope.getStaffImage = function() {\n userContextService.ensureUserContext().then(function(context) {\n staffService.getAvatar(context['http://schemas.mynha.com/SIS/Core/StaffID']).then(function(image) {\n $scope.staffImage = image;\n });\n });\n }\n $scope.getStaffImage();\n\n $scope.$on(\"nha:portal:applicationResults\", function(event, data) {\n $scope.applications = data;\n });\n\n $scope.$on(\"nha:core:callout-active\", function(event, data) {\n $scope.maskActive = true;\n });\n\n $scope.$on(\"nha:core:callout-inactive\", function (event, data) {\n $scope.maskActive = false;\n });\n\n $scope.getCurrentUser = function() {\n var currentContext = userContextService.getUserContext();\n\n return currentContext;\n };\n\n $scope.toggleSearch = function() {\n $rootScope.$broadcast('toggleSearch');\n $scope.appCalloutActive = false;\n };\n\n $scope.toggleMask = function() {\n $rootScope.$broadcast('nha:core:callout-active', 'mask');\n $scope.maskActive = false;\n }\n\n }\n ]);\n})();;\r\n(function() {\n \"use strict\";\n\n\tvar userSessionService = new myNHA.UserSessionService();\n\tvar accountService = myNHA.GetApiService('Account', 'AccountService');\n\n\tvar _appSettings = myNHA.appSettings;\n\tvar IMPERSONATION_COOKIE = _appSettings.environment + '-mynha-impersonation';\n\n angular.module(\"nha.core\")\n .directive(\"portalUserSettings\", [\"appSettings\", function(appSettings) {\n return {\n restrict: 'AEC',\n scope: {maskVisible:'='},\n controller: \"PortalUserSettingsCtrl\",\n templateUrl: appSettings.coreWebRootUrl + 'app/components/user-settings/userSettingsTemplate.html'\n };\n }])\n .controller(\"PortalUserSettingsCtrl\", [\n \"$scope\", 'userContextService', 'dataSecurityService', 'appSettings', '$rootScope', '$cookies', 'ipCookie', '$location', 'message.manager', 'uiAlertService', function ($scope, userContextService, dataSecurityService, appSettings, $rootScope, $cookies, ipCookie, $location, messageManager, uiAlertService) {\n\t\t\t\t$scope.search = { username: '' };\n\t\t\t\t$scope.canImpersonate = false;\n\t\t\t\t$scope.isImpersonating = Cookies.get(IMPERSONATION_COOKIE) ? true : false;\n\t\t\t\t$scope.impersonationUser = Cookies.get(IMPERSONATION_COOKIE);\n $scope.userSettingsCalloutActive = false;\n $scope.calloutName = \"settingsCallout\";\n\t\t\t\t$scope.staffID = null;\n $scope.userId = null;\n $scope.userTitle = '';\n\n\t\t\t\tvar _impersonationCheckTimer = null;\n\n $scope.toggleUserSettings = function (event, data) {\n $scope.userSettingsCalloutActive = $scope.userSettingsCalloutActive ? false : true;\n if ($scope.userSettingsCalloutActive) {\n $rootScope.$broadcast('nha:core:callout-active', $scope.calloutName);\n\t\t\t\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': true, 'window': 'module-user-settings' }});\n } else {\n $rootScope.$broadcast('nha:core:callout-inactive', $scope.calloutName);\n\t\t\t\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null }});\n }\n };\n\n $scope.getCurrentUser = function () {\n\t\t\t\t\tvar currentContext = userContextService.getUserContext();\n return currentContext;\n };\n\n $scope.$on(\"nha:core:callout-active\", function (event, data) {\n if (data !== $scope.calloutName) {\n $scope.userSettingsCalloutActive = false;\n }\n\n });\n\n $scope.close = function() {\n messageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null } });\n };\n\n\t\t\t\t$scope.impersonateUser = function() {\n\t\t\t\t\tconst username = $scope.search.username;\n\n\t\t\t\t\tif (!username) {\n\t\t\t\t\t\tuiAlertService.error('Please enter a username to impersonate');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username !== null && username === window.userContext.unique_name) {\n\t\t\t\t\t\tuiAlertService.error('Why would you want to impersonate yourself...? Come on man... ');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username !== null) {\n\t\t\t\t\t\tuiAlertService.info('Searching for user ' + username + '...');\n\n\t\t\t\t\t\taccountService.getByUsername(username).then(function(account) {\n\t\t\t\t\t\t\tclearAllCookies(userSessionService.getDomain());\n\n\t\t\t\t\t\t\tCookies.set(IMPERSONATION_COOKIE, username, { path: '/', secure: true, domain: userSessionService.getDomain() });\n\t\t\t\t\t\t\tuiAlertService.success('About to start impersonation session as ' + username + '...');\n\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t\t}, function(error) {\n\t\t\t\t\t\t\tuiAlertService.error('Username not found');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t$scope.endImpersonationSession = function() {\n\t\t\t\t\tclearAllCookies(userSessionService.getDomain());\n\n\t\t\t\t\tCookies.remove(IMPERSONATION_COOKIE, { path: '/', secure: true, domain: userSessionService.getDomain() });\n\t\t\t\t\tuiAlertService.success('Ending impersonation session for ' + $scope.impersonationUser + '...');\n\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}, 2000);\n\t\t\t\t};\n\n function clearAllCookies(domainName) {\n var cookies = $cookies.getAll();\n\n\t\t\t\t\t_.forEach(cookies, function (v, k) {\n\t\t\t\t\t\tif (!k.startsWith(myNHA.appSettings.environment)) {\n\t\t\t\t\t\t\tipCookie.remove(k, { path: '/', domain: domainName });\n\t\t\t\t\t\t}\n });\n }\n\n $scope.signout = function() {\n messageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null } });\n\n\t\t\t\t\tvar signOutUrl = appSettings.adfsBaseUrl;\n var redirectUrl = appSettings.moduleWebRootUrl;\n var hostnameParts = $location.host().split('.');\n var domainName = $location.host();\n if (hostnameParts.length > 2) {\n domainName = hostnameParts[hostnameParts.length-2] + '.' + hostnameParts[hostnameParts.length-1];\n }\n\n clearAllCookies(domainName);\n\n\t\t\t\t\tuserSessionService.logout();\n\n //$window.location.href = signOutUrl + '?wa=wsignout1.0' + '&wreply=' + redirectUrl;\n };\n\n\n function init() {\n\t\t\t\t\tuserContextService.ensureUserContext().then(function(context) {\n\t\t\t\t\t\t$scope.staffID = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n\t\t\t\t\t\t$scope.userId = context['http://schemas.mynha.com/Savyint/UserID'];\n\t\t\t\t\t\t$scope.userTitle = context['http://schemas.mynha.com/ILM/Title'] !== '' ? context['http://schemas.mynha.com/ILM/Title'] : 'No title Found';\n\n\t\t\t\t\t\t$scope.canImpersonate = dataSecurityService.isAdminUser(window.userContext) && ['dev', 'ci', 'qa'].includes(appSettings.environment);\n\n\t\t\t\t\t\twatchForImpersonationStartEnd();\n });\n\n messageManager.addCallback('message', messageCheck, true);\n }\n\n\t\t\t\t/** receive a message */\n\t\t\t\tfunction messageCheck(message) {\n\t\t\t\t\tif (message.key && message.key === 'module-callout-mask' && (message.value.visible === false || (message.value.visible === true && message.value.window !== 'module-user-settings'))) {\n\t\t\t\t\t\t$scope.userSettingsCalloutActive = false;\n\t\t\t\t\t\t$scope.maskVisible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction watchForImpersonationStartEnd() {\n\t\t\t\t\tif (!$scope.canImpersonate) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\twindow.clearInterval(_impersonationCheckTimer);\n\t\t\t\t\t_impersonationCheckTimer = window.setInterval(function() {\n\t\t\t\t\t\tvar isImpersonatingNow = Cookies.get(IMPERSONATION_COOKIE) ? true : false;\n\n\t\t\t\t\t\tif (($scope.isImpersonating && !isImpersonatingNow) || (!$scope.isImpersonating && isImpersonatingNow)) {\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\n init();\n }\n ]);\n})();;\r\n'use strict';\n\nangular.module('nha.core')\n .factory('Modal', function ($rootScope, $uibModal) {\n /**\n * Opens a modal\n * @param {Object} scope - an object to be merged with modal's scope\n * @param {String} modalClass - (optional) class(es) to be applied to the modal\n * @return {Object} - the instance $uibModal.open() returns\n */\n function openModal(scope, modalClass) {\n var modalScope = $rootScope.$new();\n scope = scope || {};\n modalClass = modalClass || 'modal-default';\n\n angular.extend(modalScope, scope);\n\n return $uibModal.open({\n templateUrl: '/core/components/modal/modal.html',\n windowClass: modalClass,\n scope: modalScope\n });\n }\n\n // Public API here\n return {\n\n /* Confirmation modals */\n confirm: {\n\n /**\n * Create a function to open a delete confirmation modal (ex. ng-click='myModalFn(name, arg1, arg2...)')\n * @param {Function} del - callback, ran when delete is confirmed\n * @return {Function} - the function to open the modal (ex. myModalFn)\n */\n delete: function(del) {\n del = del || angular.noop;\n\n /**\n * Open a delete confirmation modal\n * @param {String} name - name or info to show on modal\n * @param {All} - any additional args are passed staight to del callback\n */\n return function() {\n var args = Array.prototype.slice.call(arguments),\n name = args.shift(),\n deleteModal;\n\n deleteModal = openModal({\n modal: {\n dismissable: true,\n title: 'Confirm Delete',\n html: '

Are you sure you want to delete ' + name + ' ?

',\n buttons: [{\n classes: 'btn-danger',\n text: 'Delete',\n click: function(e) {\n deleteModal.close(e);\n }\n }, {\n classes: 'btn-default',\n text: 'Cancel',\n click: function(e) {\n deleteModal.dismiss(e);\n }\n }]\n }\n }, 'modal-danger');\n\n deleteModal.result.then(function(event) {\n del.apply(event, args);\n });\n };\n }\n }\n };\n });\n;\r\n(function () {\n 'use strict';\n angular.module(\"nha.core\")\n .directive(\"miniAppLauncher\", [\"appSettings\", function (appSettings) {\n return {\n restrict: \"AEC\",\n scope: {\n appCalloutActive: '=',\n moduleId: \"@moduleid\"\n },\n controller: \"MiniAppLauncherCtrl\",\n templateUrl: appSettings.coreWebRootUrl + \"app/components/app-launcher/miniAppLauncher.html\",\n link: function (scope, element, attribute) {\n \n }\n };\n }])\n .controller(\"MiniAppLauncherCtrl\", [\n '$scope', '$location', '$window', 'appSettings', 'userContextService', '$rootScope', \"businessApplicationsSvc\", \"$filter\", \"$interval\", \"apiSecurityService\",\"ipCookie\", function ($scope, $location, $window, appSettings, userContextService, $rootScope, businessApplicationsSvc, $filter, $interval, apiSecurityService, ipCookie) {\n $scope.calloutName = \"appCallout\";\n $scope.applications = [];\n $scope.JWTIsValid = true;\n $scope.networkFailed = false;\n\n $scope.isActive = function (route) {\n return route === $location.path();\n };\n\n $scope.getApplications = function () {\n userContextService.ensureUserContext().then(function (context) {\n businessApplicationsSvc.getForUser().then(function (data) {\n $scope.dataLoading = false;\n var sortedData = $filter('orderBy')(data, 'applicationName', false);\n $scope.applications = _.without(sortedData, _.find(sortedData, { businessApplicationID: parseInt($scope.moduleId) }));\n });\n });\n };\n \n $scope.launchApplication = function (path) {\n //$scope.appCalloutActive = $scope.appCalloutActive ? false : true;\n $scope.toggleAppCallout();\n $window.open(appSettings[path]);\n };\n\n $scope.toggleAppCallout = function (event) {\n if (event) {\n event.stopPropagation();\n }\n \n $scope.appCalloutActive = $scope.appCalloutActive ? false : true;\n if ($scope.appCalloutActive) {\n $rootScope.$broadcast('nha:core:callout-active', $scope.calloutName);\n } else {\n $rootScope.$broadcast('nha:core:callout-inactive', $scope.calloutName);\n }\n };\n\n $scope.$on('nha:core:callout-active', function (event, data) {\n if (data !== $scope.calloutName) {\n $scope.appCalloutActive = false;\n }\n });\n\n $scope.init = function () {\n $scope.getApplications();\n $scope.$on('nha:core:tokenUpdated', function(event, data) {\n $scope.JWTIsValid = true;\n //log('JWT is valid');\n });\n $scope.$on('nha:core:tokenExpired', function (event, data) {\n $scope.JWTIsValid = false;\n //log('JWT is NOT Valid');\n });\n }\n $scope.init();\n\n }\n ]);\n})();;\r\n(function () {\n \"use strict\";\n\n angular.module(\"nha.core\")\n .directive(\"schoolSelector\", [\"appSettings\", function (appSettings) {\n return {\n restrict: \"AEC\",\n scope: {\n\t\t\t\t\tmaskVisible: '=',\n\t\t\t\t\tonChange: '='\n\t\t\t\t},\n\t\t\t\tcontroller: \"SchoolSelectorCtrl\",\n templateUrl: appSettings.coreWebRootUrl + \"app/components/school-selector/schoolSelector.html\",\n link: function (scope, el, attr) {\n\n }\n };\n }])\n .controller(\"SchoolSelectorCtrl\", [\n \"$scope\", \"schoolService\", 'userContextService', 'ipCookie', 'appSettings', '$window', '$rootScope', '$location', 'stateRepository', 'message.manager', function ($scope, schoolService, userContextService, ipCookie, appSettings, $window, $rootScope, $location, stateRepository, messageManager) {\n $scope.schoolSelectorCalloutActive = false;\n $scope.calloutName = \"schoolCallout\";\n $scope.schools = [];\n $scope.defaultSchoolForUser = null;\n $scope.selectedSchools = [];\n $scope.schoolFilter = \"\";\n $scope.defaultToAllSchools = false;\n $scope.defaultSchoolCookieName = null;\n $scope.moduleDefaultSchoolCookieName = 'filter-School';\n $scope.noCourseLoaded = true;\n\n function init() {\n userContextService.ensureUserContext().then(function (context) {\n $scope.defaultSchoolCookieName = 'nha.core.user-default-school.' + context['http://schemas.mynha.com/Savyint/UserID'];\n var defaultSchool = ipCookie($scope.defaultSchoolCookieName) != null ? ipCookie($scope.defaultSchoolCookieName) : null;\n if (defaultSchool !== null) {\n $scope.defaultSchoolForUser = defaultSchool;\n $scope.setSelectedSchoolLabel(defaultSchool ? defaultSchool.shortName : '');\n } else {\n $scope.setSelectedSchoolLabel(\"Loading your schools...\");\n }\n $scope.getSchools();\n });\n\n\t\t\t\t\t/** watch for message */\n\t\t\t\t\tmessageManager.addCallback('message', messageCheck, true);\n }\n\n init();\n\n\t\t\t\t/** receive a message */\n\t\t\t\tfunction messageCheck(message) {\n\t\t\t\t\tif (message.key && message.key === 'module-callout-mask' && (message.value.visible === false || (message.value.visible === true && message.value.window !== 'module-navbar-school-selector'))) {\n\t\t\t\t\t\t$scope.schoolSelectorCalloutActive = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n var _defaultSchoolCookie = ipCookie($scope.defaultSchoolCookieName);\n\n //log(\"SCHOOL-SELECTOR DIRECTIVE, DEFAULT SCHOOL COOKIE VALUE: \", _defaultSchoolCookie);\n if (!_defaultSchoolCookie) {\n $scope.defaultToAllSchools = true;\n };\n\n $scope.$on(\"filterChange\", function (event, data) {\n if (data.selectedFilters.School) {\n if (data.selectedFilters.School.items[0].id !== $scope.defaultSchoolForUser.schoolID) {\n\n var school = _.find($scope.schools, function (school) {\n return school.schoolID === data.selectedFilters.School.items[0].id;\n });\n\n\n $scope.setUserDefaultSchool(school);\n }\n }\n });\n\n //hook to sync the selected school with the master scheduling course the user is viewing.....could be different if the user\n //used a direct link (versus browsing through courses/teachers list) to access the course.\n $scope.$on('master-scheduling-course-loaded', function (event, data) {\n //log('master-scheduling-course-loaded', data);\n $scope.noCourseLoaded = false;\n if (data.schoolID !== $scope.defaultSchoolForUser.schoolID) {\n var school = _.find($scope.schools, function (school) {\n return school.schoolID === data.schoolID;\n });\n\n\n $scope.setUserDefaultSchool(school);\n log('master-scheduling-course-loaded - changed school', school);\n }\n });\n\n //when we load a course in master scheduling, we need to block changes in the selected school as\n //these are hooked into filters, which can cause invalid results (like showing rosters for a school\n //that differs from the course school).\n $scope.$on('master-scheduling-course-unloaded', function (event, data) {\n log('master-scheduling-course-unloaded');\n $scope.noCourseLoaded = true;\n });\n\n // sets the user's default school selection\n $scope.setUserDefaultSchool = function (value) {\n var hostnameParts = $location.host().split('.');\n var domainName = $location.host();\n if (hostnameParts.length > 2) {\n domainName = hostnameParts[hostnameParts.length-2] + '.' + hostnameParts[hostnameParts.length-1];\n }\n\n ipCookie($scope.defaultSchoolCookieName, value, { domain: domainName, path: '/' });\n ipCookie($scope.moduleDefaultSchoolCookieName, value.schoolID, { domain: domainName, path: '/' });\n\n $scope.defaultSchoolForUser = value;\n $rootScope.$broadcast('nha:core:default-school-changed', value);\n\n\t\t\t\t\tif ($scope.onChange) $scope.onChange(value);\n $scope.defaultToAllSchools = false;\n $scope.setSelectedSchoolLabel(value ? value.shortName : '');\n\n $scope.schoolSelectorCalloutActive = false;\n $rootScope.$broadcast('nha:core:callout-inactive', $scope.calloutName);\n\t\t\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null } });\n };\n\n //is the school passed the user's default selection?\n $scope.isDefaultSchool = function (schoolId) {\n var retVal = false;\n var defaultsCookie = ipCookie($scope.defaultSchoolCookieName);\n if (defaultsCookie != null) {\n if (defaultsCookie.hasOwnProperty('schoolID')) {\n retVal = defaultsCookie ? defaultsCookie.schoolID === schoolId : false;\n }\n }\n return retVal;\n };\n\n $scope.getCurrentUser = function () {\n var currentContext = userContextService.getUserContext();\n return currentContext;\n };\n\n $scope.$on(\"nha:core:callout-active\", function (event, data) {\n if (data !== $scope.calloutName) {\n $scope.schoolSelectorCalloutActive = false;\n }\n\n });\n\n $scope.getSchools = function () {\n\n userContextService.ensureUserContext().then(function (context) {\n stateRepository.getAll().then(function(states) {\n schoolService.getSchoolsForUser().then(function (data) {\n //log('SCHOOLS: ', data);\n\n if (!Array.isArray(data)) {\n $scope.schools.push(data); // there is only one school, so add it\n $scope.setSelectedSchoolLabel(data ? data.shortName : '');\n } else if (data.length === 0) {\n $scope.setSelectedSchoolLabel(\"No schools found!\");\n } else {\n $scope.schools = _.sortBy(data, function(item) {\n return item.shortName;\n });\n }\n\n mergeStatesAndSchools($scope.schools, states, 'stateID');\n\n //TODO: maybe return a promise or use a callback instead of this....\n if ($scope.defaultSchoolForUser === null) {\n var defaultSchool = _.find($scope.schools, 'isPrimary') || $scope.schools[0];\n\n $scope.setUserDefaultSchool(defaultSchool);\n }\n });\n });\n });\n };\n\n //This could probably be done at the repository level\n function mergeStatesAndSchools(arr1, arr2, prop) {\n _.each(arr2, function (arr2obj) {\n var arr1obj = _.filter(arr1, function (arr1obj) {\n return arr1obj[prop] === arr2obj[prop];\n });\n\n if (arr1obj) {\n _.each(arr1obj, function(school) {\n _.extend(school, arr2obj);\n });\n }\n });\n }\n\n $scope.setSelectedSchoolLabel = function(label) {\n $scope.profileDropDownLabel = label;\n };\n\n $scope.toggleSchoolSelector = function () {\n\n if ($scope.noCourseLoaded) {\n $scope.schoolFilter = \"\";\n $scope.schoolSelectorCalloutActive = $scope.schoolSelectorCalloutActive ? false : true;\n if ($scope.schoolSelectorCalloutActive) {\n $rootScope.$broadcast('nha:core:callout-active', $scope.calloutName);\n\t\t\t\t\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': true, 'window': 'module-navbar-school-selector' } });\n } else {\n $rootScope.$broadcast('nha:core:callout-inactive', $scope.calloutName);\n\t\t\t\t\t\t\tmessageManager.setData('message', { 'key': 'module-callout-mask', 'value': { 'visible': false, 'window': null } });\n }\n }\n\n };\n\n }\n ]);\n})();;\r\n(function () {\n 'use strict';\n\n angular.module('nha.core').controller('BusinessResponseModalCtrl', BusinessResponseModalCtrl);\n\n BusinessResponseModalCtrl.$inject = ['$scope', '$uibModalInstance', 'displayModal'];\n\n function BusinessResponseModalCtrl($scope, $uibModalInstance, displayModal) {\n\n $scope.displayModal = displayModal;\n log('BusinessResponseModalCtrl->displayModal', $scope.displayModal);\n\n function businessResponseHasOnlyWarnings() {\n log('businessResponseHadOnlyWarnings -> displayModal', $scope.displayModal);\n if ($scope.displayModal.businessResponse && $scope.displayModal.businessResponse.operationResult && !$scope.displayModal.businessResponse.operationResult.exception) {\n\n // get all of our failed rules\n var rules = _.filter($scope.displayModal.businessResponse.operationResult.rules, function (r) {\n return r.criteriaMet !== true;\n });\n\n // are their any warnings?\n var warningRules = _.filter(rules, function (r) {\n return r.ruleSeverity === 'Warning';\n });\n\n // if the total rules and the warning rules match, show the warning footer\n return (warningRules.length === rules.length);\n }\n\n return false;\n }\n\n $scope.showWarningFooter = function () {\n log('showWarningFooter -> displayModal', $scope.displayModal);\n return !$scope.displayModal.checkboxWarning && businessResponseHasOnlyWarnings();\n\n }; \n\n $scope.showCheckboxWarningFooter = function () {\n log('showCheckboxWarningFooter -> displayModal', $scope.displayModal);\n return $scope.displayModal.checkboxWarning && businessResponseHasOnlyWarnings();\n\n }\n\n $scope.overrideWarning = function() {\n $uibModalInstance.close({ ignoreWarnings: true });\n }\n\n $scope.closeModal = function () {\n $uibModalInstance.dismiss();\n }\n }\n\n})();\n;\r\nangular.module('module-sliding-sidebar', [])\n\n.directive('moduleSlidingSidebar', ['$document', '$timeout', '$compile',\n function ($document, $timeout, $compile) {\n var defaults = {};\n\n return {\n restrict: 'EAC',\n transclude: false,\n scope: {\n mssOpen: '=?',\n mssAutoClose: '=?',\n mssSpeed: '@',\n mssClass: '@',\n mssSize: '@',\n mssSqueeze: '@',\n mssCloak: '@',\n mssPush: '@',\n mssContainer: '@',\n mssKeyListener: '@',\n mssBodyClass: '@',\n mssModuleId: '@',\n mssStudentId: '@'\n },\n link: function ($scope, el, attrs) {\n\n /* Inspect */\n var param = {};\n\n param.speed = $scope.mssSpeed || '0.5';\n param.size = $scope.mssSize || '300px';\n param.zindex = 1000; // Override with custom CSS\n param.className = $scope.mssClass || 'ng-pageslide';\n param.cloak = $scope.mssCloak && $scope.mssCloak.toLowerCase() == 'false' ? false : true;\n param.squeeze = Boolean($scope.mssSqueeze) || false;\n param.push = Boolean($scope.mssPush) || false;\n param.container = $scope.mssContainer || false;\n param.keyListener = Boolean($scope.mssKeyListener) || false;\n param.bodyClass = $scope.mssBodyClass || false;\n param.moduleId = $scope.mssModuleId || 0;\n param.studentId = $scope.mssStudentId || null;\n\n el.addClass(param.className);\n el.addClass('vertical-stretch-minus-header-pixels');\n\n /* DOM manipulation */\n\n var content = null;\n var slider = null;\n var openClose = null;\n var body = param.container ? document.getElementById(param.container) : document.body;\n\n // TODO verify that we are meaning to use the param.className and not the param.bodyClass\n\n function setBodyClass(value){\n if (param.bodyClass) {\n var bodyClass = param.className + '-body';\n var bodyClassRe = new RegExp(bodyClass + '-closed|' + bodyClass + '-open');\n body.className = _.trim(body.className.replace(bodyClassRe, ''));\n body.className += ' ' + bodyClass + '-' + value;\n }\n }\n\n setBodyClass('closed');\n\n slider = el[0];\n \n //open/close tag\n\n\n //content\n content = angular.element(slider.children);\n\n /* Append */\n body.appendChild(slider);\n\n /* Style setup */\n slider.style.zIndex = param.zindex;\n //slider.style.position = param.container !== false ? 'absolute' : 'fixed';\n slider.style.position = 'absolute';\n slider.style.width = 0;\n slider.style.height = 0;\n //slider.style.overflow = 'hidden';\n slider.style.transitionDuration = param.speed + 's';\n slider.style.webkitTransitionDuration = param.speed + 's';\n slider.style.transitionProperty = 'width, height';\n\n if (param.squeeze) {\n body.style.position = 'absolute';\n body.style.transitionDuration = param.speed + 's';\n body.style.webkitTransitionDuration = param.speed + 's';\n body.style.transitionProperty = 'top, bottom, left, right';\n }\n \n slider.style.height = attrs.mssCustomHeight || 'calc(100% - ' + attrs.mssCustomTop || '44px' + ')';\n slider.style.top = attrs.mssCustomTop || '0px';\n slider.style.bottom = attrs.mssCustomBottom || '0px';\n slider.style.right = attrs.mssCustomRight || '0px';\n \n $scope.toggle = function () {\n $scope.mssOpen = !$scope.mssOpen;\n }\n /* Closed */\n function mssClose(slider, param) {\n if (slider && slider.style.width !== 0) {\n //if (param.cloak) content.css('display', 'none');\n slider.style.width = '0px';\n\n _.each(slider.children, function (element) {\n element.style.display = 'none';\n });\n\n if (param.squeeze) body.style.right = '0px';\n if (param.push) {\n body.style.top = '2px';\n body.style.right = '0px';\n body.style.left = '0px';\n }\n \n }\n $scope.mssOpen = false;\n\n if (param.keyListener) {\n $document.off('keydown', keyListener);\n }\n\n setBodyClass('closed');\n }\n\n /* Open */\n function mssOpen(slider, param) {\n if (slider.style.width !== 0) {\n \n slider.style.width = param.size;\n if (param.squeeze) body.style.right = param.size;\n if (param.push) {\n body.style.right = param.size;\n body.style.left = '-' + param.size;\n }\n \n $timeout(function() {\n if (param.cloak) content.css('display', 'block');\n }, (param.speed * 1000));\n\n $scope.mssOpen = true;\n if (param.keyListener) {\n $document.on('keydown', keyListener);\n }\n\n setBodyClass('open');\n body.style.position = 'absolute';\n body.style.width = '100%';\n }\n }\n\n function isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n }\n\n /*\n * Close the sidebar if the 'esc' key is pressed\n * */\n\n function keyListener(e) {\n var ESC_KEY = 27;\n var key = e.keyCode || e.which;\n\n if (key === ESC_KEY) {\n mssClose(slider, param);\n }\n }\n\n /*\n * Watchers\n * */\n\n $scope.$watch('mssOpen', function(value) {\n if (!!value) {\n mssOpen(slider, param);\n } else {\n mssClose(slider, param);\n }\n });\n\n $scope.$watch('mssSize', function(newValue, oldValue) {\n if (oldValue !== newValue) {\n param.size = newValue;\n mssOpen(slider, param);\n }\n });\n\n /*\n * Events\n * */\n\n $scope.$on('$destroy', function () {\n body.removeChild(slider);\n });\n\n if ($scope.mssAutoClose) {\n $scope.$on('$locationChangeStart', function() {\n mssClose(slider, param);\n });\n $scope.$on('$stateChangeStart', function() {\n mssClose(slider, param);\n });\n\n }\n }\n };\n }\n]);\n;\r\n(function () {\n\t'use strict';\n\n\t/** define component */\n\tangular.module('nha.core').component('smallCalendar', {\n\t\ttemplateUrl: ['appSettings', function(appSettings){\n\t\t\treturn appSettings.coreWebRootUrl + 'app/directives/small-calendar/small-calendar.component.html'\n\t\t}],\n\t\tcontroller: CalendarController,\n\t\tbindings: {\n\t\t\tselected: '=?',\n\t\t\tevents: '=?',\n\t\t\tisSelected: '=?',\n\t\t\tonSelect: '=?'\n\t\t}\n\t});\n\n\t/** setup injection for the controller */\n\tCalendarController.$inject = [];\n\n\t/** define controller */\n\tfunction CalendarController() {\n\t\t/** get this */\n\t\tvar ctrl = this;\n\n\t\t/** public properties */\n\t\tctrl.today = removeTime(moment());\n\t\tctrl.selected = ctrl.selected || moment();\n\t\tctrl.month = ctrl.selected.clone();\n\t\tctrl.weeks = [];\n\t\tctrl.events = ctrl.events || [];\n\n\t\t/** remove time from the selected day */\n\t\tctrl.selected = removeTime(ctrl.selected);\n\n\t\t/** public methods */\n\t\tctrl.select = select;\n\t\tctrl.next = next;\n\t\tctrl.prev = prev;\n\t\tctrl.goToToday = goToToday;\n\t\tctrl.isSelected = ctrl.isSelected || isSelected;\n\n\t\t/** run init */\n\t\tinit();\n\n\t\t/** public method implementations */\n\n\t\t/** select a day */\n\t\tfunction select(day) {\n\t\t\tctrl.selected = day.date;\n\t\t\tif (ctrl.onSelect) ctrl.onSelect(day);\n\t\t}\n\n\t\t/** go to next month */\n\t\tfunction next() {\n\t\t\tvar next = ctrl.month.clone();\n\t\t\tremoveTime(next.month(next.month()+1).date(1));\n\t\t\tctrl.month.month(ctrl.month.month()+1);\n\t\t\tbuildMonth(next, ctrl.month);\n\t\t}\n\n\t\t/** go to previous month */\n\t\tfunction prev() {\n\t\t\tvar previous = ctrl.month.clone();\n\t\t\tremoveTime(previous.month(previous.month()-1).date(1));\n\t\t\tctrl.month.month(ctrl.month.month()-1);\n\t\t\tbuildMonth(previous, ctrl.month);\n\t\t}\n\n\t\t/** go to today */\n\t\tfunction goToToday() {\n\t\t\tctrl.today = removeTime(moment());\n\t\t\tctrl.selected = removeTime(ctrl.selected || moment());\n\t\t\tctrl.month = ctrl.selected.clone();\n\t\t\tinit();\n\t\t}\n\n\t\t/** check to see if the day should be selected */\n\t\tfunction isSelected(day) {\n\t\t\t/** check to see if events holds the */\n\t\t\tvar selected = false;\n\t\t\t_.forEach(ctrl.events, function(ev) {\n\t\t\t\tev.date = removeTime(ev.date);\n\t\t\t\tif (ev.date.isSame(day.date)) selected = true;\n\t\t\t});\n\n\t\t\t/** return selected */\n\t\t\treturn selected;\n\t\t}\n\n\t\t/** private methods */\n\n\t\t/** initialize the calendar */\n\t\tfunction init() {\n\t\t\tvar start = ctrl.month.clone();\n\t\t\tstart.date(1);\n\t\t\tremoveTime(start.day(0));\n\t\t\tbuildMonth(start, ctrl.month);\n\t\t}\n\n\t\t/** remove the time */\n\t\tfunction removeTime(date) {\n\t\t\treturn date.day(0).hour(0).minute(0).second(0).millisecond(0);\n\t\t}\n\n\t\t/** build out the month */\n\t\tfunction buildMonth(start, month) {\n\t\t\tctrl.weeks = [];\n\t\t\tvar done = false;\n\t\t\tvar date = start.clone();\n\t\t\tvar monthIndex = date.month();\n\t\t\tvar count = 0;\n\t\t\twhile (!done) {\n\t\t\t\tctrl.weeks.push({ days: buildWeek(date.clone(), month) });\n\t\t\t\tdate.add(1, \"w\");\n\t\t\t\tdone = count++ > 2 && monthIndex !== date.month();\n\t\t\t\tmonthIndex = date.month();\n }\n\t\t}\n\n\t\t/** build out the week */\n\t\tfunction buildWeek(date, month) {\n\t\t\tvar days = [];\n\t\t\tfor (var i = 0; i < 7; i++) {\n\t\t\t\tdays.push({\n\t\t\t\t\tname: date.format(\"dd\").substring(0, 1),\n\t\t\t\t\tnumber: date.date(),\n\t\t\t\t\tisCurrentMonth: date.month() === month.month(),\n\t\t\t\t\tisToday: date.isSame(new Date(), \"day\"),\n\t\t\t\t\tdate: date\n\t\t\t\t});\n\t\t\t\tdate = date.clone();\n\t\t\t\tdate.add(1, \"d\");\n\t\t\t}\n\t\t\treturn days;\n\t\t}\n\t}\n})();;\r\n(function(){'use strict';angular.module('nha.core').run(['$templateCache', function($templateCache) {$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/directives.html','\\n\\n
\\n
\\n
\\n

Directives

\\n
\\n
\\n\\n
\\n\\n\\n\\n
\\n
\\n

Action Save Status

Back to top\\n

\\n Accepts an array of promises and displays the current status of the save based on the promises\\' resolution, rejection, or notification.\\n Live examples can be seen on the Retention and Reenrollment editors.\\n

\\n\\n

Basic Example

\\n

Promises in Queue: {{promiseQueue.length}}

\\n \\n \\n\\n

\\n Pressing \"Save\" creates a deferred promise which is pushed into an array of promises. That array of promises is passed into the action-save-status directive.\\n Once the promises in the array are resolved, rejected, or notified, the status updates accordingly. You can also pass a custom message through the promise resolve,\\n reject, or notify. Such as promise.resolve(\\'Save Complete!\\'), promise.reject(\\'FAIL!\\'). If you do not specify custom messages, default messages are given.\\n

\\n\\n\\n

Code Example

\\n
\\n
\\n                    \\n                <action-save-status save-queue="promiseQueue"></action-save-status>\\n                    \\n                
\\n
\\n
\\n\\n
\\n

Table Sort

Back to top\\n

Basic Example

\\n

Maintain Sort Parameters/Visual Indicators. Sort parameters can then be passed into services for server side sorting/ordering.

\\n \\n Sort Change Event Raised\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
NameLocation
{{rec.name}}{{rec.city}}
\\n Sort: {{testSort}}\\n\\n

Code Example

\\n
\\n
\\n                    \\n           <table table-sort sort-expression="testSort">\\n                <thead>\\n                    <th table-sort-criteria="name">Name</th>\\n                    <th table-sort-criteria="city">Location</th>\\n                </thead>\\n            </table>\\n                    \\n                
\\n
\\n\\n

\\n Giving the directive a model through the \"sort-expression\" attribute will allow you to bind to and use the sort expression/parameters that the directive maintains.\\n

\\n

\\n Use the \"sort-changed\" attribute to bind a function to be called when the sort expression is changed.\\n

\\n

\\n Use Shift + Click to append parameters to your sort expression.\\n

\\n\\n

Multiple Sort Options in One Column Example

\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
NameLocation
{{rec.name}}{{rec.city}}
\\n Sort: {{testSort}}\\n\\n

Code example

\\n
\\n
\\n                    \\n        // Define the multiple options for the column.                    \\n        $scope.groupModel = [\\n            { criteria: \\'firstName\\', displayName: \\'First Name\\' },\\n            { criteria: \\'lastName\\', displayName: \\'Last Name\\' }\\n        ];\\n           <table table-sort sort-expression="testSort">\\n                <thead>\\n                    <th table-sort-criteria-group="groupModel">Name</th>\\n                    <th table-sort-criteria="city">Location</th>\\n                </thead>\\n            </table>\\n                    \\n                
\\n
\\n

Using the table-sort-criteria-group, we can handle the cases where we have one logical column that needs to be able to sorted on values from 2 different database columns. A good example of this is the First/Last name scenario.

\\n\\n

Live Example - Set Status

\\n
\\n\\n
\\n

Avatar

Back to top\\n\\n

Render Avatars for student photos

\\n

Basic example

\\n

Basic usage

\\n
\\n \\n


\\n \\n


\\n \\n
\\n
Copy
\\n
\\n
\\n                        <avatar student-id="::student.studentID" alt-text="::student.fullName"></avatar>\\n                    
\\n
\\n Back to top\\n
\\n\\n \\n
\\n

Dropdown Submenu

Back to top\\n\\n

\\n Dropdown with submenus. A little bit of history, these used to be supported in BS2, but were dropped since they are not that mobile friendly. We still have desktop use cases for this control though.\\n Stackoveflow question on this\\n

\\n

Basic example

\\n
\\n
\\n

Simple

\\n \\n {{testModel}}\\n
\\n\\n

Two Levels

\\n\\n \\n {{testDD2}}\\n
\\n

Two Levels with multi select

\\n {{dropDownSubmenu_TwoLevelMultiData}}\\n \\n {{testModel3}}\\n

\\n
\\n
Copy
\\n
\\n
\\n                        <dropdown-submenu ></dropdown-submenu>\\n                    
\\n
\\n Back to top\\n
\\n\\n \\n
\\n

Tag Cloud

Back to top\\n\\n

\\n Tag Cloud - this works well in conjunction with the dropdown submenu. It uses the same data structure\\n

\\n

Basic example

\\n
\\n\\n \\n

\\n
\\n
Copy
\\n
\\n
\\n                        <tag-cloud ></tag-cloud>\\n                    
\\n
\\n Back to top\\n
\\n\\n \\n
\\n

Availability Panel

Back to top\\n\\n

\\n This will determine if a module is available or not based on conditions such as, does this controller exist?\\n

\\n

Basic example

\\n
\\n
\\n This controller called \\'DirectivesCtrl\\' does exist\\n\\n \\n

\\n\\n
\\n This controller called \\'missingCtrl\\' does not exist\\n\\n \\n

\\n\\n
\\n This controller called \\'missingCtrl\\' does not exist, as well as passing in a custom message\\n\\n \\n

\\n\\n
\\n
Copy
\\n
\\n
\\n                        <availability-panel controller-to-test="missingCtrl"></availability-panel>\\n                    
\\n
\\n Back to top\\n
\\n\\n
\\n

Spinner

Back to top\\n\\n

Here is your spinner for load screens

\\n\\n

Basic example

\\n

Basic usage

\\n \\n \\n
\\n

I only show when not spinning :)

\\n
\\n
\\n\\n


\\n
\\n
Copy
\\n
\\n
\\n                        <div spinner is-loading=\"dataLoading\">Content to load.</div>\\n                    
\\n
\\n Back to top\\n
\\n\\n
\\n

Filters

Back to top\\n\\n

Render Filters

\\n\\n

Basic example

\\n

\\n Basic usage\\n Here are the filters currently supported from Core\\n
\\n

    \\n
  1. AcademicYear
  2. \\n
  3. School
  4. \\n
  5. GradeLevel
  6. \\n
  7. Homeroom (requires School pass in SchoolId, due to perf reasons)
  8. \\n
  9. MasterStatus (specify subType aka MasterStatusTypeId with subType = 1 in filter config)
  10. \\n
  11. Staff (requires School pass in SchoolId, due to perf reasons)
  12. \\n
  13. Wing
  14. \\n
  15. Period
  16. \\n
  17. MarkingPeriod
  18. \\n
\\n
\\n

\\n
\\n
\\n \\n
\\n
\\n\\n
Copy
\\n
\\n
\\n                        <filters></filters>\\n                    
\\n
\\n Back to top\\n
\\n\\n
\\n

Date Entry

Back to top\\n\\n

Date Entry

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n
\\n
\\n

\\n
\\n
Copy
\\n
\\n
\\n                        <date-entry></date-entry>\\n                    
\\n
\\n\\n

Time example

\\n

Basic usage

\\n
\\n
\\n \\n
\\n
\\n

\\n
\\n
Copy
\\n
\\n
\\n                        <date-entry options=\"{format: \\'hh : mm a\\'}\" icon-class=\"nha-circle-clock\"></date-entry>\\n                    
\\n
\\n\\n\\n Back to top\\n
\\n\\n
\\n

Date Panel

Back to top\\n\\n

Date Panel

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n
\\n
\\n

\\n
\\n
Copy
\\n
\\n
\\n                        <date-panel></date-panel>\\n                    
\\n
\\n Back to top\\n
\\n\\n
\\n

Timepicker Pop

Back to top\\n\\n

A helper for the timepicker in AngularUI

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n \\n
\\n
\\n
\\n
Copy
\\n
\\n
\\n                        <timepicker-pop></timepicker-pop>\\n                    
\\n
\\n Back to top\\n
\\n
\\n

DatePicker

\\n\\n

Date Only

\\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n
Copy
\\n
\\n
\\n                    <div class="input-group date" date-picker>\\n                             <input name="datePicker" type="text" class="form-control" ng-model="date" ng-required="true" />\\n                             <span class="input-group-addon">\\n                             <span class="fa fa-calendar"></span>\\n                        </span>\\n                    </div>\\n                    \\n                    
\\n
\\n\\n Back to top\\n
\\n\\n \\n
\\n

DateEntry

\\n\\n\\n

Date Only

\\n
\\n \\n \\n
\\n
Copy
\\n
\\n
\\n                           <div class="form-group">\\n                                 <label class="control-label col-sm-3">Date:</label >\\n                                 <div class="col-sm-2" >\\n                                     <date-entry date="model"\\n                                        options="options =" {mindate: \\'01/01/2000\\' , maxdate: \\'01/01/2020\\' }}"\\n                                        on-change="myfunction()"\\n                                        require></date-entry>\\n                            \\n                               </div>  \\n                            </div>\\n                            \\n                            
\\n
\\n Back to top\\n
\\n\\n
\\n

Error Panel

Back to top\\n\\n

Use this to handle an error coming from a HTTP call

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n
\\n
\\n
\\n
Copy
\\n
\\n
\\n                        <transaction-error-panel></transaction-error-panel>\\n                    
\\n
\\n Back to top\\n
\\n\\n\\n
\\n

Draggable

\\n\\n

Drag Drop in AngularJs without using jQueryUI

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n Coming soon\\n

\\n
\\n
\\n
Copy
\\n
\\n
\\n                        Coming Soon\\n                    
\\n
\\n
\\n\\n
\\n

Focus On

\\n\\n

Focus On Directive when opening a form and focusing on a field

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n Coming soon\\n

\\n
\\n
\\n
Copy
\\n
\\n
\\n                        Coming Soon\\n                    
\\n
\\n
\\n\\n
\\n

Prompt If Dirty

\\n\\n

Prompt if dirty when navigating away

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n Coming soon\\n

\\n
\\n
\\n
Copy
\\n
\\n
\\n                        Coming Soon\\n                    
\\n
\\n
\\n\\n
\\n

Slide Bottom Panel

\\n\\n

Drag Drop in AngularJs without using jQueryUI

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n Coming soon\\n

\\n
\\n
\\n
Copy
\\n
\\n
\\n                        Coming Soon\\n                    
\\n
\\n
\\n\\n
\\n

Breadcrumb

\\n\\n

The Breadcrumb directive (see top of the screen). This is included with navbar

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n

\\n
\\n
\\n
Copy
\\n
\\n
\\n                        Coming Soon\\n                    
\\n
\\n
\\n\\n
\\n

Navbar

\\n\\n

Navbar see top of the screen

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n
\\n



\\n
\\n
\\n
Copy
\\n
\\n
\\n                                                     <div class="top-nav" ng-include="\\'app/components/navbar/navbar.html\\'"></div>\\n                    
\\n
\\n
\\n\\n
\\n

Search Box

\\n\\n

Search ahead

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n

\\n
\\n
\\n
\\n
Copy
\\n
\\n
\\n                        <search-box />\\n                    
\\n
\\n
\\n\\n
\\n

CRUD Panel

\\n\\n

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n

\\n
\\n
\\n
\\n
Copy
\\n
\\n
<crud-panel last-saved-date="{{date}}" save-call="save()" saving="saving" cancel-call="cancel()"></crud-panel>
\\n
\\n
\\n\\n
\\n

Camel Case Filter

\\n\\n

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n {{status | camelCaseToHuman}}\\n \\n

\\n
\\n
\\n
\\n\\n
\\n

Avatar Resuzer

\\n\\n

Control that will help you resize avatars in grid views

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n

\\n
\\n
\\n
\\n\\n
\\n

Page Tabs

\\n\\n

\\n\\n

Basic example

\\n

Basic usage

\\n
\\n
\\n \\n

\\n
\\n
\\n
\\n
Copy
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/templates/403.html','
\\n \\n Sorry, the user account that you are using does not have access to this data or feature.\\n

\\n If you believe you should have access, please logout, then log back in. \\n

\\n

\\n If you still believe you require access, please contact the administrator.\\n

\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/templates/404.html','
\\n \\n Sorry, the resource you have requested cannot be found.\\n

\\n Please recheck your URL as it may be out of date or load the list/summary view that contains this URL and try again.\\n

\\n

\\n If you believe this message to be in error, please contact your systems administrator.\\n

\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/templates/business-response-modal.html','
\\n
\\n
\\n
\\n

{{displayModal.title}}

\\n
\\n
\\n

{{displayModal.message}}

\\n

{{displayModal.warningMessage}}

\\n
\\n
\\n
\\n
\\n \\n \\n
\\n\\n
\\n

\\n \\n \\n
\\n\\n
\\n \\n
\\n
\\n
\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/templates/offline.html','
\\n
\\n \\n This page is not currently available. Please try again later.\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/app-launcher/miniAppLauncher.html','
\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n \\n {{app.applicationName}}\\n
\\n
\\n\\n
\\n No applications found!\\n
\\n
\\n
\\n
\\n Close\\n
\\n
\\n
\\n
\\n
\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/core-navbar/coreNavbar.html','
\\n
\\n
\\n \\n
\\n\\n
\\n
\\n Training\\n
\\n\\n \\n \\n
\\n \\n
\\n \\n
\\n \\n
\\n\\n
\\n \\n
\\n
\\n
\\n\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/modal/modal.html','
\\n \\n

\\n
\\n
\\n

\\n
\\n
\\n
\\n \\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/module-navbar/module-navbar.directive.html','
\\n\\t\\n\\t\\n\\n\\t
\\n\\t\\t\\n\\t
\\n\\n\\t\\n\\n\\t
\\n\\t\\t\\n\\t
\\n\\n\\t\\n\\n\\t\\n\\n\\t\\n\\n\\t
\\n\\t\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/navbar/navbar.html','\\n
\\n
\\n\\n
\\n \"\"\\n
\\n\\n \\n\\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n
\\n
\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/school-selector/schoolSelector.html','
\\n\\t
\\n\\t\\t\\n\\t
\\n\\n\\t
\\n\\t\\t{{profileDropDownLabel}}\\n\\t
\\n\\t
\\n\\t\\t\\n\\t
\\n\\n\\t
\\n\\t\\t
5\">\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t
\\n\\n\\t\\t\\n\\n\\t\\t
\\n\\t\\t\\t
\\n\\t\\t\\t\\t\\n\\t\\t\\t
\\n\\t\\t
\\n\\t
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/components/user-settings/userSettingsTemplate.html','');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/avatar/avatar.html','\"{{::altText}}\"');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/avatarResizer/avatar-resizer.html','
\\n \\n \\n \\n
\\n \\n \\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/breadcrumb/breadcrumb.html','
\\n
    \\n \\n \\n
  • \\n \\n \\n
  • \\n
  • \\n \\n \\n
  • \\n\\n
  • \\n \\n \\n
  • \\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/business-response/business-response.html','
\\n
\\n
\\n Save was not successful!\\n
\\n
\\n
\\n Technical Details\\n \\n \\n \\n
\\n
\\n
\\n

{{businessResponse.operationResult.exception}}

\\n
\\n
\\n
\\n
\\n
\\n {{businessResponse.modelState}}\\n
\\n
\\n

{{message}}

\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/crudPanel/crudPanel.html','\\n
\\n \\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/dateEntry/dateEntry.html','
\\n \\n \\n \\n \\n
\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/datePanel/datePanel.html','
\\n
\\n\\n \\n
\\n {{ viewOptions.startDate | date:\\'EEE MMM d, y\\'}}\\n {{ viewOptions.startDate | date:\\'mediumDate\\'}} - {{ viewOptions.endDate | date:\\'mediumDate\\'}}\\n
\\n\\n \\n
\\n {{ viewOptions.startDate | date:\\'EEE MMM d, y\\'}}\\n {{ viewOptions.startDate | date:\\'mediumDate\\'}} - {{ viewOptions.endDate | date:\\'mediumDate\\'}}\\n
\\n\\n \\n
\\n \\n \\n \\n
\\n\\n \\n
\\n
\\n \\n \\n \\n \\n
\\n
\\n\\n \\n
\\n \\n \\n\\n \\n \\n
\\n\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/dropdownSubmenu/dropdownSubmenu.html','
\\n \\n \\n
\\n
\\n \\n
\\n \\n {{key}}\\n
\\n
\\n \\n {{getPropertyForObject(opt,settings.optionLabel)}}\\n
\\n
\\n
\\n
1\">\\n \\n
\\n \\n {{getPropertyForObject(opt,settings.optionLabel)}}\\n
\\n
\\n
\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/errorPanel/errorPanel.html','
\\n \\n Uh oh! There seems to be a problem!\\n
\\n \\n \\n Technical Details\\n
\\n
\\n
ERROR DETAILS
\\n {{error.errorMessage}}
\\n {{error.errorDetails}}\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/file-input/file-input.html','\\n {{buttonText}}\\n\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/filters/filters.html','\\n
\\n \\n
\\n\\n\\n
\\n
\\n
\\n
\\n\\n \\n
\\n \\n
\\n \\n
\\n \\n \\n \\n \\n
\\n
\\n
\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/filters/selected-filters.html','
\\n\\t\\n\\t\\n\\n\\t
\\n\\t\\t\\n\\n\\t\\t
\\n\\t\\t\\t
\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t{{filter.displayName}} \\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t
\\n\\t\\t\\t
\\n\\t\\t\\t
\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t\\t{{item.displayName}}\\n\\t\\t\\t\\t\\t{{item.description}}\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t
\\n\\t\\t
\\n\\t
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/hierarchicalSelector/hierarchical-selector.html','
\\n
\\n \\n
\\n {{placeholder}}\\n 0\" class=\"selected-items\">\\n {{getTagName(i)}} \\n \\n \\n
\\n
\\n
\\n
\\n
    \\n \\n
\\n
\\n
\\n
');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/hierarchicalSelector/tree-item.html','
  • \\n
    \\n \\n
    \\n {{item.name}}\\n
    \\n
    \\n
      \\n
      Loading...
      \\n \\n
    \\n
  • ');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/loader/loader.directive.html','
    \\n\\t {{message || \\'Loading...\\'}}\\n
    \\n\\n\\n\\t\\n\\n\\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/pageTabs/pageTabs.html','
    \\n\\t\\n
    ');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/search-box/search-box.html','
    \\n \\n \\n
    \\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/slideBottomPanel/slideBottomPanel.html','
    \\n \\n \\n \\n\\n \\n
    \\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/small-calendar/small-calendar.component.html','
    \\n\\t
    \\n\\t\\t\\n\\t\\t{{$ctrl.month.format(\"MMMM YYYY\")}}\\n\\t\\t\\n\\t
    \\n\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t
    SunMonTueWedThuFriSat
    \\n\\t\\t\\t\\t\\t{{day.number}}\\n\\t\\t\\t\\t
    \\n
    ');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/spinner/spinner.html','
    \\n
    \\n \\n {{message || \\'Loading...\\'}}\\n \\n
    \\n
    \\n
    \\n
    \\n
    \\n');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/tagCloud/tagCloud.html','\\n\\n\\n
    \\n
    \\n
    \\n \\n {{tag.name}}\\n
    \\n\\n \\n
    \\n
    ');\n$templateCache.put('/app/NHAApp.Core/src/NHA.App.Core.Web/app/directives/transactionErrorPanel/transactionErrorPanel.html','
    \\n
    \\n \\n
    \\n
    \\n \\n
    \\n
    \\n Technical Details\\n \\n \\n \\n
    \\n
    \\n
    \\n

    {{error.detail}}

    \\n
    \\n
    \\n
    \\n
    ');}]);})();"],"sourceRoot":"/source/"}