{"version":3,"file":"babel-fb51fbaf3f973a78cf86a9b27f13bf6b.js","names":["ApplicationAdapter","extend","namespace","shouldBackgroundReloadRecord","shouldBackgroundReloadAll","urlForFindMany","ids","modelName","snapshots","all","adapterOptions","url","this","_super","arguments","_exports","default","_class","OIDCJSONAPIAdapter","constructor","super","_initializerDefineProperty","_descriptor","_descriptor2","_defineProperty","config","endpoint","headers","session","inPreviewMode","handleResponse","status","info","payload","isMaintenanceResponse","handleMaintenanceResponse","host","addCourseSettingRelationship","generateIdForRecord","uuid","groupRecordsForFindMany","_","chunk","createRecord","store","type","snapshot","data","serializerFor","serializeIntoHash","includeId","id","buildURL","action","ajax","then","ignoreResponsePayload","updateRecord","_applyDecoratedDescriptor","prototype","service","configurable","enumerable","writable","initializer","CanvasStateAdapter","userApiEndpoint","isNew","findBelongsTo","relationship","meta","name","handleDirtyBelongsToRelationshipData","async","response","setting","user","isTeacher","save","course","peekRecord","books","resolve","allBooks","shortcuts","length","addObjects","serialize","DIRTY_DATA_RELATIONSHIPS","findHasMany","includes","handleDirtyHasManyRelationshipData","urlForFindRecord","include","get","isNone","indexOf","join","GroupAdapter","HelpListAdapter","LicenseAdapter","MissionAdapter","handleReceiversRelationship","order","record","hasMany","map","find","item","NoticeAdapter","shouldReloadAll","book","index","SchoolAdapter","SettingAdapter","Array","isArray","allowedBookIds","filter","shortcut","attributes","book_id","_dec","queryRecord","query","options","me","ajaxService","request","App","Application","modulePrefix","podModulePrefix","Resolver","loadInitializers","xl","lg","md","sm","xs","mediumOrLess","__COLOCATED_TEMPLATE__","_templateFactory","createTemplateFactory","block","moduleName","isStrictMode","_component","setComponentTemplate","templateOnly","ActionMenu","Component","width","args","handleItemSelect","value","onSelect","onClose","handleDocumentKeyDown","evt","key","KEY","tab","preventDefault","stopImmediatePropagation","tracked","Object","getOwnPropertyDescriptor","ActionMenuItem","handlePointerEnter","element","focus","preventScroll","handlePointerLeave","wrapperElement","handleClick","highlight","select","handleKeyDown","enter","space","ms","isHighlighted","onHighlightChange","Promise","setTimeout","waitForAnimation","AdditionCollatorComponent","mode","placeholderSearchValue","placeholderSearch","intl","t","perPage","hasQuery","bookId","search","bookSelectItemsPromise","bookPromise","additions","addition","flat","productPromise","products","bookProducts","product","push","uniqBy","promise","_ref","load","bookSelectItems","isPending","isRejected","A","items","addObject","label","groups","forEach","filteredBooks","userBooks","group","EmberObject","create","sortBy","hasProduct","title","bookIds","mapBy","filteredAdditions","rejectBy","isPresent","searchLower","toLowerCase","_searchHTML","content","questionHtml","reverse","pagedAdditions","pagedArray","page","handleFilterSelectChange","_query","handleSearchFormSubmit","handleSearchInputClear","handlePaginationChange","setElement","scrollToTopOnQuery","parentScrollElement","scrollParentElement","scrollTo","top","onQuery","str","sanitizeHtml","allowedTags","allowedAttributes","cached","additionsGroupedByUserProxy","teacherAssignments","wordlists","result","types","arr","idx","findBy","additionsGroupedByUser","isResolved","_AdditionCustomizerGroupSectionComponent_brand","WeakSet","_classPrivateMethodInitSpec","classes","isExpanded","includedGroupAdditions","includedAdditions","intersection","excludedAdditions","diff","hasFullInclusion","hasPartialInclusion","handleCheckboxChange","_assertClassBrand","_excludeAll","call","_includeAll","handleToggleButtonClick","onInclude","onExclude","_AdditionCustomizerGroupSectionTreeItemComponent_brand","isIncluded","_exclude","_include","AdditionGridComponent","range","AiWidgetComponent","_onCourseUpdate","WeakMap","_AiWidgetComponent_brand","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_classPrivateFieldInitSpec","isEnabled","_checkIsEnabled","closeModal","pusher","on","_classPrivateFieldGet","_refreshIsEnabledFromArgs","courseId","willDestroy","off","syncIsEnabledWhenArgsChange","aiEndpoint","aiUrl","URL","isbn","tryAddParameter","prop","searchParams","set","aiApiEndpoint","section","area","toString","didInsert","iframeElement","iframeLoadEvent","token","accessToken","contentWindow","postMessage","windowMessageEvent","refreshAuthentication","perform","addEventListener","window","willDestroyIframe","removeEventListener","openModal","isLoaded","document","body","classList","add","showModal","remove","environment","statusUrl","fetch","is_active","catch","AnswerCommentsComponent","commentsProxy","sessionUserId","answer","comments","comment","err","resolved","x","isDeleted","date","created","text","model","versionsProxy","versions","version","answerUserProxy","events","answerUser","updated","event","dayName","moment","format","time","lower","todayAtTime","yesterdayAtTime","lastWeek","dateString","calendar","sameDay","lastDay","sameElse","messageParts","userStr","message","htmlSafe","sendComment","trackAuditEvent","commentTxt","assignment","public","sendPrivateNote","noteTxt","removeComment","destroyRecord","AnswerLogContextFilterComponent","_descriptor8","booksProxy","licenses","contextHelper","activeCourse","promises","license","results","pop","filterBooks","presentBooks","productAdded","disabled","changeBookFilterOption","areaFilterOptions","areaFilter","contentFilterOptions","contentFilter","children","_addToArray","_addAllOption","onSelectedBook","changeAreaFilterOption","onSelectedArea","changeContentFilterOption","onSelectedContent","obj","unshiftObject","AnswerLogDiagnosisListAnswerItemComponent","indexDot","entity","hideAssignmentSortNumbers","answerProxy","answers","openAudit","answerEntity","resultEntity","parent","_ref2","resultEntityParent","router","transitionTo","queryParams","exercise_id","AnswerLogDiagnosisListComponent","_fetchData","noResults","areaId","contentId","userId","bookFilter","users","limit","area_id","content_id","user_id","size","number","pageNumber","field","direction","handleBookFilterChange","bookModel","handleAreaFilterChange","areaModel","handleContentFilterChange","contentModel","CollectionData","collection","exercises","activeExercise","activeAnswer","editor","isShowingResultsForCarousel","editorExceptForSections","AnswerLogComponent","_class2","_descriptor9","_descriptor10","_descriptor11","_descriptor12","_descriptor13","_descriptor14","showTeacherAssignments","handleAnswerClick","onAnswerClick","getCollectionData","assignmentEvents","getAnswersForExercises","collectionData","template","isModalOpen","openExercise","exerciseId","exercise","getOrCreateAnswerForExercise","inboxType","AnswerLogStandardListExerciseComponent","entityProxy","firstObject","getLatestVersion","numStudentsAnsweredProxy","val","self","numStudentsAnswered","AnswerLogStandardListComponent","_descriptor15","_descriptor16","_descriptor17","_descriptor18","_descriptor19","statuses","inboxMode","started","turnedIn","audited","teacherCorrect","teacherWrong","correct","wrong","statusString","camelize","selectedContent","filterString","slice","numStatuses","lastStatus","otherStatuses","assignmentSearch","commentStatus","multipleUsers","groupedAnswers","grouped","createdDate","_getFilters","findRecord","belongsTo","group_key","assignment_types","handleStatusFilter","toggleFilters","showFilters","trackAuditEvents","searchAssignments","changeCommentStatus","markAllAsRead","AnswerLogStandardListItemComponent","errorMessage","errorCode","reason","errors","originalAnswerProxy","originalAnswer","computedStatus","hasComments","contentProxy","showTextEdition","metadata","sort","entities","categories","AnswerLogTeacherAssignmentListExerciseComponent","proxy","resolvePathForTeacherAssignmentAnswer","answerUsersProxy","AnswerLogTeacherAssignmentListComponent","teacherAssignment","teacher_assignment_id","teachers","teacherIds","teacher","findAll","matchingTeacherAssignments","validBook","hasBook","validTeacher","AnswerLogTeacherAssignmentListItemComponent","AnswerStatusIconComponent","generateId","iconName","classNames","statusText","onCancel","routed","cancelRouteParams","PromiseArray","DS","implicitSearchResults","isLoading","isLoadingImplicit","searchResults","searchVal","searchValue","sortValue","archive","folder","materials","init","computed","showSearchBar","isPaginated","hasFilters","hasOrder","hasRandom","hasCategorySelect","hasSortSelect","categoryOptions","unshift","sortOptions","folderId","sortedCategories","_search","entity_id","hits","folders","hit","task","keepLatest","doSearch","restartable","actions","openRandom","rand","Math","floor","random","material","objectAt","materialId","archiveId","changeSortValue","isGridView","showTitles","show_titles","archive_sort","sortedMaterials","comp","compact","shuffle","pagedMaterials","totalPages","openMaterial","routerScroll","preserveScrollPosition","returnUrl","currentURL","later","sortedChildren","pagedModels","isFulfilled","toArray","oneWay","groupedSortedContents","onSearchCleared","categoryId","parent_id","hideEditions","categoryEntities","contents","activeExerciseId","activeSectionId","missionId","customContentId","closeUrl","currentUrl","file","externalType","saveLink","externalUrl","_youtubeEmbedUrl","_vimeoEmbedUrl","e","urlHelper","addHttp","validate","onChoose","snackbar","enqueue","variant","dismissible","autoDismiss","embed_url","replace","contains","some","pattern","test","downloadable","handleRemove","onRemoveEntity","onRemoveFile","handleExternalLink","open","externalLinkDialogIsOpen","imageObj","source","closeImageViewer","imageViewerIsOpen","imageUrl","coverImage","imageSource","preset","featured_image","defaultImage","isValidProxy","allowedBooks","isValid","closeMediaViewer","mediaViewerIsOpen","BookAnnouncementComponent","setClosedAnnouncements","announcementClosed","closedAnnouncements","announcement","closed_announcements","onDismiss","Date","getTime","removeObjects","filterBy","roles","reject","BookBrowserComponent","rangeClassName","isChecked","selectedBookIds","selectedBooks","selected","onDeselect","isExternal","isJunior","isDigitalbok","imageURL","linkTarget","linkIcon","href","target","external_url","digitalbokUrl","juniorUrl","params","statisticsIsbn","appendQueryParams","synthesizeSpeech","createSpeechSynthesizer","auth","apiBaseUrl","isFullscreen","isFullscreenEnabled","Boolean","fullscreenElement","webkitFullscreenElement","changeUser","changingUser","setCanvasState","toggleFullscreen","exitFullscreen","webkitExitFullscreen","requestFullscreen","webkitRequestFullscreen","setElementAndCanvasState","elem","handleConfirmActivated","scheduleOnce","moveModalToElement","handleConfirmReset","confirm","removeChild","handleSave","canvas","cancel","saveTimeout","performSave","canvasState","json","toJSON","customCanvasKeys","JSON","stringify","savingState","setJSON","resetSaveState","onFullScreenChange","getElementById","confirmManager","appendChild","bind","states","state","material_id","editor_id","image","interactive","isCompleted","numCorrect","numCorrectAttemptAnswers","numTotal","numAttemptExercises","infoText","numExercises","numCorrectAnswers","hasRedoButton","hasCloseButton","onCollectionClose","hasTryAgainButton","handleCarouselResultRedo","onCreateNewCarouselAttempt","newCarouselAttempt","onNewCarouselAttemptCreated","handleCarouselResultTryAgain","ChapterNavigationComponent","currentIndex","currentSections","activeSection","currentSectionNumber","goToPrevious","previousSection","goToSection","goToNext","nextSection","openIndex","isShowingIndex","closeIndex","beforePrint","afterPrint","handleWillDestroy","isPrint","ChooseModalComponent","count","onDelete","handleChooseButtonClick","storageFor","showTip","collectionSoundStore","hideTip","CollectionExerciseIndexComponent","isTeacherCollection","isDiagnosis","isFlow","indexTypeClass","exerciseAnswers","getAnswersForExercise","useOriginalAnswer","getOriginalAnswer","numAnswers","onExerciseChange","linked","onOpenCollection","currentExercise","baseClass","showBagde","ended","canContinue","isStarted","badgeVariant","score","handleOpenCollection","interactiveProxy","getOrCreateInteractiveForCollection","exercisesProxy","missionMode","allowedEntities","resetCollection","attemptsLeft","latestAttempt","attempt","max","allowedAttempts","isActive","showLatestResult","getNumCorrectAnswers","pointsRequired","stopPropagation","onOpenExercise","startExpanded","CollectionListComponent","CollectionModalTogglerComponent","icon","appearance","toggleModal","hasOptions","isClickable","hasIndex","buttonId","link","location","origin","inContent","activeContent","answersProxy","notStarted","every","showAuditKey","any","assignments","settings","solution","popoverOpen","handleClose","openShareDialog","shareDialogOpen","closeShareDialog","resetAnswers","_clearAnswers","resetAnswer","correctExercises","isSaving","openPreviewModal","previewModalOpen","closePreviewModal","CollectionSummaryComponent","activePage","hasPagination","hasPopupIndex","handleIndexGoTo","resizeObserver","ResizeObserver","handleResize","toggleCollectionSummary","unobserve","scrollParent","isCarousel","carouselAttemptExercises","showCarouselResult","isVisible","entityIsAllowed","showCollectionSummary","audioSource","audio","attachment_url","hasEditor","components","stacked","elementWidth","inNarrowSpace","hasAudio","speakerContentInfo","contentTitle","shortCode","digilarRecordedSpeechEnabled","iltRecordedSpeechEnabled","exerciseIndex","handleCreateNewCarouselAttempt","isCreatingNewCarouselAttempt","handleNewCarouselAttemptCreated","changedCollection","showKey","showSuggestion","toggleKey","toggleSuggestion","getScrollParent","observe","nextExercise","showResponse","reset","carouselOpenNextExercise","changeExercise","handleExerciseBottombarNextExercise","focusExercise","elementTop","getBoundingClientRect","collectionViewTop","documentElement","scrollTop","style","setProperty","bottom","scrollParentBottom","scrollParentTop","tagName","marginBottom","innerHeight","ownerProxy","owner","showname","handleDone","showContentSummary","showDoneButton","showSummary","hasNextSection","allExerciseIds","_interactivePromise","replaceWith","currentExerciseId","handleUpdate","waitForScrollEnd","setActive","ContentListSummaryComponent","categorizedWordlists","wordlist","category","_category","activeCategory","categorizedCollections","collections","filteredCollections","isEvery","sorted","a","b","localeCompare","isStudent","setCategory","nextMissionContent","imageWidth","height","imageHeight","embed","focus_point","y","backgroundColor","responsiveClass","goToNextContent","missionDispatcher","activeMission","summaryMode","showContentMissionNextButton","showNextButton","handleOpenProductInformation","entityInspector","ContentPaginationComponent","horizontal","TextHighlightingOptions","NONE","WORDS_ONLY","SENTENCES_ONLY","EVERYTHING","digilarSpeakerConfig","DigilarSpeakerConfig","getContextData","getSpeakerSettings","markings","speechSpeedOptions","speechSpeedValue","speechSpeedDisabled","speaker","speechSpeedSettingHasEffectForActiveSpeaker","selectedMarking","highlighting","highlightingOption","words","sentences","markingType","trackPlaySettingEvent","voices","currentLanguage","_currentLanguage","supportedVoices","voice","v1","v2","language","selectedVoice","isValidVoice","preferredVoice","isTranslated","WebPageTranslationDetector","setFollowText","followText","setPreferSpeechSynthesis","preferSpeechSynthesis","setSpeechSpeed","speed","undefined","showSpeakerInfo","onShowSpeakerInfo","detectLanguage","DigilarLanguageUtil","parseLanguage","languages","contentLanguage","ContentPresenter","textSize","adaptUiFor","activeBook","saved","isContainer","sections","customContentProxy","sortedCustomContents","customContent","currentCustomContent","c","isWorkspaceOpen","currentRouteName","hasPreviousSection","readSettings","isOnLast","hasAdditionalContent","hasMissionNextButton","contenteditor","isSection","handleOnCloseModal","showStoryModal","active","querySelector","collectionItemsProxy","isWorkspaceCollectionActive","collectionItems","isSummaryOpen","numAssignmentsProxy","allowed","numAssignments","ASSIGNMENTS_ROUTE","WORDLISTS_ROUTE","NOTES_ROUTE","routeOnSubHeadingClick","shouldDisplayAssignments","assignmentsButtonIsActive","startsWith","wordlistsButtonIsActive","notesButtonIsActive","openAssignments","openWordlists","trackWordlistEvent","openNotes","colorTheme","changeTheme","removeTheme","hasPlaySettings","hidePlaySettings","speakerProvider","speakerButtonClass","speakerButtonId","showSpeakerInfoModal","isSpeakerActive","hasSeenSpeakerInfo","has_seen_speaker_info","autoShow","forceShow","speakerInfoModalForced","settingsButtonClass","isShowingReadSettings","toggleSpeakerActive","closeSpeakerInfoModal","forceShowSpeakerInfoModal","toggleReadSettings","handleSettingsChange","excerptBreakpoint","showMoreButton","showFullText","hideFullText","classNameBindings","didInsertElement","offsetHeight","toggleText","toggleProperty","Part","showPlaceholder","part","mediaForced","footnotesService","createIndexContext","sectionProxy","heading","hide_heading","_dec2","_ContentsStorySection_brand","cinema","handleImageFinally","cacheNextAndPreviousImage","imageSize","imageElement","resetOpacity","_isImageLoaded","setImageElement","toggleOnlyImage","expandedImage","keep_proportions","featuredImage","styleString","modelProxy","hasExercises","complete","naturalHeight","showCourses","inCourse","courses","showProducts","inProduct","courseProxy","getEach","modalHeader","fetchCoursesAndProducts","courseContext","fetchCoursesForBook","fetchCoursesForProduct","setCurrentCourse","productContext","getAvailableProducts","setActiveProduct","selectCourse","onSelectCourse","selectProduct","onSelectProduct","PromiseObject","createPromiseObject","continueVisited","continueVisitedEntity","imageSrc","readOnly","linkedEntity","getProperties","entityId","parentId","assignmentId","wordlistId","sectionId","didReceiveAttrs","imageId","w","h","_getDefaultImage","default_image_name","path","trackClick","trackContentEvent","imageThumbnail","cookieConsent","showMessage","acceptCookies","accept","CountdownTimerComponent","minutes","Number","start","_getTime","from","stop","secondsLeft","_step","interval","timer","padStart","isNaN","valueOf","onFinish","settingProxy","overviewSortSetting","hideDiagnosis","showDiagnosis","hideKey","externalProducts","setDiagnosis","setKey","saveSettings","throttle","handleImageUpload","contentType","processData","removeImage","CourseAuditIndexCardComponent","closest","parentElement","onClick","STATUS_LABELS","freeze","CourseAuditBottombarComponent","teacherResponses","hasAuditKey","isTeacherAssignment","objects","alternatives","alternative","keyLabel","selectedVersion","teacherCanRespond","setStatus","isUndoStatusChange","statusLabel","newStatus","answersToUpdate","currStatus","reloaded","reload","changeVersion","handleNextStudentClick","changeToNextStudent","CourseAuditCollectionExerciseComponent","hasNextButton","setVersion","COLLECTION_TAB_LABELS","students","compare","CourseAuditCollectionComponent","student","selectedStudent","hideQuestion","hiddenQuestions","answerUsers","studentId","includedEntities","isPublished","entityIsAllowedInCustomContent","exerciseOptions","singleViewMode","teacherAssignmentProxy","exerciseAnswersProxy","teacherAssignmentId","node_id","studentsAnswersProxy","studentsAnswers","selectedAnswerId","answersForExercise","studentsProxy","role","left","right","flatten","invoke","uniq","allUsers","studentOptions","studentAnswers","studentsExercises","nextStudent","toggleQuestion","removeObject","selectExercise","selectedExercise","handleModeChange","tabLabel","changeStudent","openAnswer","CourseAuditCommentsComponent","_getComments","showUserNameAndAvatar","currUserId","commentUser","userString","commentedOn","CourseAuditDiagnosisExerciseComponent","exerciseResults","exerciseResult","openAuditMode","CourseAuditDiagnosisGroupComponent","isClass","resultsByUserProxy","allResultsByUserProxy","allResults","studentResults","maxScore","allResultsByUser","attempts","num","CourseAuditDiagnosisComponent","_getDiagnoses","diagnoses","diagnosis","ancestors","invalid","diagnosisA","diagnosisB","areaA","areaB","interA","interB","CourseAuditDiagnosisPartComponent","_getResults","sortedGroups","selectedStudents","resultOptions","resultsForType","selectedResultOption","reverseObjects","resultColor","sortedResults","CourseAuditComponent","studentSelectValue","_openAuditMode","closeAuditMode","createAsEntity","_ref3","auditType","auditStudent","shift","_ref4","auditModalTitle","auditCollection","auditExercise","auditAnswers","auditMode","auditIncludedEntities","auditCustomContent","_restoreScroll","CourseAuditStandardEntityComponent","getAnswers","rootEntity","teacherAssignmentCollections","validEntities","singularize","noAnswerCheck","hasAnswers","answeredSiblings","child_id","parseInt","num_answers","findIndex","indexStr","increment","multipleStudents","dimmed","buttonClass","toggleAccordion","_toggleAccordion","onCompare","_collectionAnswers","handleAuditModeOpen","expanded","_getAnswers","_getAnsweredChildren","collection_id","answerRules","startedStatuses","answersResult","numPages","i","responses","validEntityIds","validCollectionChildren","child","reduce","answeredChildren","CourseAuditStandardExerciseSingleComponent","CourseAuditStandardExerciseComponent","numSelectedStudents","numAnswersProxy","CourseAuditStudentListItemComponent","studentAnswersProxy","goTo","CourseAuditTeacherAssignmentsComponent","bookTeacherAssignments","teachersProxy","CourseAuditTeacherAssignmentsTeacherCollectionComponent","allowedAssignments","handleCompareClick","CourseAuditTeacherAssignmentsTeacherComponent","teacherProxy","assignmentsProxy","teacherId","CourseChooseListItem","_CourseChooseListItem_brand","isSelected","selectedCourses","_toggle","CourseHeaderComponent","imageStyle","coverBackground","coverClass","effectClass","textClass","CourseList","disabledCourses","CourseListItem","isDisabled","missingLicenses","licensesReloaded","refreshUserLicenses","schoolProxy","school","courseProducts","activeLicenseISBNs","licenseISBNs","courseHasGroups","courseHasBooks","hasStudents","courseMenuItems","menu_items","menu_teacher_items","menu_icons","overview","missions","myResults","audit","menu_routes","require_books","route","teacherMenuItems","saveCourse","restore","openLicenseModal","activeProduct","modalOpen","hasSkolAdminUrl","skolAdminUrl","createCourseUrl","openCourseSettings","MissionActivateModal","Resource","course_id","mission","handleMissionListSelect","selectedMissions","handleMissionListDeselect","CourseMissionCopyFromModal","handleSchoolSelected","schoolOptions","selectedSchoolId","fetchSchoolsAndCourses","handleChooseCourseButtonClick","selectedCourse","handleMissionCopy","onCopy","scrollIntoView","behavior","CourseMissionCopyFromModalMissionPart","resource","disabledMissions","missionQuery","handleMissionCollatorChange","CourseMissionCopyToModalComponent","_CourseMissionCopyToModalComponent_brand","handleCourseChooseListSelect","isInvalid","handleCourseChooseListDeselect","handleCopyButtonClick","_copy","modalContentElement","expandedEntities","firstBook","shortcutFiles","sortedShortcutIds","handleCourseShortcutActionMenuSelect","entityImportModalIsOpen","trackShortcutEvent","attachLinkModalOpen","fileChooseModalOpen","showFilePicker","handleEntityImportModal","deleteShortcutEntity","deleteShortcutFile","handleFileAttachmentAdd","attachment","concat","files","handleEntityImportModalExpand","handleEntityImportModalCollapse","handleEntityModalToggle","handleFileAttachmentClose","handleLinkAttachmentClose","handleAddShortcut","isCourseShortcutActionMenuOpen","toggleSort","sortable","_deleteEventListener","sortingShortcuts","mousePosition","selectSort","originalPositions","elements","shortcutsContainer","selectedItem","moveItem","keyCode","which","_resetMovingElements","sortShortcuts","saveBtn","_calculateNewPositions","multiple","capture","onChange","fileData","fileUpload","onFileUpload","scope","onStart","droppableAccepts","droppableData","draggableData","isMoving","newPosition","movingObject","slotObject","indexToRemove","slotIndex","dragging","removeAt","insertAt","touches","cursorX","clientX","cursorY","clientY","targetRect","draggingRect","targetCenter","mouseX","shortcutsContainerWidth","offsetWidth","row","tempWidth","object","newPositions","_moveToNewPositions","originalPosition","xCoord","yCoord","transform","mouseMoveEvent","MouseEvent","bubbles","dispatchEvent","transition","onEnd","selectableCourse","coursePagesDisabledProxy","userLicenses","userISBNs","courseISBNs","prod","coursePagesDisabled","loggedInStudents","last_login","notLoggedInStudents","courseSettingsURL","activeUser","licenseModalOpen","_CourseUserListComponent_brand","actionMenuButtonItems","description","onActionMenuButtonChange","_routeToAudit","close","AreaViewCoverCardComponent","imageClass","CustomContentDetailModalComponent","populated","customizableDescendents","populate","includedTeacherAssignments","includedWordlists","courseTeacherIds","contentTeacherAssignments","hasContent","contentWordlists","isTransformed","handleEntityCustomizerExpand","handleEntityCustomizerCollapse","handleEntityCustomizerInclude","handleEntityCustomizerExclude","handleAdditionCustomizerIncludeTeacherAssignment","handleAdditionCustomizerExcludeTeacherAssignment","handleAdditionCustomizerIncludeWordlist","handleAdditionCustomizerExcludeWordlist","_DiagnosisDoneComponent_brand","scoreMax","handleCloseButton","inMission","hasCloseUrl","redirectToVue","_isEmberRoute","routeInfo","recognize","latestResult","allowedTime","timeAllowed","attemptsDone","disabledInCourse","noAttemptsLeft","startDisabled","openResults","resultsOpen","closeResults","handleStartButtonClick","onStartButtonClick","DiagnosisResultItemComponent","showBorder","titleToShow","typeOf","setEntityContext","queryExercise","entityContext","unsetEntityContext","editUrl","currentRoute","activeWordlist","wordlist_id","activeItem","activeArea","activeWorkspaceSection","activeWorkspaceExercise","cmsBaseUrl","htmlSafeContent","querySelectorAll","PICKABLE_TYPES","selectable","inspectable","pickable","onShouldAllowPick","pickableTypes","pickedEntities","indent","depth","indentClass","property","descriptor","context","defineProperty","r","Symbol","toPrimitive","TypeError","String","_toPrimitive","decorators","desc","keys","decorator","createPromiseArray","extractRouteArgs","possibleQueryParams","hasOwnProperty","routeName","models","isSelectable","isSemiRouteActive","isSelecting","isPickable","isPicked","showingMeta","isExpandable","hideSortNumbers","hideSectionSortNumbers","siblingIndex","orginalRouteArgsProxy","routeArgsForEntity","orginalRouteArgs","isSettled","shouldRouteWithSection","shouldRouteWithExercise","routeArgsProxy","contentRoute","urlFor","currentContentRoute","routeArgs","productProxy","productsProxy","productId","overlappingProduct","p","routable","disabledEntities","entityType","_shouldAllowPick","routeHasExercise","isRouteActive","split","isContent","withSection","withExercise","selectedEntity","typeIsPickable","pickedEntity","childrenSum","handlePickCheckboxChange","_pickOrUnPick","clickEntity","hasModifier","_select","handleToggleMetaButtonClick","handleOpenEntityInspector","openMeta","closeMeta","scrollIntoViewIfNeeded","parentType","parentTemplate","_unpick","_pick","onPick","onUnpick","_collapse","_expand","onExpand","onCollapse","ALLOWED_TYPES","MANUAL","SORT","TITLE","CREATED","ORDER_OPTIONS","inverse","title_asc","title_desc","date_asc","date_desc","blacklistedEntityTypes","allowedEntityTypes","entityChildren","orderOptions","categoryGroups","categoryGroupsFinal","groupBy","uncategorizedGroup","categoryGroup","filteredEntities","sortSpaceGroups","spaceGroups","spaceGroup","shuffleArray","groupEntites","EntityCustomizerTreeGroup","_EntityCustomizerTreeGroup_brand","isLocked","level","isGroupedByType","groupedEntitiesByType","entitiesByType","acc","exists","entries","typeLabel","isAllIncluded","handleToggleAllButton","EntityCustomizerTreeItem","_EntityCustomizerTreeItem_brand","_applyCallbackToSettings","includedEntitySetting","numberOfTries","excludedChildren","showIndex","handleNumberOfTriesChange","onDiagnosisChange","handleTimeAllowedChange","callback","includedEntitySettings","ENTITY_TYPE_TO_NAME_MAPPING","archives","areas","glossaries","interactives","studies","books_junior","books_external","books_pdf","EntityIcon","importableTypes","controlled","onImport","handleLoad","handleEntityBrowserExpand","_expandEntity","loadEntityRelationships","handleEntityBrowserCollapse","_collapseEntity","handleEntityBrowserPick","_pickEntity","handleEntityBrowserUnpick","_unpickEntity","handleImportButtonClick","_import","_close","hash","_loadRelationships","_printComponent","component","media","isMediumOrLess","fullscreen","SECTIONS","onLoadStart","onLoadEnd","entityPromise","_entityIsAllowed","_createVersion","hasContentAuthors","authorNames","authors","author","names","firstName","trim","separator","lastName","datetime","toISOString","substring","productTitle","generateFallbackTitle","toLocaleTimeString","handleGoToButtonClick","_goTo","addToClipboard","copyToClipboard","materialEntityGroups","copyrightedMaterialEntityGroups","ceil","backgroundType","EntityInspectorDetailVersionTabComponent","_EntityInspectorDetailVersionTabComponent_brand","once","_setValueFromActiveSection","sectionChanged","activeCategoryName","selectedArticle","_selectedArticle","articles","articlesProxy","guidances","handleIndexSelect","article","scrollToTop","setScrollParent","HEADING_ATTENTIVE_CLASS_NAME","previousArticle","nextArticle","editorsProxy","editors","titles","first","tableOfContentsMenuButtonItems","handleTableOfContentsMenuButtonChange","queryByDataAttribute","instructions","el","menuValue","ROUTES_NEEDING_REFRESH_AFTER_CHANGES","MissionCustomizeComponent","controller","_dec3","_MissionCustomizeComponent_brand","_turnOfSpeakerIfActive","_closeModalOnRouteChange","isInteractive","categoryItems","contentsController","unrestrictedCategories","activeCategoryEntity","activeCategoryId","includedSectionsAndCollections","activeCustomContent","isActiveContentHidden","_isAllChildrenExcluded","_notifyParent","debouncedSave","_maybeNavigate","_getParent","handleCategoryChange","activeContentChildrenIds","includedId","isActiveCategoryHidden","debounce","_save","_shouldNavigateToSection","_navigateToNextOrPreviousSection","_shouldNavigateToInteractive","_navigateToNextOrPreviousInteractive","notifyPropertyChange","refresh","practice_id","sectionToNavigateTo","nextObject","categorizedSections","previousObject","practicesController","hasNextCollection","paginateToNextCollection","hasPreviousCollection","paginateToPreviousCollection","customContentDispatcher","inWorkspaceExercise","modalIsOpen","buildQueryParamsHash","isQueryParams","values","initialQueryParams","closeMissionHeader","routeParams","trackEvent","elevWebb","match","trackOpenElevwebbEvent","entityGuidance","isTeacherForSchool","guidance","onOpen","closeCollectionModal","cropImage","setBackgroundImage","imageChanged","observer","login","setInteractivePromise","interactivePromise","collectionOwnerProxy","collectionOwner","checked","inActiveCarousel","inCollectionView","numSubmittedAttemptAnswers","numStartedAnswers","numSubmittedAnswers","total","progress","collectionId","EntitySearchComponent","entitySearch","resetSearch","showPagination","searchStatus","totalHits","showEntityTree","handlePageChange","arg","EntityThumbnailComponent","isAvatar","avatarUser","isProgress","isIcon","ERROR_MAP","UnauthorizedError","ForbiddenError","NotFoundError","ConflictError","ServerError","statusCode","code","errorClass","error","explanation","greeting","TEMPLATES_WITH_EDITOR","ExerciseBottombarComponent","activeExerciseProxy","specialCharactersEnabled","special_keyboard_preset","behaviour","resetButtonId","guidFor","keyboardButtonId","keyButtonId","exerciseHasOnlyCheckAssignments","completed","allExercisesStarted","incomplete","hasSolutions","buttonKeyDisabled","shouldCheck","hideSolution","hideSolutions","courseSetting","showButtonKey","buttonNextDisabled","lastObject","showButtonNext","carouselNextExercise","carouselNextExerciseProxy","showButtonDone","buttonDoneDisabled","showButtonReset","buttonSubmitDisabled","showButtonSubmit","submitButtonLabel","_onEnter","submitAnswer","handleButtonDone","carouselDone","ExerciseViewAssignmentArrangeArrowIndicatorComponent","startLabel","endLabel","presentation","ExerciseViewAssignmentArrangeItemComponent","ItemStateComponent","suffix","showValidation","hasText","wrapperClassNames","dragItemClassNames","horizontalImageContainerClassNames","ExerciseViewArrangeImage","ItemImageComponent","ExerciseViewAssignmentArrangeComponent","DragAssignmentComponent","input","assignmentAnswer","hasImages","allowMultipleRows","allow_multi_line","horizontalWrapperClassNames","inputRow","onDroppableDrop","handleOnChange","textMarginLeft","showIncompleteMessage","handleChange","handleEnter","trigger","ExerciseViewAssignmentCommonHorizontalComponent","len","cssClass","ExerciseViewAssignmentCommonHorizontalItemComponent","groupValue","isMultiple","showValidationAndOption","onChangeCheckbox","splice","onChangeRadioButton","onEnter","ExerciseViewChoiceImage","ExerciseViewAssignmentChoiceComponent","_setAnswer","isEmpty","showHint","falseAlternatives","_setGroupValue","answerUpdated","preview","ExerciseViewAssignmentChoiceLabelComponent","ExerciseViewAssignmentEditableMatrixComponent","tableClass","header","valign","vertical_alignment","halign","horizontal_alignment","table","tableData","cells","rowIndex","columns","column","colIndex","placeholder","object_id","clue","isHeading","_isHeading","tableAppearance","ExerciseViewAssignmentEditableMatrixTextareaComponent","objectId","handleTableCellFocus","textarea","handleToggleClue","showClue","ExerciseViewAssignmentEditorComponent","ready","isIncomplete","canHaveAttachments","numberOfMediaAssignments","presetClass","editorToolbarOptions","textFormats","headings","lists","tables","editorCapabilities","updateText","inputChanged","editorElement","setValueFromHtml","ExerciseViewAssignmentComponent","isAutoCorrected","hasMultipleAssignments","listType","indexString","exerciseType","hasSuggestion","suggestion","suggestionVisible","suffixClassName","behaviourClassName","disabledClassName","keyClassName","contentClassNames","validationVisible","audioProxy","imageProxy","ExerciseViewMatchImage","ExerciseViewAssignmentMatchComponent","hasValueImage","value_image","keyValue","droppableContent","droppableImage","draggableContent","oldKey","assigned","ExerciseViewAssignmentMatchItemComponent","keyAssigned","draggableScrollSize","withinContent","paired","TABLE_SETTINGS","TextGapComponent","tbRenderContent","assignmentSettings","underscore","rows","ExerciseViewAssignmentMediaComponent","filesProxy","audioURL","playerStatus","isRecording","playerText","isUploading","mediaLabel","showIncomplete","disableRecordButton","mediaIsRecording","handleRecording","micPermission","_getMicApproval","_stopTimer","recordAudio","stopRecording","finishRecording","returnRecording","handleFileUploadPerform","audioBlob","changeMediaRecordingStatus","_startTimer","startRecording","removeAudioFile","danger","fileDispatcher","delete","pendingFile","recorded","performUpload","onResolve","finally","onFinally","navigator","mediaDevices","getUserMedia","stream","recordTime","_tick","showTimer","ExerciseViewAssignmentNumberLineComponent","validValues","start_index","stage","ExerciseViewAssignmentPlaceChoicesComponent","markers","handleMarkerScopeClick","_isClickOnBackground","highlightMarkers","ExerciseViewAssignmentPlaceChoicesItemComponent","ExerciseViewPlaceImagesComponent","ExerciseViewAssignmentPlaceImagesComponent","images","hasAlternatives","isDropzone","highlightImageClass","highlightImages","alternativeImagesProxy","alternativeImages","showClickHint","validateAssignmentCompleted","marker","_markerStatus","clone","markerStatus","selectedAlternative","_remainingMarker","extra","triedDragItem","buttonHold","handleButtonHold","handleClearButtonHold","handleSelectMarker","_markerAlternative","handleRemoveAlternative","selectedMarker","handleAssignmentAnswer","skipHighlight","_clearMarker","handleImageClick","handleClickOnBackgroundImage","ExerciseViewPlaceImagesItemComponent","assignedAlternative","duplicateImages","assignedTo","ExerciseViewAssignmentPlaceImagesMarkerImageComponent","PLACEMENT","ALIGNMENT","ExerciseViewAssignmentPlaceImagesMarkerComponent","assigned_to","isDroppable","markerAlternative","isDropped","iconClass","markerIcon","hasAlternativeImage","isEmptyDropzone","dropzoneHeight","wrapperWidthPx","backgroundImage","wrapperHeightPx","innerWidthPercent","innerHeightPx","innerWidthPx","showMarker","showDropzone","markerClass","dropzoneClass","onSelectMarker","placement","position","alignment","ExerciseViewAssignmentPlaceTextGapsComponent","ExerciseViewAssignmentPlaceTextGapsItemComponent","markerItem","word","isBlank","corrections","correctionwrite","isPlaceTextGapWordCorrect","handleInputKeyDown","ExerciseViewAssignmentPlaceWordsComponent","validationIsVisible","hasItems","labels","highlightWordsClass","highlightWords","_highlightMarker","labelWidth","handleLabelClick","_markerLabel","onRemoveLabel","skipHighlighWords","handleRemoveLabel","handleClickOnImage","ExerciseViewCommonInteractiveItemComponent","labelValue","labelPlacement","labelAlignment","ExerciseViewAssignmentPlaceWordsMarkerComponent","_labelPlacement","_labelAlignment","ExerciseViewReplyImage","ExerciseViewAssignmentReplyComponent","inputValue","isFormula","hasUnit","unit","suffixClass","inputDisabled","ExerciseViewAssignmentSortGroupComponent","imageSelector","groupId","groupItems","ExerciseViewSortImage","ExerciseViewAssignmentSortComponent","hasGroupImages","group_image","itemsInList","unassignedItems","noItemsInList","correctAssigned","handleDroppedItem","availableGroups","groupItem","pushObject","handleRemoveItem","ExerciseViewAssignmentSortItemComponent","innerValue","isAlphabetical","inGroup","outerValue","behaviourObjects","isAssigned","showRemoveIcon","ExerciseViewAssignmentTextGapDragGapComponent","node","gapObj","gapValue","droppableAccept","removeDragItem","ExerciseViewAssignmentTextGapDragComponent","_setAlternatives","_setDragAlternatives","shuffledAlternatives","handleRemoveDragItem","gap","added","dragAlternatives","ExerciseViewAssignmentTextGapComponent","ExerciseViewAssignmentTextGapSelectGapComponent","gaps","selectAlternatives","ExerciseViewAssignmentTextGapWriteComponent","ExerciseViewAssignmentTextGapWriteGapComponent","ExerciseViewCommonDragAlternativesComponent","empty","emptyLabel","draggingClassName","handleDragStart","draggablePositions","_getDraggablePositions","handleDragEnd","droppables","positions","droppable","draggables","textContent","draggable","_getActiveDraggable","activeDraggable","_findChangedDraggable","initial","current","curr","_highlightDraggable","initDraggable","ExerciseViewAssignmentCommonDragItemComponent","hasValidation","placeholderClass","sizeClass","hasHover","ExerciseViewAssignmentCommonDropItemComponent","pairable","single","hasDraggable","allowCrop","imagePadding","disablePadding","isHorizontal","isGroup","selector","box","imageIsPortrait","focusPoint","px","py","crop","componentData","assignedClassName","pairedClassName","inGroupClassName","shakeElement","ExerciseViewCommonMarkerScopeComponent","showDividerTemplateList","hideAttachedFiles","isElementInViewport","IntersectionObserver","entry","isIntersecting","disconnect","ExerciseViewComponent","exerciseLanguage","hide_fields_feedback","showComments","exerciseParent","canStartConversation","numComments","class","fileList","allow_attachments","exerciseOwnerProxy","exerciseOwner","canEditExercise","ownerId","localStatus","exerciseLink","assignmentsOrdered","shouldShowDivider","exerciseParentProxy","exerciseTitle","htmlEntities","numCommentsProxy","showTitle","showDraftBadge","commentsDisabled","shouldResetAnswerStatus","scrollToComments","_clearAnswer","_submitAnswer","_onChange","handleReset","removeExerciseFromWorkspace","currentContent","deleteAsEntity","handleDidInsertAssignment","focusedExercise","candidateElement","resetExerciseFocus","handleFileAssignmentAdd","handleFileAssignmentRemove","toggleKeyboard","showKeyboard","autoSaveAnswer","_validateAnswer","exerciseAssignment","isAny","correctExercise","unlinked","FileAssignmentComponent","buttonItems","handleMenuButtonChange","fileChooseModalIsOpen","openFilePicker","attachLinkModalIsOpen","onAdd","handleFileUploadAbort","abortUpload","handleCloseAttachLinkModal","handleCloseFileChooseModal","handleFileChooseModalChoose","fileOrFiles","QUERY","FileChooseModalComponent","handleFileUploadPeform","pickedFiles","clear","handleArchiveCollatorQuery","handleFilePickerPick","handleFilePickerUnpick","handleFileDelete","deleteMany","waitFor","FilePickerGridItemComponent","disabledFiles","focusMode","leaveFocus","turnOff","footnotes","getIndex","footnote","decodeURIComponent","handleMouseDown","isOpen","groupsOnboarding","loaded","informationSeen","dismiss","dismissInformation","HeaderBasicButton","HeaderButton","wide","startCircle","withIcon","withText","HeaderBaseComboButtonButton","HeaderBaseComboButtonComponent","HeaderBaseComboButtonPrimaryButtonComponent","scrollToTopIfNeeded","CourseUsersButton","shouldShowNotification","usersMissingLicenses","numMissing","HeaderBaseEntityBreadcrumbComponent","handleEntityLinkClick","HeaderBaseHelpButton","helpListStudentsProxy","courseHelpList","helpListStudents","isAskingForHelp","isStudentsInQueue","placeInQueue","initialPlaceInQueue","handleHelpButtonClick","helpList","lowerHand","showQue","popupOpen","raiseHand","relationships","checkUpdate","handleOpenHelplist","HeaderBase","logoHref","nokPortalURL","skolonEndpoint","environmentName","showSkolonLogo","provider","matchMedia","matches","activeIsbn","showAiChatButton","activeHelpList","showHelpButton","HeaderLink","HeaderBaseLogoLinkComponent","handleLogoClick","trackPageHeaderEvent","REJECTED_NODE_TYPES","GlobalBreadcrumb","ancestorsProxy","getParents","parents","HeaderBaseMetaModal","infoItems","returnArray","returnURL","handleCopyOrShare","onOpenShareLinkModal","_change","NavigationDrawer","activeEntity","routerRouteDidChange","searchableBooks","activeCourseElement","initiator","HeaderBaseSupportButtonComponent","TeacherButton","activeGroupName","hasMenuItems","attachedTeacherGuidance","showTeacherGuidanceButton","showCustomizeButton","auditLink","showCreateMissionButton","hasItemsBelowDivider","URLSearchParams","isMissionCustomizerVisible","isIncludedEntitiesEmpty","includedSections","includedCollections","attachedTeacherGuidanceProxy","attached_teacher_guidance","selectItem","studentList","hasLicense","showLicenseModal","createMission","missionTitle","HeaderBaseTeacherGuidanceButtonComponent","inspectedEntity","modalSection","handleButtonClick","UserButton","passToken","nokAccountComponent","BookHeader","breadcrumbEntities","ContentHeader","skipCoverPage","gotoReturnUrl","showBackButton","inExercise","gotoActiveContent","handleCourseChange","previousCourseId","openNavigationDrawer","isNavigationDrawerOpen","closeNavigationDrawer","CourseHeaderSwitchCoursePopup","coursesProxy","filteredAndSortedCourses","hasInternalBooks","courseA","courseB","gotoMission","Header","_Header_brand","accountWidgetUrl","closeContent","inActiveDiagnosis","done","MissionHeaderComponent","isReturnButtonVisible","isButtonVisible","trackMissionEvent","handleReturnButtonClick","goto","ProductHeader","hasProductPage","HelpListComponent","helpListActiveStatus","currentHelpList","helpListActive","activateHelpList","deactivateHelpList","helpDone","materialType","searchArr","boxClasses","setContainerElementBackground","IndexCircleComponent","className","InteractiveImageWrapper","properties","svg","svg_url","aspectRatio","image_width","image_height","invisibleMarkers","invisible_markers","legends","camelizeKeys","copyright","zoomLayers","zoom_layers","stepLayers","step_layers","markerBehavior","showZoomTip","interactiveImageStore","showStepTip","showMarkerTip","handleHideMarkerTip","handleHideZoomTip","handleHideStepTip","handleInteractiveImageSelectMarker","handleMaterialViewerClose","onLoadMaterial","loadDataFromStore","onMarkerClick","hasPlayback","pauseOther","InteractivesCollectionItemCarousel","InteractivesCollectionItemDiagnosis","InteractivesCollectionItem","hasImageTemplate","InteractivesOneColumnWithImageThumbnail","InteractivesCoverImage","pageViews","productViews","selectedMaterial","courseIds","getVisitedContentIds","hasMultipleSections","activeExerciseObserver","editorObserver","exerciseObserver","_setActiveExerciseAndAnswers","_scrollIntoViewIfActiveInNextFrame","requestAnimationFrame","_scrollIntoViewIfActive","preventScrollIntoView","isPrevented","windowScroll","_debouncedRouteToClosestSection","passive","willDestroyElement","_routeToClosestSection","sectionElements","sectionElement","previousElementSibling","offsetTop","pageYOffset","viewportTop","getAttribute","activeSectionObserver","isDestroying","isDestroyed","MaterialViewerAttachmentDialog","_MaterialViewerAttachmentDialog_brand","_downloadAttachment","handleRetryButtonClick","openMaterialDownload","MaterialViewerImagePopup","MaterialViewer","loadImage","processSource","_isNokLink","_isPdf","hostname","filename","download_name","endsWith","MaterialViewerLightbox","_MaterialViewerLightbox_brand","isNarrow","handleCaptionParagraphClick","hasAttribute","MaterialViewerLinkDialog","_MaterialViewerLinkDialog_brand","handleContinueButtonClick","MissionAddActionMenu","includeActivate","MissionBrowserComponent","displayDetails","delay","SCHEDULING_MENU_BUTTON_ITEMS","SCHEDULE","MissionBrowserItemComponent","_MissionBrowserItemComponent_brand","canBeOpened","hasDescription","customContents","linkedEntities","hasEndBadge","daysLeft","hasHiddenBadge","isOngoing","schedule","isScheduled","endDate","hasEnded","startDate","getFullYear","getMonth","getDate","hasAuditLink","hasCustomContents","canBeAudited","highlightedMissions","handleMissionOptionsActionMenuSelect","_share","_edit","_audit","_toggleActivation","_hide","isScheduleDetailModalOpen","handleToggleVisiblitySwitchChange","handleSchedulingMenuButtonChange","_cancelSchedule","handleSchedulePopupSchedule","_schedule","handleHideButtonClick","onSchedule","onShare","onEdit","isHiding","onHide","isTogglingVisibility","onToggleActivation","onCancelSchedule","MissionCollator","_MissionCollator_brand","hasSearch","handleSearchClear","showContent","MissionContentCustomContentList","canBeExpanded","showAll","MissionContentCustomContentListItem","highlightedCustomContent","routePromise","getRoute","notFound","handleEditButtonClick","getPreferredTextVersion","at","afterRouteChange","inCustomContent","MissionContentCustomContentListItemThumbnail","MissionDetailModalCustomContentListItemActionButtonComponent","MissionDetailModalCustomContentListItemComponent","handlePathButtonClick","isPathPopupOpen","ATTACH_MENU_BUTTON_ITEMS","internalLink","fromDevice","fromArchive","VISIBILITY","visible","hidden","scheduled","scrollFirstInvalidInputElementIntoViewIfNeeded","formElement","inputElement","MissionDetailModalComponent","_MissionDetailModalComponent_brand","textColors","links","equations","receivers","attachMenuButtonItems","visibilityOptions","handleVisibilityRadioButtonGroupChange","visibility","scheduleFormPartElement","handleTargetIndividualReceiversCheckboxChange","handleAttachMenuButtonChange","isFileChooseModalOpen","_showFilePicker","isAttachLinkModalOpen","isEntityImportModalOpen","handleFormSubmit","onSave","handleContentEntityImportModalImport","addNewCustomContent","handleCustomContentListSort","sortedCustomContentIds","handleContentEntityImportModalExpand","expandedContentEntities","handleContentEntityImportModalCollapse","handleCustomContentListRemove","removeCustomContent","handleAttachLinkModalChoose","handleFilesPreviewerRemove","handleEntityImportModalImport","handleLinkAttachmentRemove","_fileUpload","MissionIntroCardComponent","MissionList","MissionListItem","MissionShareButtonComponent","EDIT","UNLINK","DELETE","performMenuButtonItems","unlinkable","notes","narrow","showRouteName","onPerform","noteDispatcher","note","highlightedNotes","didRender","highlightedNote","NoteChooseModalComponent","handleAdditionCollatorQuery","pickedNotes","handleNotePickerPick","handleNotePickerUnpick","handleDelete","indexRouteName","hasBreadcrumb","NotePickerGridItemComponent","disabledNotes","notice","cookies","savedShown","shown","snackId","dismissById","animate","buttons","dismissOnClick","writeCookie","markAsRead","snack","displayIcon","displayDismissButton","actionButtons","update","htmlSafeMessage","openTarget","menuItems","openNav","navOpen","closeNav","PageHeaderComponent","withLogo","use_logo","cssClasses","small","textColor","canAccessCMSNode","hasCMSAccess","accesses","mouseDown","initialX","initialY","mouseMove","mouseUp","ref","removeProperty","currentX","currentY","up","down","moved","positionY","positionX","_move","togglePreview","urlSearchParams","pathname","alias","hasColorBackground","equal","productMenuItems","QrCodeImageComponent","QRCode","errorCorrectionLevel","console","OFFSET_STYLE_VARIABLE_NAME","SPACE_STYLE_VARIABLE_NAME","offset","onResize","onMove","performDelay","minSpace","method","lasty","_resizeTimeout","_moveTimeout","isResizing","isPerforming","bool","closeButtonId","moveButtonId","resizeButtonId","handleCloseButtonClick","handleMoveButtonTouchStart","documentTouchEnd","changedTouches","documentTouchMove","handleMoveButtonMouseDown","documentMouseUp","documentMouseMove","handleResizeButtonTouchStart","handleResizeButtonMouseDown","windowResize","_calculateHeight","movementY","_resize","_setStyleVariable","didDestroyElement","spaceObserver","offsetObserver","amount","newAmount","_getStyleVariable","min","getComputedStyle","getPropertyValue","ReadSettingsComponent","showFontSizeOption","showFontFaceOption","showMarkingOption","showThemeOption","showReadRulerOption","showLineHeightOption","showBrowseOrScrollOption","showOnlyTextOption","themeOptions","markingOptions","fontSizeOptions","modeOptions","lineHeightOptions","fonts","enterFocus","turnOn","setMode","trackPresentationEvent","setFontFamily","setFontSize","setLineHeight","setReadRuler","setOnlyText","setMarking","STATES","_ReadingBuddyComponent_brand","avatar","currentState","displayText","readingBuddyClass","inPauseState","readingBuddyActiveClass","isActivated","isPaused","isListening","isSpeaking","isEnded","handleMinimize","isMinimized","trackReadingBuddyEvent","handleMaximize","_scrollToReadingBuddyIfNeeded","handleRestart","dispatchPause","activate","end","resetPage","dispatchTurnPage","resetOnPageChange","TalaSpeech","send","dispatchActivate","dispatchPrepare","dispatchStop","sendInitialTurnPage","setup","stateListener","TalaSpeechUIState","segment","log","subscription","deviceID","azureCredentials","azureApiTokenEndpoint","azureRegion","locale","speechRecognitionEndpointId","ttsDefaultVoice","waitForTalkomatic","intervalID","setInterval","clearInterval","subscribe","babelEnv","talkamatic","rootURL","unsubscribe","readingProxy","readingId","reading","readingUrl","Schedule","SchedulePopup","autofocus","onClear","onSearch","updateSearch","timeout","drop","clearSearch","SelectListItem","handleDidInsert","modalTitle","fullLink","hideOptions","qrModalIsOpen","includeProvider","finalLink","selectAll","setSelectionRange","handleDownloadQrCodeButtonClick","createElement","download","click","downloadSource","toDataURL","handleCopyToClipboard","encodedLinkToShare","encodeURIComponent","handleButtonLongPress","_openMenu","handleMenuClose","_closeMenu","menuMouseDragMode","menuIsOpen","handleListChange","shareMetaItems","handleOpenInspector","shareModalOpen","lang","player","playing","speakerSettings","Audio","_getDigilarTextProcessingRuleSets","SpeakerTextProcessorRuleSet","digilarGeneralRuleSet","_play","isLastItemToPlay","string","textProcessor","SpeakerTextProcessor","removeHtmlComments","removeHtmlTags","replaceHtmlEntities","getProcessedText","plugin","DigilarPollyProviderFactory","newPollyPlugin","pollyProxyParams","speechSpeed","generalDigilarTextProcessingRuleSets","textConverter","SpeakerTtsTextConverter","getSyntaxPlugin","getTextProcessingRuleSets","textToSpeech","audioUrl","src","play","onended","startPlayList","isLastItem","pause","currentTime","speakerService","speakerSession","requireUserInteraction","onRequiredUserInteraction","onCancelRequiredUserInteraction","_recordedSpeechProviderId","_textToSpeechProviderId","_autoplaySpeakerOnLoad","DigilarSpeakerType","MAIN","POPUP","_digilarSpeakerConfig","autoplay","_domHelper","DigilarDomHelper","speakerConfig","onlyImages","isPageTranslated","viewportUtils","viewportBottom","elemOffset","getSingleRecordedSpeechAudioSourceConfig","_getSingleRecordedSpeechAudioSourceConfig","_speakerContext","SpeakerContext","getSpeakerOptions","_getSpeakerOptions","speakerControls","_getSpeakerControls","speakerTypes","defaultSpeakerType","getContentLanguage","_getContentLanguage","handleSpeakerEvent","_handleSpeakerEvent","checkIfReadyToInitializeSpeaker","_checkIfReadyToInitializeSpeaker","newSpeakerAdapter","_newSpeakerAdapter","newDomHandler","_newDomHandler","onInit","audioSources","_afterSpeakerContextInit","onContextFocusChange","contextUuid","hasFocus","onSpeakerActive","speakerType","speakerContext","speakerAdapter","hasContextFocus","_updateSpeechSpeedSetting","initialContextFocus","pauseOnContextFocusLost","_speakerSandboxes","main","registerSpeakerContext","_updateTextHighlightingOptions","_initObservedProperties","speechSpeedSettingHasEffect","forceHtml5Audio","useTtsSpeechSpeed","currentRecordedSpeechProviderId","currentTextToSpeechProviderId","recordedSpeechAudioSource","isRecordedSpeech","recordedSpeechConfig","recordedSpeechProviderData","recordedSpeechProviderId","textToSpeechAudioSource","textToSpeechConfig","textToSpeechProviderId","_updatePlaybackSpeed","digilarSpeakerControls","getOnClickPromise","_resumeAfterAutoplayError","digilarSpeakerOptions","getSelectedSpeechSpeed","_getSelectedSpeechSpeed","speakerUuid","SpeakerDomHandler","domHelper","customSpeakerEventHandler","domHandler","contextData","digilarDomSpeakerEventHandler","applyCustomSpeakerMarkup","speakerSandbox","initializedAudioSources","shouldFollowText","getTextHighlightingOptions","onBreakingDomChange","getSpeakerContextDomElement","document_id","recordedSpeechUrl","recordedSpeechBaseUrl","_newDigilarRecordedSpeechProvider","singleRecordedSpeechConfig","prioritizeSingleRecordedSpeechAudioSource","alwaysUseSingleRecordedSpeechFileForStory","DigilarRecordedSpeechProvider","_newIltRecordedSpeechProvider","enablePlayNextOnLoadError","articleIds","getArticleIds","readMode","iltApi","IltApi","ilt","reportListeningsDisabled","iltDataParser","IltDataParser","iltError","getJwt","IltRecordedSpeechProvider","_newAudioSourceHandler","recordedSpeechProviderPriority","DigilarAudioSourceHandler","SpeakerAdapter","getRecordedSpeechProviderPlugins","selectedPlugins","pluginFactoryFunctions","digilar","providerId","getTextToSpeechProviderPlugins","TtsProviders","Polly","getAudioSourceHandler","isValidTtsText","ttsProviderId","rawText","isValidTtsElem","hasUnresolvedTextBlocks","resumeAfterAutoplayError","isLastAudioSource","success","getUuid","textMetaDataError","warn","withSpeaker","_speaker","next","ruleSets","htmlElementsToPauseAfter","getHtmlElementsToPauseAfter","htmlElementsToRemove","getHtmlElementsToRemoveFromTextProcessing","languageSpecificRuleSet","languageRuleSets","sv","digilarGeneralRuleSetSv","getLanguageSpecificRuleSet","speechSpeedSetting","speechSpeedValues","speakerContextUuidObserver","setContextFocus","lastPlayingSpeakerContextUuidObserver","forEachSpeaker","speakerActiveObserver","_startContentPoller","_stopContentPoller","cinemaModeObserver","addSpeakerControlsToStoryImage","progressBarValue","getCurrentAudioSource","duration","applySpeakerMarkUpToStoryImage","numberOfAudioSources","numberOfInitializedAudioSources","highlightAsSelected","isPlaying","highlightAsPlaying","highlightAsPaused","cleanUpStoryImage","observePropsToResetPopupSpeaker","sender","attributeName","findPopupSpeakerDomContextElem","loadFromAudioSourceIndex","autoplayFirstLoadedAudioSource","observePropsToResetMainSpeaker","isInitialized","_ref5","ttsAudioSourceExists","_ref6","hasTtsAudioSources","_ref7","shouldSetContextFocus","giveFocusToContext","countRegisteredSpeakerContexts","isSpeakerContextWithinWorkflow","autoSelectFirstAudioSource","autoSelectFirstVisibleAudioSource","_nextTick","setActiveSpeaker","_ref8","rsPlaybackSpeed","setPlaybackSpeedRecordedSpeech","ttsPlaybackSpeed","setPlaybackSpeedTextToSpeech","speakerSpeechSpeedObserver","setTextHighlighting","highlightingObserver","_contentPoller","Poller","popupSpeakerDomElem","isDomElemAvailable","_ref9","isSpeakerContextDomElementAvailable","getActiveSpeaker","withSpeakerTransactional","_ref10","initPopupSpeakerOptions","initSpeaker","_ref11","cleanUp","initMainSpeakerOptions","resolveData","unregisterSpeakerContext","addSpeakerContextClickListener","htmlTag","getHTMLElement","MutationObserver","_setPageTranslationInfo","attributeFilter","bookProxy","pageIsTranslated","recorded_speech_activated","ilt_activated","iltEnabled","translationLanguage","PRESETS","french","common","upper","german","italian","spanish","swedish","FORM_ELEMENTS","NOK_EDITOR_SELECTOR","NOK_EDITOR_CONTENTEDITABLE_SELECTOR","characterSet","characters","lowerCaseLetters","upperCaseLetters","commonLetters","showShiftKey","shiftIcon","shiftAlternative","lowercased","shouldShowGreekBetaInsteadOfEszett","insertChar","char","isNokEditor","insertText","execCommand","toggleCase","preventBlur","detectFocus","setEnabledIfFocus","srcElement","detectBlur","activeElement","handleStartWithReading","setSpeakerActive","setAutoplay","handleStartWithoutReading","handleOnlyImage","canSelectAll","groupsUsers","initials","selectedOption","itemProps","props","firstSectionQuery","initialPreserveScrollPositionState","TableOfContentsItemComponent","sortedComponents","activeSubHeading","isSectionRouteActive","isCollectionRouteActive","scrollBehavior","isInteractiveRouteActive","firstSection","isAnotherCategory","unrestrictedSections","showNumberOfAssignments","assignmentItem","compontents","childClass","isSectionWithExercises","hasToggler","togglerClass","shouldRouteOnSubHeadingClick","assignmentItemProxy","getElementsByTagName","toggleExpanded","isReadOnly","_scrollToHeading","handleOpenExercise","_navigateToExercise","TableOfContentsListComponent","groupedLists","categoryIds","categoryTitle","TableOfContentsComponent","SYMBOL_VALUE_TO_CHAR_CODE_MAPPING","nbsp","narrownbsp","thinsp","shy","TbRenderInlineComponent","nodes","div","innerHTML","parentNode","replaceChild","createTextNode","fromCharCode","dataset","transformSymbols","himalaya","parse","TAG_NAME_TO_TYPE_MAPPING","u","strike","span","br","sub","sup","em","strong","ol","ul","li","TbRenderInlineElementComponent","stripTags","dataType","componentName","markingClass","marking","variantClass","shiftKey","ctrlKey","metaKey","COMPONENT_PREFIX","IMMERSION_TYPES","linkType","materialPromise","materialProxy","typeIsAllowed","isCustomComponent","openMaterialPreview","hasMaterialPreview","closeMaterialPreview","hasReturnUrl","return_url","close_url","custom_content","handleModalClose","handleBoxContinue","canSave","linkId","parentElementId","insertElement","parentComponentElement","parentComponentLanguage","popoverIsOpen","handlePopoverClose","TbRenderInlineElementExtensionComponent","TbRenderInlineElementExtensionFootnoteComponent","dataId","getFootnote","TbRenderInlineElementExtensionFormulaComponent","formula","rawValue","TbRenderInlineElementFormatComponent","onElementInsert","_isLineBreak","previousSibling","nextSibling","nodeType","TBRenderInlineElementFormatTextColorComponent","color","SIZE_TO_IMAGE_SIZE","medium","large","maxDim","imageWidthRounded","round","imageHeightRounded","retinaImageWidth","retinaImageHeight","hasSpacer","TbRenderInlineIteratorComponent","pronounceValue","TbRenderInlineTextComponent","encode","editorProxy","editorId","TbRenderBlockComponent","asyncId","assignment_link_id","asyncData","assignmentHasPossibleAnswer","isExcluded","peekAll","openLink","openMaterialViewer","materialViewerIsOpen","closeMaterialViewer","media_id","showLabel","handleAudioPlayButtonClick","getSettingClassesForPart","extraClasses","asyncProxy","asyncType","TbRenderCanvasComponent","TbRenderCodeComponent","theme","lineNumbers","line_numbers","showCaption","show_caption","viewportMargin","Infinity","ALLOWED_COMPONENTS","TbRenderColumnComponent","templateDisjoin","template_disjoin","prevGroup","parts","sortedRows","TbRenderEmbedComponent","embed_id","wrapperStyle","combineStyle","paddingTop","handleStopEvent","toggleListening","encourageListeningEnabled","isBlockSelected","shouldDisableOnEnd","poller","getSpeakerAdapter","handlePlayEvent","startSpeaker","pollState","statePoller","isInsideBubble","isMultipart","isUserTriggered","recordedSpeechPartIndex","firstSpeakerElement","speakerBlockDataAttribute","speakerTextId","contexts","getRegisteredSpeakerContexts","getSpeakerAdapterForSpeakerTextId","ctx","_audioSources","_originalConfig","getIncludesTextIndexes","allElements","includedTextIndexes","currentAudioSource","audioSourceIndex","autoLoad","autoPlayWhenLoaded","playNextOnError","selectedImage","_selectedImage","comparableImages","selectedImageIndex","captions","currentCaption","imageViewerImages","caption","imageColor","mimetype","imageMimetype","previousImage","nextImage","fullscreenIcon","isFullscreenAvailable","resizedImageDimensions","getResizedImageDimensions","resizedImageWidth","resizedImageHeight","handlePreviousButtonClick","handleNextButtonClick","handleImageSelectImage","handleFullscreenButtonClick","handleImageViewerClose","FILES","TbRenderGroupComponent","imgSrc","templateClass","dasherize","legacyTemplateClass","TbRenderHeadingComponent","isH3","isH4","isH5","video_id","videoLoaded","handleVideoReady","handleVideoClick","videoContainer","videoElement","paused","videoService","pauseOtherVideos","isMaterialViewerOpen","noShadow","alt","alt_text","preferredSize","preferred_size","preferredSizeStyle","imageBackground","handleFullscreenClick","TbRenderInteractiveImageComponent","LIST_STYLES","ordered","orderedParen","orderedPlain","lowerAlpha","lowerAlphaDot","lowerAlphaPlain","lowerRoman","unordered","unorderedHollow","unorderedSquare","arrow","arrowTail","blank","tags","DEFAULT_STYLES_BY_LEVEL","arrow_tail","TbRenderListComponent","numberToBase26","getDefaultStyleForLevel","mainStyle","getEffectiveStyleForLevel","styles","levelStyle","itemGroups","effectiveStyle","effectiveStart","getStartForLevel","nestedItemGroups","itemGroup","parentItemGroup","previousObj","previousObjectBy","overrideStyle","sizeStyle","cssStyle","TbRenderParagraphComponent","HIDDEN_COMPONENTS_IN_ONLYTEXT","forceMedia","sortedColumns","rowClassNames","column_width","encourage_listening_enabled","with_prefix","onlyIlt","only_ilt","showRowPromise","getToken","hasBegreppa","TbRenderTableComponent","horizontal_heading","vertical_heading","TbRenderTagComponent","TbRenderVideoComponent","TeacherAssignmentChooseModalComponent","pickedTeacherAssignments","handleTeacherAssignmentPickerPick","handleTeacherAssignmentPickerUnpick","teacherAssignmentDispatcher","cancelRouteName","TeacherAssignmentPickerItemComponent","disabledTeacherAssignments","currentTheme","setTheme","UserSelectCheckbox","selectedUsers","sortedSelected","modalSelected","userChanged","saveUsers","sortedUsers","filteredUsers","lastname","firstname","username","listname","numMatchingUsers","toggle","checkbox","Event","plyr","subtitles","posterUrl","videoReady","setupPlayer","_updatePlyr","_initPlyr","mediaElem","Plyr","enabled","fallback","iosNative","restart","rewind","seektime","fastForward","seek","seekLabel","played","buffered","volume","mute","unmute","enableCaptions","disableCaptions","enterFullscreen","frameTitle","menuBack","normal","quality","loop","advertisement","qualityBadge","blankVideo","listeners","_plyrVideo","tracks","activateSubs","kind","srclang","subtitle_url","sources","poster","WaitForComponent","isGlossary","isConcepts","isTransformedGlossary","and","isTransformedConcepts","wordExplanationPopoverIsOpen","wordClass","wordConstruction","examples","translation","htmlSafeWordClass","htmlSafeWordConstruction","wordExplanationLanguage","wordLanguage","strippedExplanation","html","DOMParser","parseFromString","overridable","selected_tab","readTextArray","defaultLanguage","STRIP_HTML_RX","STRIP_PARENTHESES","SYMBOLS","replacement","charCode","replaceSymbols","fragment","strHTML","createRange","createContextualFragment","symbol","fragmentToString","userAgent","currentWordIndex","totalWords","answerWithWord","totalCorrectAnswers","wrongAnswer","shuffledWords","currentWord","hasStarted","trainOnTranslations","correctAnswers","_stripWord","noShuffledWords","inputFocus","percentCorrect","percentDone","filteredWords","_initQuiz","_setFocus","_reset","_nextWord","incrementProperty","_normalizeString","_answer","stripParentheses","stripHtml","replaceAll","RegExp","replaceInvisibleCharacters","nextWord","switchType","showBetaInfo","defaultUserLang","questionLabel","question","answerLabel","correctAnswersString","favWordlists","wordSaved","isUser","contentWordLists","currentEntityId","selectedWordlist","wordlistIds","list","favListId","listId","relatedWordLists","wordlistOptions","changeWordlist","wordlistWasNew","sendEvent","addIncludedWordlistIfNeeded","disabledWordlists","highlightedWordlist","PUBLISH","UNPUBLISH","DUPLICATE","ADD_WORD","QUIZ","wordlistDispatcher","highlightedWordlists","isQuizable","WordlistChooseModalComponent","pickedWordlists","handleWordlistPickerPick","handleWordlistPickerUnpick","GLOSSARIES","CONCEPTS","typeRadioButtonGroupItems","handleCancel","WordlistPickerItemComponent","onWordPerform","quiz","sortedWords","handleWordlistQuizModalClose","openQuiz","BODY_CLASS_NAME","to","fromSegments","toSegments","handleTeacherAssignmentDetailAddFile","handleTeacherAssignmentDetailRemoveFile","handleTeacherAssignmentDetailSave","publish","updateAsEntity","addIncludedTeacherAssignmentIfNeeded","handleTeacherAssignmentDetailDelete","currentTeacherAssignments","noAssignmentsMessage","handleTeacherAssignmentChooseModalChoose","linkMany","handleTeacherAssignmentsAddedToCollection","handleDrawerClose","bookEntity","pageviews","logPageView","contentController","handleNoteDetailUnlink","unlink","handleNoteDetailSave","handleNoteDetailDelete","currentNotes","relatedNotes","openNoteChooseModal","noteChooseModalIsOpen","closeNoteChooseModal","handleNoteBrowserPerform","handleNoteChooseModalChoose","highlightMany","handleWordlistDetailSave","handleWordlistDetailDelete","_dec4","currentWordlists","relatedWordlists","openWordlistChooseModal","wordlistChooseModalIsOpen","closeWordlistChooseModal","trackNewWordlist","handleWordlistBrowserPerform","duplicate","duplicatedWordlist","handleWordlistChooseModalChoose","handleWordlistViewUnlink","handleWordlistViewDuplicate","handleWordlistViewWordPerform","wordDispatcher","handleWordDetailSave","handleWordDetailDelete","Controller","languageChanged","shouldScreenReaderRefocus","isScroll","fromSection","toSection","MASTER_CONTENTS_INDEX","defaultValidator","currentLocale","userLocale","EmbedAuditCollectionController","restrictedNotes","sortedNotes","bookNotes","contentNotes","contentIds","restrictedWordlists","wordlistIsAllowed","isOwner","sortedWordlists","l","teacherWordlists","studentWordlists","privateUserWordlists","bookWordlists","coverWordlists","restrictedSections","preferredCategory","preferredId","activeSectionCategoryId","sortedCollections","coverCollections","isEverythingHidden","TEMPLATE","ContentsController","openCustomContent","viewAs","lastTransitionWasWithinWorkspace","getActiveSectionId","sortedSections","restrictedCollections","sortedCollectionsOrder","restrictedTeacherAssignments","teacherAssignmentIsAllowed","relatedTeacherAssignments","setDiff","useLegacyRecordedSpeechForStory","newCategorySections","activeIndex","routeToSection","_cacheNextAndPreviousImage","handleExerciseChange","savePreferredTextVersion","_currentIndex","previousImageUrl","nextImageUrl","_preloadImg","cache","_divContainsImgWithSrc","img","Image","_sectionFromId","_trackActiveSection","assignment_id","_trackActiveExercise","setActiveSectionIdIfNeeded","isAuditing","trackDashboardCard","actionName","logInboxType","total_pages","trackMissionOpen","OVERVIEW_TAB_LABELS","standard","teacher_assignments","overviewType","handleOverviewTypeChange","productBooks","selectableBooks","canToggleBooks","handleSelectBook","hiddenBooks","handleDeselectBook","_MasterCoursesShowIndexController_brand","isCourseMissionCopyToModalOpen","courseMissionCopyToModalMeta","isMissionShareModalOpen","missionShareModalMeta","isMissionDetailModalOpen","isCustomContentDetailModalOpen","isShowingIntro","hide_intro","accessibleMissions","isAccessible","sortedMissionIds","sortedMissions","handleAddNewActionMenuOpen","isAddNewActionMenuOpen","handleMissionBrowserActivate","handleMissionBrowserDeactivate","deactivate","handleAddNewMissionButtonClick","_addNewMission","handleMissionBrowserEdit","handleMissionBrowserCopy","handleMissionBrowserShare","handleMissionCopyToModalClose","handleMissionShareModalClose","handleMissionDetailModalClose","rollback","handleMissionDetailModalSave","fromOverview","handleMissionDetailModalDelete","handleMissionBrowserToggleActivation","toggleActivation","handleMissionBrowserHide","hide","handleMissionBrowserSort","sortMissions","handleMissionBrowserEditCustomContent","handleCustomContentDetailModalSave","handleMissionActivateModalActivate","activateMany","isCourseMissionActivateModalOpen","handleMissionActionMenuSelect","isCourseMissionCopyFromModalOpen","handleMissionCopyFromModalCopy","copyManyToCourse","handleMissionCopyToModalCopy","copyToManyCourses","handleCustomContentDetailModalClose","handleMissionDetailModalFileUpload","closeIntroModal","isSortingDisabled","handleMissionBrowserSchedule","fields","newMission","DEFAULT_QUERY_PARAMS","sortDirection","SORT_MENU_BUTTON_ITEMS","by","SCOPE_MENU_BUTTON_ITEMS","_MasterCoursesShowMissionsController_brand","_descriptor20","sortMenuButtonItems","sortMenuButtonLabel","scopeMenuButtonItems","scopeMenuButtonLabel","resetQueryParams","handleSortMenuButtonChange","handleScopeMenuButtonChange","history","back","_updateOrReplace","resetCreateMission","handleMissionBrowserCancelSchedule","cancelSchedule","handleMissionAddActionMenuOpen","isMissionAddActionMenuOpen","handleMissionAddActionMenuClose","setupMission","MasterInteractivesIndexController","handleStart","activeAttempt","time_allowed","createAnswers","updateInteractiveForCollection","collectionClose","showCoverImage","show_cover_image","openCollection","previous","handleCollectionClose","MasterMissionsController","routeToCourse","arbetsuppgift","ModelValidator","ObjectValidator","hhmmss","hour","minute","second","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","appVersion","APP","versionOnly","hideSha","shaOnly","hideVersion","showExtended","versionExtendedRegExp","versionRegExp","shaRegExp","helper","gcd","divisor","courseDisplayName","subtitle","courseName","groupName","htmlSafeString","buildHelper","humanTime","isBefore","days","LANGUAGES","Helper","compute","MATERIAL_TYPE_TO_POPOVER_COMPONENT_NAME_MAPPING","MATERIAL_TYPE_TO_MODAL_COMPONENT_NAME_MAPPING","attachments","embeds","interactive_images","videos","audios","COMPONENT_NAME_PREFIX","materialViewerComponentName","pluralize","Inflector","defaultRules","initialize","initializerFactory","setupContainer","ResponsiveInitializer","Mixin","hasBooks","notEmpty","hasContents","getEntityId","idKey","AdapterError","logOpenedProduct","reading_id","_mission","_customContent","contentEditors","prepareMissionModeIfNeeded","getURLFromRouteInfo","redirect","targetName","transitionIsWithinWorkspace","controllerFor","resetController","isExiting","setupController","setProperties","open_custom_content","getUserLicenseForEntity","customContentEntity","afterModel","Model","attr","defaultValue","_dec5","_dec6","_dec7","_dec8","_dec9","_dec10","_dec11","_dec12","_dec13","_dec14","_dec15","_dec16","_dec17","_dec18","_dec19","_dec20","_dec21","_dec22","_descriptor21","ArrayPromiseProxy","ArrayProxy","PromiseProxyMixin","cover_url","overviewDisplayFirst","start_date","end_date","imageUploaded","aiChatDisabled","licensesHaveChanged","missingLicenseProductsIsReloading","missingLicenseProducts","is_new","hasLicenseWarnings","numUsers","hasExternalBooks","reloadMissingLicenseProducts","settingBooks","firstProductImage","productsWithImage","imgProcessingEndpoint","isComing","privateSet","privateCollection","has","_checkPrivateRedeclaration","n","_CustomContentModel_brand","Userable","titleWithFallback","proxyGet","descendents","_loadTeacherAssignments","_loadWordlists","setObjects","descendent","_getDefaultSettingsForIncludedEntity","extractFootnotesFromEditorValue","extractFootnotesFromComponents","SV_SE","ALLOWED_TYPES_FOR_HIDE_SORT_NUMBERS","ALLOWED_TYPES_FOR_HIDE_SECTION_SORT_NUMBERS","ALLOWED_TYPES_FOR_HIDE_ASSIGNMENT_SORT_NUMBERS","DEFAULT_IMAGES","breadcrumb","edition","published","latestUpdated","parent_type","children_ids","tagFilters","logo","cat","subtitle_type","pages","hide_sort_numbers","hide_section_sort_numbers","hide_assignment_sort_numbers","activeEntitySettings","points_required","num_tries","licenseProducts","firstProduct","video","videoId","canHaveCustomizableChildren","templateObj","typeObj","generateHash","addMaterials","addEditors","solution_editor_id","addChildren","addEntity","isStandard","minutesToRead","sectionRecordedSpeech","transformToWordlist","wordId","word_class","word_construction","eachParent","s","charCodeAt","DOCUMENT","AUDIO_RECORDING","MEDIA_TYPES","GOOGLE_DOCS_ENDPOINT","SIGNED_URL_ENDPOINT","ContentableModel","presence","__","custom","validation","isValidURL","mime","hl","toQueryString","embedded","getSignedUrl","upload","MultipartUpload","contentLength","canSplitFile","returnETag","encodeURI","filesize","abort","mime_type","file_size","num_students","userIds","exerciseIds","teacherAssignmentIds","resolvedAnswers","resolvedEntity","attemptExercisesProxy","attemptExercises","attemptAnswers","getNumStartedAnswers","getNumSubmittedAnswers","requiredPoints","isAborted","emptyAnswer","turnIn","isRunning","cancelAll","saveAnswer","handleAnswer","sum","agreed_num_users","active_from","active_until","subscription_id","subscription_renewal_date","is_demo","unlimited","is_expired","extended","demo_used","is_external","is_private","activeFrom","activeUntil","isDemo","agreedNumberOfUsers","numberOfUsesLeft","isBetween","isExpired","isExhausted","hasUsers","hasUser","subscriptionIsActive","subscriptionId","subscriptionRenewalDate","isSameOrAfter","subscriptionIsEnded","subscriptionHasPendingPayment","identifier","camelizeDeserializedKeys","rank","aiGenerated","keywords","originalImageURL","copyrightedMaterials","image_colors","colors","nameWithFallback","typeSingular","or","imageAspectRatio","STATE","ongoing","idle","today","setHours","isTargeted","hasReceivers","daysUntil","shareableLink","newCustomContent","addCustomContent","RootModel","duplicateAttributes","eachAttribute","rollbackAttributes","Contentable","validations","PostModel","draft","_PostModel","ActivityItemModel","isDraft","hasMissingEntities","populateFromActivity","activity","deleted","free","disabledUntilPublished","for_trial","for_single_day_trial","subjects","stages","released","teachersOnly","license_time","unlimited_license_time","forTrial","cover","isExtraMaterial","illustrators","translators","modelValidator","numStudents","numTeachers","schoolUnitCodes","overview_display_first","sorted_shortcut_ids","sorted_mission_ids","badge","_findOrCreateEntity","_findOrCreateCollection","_peekCollection","addNewExerciseAssigment","assigment","_newExerciseAssigment","addExerciseAssigment","removeExerciseAssigment","_getEntityAttributes","_getCollectionAttributes","class_id","school_id","license_id","acquire_date","has_agreement","extended_id","showExtension","email","schools","logins","serviceProvider","integrations","isTestUser","isPrivateUser","hasSchool","isTeacherWithoutSchool","isStudentWithoutSchool","toUpperCase","activeSchoolApplications","schoolApplications","application","preferred_text_versions","category_id","changed","isBusy","duplicatedWords","setEach","relation","modifier","setAttribute","eager","positional","named","margin","initialRect","getRect","resize","windowRect","widthPercent","heightPercent","percent","maxHeight","removeHighlighting","terms","term","regex","highlightTerm","Router","EmberRouter","locationType","resetNamespace","AuthenticatedRoute","ActivateRoute","Route","beforeModel","redirectToNokportal","setupTracking","appUpdate","idp","isLoggedIn","isAuthenticated","v4","client_id","clientId","redirect_uri","protocol","response_type","prompt","acr_values","enablePkce","verifier","pkceCodeVerifier","generateCodeVerifier","append","generatePkceChallenge","authHost","loading","didTransition","serviceWorker","getRegistrations","registrations","registration","unregister","MissingContentError","redirectTarget","matomo","site_id","_paq","domains","d","g","insertBefore","authenticated","userinfo","splitTitle","transitionTarget","wordlistTitle","requireAuthentication","sessionAuthenticated","setLocale","addListener","getMessages","nextURL","expires","nextURLExpires","VALID_MODES","INVALID_PARAMS_LOG_PREFIX","_EmbedAuditCollectionRoute_brand","answer_id","refreshModel","student_id","all_users","custom_content_id","included_entity_ids","_params","_buildEmptyModel","resolvedStudents","_loadExercise","_loadCustomContent","_loadIncludedEntities","resolvedExerciseId","missingExercise","missingCollection","exerciseHadParent","resolvedCollectionId","courseTeacherAssignmentEntities","_loadCourseTeacherAssignmentEntities","selectedTeacherAssignmentId","collectionChildren","_loadAnswers","filteredStudents","filteredResolvedStudents","filteredResult","answerUserIds","answerTeacherAssignment","userIdsWithAnswers","Set","filterStudentsWithAnswers","_preloadAnswers","_loadDiagnosisAnswers","_value","interactivesResult","latestInteractiveByUser","Map","resolvedList","_loadTeacherAssignmentAsEntity","_createTeacherAssignmentEntity","selectedTeacherAssignment","selectedCollectionParent","selectedTeacherId","selectedBookId","courseTeacherAssignments","_resolveTeacherAssignmentContent","contentBookId","courseBooks","contentList","courseBookIds","includedEntityIds","entityIds","setCloseUrl","setReturnUrl","resetEntityContext","invalidateSession","LoginRoute","OIDCAuthenticationRoute","prohibitAuthentication","_handleRedirectRequest","attemptedTransition","intent","savedUrl","loginHintName","redirectUri","pkceChallenge","_redirectToUrl","getAbsoluteUrl","authEndpoint","singleLogout","drawerIsOpen","MasterAdminRoute","EntityContextRoute","EntityRouteSupport","PageViewTracker","MasterArchivesFoldersRoute","modelFor","MasterArchivesRoute","MasterAreasRoute","isbns","trackBookPageWithoutLicense","referrer","WORKSPACE_ROUTE_NAMES","teacherAssignmentUsers","wordlistUsers","imageCache","storeVisitedContent","handleTeacherAssignment","resetSpeakerActive","refreshRouteAndNotifyExerciseChange","willTransition","exerciseOverride","contentsRoute","triggerInteractiveUpdated","changeWorkspaceExercise","note_id","CONTENTS_ROUTE_NAME","paramsFor","segments","without","base","MasterContentsWordlistsShowIndexRoute","word_id","CourseSettings","CoursesNewRoute","VUE_QUERY_PARAMS_ALLOWLIST","VUE_ROUTE_MAP","extraParams","k","v","qs","removeAllContext","hasMissions","mission_id","todo_id","flatMap","handleDidReceiveMission","expandedMissions","isCourseMissionCopyModalOpen","MyResultsRoute","MasterCoursesShowTodosRoute","transistion","bookPromises","diagnosis_id","result_id","endDiagnosis","startDiagnosis","practice_show_id","targetRoute","getOrCreateInteractivesForCollections","product_id","_tryToAssignLicense","lastVisited","fetchPageViews","is_latest_location","booksQuery","pageView","handleLatestLocation","handleExercisesInDiagnosis","getClosestContentEntity","getFallbackImage","section_id","parentEntity","MasterProductsMyResultsRoute","MasterProfileSettingsRoute","nodeId","todoId","isUuid","root","skolon","uri","userCanNotSetPassword","userCanNotEnterName","userCanNotAddLicenses","userCanNotAddLoginProviders","itslearning","skolfederation","hermods","ApplicationSerializer","JSONAPISerializer","serializeAttribute","attribute","keyForAttribute","keyForRelationship","normalizeArrayResponse","assign","METADATA_ATTRIBUTES","normalize","EditorSerializer","typeClass","parsed","normalizeLegacyTemplateAttributeValues","LEGACY_INTERACTIVE_TEMPLATES","attrs","MissionSerializer","expectedValues","custom_contents","sorted_custom_content_ids","sanitizeHTML","Service","$","xmlHttpReq","xhr","ajaxSettings","beforeSend","setRequestHeader","onProgress","onprogress","CONFIG_REGEXP","checkVersion","exec","indexVersion","currentVersion","hasUpdate","initialized","shouldReloadOnUpdate","removeListener","resolvedAnswer","waitForProperty","local","versionsRelation","interactiveKey","sent","activeExercises","_fetchOrCreateInteractivesForCollections","answerKey","createInteractive","getCorrectAnswers","_keyForCollection","_fetchInteractivesForCollections","collectionIds","pushPayload","interactivePayload","collectionsToFetch","chunks","useCache","assignment_title","exerciseAssignments","remainingExercises","refreshCarouselRoute","previousAttempt","resetAllAnswers","previousAttemptAnswers","currentParam","themeClass","CLOSE_URL_BLOCKLIST","_ContextHelperService_brand","activeDiagnosisAttempt","inBook","inArea","inSection","inWorkspaceSection","hasPageTitle","pageTitle","timers","activeDiagnosisAttemptUpdate","activeMissionUpdate","activeCustomContentUpdate","activeCourseUpdate","activeProductUpdate","activeBookUpdate","activeAreaUpdate","activeContentUpdate","activeSectionUpdate","activeExerciseUpdate","activeWorkspaceSectionUpdate","activeWorkspaceExerciseUpdate","closeUrlUpdate","returnUrlUpdate","pageTitleUpdate","_validateUrl","COOKIES_ACCEPTED_KEY","COOKIES_ALLOWED_COOKIE","readNotices","accepted","read","SESSION_STORAGE_KEY","setActiveHelpList","resetActiveHelpList","_storeActiveCourseForBook","currentCourses","courseProduct","_getActiveCourseForBook","currentCourse","visits","emberCourseId","getObject","vueCourseId","selectedCourseId","storeInObject","_CustomContentDispatcherService_brand","showSuccessMessage","_success","_highlight","_error","_turnIn","timesUp","turningIn","setEntityContextRecursively","getParent","newSearch","showingResultLow","showingResultHight","setResultNumbers","allButLastPageResults","lastResultPageResults","queryParamDelimiter","serializeQueryParams","isPlainObject","ok","_FileDispatcherService_brand","onReject","_confirm","_deleteFile","resetTools","FootnotesService","indexes","INFORMATION_KEY","TOOLTIP_KEY","tooltipSeen","dismissTooltip","help_list","trackHelplistEvent","hasInitialized","_sid","_imbox","userInfo","schoolId","translatedRole","card","adminUrl","formValues","formId","isSupportDrawerOpen","_toggleImboxContainer","se","onload","records","addedNodes","childList","head","container","display","uiLanguage","Media","_MissionDispatcherService_brand","_hightlight","wasOngoing","autoDismissDelay","_request","course_ids","keep_receivers","newMissions","_highlightMany","_delete","validCustomContents","force","doc","customContentEntityProxy","includedEntitiesProxy","includedTeacherAssignmentsProxy","includedWordlistsProxy","_NoteDispatcherService_brand","_link","maintenanceMessage","topMessage","shownSnacks","snacks","noticeId","notice_key","fetchReadNoticeKeys","messages","readNoticeKeys","fetchedKeys","nestedNotices","getNoticesBatchedByIsbn","isbnBatch","platform","removeDuplicateNotices","openMessages","filterMessages","showMessages","maintenanceMessages","topMessages","clearCookie","batchedIsbns","uniqueNoticeIds","nestedArray","book_title","parent_title","_products","_storeActiveProductForBook","_getStoredProductForBook","userProductIds","activeProductId","_getActiveProductForBook","vueActiveProductId","selectedProductId","storedProduct","entityProductIds","validProductIds","EVENTS","initPusher","connection","Pusher","pusherKey","cluster","pusherCluster","forceTLS","authorizer","channel","authorize","socketId","PusherBatchAuthorizer","updateSubscriptions","getChannels","channels","pusherChannels","channelsToAdd","channelName","subscribeToChannel","unsubscribeFromChannel","bind_global","_handleEvent","unbind_global","run","classify","pushedLicense","newRecord","unloadRecord","deleteRecord","_loadPromise","_keys","recorder","handleStartRecord","recordingsArray","searchId","MicRecorder","bitRate","getMp3","buffer","File","lastModified","now","createObjectURL","ESASession","allowPreview","inUndercover","access_token","clientUserRole","jwtDecode","isAdmin","isSuperAdmin","allow_preview","idp_roles","logoutEvent","idToken","id_token","sid","invalidate","_lookupAuthenticator","authenticator","refreshUserSession","stayOnPage","imbox","access","triggerPromptNone","esaConfig","getConfig","getOwner","playSound","showImage","pathObj","audioSrc","rect","imgStyle","iltJwt","hasNarratedStudyMaterial","_activeSpeakerContexts","_autoplay","uuids","cx","_len","others","_key","sandbox","adapter","one","audioManager","currentAudio","CustomStore","Store","closeDrawer","_TeacherAssignmentDispatcherService_brand","highlightedTeacherAssignments","excludedVideoId","documentVideos","_pauseIltVideo","iltElements","playButton","_WordlistDispatcher_brand","wasNew","wasPublished","wordlistCount","transformMaterialWord","LocalStorageStore","Storage","StorageObject","reopenClass","initialState","content_visited","fontfamily","onlytext","onlyImage","readRulerIsOpen","readRulerSpace","readRulerOffset","textformats","textsize","lineHeight","schoolMessageClosed","schoolApplicationMessageClosed","StorageArray","Transform","deserialize","serialized","nativeObjectToEmberObject","deserialized","underscoreKeys","emberObjectToNativeObject","_interval","_currentlyExecutedFunction","pollingFunction","func","apply","addSettingRelationship","related","querystring","substr","indexArr","normalizeLatexInput","replacements","doLowerCase","keepWhitespace","isEqual","validatePlaceTextGaps","correctiontext","parseFloat","dragGapIsCorrect","selectGapIsCorrect","writeGapIsCorrect","gapIsCorrect","isCorrect","CORRECT_ANSWER_STATUSES","NOT_CORRECT_ANSWER_STATUSES","NOT_STARTED_ANSWER_STATUSES","NOT_SUBMITTED_ANSWER_STATUSES","WHITESPACE_RX","lastChangedFrame","lastX","scrollX","lastY","scrollY","tick","frames","topbar","getElementsByClassName","par","offsetParent","scrollToPromise","clipboard","writeText","contentEditable","selectNodeContents","selection","getSelection","removeAllRanges","addRange","BLACKLISTED_KEYS","teacherAssignmentEntity","teacherCollection","teacherCollectionIsAllowed","Error","extractFootnotesFromNodes","nodeIsFootnote","courseRequest","arrayContains","keep_alive","selectedSchool","userCourses","entityFallbackTitles","exerciseKey","originalAnswers","multipleElements","isElement","isString","isBoolean","HTMLElement","settingClasses","settingClass","entityProducts","entityISBNs","licensedISBNs","licenseExists","failedEntities","retry","getOptions","fullDomain","domainParts","numDomainParts","domain","maxAge","cookieService","write","relationUrl","getAll","num_not_found","courseUsers","validReceivers","maxSize","DEFAULT_MAX_IMAGE_SIZE","parsedWidth","toPositiveDimension","parsedHeight","resolvedMaxSize","longestSide","scale","dimension","val1","val2","showErrors","isError","subtract","storageKey","logged","stored","sessionStorage","getItem","loggedProducts","setItem","getDownloadUrl","forceDownload","forceDownloadParam","signed_url","MATOMO_CATEGORIES","helplist","pageHeader","readingBuddy","objectToEmberObject","tail","remainder","division","trunc","getUrl","TRANSITION_TO_PATH","master.index","master.admin.books","master.admin.teachers.list","master.admin.students.list","master.admin.courses","master.profile.settings","master.courses.new","link_hash","initialParams","nameParts","NAME_PARTS","master","BOOKS","AREAS","ARCHIVES","CONTENTS","INTERACTIVES","MATERIALS","resolveStandardRoute","resolveSectionRoute","show","resolveGlossariesRoute","COLLECTIONS","SPACES","contentOrInteractiveAncestor","getFirstContentOrInteractiveAncestor","ancestorType","childRouteName","getChildRouteName","resolveContentCollectionRoute","workspace","firstChild","resolveWordspaceCollectionRoute","resolveCollectionRoute","ASSIGNMENTS","EXERCISES","STUDIES","resolveInteractivesDiagnosisExerciseRoute","templateType","practices","resolveInteractivesPracticeExerciseRoute","resolveInteractivesExerciseRoute","parentParent","resolveContentExerciseRoute","resolveExerciseRoute","FOLDERS","resolveFolderRoute","resolveProductRoute","namePart","isWithinWorkspace","contentAncestor","getParameters","allParameters","paramNames","orderedParameters","markup","col","colgroup","td","th","scrollPrevented","handleRouteWillChange","sessionKey","removeItem","dir","getElement","shake","NodeList","WHITELISTED_ROUTE_NAMES","array","sortOption","_prioritizeSingleRecordedSpeechAudioSource","_recordedSpeechProviderPriority","_hasHigherPriorityThan","providerIdToCheck","providerIdToCompareTo","highestPrioProviderId","customizeAudioSources","audioSourceConfigs","preferRecordedSpeech","recordedSpeechProviderPlugins","recordedSpeech","tts","customizedAudioSourceConfigs","digilarRecordedSpeechPlugin","hasValidSingleRecordedSpeechFile","extraEventData","singleRecordedSpeechFile","singleRecordedSpeechAudioSource","SpeakerAdapterAudioSource","getSingleRecordedSpeechConfig","rsConfig","ttsConfig","textToSpeechData","disableFallback","CONTENT_TITLE","elementName","IMAGE_GALLERY","IMAGES","IMAGE_INNER","IMAGE_CAPTIONS","INTERACTIVE_IMAGE_CAPTIONS","AUDIO_CAPTIONS","COLLECTION_EXERCISE_INDEX","VIDEO_CAPTIONS","IMAGE_SOURCES","TIPS","SECTION_HEADERS","HEADERS_LEVEL_2","HEADERS_LEVEL_3","LIST","LIST_ITEMS","POPOVER_DIALOGS","SECTION_HEADING","MODAL_DIALOG_TITLE","STORY_SECTION_TITLE","STORY_SECTION_CONTENT","STORY_IMAGE_CONTAINER","STORY_IMAGE","VIDEO","AUDIO","MATHLIVE","WORKSPACE","EXERCISE_VIEW","DATA_TABLE","DATA_TABLE_CELLS","DATA_TABLE_HEADER_CELLS","INTERACTIVE_IMAGES","CANVAS","CANVAS_CAPTION","WORKFLOW_INDEX","TOOLBAR_WIDGETS","EXERCISE_MAIN_ASSIGNMENT","ENTITY_THUMBNAILS","CODE_BLOCK","CODE_BLOCK_CAPTION","ASSIGNMENT_LINK","DigilarSpeakerDOMElements","STORY_IMAGE_SPEAKER_CONTROLS","AUDIO_PROVIDER_INFO","toJQuerySelector","domElementConfig","_domElementsConfig","_getContextData","_speakerConfig","_textBlockSelectors","generalSelector","additionalSelectors","UI","Images","excludeImageFromSpeakerControls","excludeCaptionsFromSpeakerControls","DigilarDomElementsConfig","imagesSelector","interActiveImagesSelector","videoSelector","audioSelector","codeSelector","listSelector","TextProcessing","shouldExcludeModalDialogTitle","getTextBlockRecordedSpeechData","$textBlock","isPausing","speakerPauseFor","RecordedSpeech","searchAncestorsForDataId","$ancestorWithDataId","recordedReadingUrl","recordedSpeechId","getTextBlockTtsData","getFallbackExcludedElementConfigs","excludedElements","elementConfig","excludedElementSelector","is","ttsTextId","dom","getTextBlockLanguage","findRenderedTextBlockElements","_addPauseElements","additionalTextBlockSelectors","allTextBlockSelectors","pauseElements","createPauseElement","pauseFor","pauseSpan","pauseWrapper","speakerPause","filterRenderedTextBlockElements","$textBlocks","shouldExcludeTextBlock","isTextBlockRendered","isRendered","hasClass","each","getExcludedDomElements","shouldExcludeImages","shouldExcludeImageSources","shouldExcludeTips","shouldExcludeImageGalleries","cleanUpDom","contextDomElement","_cleanUpSpeakerElems","findSectionElem","beforeApplyTextMetaData","getAudioSourceIndex","getFirstVisibleAudioSourceIndex","_isElementInViewport","_insideOfPopupOrExercise","shouldAutoSelectFirstTextBlock","isPageRendered","findStoryImageElem","_applyProviderInfoForAudioSource","$elemsToApplyTo","$elemToApplyTo","isLegacyRecordedSpeech","eventData","providerInfoHtml","polly","$providerInfoElem","prepend","allowDefaultMarkupToBeApplied","$storyImageElem","applySpeakerMarkUpToSection","addSpeakerControlsToSection","$sectionElem","$domContextRoot","preventTextBlockClicksForJQuerySelectors","scrollToTextBlock","textBlockElem","speakerScrollTo","_handlePauseElementScroll","nextElementSibling","inline","SPEAKER_TEXT_BLOCK_SELECTED","speakerControlsHtml","playButtonInnerHtml","pauseButtonInnerHtml","elementsToRemove","shouldExcludeMathCode","shouldExcludeTextsContainingMathCode","speakerContextDomElement","retVal","htmlString","$textBlockElem","dialogElements","toolTip","contextDomRoot","$contextForClick","isClickWithinThisContext","excludeSelector","isWithinExcludedElement","$storyImage","$speakerControls","_addSpeakerControlsToElement","selectBeforePlay","addClass","_findSpeakerControlsForStoryImage","_clearStoryImagePlayingHighlighting","$section","_hasTextBlockSpeakerMarkUp","showProgressBar","_shouldShowProgressBarWhenPlaying","_applySpeakerMarkUpToElem","_setProgressBarValue","_highlightSelectedStoryImage","_highlightStoryImagePlaying","_highlightStoryImagePaused","_showStoryImageLoader","$storyPlayer","after","_getLoadingIndicatorHtml","_hideStoryImageLoader","_hideTextBlockLoader","_highlightSelected","_highlightSelectedSection","_highlightSectionPlaying","_clearSectionPlayingHighlighting","_clearSectionPausedHighlighting","_highlightTextBlockPlaying","highlightWithAnimation","_shouldShowAnimationWhenPlaying","_clearStoryImagePausedHighlighting","_highlightSectionPaused","_highlightTextBlockPaused","_clearSelectedSectionHighlighting","_clearSelectedHighlighting","_clearSelectedStoryImageHighlighting","_clearPlayingHighlighting","_clearPausedHighlighting","languageCode","separatorIndex","PollyTextToSpeechProvider","pollyProxy","DigilarPollyProxy","cacheEnabled","fetchSpeechCache","audioSourceKey","forcedUrlProtocol","customTextProcessingRuleSets","digilarPollyRuleSet","_ajax","_apiBaseUrl","generateSpeechMarks","textId","voiceName","voiceEngineType","engineType","RecordedSpeechProvider","_recordedSpeechBaseUrl","_singleRecordedSpeechConfig","_hasValidSingleRecordedSpeechFile","customInit","fail","preventRecordedSpeechForTextBlocks","getTextBlockAudioSourceData","textBlockData","textBlockHtml","textMetaData","shouldVerifyRecordedSpeechUrls","playStarted","playEnded","DefaultSpeakerConfig","_voices","allSpeakerVoices","onDemandLoadingNumberOfAudioSourcesToLoad","recordedSpeechEndpoint","_toTtsLanguageCode","isRecordedSpeechEnabled","priority","allowTtsWithRecordedSpeech","allowMixOfRecordedSpeechProviders","preventApplyingTextMetaData","voiceId","autoplayFirstTextBlockOnLoad","autoSelectFirstTextBlockOnInit","domPollerIntervalMs","Activation","alwaysRememberActiveState","overrideActiveStateWithSetting","iOS","isStoryImageMode","isLegacyStoryMode","updateRelevantProgressBars","normalizedProgressValue","$progressBarParents","showLoadingIndicator","_showTextBlockLoader","allowDefaultEventHandling","_addProgressBarToElem","defaultControls","defaultSpeakerControls","onTextBlockClick","speakerAudioSourceIndex","onPlayButtonClick","disableProgressBar","showProgressBarWhenPlayingRecordedSpeech","showProgressBarWhenPlayingTts","defaultSpeakerOptions","progressEventsIntervalMs","playbackSpeedRecordedSpeech","playbackSpeedTextToSpeech","autoplayTimeoutMs","maxLoadAttempts","audioFormats","loadErrorDelayMs","_reportListeningsDisabled","fetchArticle","articleId","jwt","useBrowserCache","urlWithParams","reportListening","recordingId","_findSentenceGroup","sentenceGroupId","sentenceGroup","SentenceGroups","Id","_findArticle","articleContainingSentenceGroup","_createTextMetaData","sentence","sentenceIndex","startTimeMs","durationMs","sentenceText","Content","getAudioSources","Sentences","RecordingUrl","Url","RecordingId","isArticleExpired","Created","expirationTimeInSeconds","TimeLeftSeconds","expirationMarginMinutes","STATIC_AUDIO_SOURCES","_sentenceGroupId","_mockArticle","PublisherDomContainer","Order","Ttl","TimeLeft","debug","_dataParser","_articleIds","_iltApi","_iltDataParser","_getJwt","_iltError","_enablePlayNextOnLoadError","_articles","_jwt","_fetchArticles","fetchPromises","iltSentenceGroupId","_playbackRoyaltyHandler","speakerEvent","en","fr","de","it","es","da","no","ar","ca","zh","nl","fi","hi","ja","ko","pl","pt","ro","ru","tr","cy","cs","nn","nb","ruleSet","initialCleanUp","syntax","withPlaceholder","beforeHtmlRemoved","afterHtmlRemoved","finalCleanUp","THOUSANDS_NUMBER_REGEX","SEPARATOR_REGEX","elementToRemove","removeHtmlElementsByClass","_addPauseAfterElements","appendToHtmlElementContent","SpeakerStringUtil","endsWithSentenceSeparator","replaceHtmlElementByAttribute","elementMetaData","completeElement","translate","replaceHtmlElementByClass","$element","$altTextElem","playSettings","localStorage","exponents","replaceHtmlWithPlaceholders","replacePlaceholdersWithText","replaceRegex","_normalizeThousandsSeparatedNumbers","replaceText","removeEmojis","_rawText","XSAMPA_MATCHER","TRANSLATION_TABLES","onTranslation","onMissingTranslation","getCurrentOrigin","port","urlIsSameOrigin","urlRegex","define","metaName","prefix","rawConfig","exports","runningTests","require"],"sources":["vendor/ember-cli/app-prefix.js","babel/adapters/answer-comment.js","babel/adapters/answer.js","babel/adapters/application.js","babel/adapters/canvas-state.js","babel/adapters/course.js","babel/adapters/custom-content.js","babel/adapters/editor.js","babel/adapters/entity.js","babel/adapters/file.js","babel/adapters/group.js","babel/adapters/help-list.js","babel/adapters/interactive.js","babel/adapters/license.js","babel/adapters/material.js","babel/adapters/mission.js","babel/adapters/note.js","babel/adapters/notice.js","babel/adapters/post.js","babel/adapters/product.js","babel/adapters/school.js","babel/adapters/setting.js","babel/adapters/teacher-assignment.js","babel/adapters/user.js","babel/adapters/word.js","babel/adapters/wordlist.js","babel/app.js","babel/breakpoints.js","babel/components/action-menu/divider/index.js","babel/components/action-menu/index.js","babel/components/action-menu/item/index.js","babel/components/addition-collator/index.js","babel/components/addition-customizer/component.js","babel/components/addition-customizer/group/section/component.js","babel/components/addition-customizer/group/section/template.js","babel/components/addition-customizer/group/section/tree/item/component.js","babel/components/addition-customizer/group/section/tree/item/template.js","babel/components/addition-customizer/group/section/tree/template.js","babel/components/addition-customizer/group/template.js","babel/components/addition-customizer/template.js","babel/components/addition-grid/index.js","babel/components/addition-list/index.js","babel/components/ai-widget/index.js","babel/components/answer-comments/index.js","babel/components/answer-log/context-filter/index.js","babel/components/answer-log/diagnosis-list/answer-item/index.js","babel/components/answer-log/diagnosis-list/index.js","babel/components/answer-log/diagnosis-list/item/index.js","babel/components/answer-log/index.js","babel/components/answer-log/standard-list/exercise/index.js","babel/components/answer-log/standard-list/index.js","babel/components/answer-log/standard-list/item/index.js","babel/components/answer-log/teacher-assignment-list/exercise/index.js","babel/components/answer-log/teacher-assignment-list/index.js","babel/components/answer-log/teacher-assignment-list/item/index.js","babel/components/answer-status-icon/index.js","babel/components/archive-form/component.js","babel/components/archive-form/template.js","babel/components/archive-view/component.js","babel/components/archive-view/folder-view/component.js","babel/components/archive-view/folder-view/template.js","babel/components/archive-view/template.js","babel/components/area-view/component.js","babel/components/area-view/cover/card/template.js","babel/components/area-view/cover/template.js","babel/components/area-view/delimited-list/template.js","babel/components/area-view/grid-item/component.js","babel/components/area-view/grid-item/template.js","babel/components/area-view/grid/component.js","babel/components/area-view/grid/template.js","babel/components/area-view/list/component.js","babel/components/area-view/list/template.js","babel/components/area-view/template.js","babel/components/attach-link-modal/component.js","babel/components/attach-link-modal/template.js","babel/components/attachment-preview/base/actions/template.js","babel/components/attachment-preview/base/item/template.js","babel/components/attachment-preview/base/template.js","babel/components/attachment-preview/item/component.js","babel/components/attachment-preview/item/external/component.js","babel/components/attachment-preview/item/external/template.js","babel/components/attachment-preview/item/generic/template.js","babel/components/attachment-preview/item/image/component.js","babel/components/attachment-preview/item/image/template.js","babel/components/attachment-preview/item/internal/component.js","babel/components/attachment-preview/item/internal/template.js","babel/components/attachment-preview/item/template.js","babel/components/attachment-preview/item/video-external/component.js","babel/components/attachment-preview/item/video-external/template.js","babel/components/attachment-preview/item/video/component.js","babel/components/attachment-preview/item/video/template.js","babel/components/attachment-preview/template.js","babel/components/book-announcement/index.js","babel/components/book-browser/component.js","babel/components/book-browser/item/component.js","babel/components/book-browser/item/template.js","babel/components/book-browser/template.js","babel/components/book-header/template.js","babel/components/book-view/grid/template.js","babel/components/book-view/list/template.js","babel/components/book-view/template.js","babel/components/canvas-presentor-wrapper/component.js","babel/components/canvas-presentor-wrapper/template.js","babel/components/carousel-result/component.js","babel/components/carousel-result/template.js","babel/components/chapter-navigation/index.js","babel/components/chapter-section/template.js","babel/components/choose-modal/index.js","babel/components/collection-audio/component.js","babel/components/collection-audio/template.js","babel/components/collection-editor/template.js","babel/components/collection-exercise-index/component.js","babel/components/collection-exercise-index/item/component.js","babel/components/collection-exercise-index/item/link/component.js","babel/components/collection-exercise-index/item/link/template.js","babel/components/collection-exercise-index/item/template.js","babel/components/collection-exercise-index/template.js","babel/components/collection-list-item/carousel/component.js","babel/components/collection-list-item/carousel/template.js","babel/components/collection-list-item/component.js","babel/components/collection-list-item/diagnosis/component.js","babel/components/collection-list-item/diagnosis/template.js","babel/components/collection-list-item/standard/component.js","babel/components/collection-list-item/standard/template.js","babel/components/collection-list-item/template.js","babel/components/collection-list/index.js","babel/components/collection-modal-toggler/index.js","babel/components/collection-modal/template.js","babel/components/collection-options/component.js","babel/components/collection-options/preview/component.js","babel/components/collection-options/preview/template.js","babel/components/collection-options/template.js","babel/components/collection-summary/component.js","babel/components/collection-summary/template.js","babel/components/collection-topbar/component.js","babel/components/collection-topbar/template.js","babel/components/collection-view/component.js","babel/components/collection-view/template.js","babel/components/collection-view/top/component.js","babel/components/collection-view/top/template.js","babel/components/content-chapter/component.js","babel/components/content-chapter/template.js","babel/components/content-exercises/component.js","babel/components/content-exercises/template.js","babel/components/content-list-summary/index.js","babel/components/content-meta/template.js","babel/components/content-mission-next/component.js","babel/components/content-mission-next/template.js","babel/components/content-pagination-summary/component.js","babel/components/content-pagination-summary/template.js","babel/components/content-pagination/component.js","babel/components/content-pagination/template.js","babel/components/content-playsettings/component.js","babel/components/content-playsettings/template.js","babel/components/content-presenter/index.js","babel/components/content-sheet/component.js","babel/components/content-sheet/template.js","babel/components/content-speaker-info-modal/template.js","babel/components/content-story/component.js","babel/components/content-story/template.js","babel/components/content-summary/component.js","babel/components/content-summary/item/component.js","babel/components/content-summary/item/template.js","babel/components/content-summary/template.js","babel/components/content-topbar/component.js","babel/components/content-topbar/settings/component.js","babel/components/content-topbar/settings/template.js","babel/components/content-topbar/template.js","babel/components/content-workflow/template.js","babel/components/content/c-preamble/component.js","babel/components/content/c-preamble/template.js","babel/components/contents-chapter-hero/component.js","babel/components/contents-chapter-hero/template.js","babel/components/contents-chapter-step/component.js","babel/components/contents-chapter-step/template.js","babel/components/contents-story/component.js","babel/components/contents-story/section/component.js","babel/components/contents-story/section/template.js","babel/components/contents-story/template.js","babel/components/context-select/component.js","babel/components/context-select/courses/template.js","babel/components/context-select/products/template.js","babel/components/context-select/template.js","babel/components/continue-content/component.js","babel/components/continue-content/template.js","babel/components/cookie-message/component.js","babel/components/cookie-message/template.js","babel/components/countdown-timer/index.js","babel/components/course-adapt-settings/component.js","babel/components/course-adapt-settings/template.js","babel/components/course-audit-index-card/index.js","babel/components/course-audit/bottombar/index.js","babel/components/course-audit/collection/exercise/index.js","babel/components/course-audit/collection/index.js","babel/components/course-audit/collection/tab/index.js","babel/components/course-audit/comments/index.js","babel/components/course-audit/diagnosis/exercise/index.js","babel/components/course-audit/diagnosis/group/index.js","babel/components/course-audit/diagnosis/index.js","babel/components/course-audit/diagnosis/part/index.js","babel/components/course-audit/index.js","babel/components/course-audit/standard/entity/index.js","babel/components/course-audit/standard/exercise-single/index.js","babel/components/course-audit/standard/exercise/index.js","babel/components/course-audit/student-list/index.js","babel/components/course-audit/student-list/item/index.js","babel/components/course-audit/teacher-assignments/index.js","babel/components/course-audit/teacher-assignments/teacher-collection/index.js","babel/components/course-audit/teacher-assignments/teacher/index.js","babel/components/course-audit/version-popup/index.js","babel/components/course-choose-list/index.js","babel/components/course-choose-list/item/index.js","babel/components/course-header/component.js","babel/components/course-header/template.js","babel/components/course-list/index.js","babel/components/course-list/item/index.js","babel/components/course-main/component.js","babel/components/course-main/teacher-license-alert/component.js","babel/components/course-main/teacher-license-alert/template.js","babel/components/course-main/template.js","babel/components/course-mission-activate-modal/index.js","babel/components/course-mission-copy-from-modal/index.js","babel/components/course-mission-copy-from-modal/mission-part/index.js","babel/components/course-mission-copy-to-modal/index.js","babel/components/course-shortcut-action-menu/index.js","babel/components/course-shortcuts/component.js","babel/components/course-shortcuts/template.js","babel/components/course-user-list/component.js","babel/components/course-user-list/template.js","babel/components/course-user-list/user/component.js","babel/components/course-user-list/user/template.js","babel/components/cover-card/component.js","babel/components/cover-card/template.js","babel/components/custom-content-detail-modal/index.js","babel/components/diagnosis-done/component.js","babel/components/diagnosis-done/template.js","babel/components/diagnosis-intro/component.js","babel/components/diagnosis-intro/results-summary/template.js","babel/components/diagnosis-intro/template.js","babel/components/diagnosis-result-item/index.js","babel/components/diagnosis-show/component.js","babel/components/diagnosis-show/template.js","babel/components/edit-pen-icon/component.js","babel/components/edit-pen-icon/template.js","babel/components/editor-preview/component.js","babel/components/editor-preview/template.js","babel/components/entity-browser/component.js","babel/components/entity-browser/template.js","babel/components/entity-browser/tree/component.js","babel/components/entity-browser/tree/item/component.js","babel/components/entity-browser/tree/item/template.js","babel/components/entity-browser/tree/template.js","babel/components/entity-categorizer/component.js","babel/components/entity-categorizer/template.js","babel/components/entity-customizer/index.js","babel/components/entity-customizer/tree/group/index.js","babel/components/entity-customizer/tree/index.js","babel/components/entity-customizer/tree/item/control-field/index.js","babel/components/entity-customizer/tree/item/index.js","babel/components/entity-icon/index.js","babel/components/entity-import-modal/component.js","babel/components/entity-import-modal/template.js","babel/components/entity-inspector/component.js","babel/components/entity-inspector/detail/component.js","babel/components/entity-inspector/detail/definition-list/index.js","babel/components/entity-inspector/detail/definition-list/item/index.js","babel/components/entity-inspector/detail/template.js","babel/components/entity-inspector/detail/version-tab/index.js","babel/components/entity-inspector/detail/version-tab/pane/index.js","babel/components/entity-inspector/guidance-viewer/component.js","babel/components/entity-inspector/guidance-viewer/index/template.js","babel/components/entity-inspector/guidance-viewer/show/component.js","babel/components/entity-inspector/guidance-viewer/show/template.js","babel/components/entity-inspector/guidance-viewer/template.js","babel/components/entity-inspector/mission-customizer/index.js","babel/components/entity-inspector/template.js","babel/components/entity-link/component.js","babel/components/entity-link/template.js","babel/components/entity-meta/component.js","babel/components/entity-meta/template.js","babel/components/entity-preview-page/component.js","babel/components/entity-preview-page/template.js","babel/components/entity-progress/component.js","babel/components/entity-progress/template.js","babel/components/entity-search/index.js","babel/components/entity-thumbnail/index.js","babel/components/error-page/component.js","babel/components/error-page/template.js","babel/components/exercise-bottombar/index.js","babel/components/exercise-topbar/index.js","babel/components/exercise-view/assignment/arrange/arrow-indicator/index.js","babel/components/exercise-view/assignment/arrange/horizontal-item/index.js","babel/components/exercise-view/assignment/arrange/image/index.js","babel/components/exercise-view/assignment/arrange/index.js","babel/components/exercise-view/assignment/arrange/item/index.js","babel/components/exercise-view/assignment/check/component.js","babel/components/exercise-view/assignment/check/template.js","babel/components/exercise-view/assignment/choice/horizontal/index.js","babel/components/exercise-view/assignment/choice/horizontal/item/index.js","babel/components/exercise-view/assignment/choice/image/index.js","babel/components/exercise-view/assignment/choice/index.js","babel/components/exercise-view/assignment/choice/label/index.js","babel/components/exercise-view/assignment/editable-matrix/index.js","babel/components/exercise-view/assignment/editable-matrix/textarea/index.js","babel/components/exercise-view/assignment/editor/index.js","babel/components/exercise-view/assignment/index.js","babel/components/exercise-view/assignment/match/image/index.js","babel/components/exercise-view/assignment/match/index.js","babel/components/exercise-view/assignment/match/item/index.js","babel/components/exercise-view/assignment/matrix/index.js","babel/components/exercise-view/assignment/media/index.js","babel/components/exercise-view/assignment/number-line/index.js","babel/components/exercise-view/assignment/place-choices/index.js","babel/components/exercise-view/assignment/place-choices/item/index.js","babel/components/exercise-view/assignment/place-images/image/index.js","babel/components/exercise-view/assignment/place-images/index.js","babel/components/exercise-view/assignment/place-images/item/index.js","babel/components/exercise-view/assignment/place-images/marker-image/index.js","babel/components/exercise-view/assignment/place-images/marker/index.js","babel/components/exercise-view/assignment/place-text-gaps/index.js","babel/components/exercise-view/assignment/place-text-gaps/item/index.js","babel/components/exercise-view/assignment/place-words/index.js","babel/components/exercise-view/assignment/place-words/item/index.js","babel/components/exercise-view/assignment/place-words/marker/index.js","babel/components/exercise-view/assignment/reply/image/index.js","babel/components/exercise-view/assignment/reply/index.js","babel/components/exercise-view/assignment/sort/group/index.js","babel/components/exercise-view/assignment/sort/image/index.js","babel/components/exercise-view/assignment/sort/index.js","babel/components/exercise-view/assignment/sort/item/index.js","babel/components/exercise-view/assignment/text-gap/drag/gap/index.js","babel/components/exercise-view/assignment/text-gap/drag/index.js","babel/components/exercise-view/assignment/text-gap/index.js","babel/components/exercise-view/assignment/text-gap/select/gap/index.js","babel/components/exercise-view/assignment/text-gap/select/index.js","babel/components/exercise-view/assignment/text-gap/write/gap/index.js","babel/components/exercise-view/assignment/text-gap/write/index.js","babel/components/exercise-view/common/drag-alternatives/index.js","babel/components/exercise-view/common/drag-assignment/index.js","babel/components/exercise-view/common/drag-item/index.js","babel/components/exercise-view/common/drop-item/index.js","babel/components/exercise-view/common/hint/index.js","babel/components/exercise-view/common/item-image/index.js","babel/components/exercise-view/common/item-state/index.js","babel/components/exercise-view/common/marker-scope/index.js","babel/components/exercise-view/index.js","babel/components/file-assignment/index.js","babel/components/file-choose-modal/index.js","babel/components/file-picker/grid/index.js","babel/components/file-picker/grid/item/index.js","babel/components/file-picker/index.js","babel/components/file-picker/list/index.js","babel/components/file-picker/list/item/index.js","babel/components/file-thumbnail/component.js","babel/components/file-thumbnail/template.js","babel/components/file-type/component.js","babel/components/file-type/template.js","babel/components/file-upload/template.js","babel/components/focus-mode/component.js","babel/components/focus-mode/template.js","babel/components/footnote-list/item/component.js","babel/components/footnote-list/item/template.js","babel/components/footnote-list/template.js","babel/components/group-feature-welcome-modal/component.js","babel/components/group-feature-welcome-modal/template.js","babel/components/header/base/basic-button/index.js","babel/components/header/base/basic-link/index.js","babel/components/header/base/button/icon/index.js","babel/components/header/base/button/index.js","babel/components/header/base/button/label/index.js","babel/components/header/base/combo-button/button/icon/index.js","babel/components/header/base/combo-button/button/index.js","babel/components/header/base/combo-button/button/label/index.js","babel/components/header/base/combo-button/index.js","babel/components/header/base/combo-button/primary-button/index.js","babel/components/header/base/combo-button/secondary-button/index.js","babel/components/header/base/course-users-button/index.js","babel/components/header/base/entity-breadcrumb/index.js","babel/components/header/base/entity-breadcrumb/item/index.js","babel/components/header/base/help-button/index.js","babel/components/header/base/index.js","babel/components/header/base/link/icon/index.js","babel/components/header/base/link/index.js","babel/components/header/base/link/label/index.js","babel/components/header/base/logo-link/index.js","babel/components/header/base/meta-button/index.js","babel/components/header/base/meta-menu/breadcrumb/index.js","babel/components/header/base/meta-menu/index.js","babel/components/header/base/navigation-drawer/index.js","babel/components/header/base/support-button/index.js","babel/components/header/base/teacher-button/index.js","babel/components/header/base/teacher-guidance-button/index.js","babel/components/header/base/user-button/index.js","babel/components/header/base/user-drawer/index.js","babel/components/header/book/index.js","babel/components/header/content/index.js","babel/components/header/course/index.js","babel/components/header/course/switch-course-popup/index.js","babel/components/header/default/index.js","babel/components/header/diagnosis/index.js","babel/components/header/index.js","babel/components/header/mission/index.js","babel/components/header/product/index.js","babel/components/help-list/index.js","babel/components/image-card/component.js","babel/components/image-card/template.js","babel/components/index-circle/component.js","babel/components/index-circle/template.js","babel/components/interactive-image-wrapper/index.js","babel/components/interactives/collection-item/carousel/index.js","babel/components/interactives/collection-item/diagnosis/index.js","babel/components/interactives/collection-item/index.js","babel/components/interactives/collection-item/standard/index.js","babel/components/interactives/collection-item/thumbnail/index.js","babel/components/interactives/cover-image/index.js","babel/components/interactives/one-column/index.js","babel/components/interactives/standard/index.js","babel/components/interactives/two-columns/index.js","babel/components/latest-visited-content/component.js","babel/components/latest-visited-content/template.js","babel/components/master/contents-chapter-scroll/chapter-part/component.js","babel/components/master/contents-chapter-scroll/chapter-part/template.js","babel/components/master/contents-chapter-scroll/component.js","babel/components/master/contents-chapter-scroll/template.js","babel/components/master/contents-title/template.js","babel/components/master/contents-workflow/component.js","babel/components/master/contents-workflow/template.js","babel/components/material-viewer/article-dialog/index.js","babel/components/material-viewer/article-popup/index.js","babel/components/material-viewer/attachment-dialog/index.js","babel/components/material-viewer/audio-lightbox/index.js","babel/components/material-viewer/canvas/index.js","babel/components/material-viewer/dialog/index.js","babel/components/material-viewer/embed-lightbox/index.js","babel/components/material-viewer/image-lightbox/index.js","babel/components/material-viewer/image-popup/index.js","babel/components/material-viewer/index.js","babel/components/material-viewer/interactive-image-lightbox/index.js","babel/components/material-viewer/lightbox/close-button/index.js","babel/components/material-viewer/lightbox/index.js","babel/components/material-viewer/link-dialog/index.js","babel/components/material-viewer/loading/index.js","babel/components/material-viewer/popup/index.js","babel/components/material-viewer/video-lightbox/index.js","babel/components/mission-add-action-menu/index.js","babel/components/mission-browser/index.js","babel/components/mission-browser/item/index.js","babel/components/mission-collator/index.js","babel/components/mission-content/component.js","babel/components/mission-content/custom-content-list/index.js","babel/components/mission-content/custom-content-list/item/index.js","babel/components/mission-content/custom-content-list/item/thumbnail/index.js","babel/components/mission-content/template.js","babel/components/mission-detail-modal/custom-content-list/index.js","babel/components/mission-detail-modal/custom-content-list/item/action-button/index.js","babel/components/mission-detail-modal/custom-content-list/item/index.js","babel/components/mission-detail-modal/index.js","babel/components/mission-intro-card/icon/index.js","babel/components/mission-intro-card/index.js","babel/components/mission-list/index.js","babel/components/mission-list/item/index.js","babel/components/mission-options-action-menu/index.js","babel/components/mission-share-button/index.js","babel/components/mission-share-modal/index.js","babel/components/mission-start-page/template.js","babel/components/model-rejection/template.js","babel/components/note-browser/component.js","babel/components/note-browser/grid/component.js","babel/components/note-browser/grid/item/component.js","babel/components/note-browser/grid/item/template.js","babel/components/note-browser/grid/template.js","babel/components/note-browser/list/component.js","babel/components/note-browser/list/item/component.js","babel/components/note-browser/list/item/template.js","babel/components/note-browser/list/template.js","babel/components/note-browser/template.js","babel/components/note-choose-modal/index.js","babel/components/note-content/index.js","babel/components/note-detail/component.js","babel/components/note-detail/template.js","babel/components/note-picker/grid/index.js","babel/components/note-picker/grid/item/index.js","babel/components/note-picker/index.js","babel/components/note-picker/list/index.js","babel/components/note-picker/list/item/index.js","babel/components/notice-manager/component.js","babel/components/notice-manager/maintenance-message/component.js","babel/components/notice-manager/maintenance-message/template.js","babel/components/notice-manager/snacks/component.js","babel/components/notice-manager/template.js","babel/components/notice-manager/top-message/component.js","babel/components/notice-manager/top-message/template.js","babel/components/page-content-menu/component.js","babel/components/page-content-menu/items/template.js","babel/components/page-content-menu/menu/index.js","babel/components/page-content-menu/template.js","babel/components/page-header/component.js","babel/components/page-header/template.js","babel/components/preview-actions/component.js","babel/components/preview-actions/template.js","babel/components/preview-icon/component.js","babel/components/preview-icon/template.js","babel/components/product-root/index.js","babel/components/products/product-activity-list/index.js","babel/components/products/product-header/component.js","babel/components/products/product-header/template.js","babel/components/products/product-index/component.js","babel/components/products/product-index/template.js","babel/components/products/product-main/component.js","babel/components/products/product-main/template.js","babel/components/qr-code-image/index.js","babel/components/qr-code-modal/index.js","babel/components/read-ruler/component.js","babel/components/read-ruler/portal/component.js","babel/components/read-ruler/portal/template.js","babel/components/read-ruler/template.js","babel/components/read-settings/index.js","babel/components/reading-buddy/component.js","babel/components/reading-buddy/template.js","babel/components/reading-resolve/component.js","babel/components/reading-resolve/template.js","babel/components/schedule-detail-modal/index.js","babel/components/schedule-form-part/index.js","babel/components/search-bar/component.js","babel/components/search-bar/template.js","babel/components/select-list/index.js","babel/components/select-list/item/index.js","babel/components/share-link-modal/component.js","babel/components/share-link-modal/options/component.js","babel/components/share-link-modal/options/template.js","babel/components/share-link-modal/template.js","babel/components/share-meta-menu/component.js","babel/components/share-meta-menu/modal/breadcrumb/component.js","babel/components/share-meta-menu/modal/breadcrumb/template.js","babel/components/share-meta-menu/modal/component.js","babel/components/share-meta-menu/modal/template.js","babel/components/share-meta-menu/template.js","babel/components/share-meta/component.js","babel/components/share-meta/template.js","babel/components/show-response/component.js","babel/components/show-response/template.js","babel/components/simple-speech-player/component.js","babel/components/simple-speech-player/template.js","babel/components/speaker-context/component.js","babel/components/speaker-context/template.js","babel/components/speaker-provider/component.js","babel/components/speaker-provider/icon/template.js","babel/components/speaker-provider/template.js","babel/components/special-keyboard/component.js","babel/components/special-keyboard/template.js","babel/components/story-modal/component.js","babel/components/story-modal/template.js","babel/components/student-select/component.js","babel/components/student-select/detail/template.js","babel/components/student-select/template.js","babel/components/table-of-contents-item/assignment-item/component.js","babel/components/table-of-contents-item/assignment-item/template.js","babel/components/table-of-contents-item/index.js","babel/components/table-of-contents-list/index.js","babel/components/table-of-contents/index.js","babel/components/tb-render-inline/component.js","babel/components/tb-render-inline/element/component.js","babel/components/tb-render-inline/element/enclose/a/component.js","babel/components/tb-render-inline/element/enclose/a/template.js","babel/components/tb-render-inline/element/enclose/component.js","babel/components/tb-render-inline/element/enclose/immersion/component.js","babel/components/tb-render-inline/element/enclose/immersion/template.js","babel/components/tb-render-inline/element/enclose/link/component.js","babel/components/tb-render-inline/element/enclose/link/template.js","babel/components/tb-render-inline/element/enclose/template.js","babel/components/tb-render-inline/element/enclose/word-explanation/component.js","babel/components/tb-render-inline/element/enclose/word-explanation/template.js","babel/components/tb-render-inline/element/extension/component.js","babel/components/tb-render-inline/element/extension/footnote/index.js","babel/components/tb-render-inline/element/extension/formula/component.js","babel/components/tb-render-inline/element/extension/formula/template.js","babel/components/tb-render-inline/element/extension/template.js","babel/components/tb-render-inline/element/format/bold/template.js","babel/components/tb-render-inline/element/format/component.js","babel/components/tb-render-inline/element/format/italic/template.js","babel/components/tb-render-inline/element/format/line-break/component.js","babel/components/tb-render-inline/element/format/line-break/template.js","babel/components/tb-render-inline/element/format/regular/template.js","babel/components/tb-render-inline/element/format/speech/template.js","babel/components/tb-render-inline/element/format/strike-through/template.js","babel/components/tb-render-inline/element/format/subscript/template.js","babel/components/tb-render-inline/element/format/superscript/template.js","babel/components/tb-render-inline/element/format/template.js","babel/components/tb-render-inline/element/format/text-color/component.js","babel/components/tb-render-inline/element/format/text-color/template.js","babel/components/tb-render-inline/element/format/underline/template.js","babel/components/tb-render-inline/element/image/component.js","babel/components/tb-render-inline/element/image/template.js","babel/components/tb-render-inline/element/stripped/template.js","babel/components/tb-render-inline/element/template.js","babel/components/tb-render-inline/iterator/component.js","babel/components/tb-render-inline/iterator/template.js","babel/components/tb-render-inline/template.js","babel/components/tb-render-inline/text/component.js","babel/components/tb-render-inline/text/template.js","babel/components/tb-render-wrapper/component.js","babel/components/tb-render-wrapper/template.js","babel/components/tb-render/assignment-link/component.js","babel/components/tb-render/assignment-link/template.js","babel/components/tb-render/attachment/component.js","babel/components/tb-render/attachment/template.js","babel/components/tb-render/audio/component.js","babel/components/tb-render/audio/template.js","babel/components/tb-render/block-component/component.js","babel/components/tb-render/canvas/component.js","babel/components/tb-render/canvas/template.js","babel/components/tb-render/caption/template.js","babel/components/tb-render/code/component.js","babel/components/tb-render/code/template.js","babel/components/tb-render/column/component.js","babel/components/tb-render/column/template.js","babel/components/tb-render/component.js","babel/components/tb-render/divider/index.js","babel/components/tb-render/embed/component.js","babel/components/tb-render/embed/template.js","babel/components/tb-render/encourage-listening-bubble/component.js","babel/components/tb-render/encourage-listening-bubble/template.js","babel/components/tb-render/gallery/component.js","babel/components/tb-render/gallery/template.js","babel/components/tb-render/group/component.js","babel/components/tb-render/group/template.js","babel/components/tb-render/heading/component.js","babel/components/tb-render/heading/template.js","babel/components/tb-render/ilt-video/component.js","babel/components/tb-render/ilt-video/template.js","babel/components/tb-render/image/component.js","babel/components/tb-render/image/template.js","babel/components/tb-render/interactive-image/component.js","babel/components/tb-render/interactive-image/template.js","babel/components/tb-render/list/component.js","babel/components/tb-render/list/template.js","babel/components/tb-render/paragraph/component.js","babel/components/tb-render/paragraph/template.js","babel/components/tb-render/part/component.js","babel/components/tb-render/part/template.js","babel/components/tb-render/placeholder/component.js","babel/components/tb-render/placeholder/template.js","babel/components/tb-render/row/component.js","babel/components/tb-render/row/template.js","babel/components/tb-render/table/component.js","babel/components/tb-render/table/template.js","babel/components/tb-render/tag/component.js","babel/components/tb-render/tag/template.js","babel/components/tb-render/template.js","babel/components/tb-render/video/component.js","babel/components/tb-render/video/template.js","babel/components/teacher-assignment-choose-modal/index.js","babel/components/teacher-assignment-detail/component.js","babel/components/teacher-assignment-detail/template.js","babel/components/teacher-assignment-picker/index.js","babel/components/teacher-assignment-picker/item/index.js","babel/components/theme-switch/component.js","babel/components/theme-switch/template.js","babel/components/user-avatar-and-name/template.js","babel/components/user-external-link-dialog/component.js","babel/components/user-external-link-dialog/template.js","babel/components/user-profile/template.js","babel/components/user-select/checkbox/component.js","babel/components/user-select/checkbox/template.js","babel/components/user-select/component.js","babel/components/user-select/list/component.js","babel/components/user-select/list/template.js","babel/components/user-select/table/component.js","babel/components/user-select/table/template.js","babel/components/user-select/template.js","babel/components/video-player/component.js","babel/components/video-player/template.js","babel/components/wait-for/index.js","babel/components/word-browser/component.js","babel/components/word-browser/item/component.js","babel/components/word-browser/item/template.js","babel/components/word-browser/template.js","babel/components/word-detail/template.js","babel/components/word-explanation-box/component.js","babel/components/word-explanation-box/template.js","babel/components/word-explanation-popup/index.js","babel/components/word-quiz/component.js","babel/components/word-quiz/done/component.js","babel/components/word-quiz/done/template.js","babel/components/word-quiz/quiz/component.js","babel/components/word-quiz/quiz/template.js","babel/components/word-quiz/template.js","babel/components/word-save/component.js","babel/components/word-save/template.js","babel/components/wordlist-browser/component.js","babel/components/wordlist-browser/item/component.js","babel/components/wordlist-browser/item/template.js","babel/components/wordlist-browser/template.js","babel/components/wordlist-choose-modal/index.js","babel/components/wordlist-detail/component.js","babel/components/wordlist-detail/template.js","babel/components/wordlist-picker/index.js","babel/components/wordlist-picker/item/index.js","babel/components/wordlist-view/component.js","babel/components/wordlist-view/template.js","babel/components/workspace/aside/component.js","babel/components/workspace/aside/template.js","babel/components/workspace/assignments/edit/component.js","babel/components/workspace/assignments/edit/template.js","babel/components/workspace/assignments/error/template.js","babel/components/workspace/assignments/index/component.js","babel/components/workspace/assignments/index/template.js","babel/components/workspace/assignments/show/component.js","babel/components/workspace/assignments/show/template.js","babel/components/workspace/component.js","babel/components/workspace/notes/edit/component.js","babel/components/workspace/notes/edit/template.js","babel/components/workspace/notes/error/template.js","babel/components/workspace/notes/index/component.js","babel/components/workspace/notes/index/template.js","babel/components/workspace/template.js","babel/components/workspace/topbar/template.js","babel/components/workspace/wordlists/edit/component.js","babel/components/workspace/wordlists/edit/template.js","babel/components/workspace/wordlists/error/template.js","babel/components/workspace/wordlists/index/component.js","babel/components/workspace/wordlists/index/template.js","babel/components/workspace/wordlists/show/component.js","babel/components/workspace/wordlists/show/template.js","babel/components/workspace/wordlists/words/edit/component.js","babel/components/workspace/wordlists/words/edit/template.js","babel/controllers/application.js","babel/controllers/embed-audit-collection.js","babel/controllers/master.js","babel/controllers/master/admin.js","babel/controllers/master/archives.js","babel/controllers/master/archives/folders/materials.js","babel/controllers/master/contents-refactored.js","babel/controllers/master/contents.js","babel/controllers/master/contents/wordlists/show/index.js","babel/controllers/master/courses/show/audit/comments.js","babel/controllers/master/courses/show/audit/inbox.js","babel/controllers/master/courses/show/audit/index.js","babel/controllers/master/courses/show/audit/log.js","babel/controllers/master/courses/show/audit/missions/index.js","babel/controllers/master/courses/show/audit/missions/show.js","babel/controllers/master/courses/show/audit/overview.js","babel/controllers/master/courses/show/books.js","babel/controllers/master/courses/show/index.js","babel/controllers/master/courses/show/missions.js","babel/controllers/master/error.js","babel/controllers/master/interactives.js","babel/controllers/master/interactives/diagnoses/done/audit.js","babel/controllers/master/interactives/diagnoses/index.js","babel/controllers/master/interactives/diagnoses/show.js","babel/controllers/master/interactives/index.js","babel/controllers/master/interactives/practices/show.js","babel/controllers/master/materials.js","babel/controllers/master/missions.js","babel/controllers/master/products.js","babel/controllers/nodes.js","babel/controllers/url-resolve.js","babel/decorators/model-validator.js","babel/decorators/object-validator.js","babel/formats.js","babel/helpers/app-version.js","babel/helpers/aspect-ratio.js","babel/helpers/course-display-name.js","babel/helpers/date.js","babel/helpers/datetime.js","babel/helpers/format-date.js","babel/helpers/format-message.js","babel/helpers/format-number.js","babel/helpers/format-relative.js","babel/helpers/format-time.js","babel/helpers/html-safe.js","babel/helpers/human-time.js","babel/helpers/is-before.js","babel/helpers/language-items.js","babel/helpers/material-viewer-component-name.js","babel/helpers/number-to-base-26.js","babel/helpers/pluralize.js","babel/helpers/singularize.js","babel/helpers/t.js","babel/initializers/app-version.js","babel/initializers/ember-data.js","babel/initializers/ember-responsive-breakpoints.js","babel/instance-initializers/ember-data.js","babel/mixins/contentable.js","babel/mixins/entity-route-support.js","babel/mixins/page-view-tracker.js","babel/mixins/userable.js","babel/models/answer-comment.js","babel/models/answer.js","babel/models/book.js","babel/models/canvas-state.js","babel/models/category.js","babel/models/contentable.js","babel/models/course.js","babel/models/custom-content.js","babel/models/editor.js","babel/models/entity.js","babel/models/file.js","babel/models/group.js","babel/models/help-list.js","babel/models/interactive.js","babel/models/license.js","babel/models/login.js","babel/models/material.js","babel/models/missing-license-item.js","babel/models/missing-license-product.js","babel/models/mission.js","babel/models/model.js","babel/models/note.js","babel/models/notice.js","babel/models/post.js","babel/models/product.js","babel/models/role.js","babel/models/root-model.js","babel/models/school.js","babel/models/setting.js","babel/models/teacher-assignment.js","babel/models/user-license.js","babel/models/user.js","babel/models/word.js","babel/models/wordlist.js","babel/modifiers/collection-index.js","babel/modifiers/fit-within-window.js","babel/modifiers/highlight-terms.js","babel/router.js","babel/routes/404.js","babel/routes/activate.js","babel/routes/application.js","babel/routes/authenticated-route.js","babel/routes/embed-audit-collection.js","babel/routes/entity-context-route.js","babel/routes/invalidate.js","babel/routes/login.js","babel/routes/logout.js","babel/routes/master.js","babel/routes/master/admin.js","babel/routes/master/archives.js","babel/routes/master/archives/folders.js","babel/routes/master/archives/folders/materials.js","babel/routes/master/archives/index.js","babel/routes/master/areas.js","babel/routes/master/books.js","babel/routes/master/contents.js","babel/routes/master/contents/assignments/edit.js","babel/routes/master/contents/assignments/new.js","babel/routes/master/contents/assignments/show.js","babel/routes/master/contents/notes/edit.js","babel/routes/master/contents/notes/new.js","babel/routes/master/contents/sections.js","babel/routes/master/contents/wordlists/edit.js","babel/routes/master/contents/wordlists/new.js","babel/routes/master/contents/wordlists/show.js","babel/routes/master/contents/wordlists/show/index.js","babel/routes/master/contents/wordlists/show/words/edit.js","babel/routes/master/contents/wordlists/show/words/new.js","babel/routes/master/course-settings.js","babel/routes/master/courses.js","babel/routes/master/courses/new.js","babel/routes/master/courses/show.js","babel/routes/master/courses/show/audit.js","babel/routes/master/courses/show/audit/comments.js","babel/routes/master/courses/show/audit/inbox.js","babel/routes/master/courses/show/audit/index.js","babel/routes/master/courses/show/audit/log.js","babel/routes/master/courses/show/audit/missions/index.js","babel/routes/master/courses/show/audit/missions/show.js","babel/routes/master/courses/show/audit/overview.js","babel/routes/master/courses/show/audit/todos/index.js","babel/routes/master/courses/show/audit/todos/show.js","babel/routes/master/courses/show/books.js","babel/routes/master/courses/show/index.js","babel/routes/master/courses/show/missions.js","babel/routes/master/courses/show/my-results.js","babel/routes/master/courses/show/settings.js","babel/routes/master/courses/show/todos.js","babel/routes/master/error.js","babel/routes/master/index.js","babel/routes/master/interactives.js","babel/routes/master/interactives/diagnoses.js","babel/routes/master/interactives/diagnoses/done.js","babel/routes/master/interactives/diagnoses/index.js","babel/routes/master/interactives/diagnoses/show.js","babel/routes/master/interactives/index.js","babel/routes/master/interactives/practices.js","babel/routes/master/interactives/practices/index.js","babel/routes/master/interactives/practices/show.js","babel/routes/master/materials.js","babel/routes/master/missions.js","babel/routes/master/products.js","babel/routes/master/products/index.js","babel/routes/master/products/my-results.js","babel/routes/master/profile/index.js","babel/routes/master/profile/settings.js","babel/routes/master/todos.js","babel/routes/nodes.js","babel/routes/url-resolve.js","babel/rules/answers.js","babel/rules/entity-fallback-titles.js","babel/rules/integrations.js","babel/serializers/application.js","babel/serializers/custom-content.js","babel/serializers/editor.js","babel/serializers/entity.js","babel/serializers/mission.js","babel/serializers/note.js","babel/serializers/post.js","babel/serializers/teacher-assignment.js","babel/serializers/word.js","babel/services/ajax.js","babel/services/app-update.js","babel/services/assignment-events.js","babel/services/color-theme.js","babel/services/context-helper.js","babel/services/cookie-consent.js","babel/services/course-context.js","babel/services/custom-content-dispatcher.js","babel/services/diagnosis.js","babel/services/entity-context.js","babel/services/entity-inspector.js","babel/services/entity-search.js","babel/services/fetch.js","babel/services/file-dispatcher.js","babel/services/focus-mode.js","babel/services/footnotes.js","babel/services/groups-onboarding.js","babel/services/help-list.js","babel/services/imbox.js","babel/services/intl.js","babel/services/languages.js","babel/services/media.js","babel/services/mission-dispatcher.js","babel/services/mission-mode.js","babel/services/note-dispatcher.js","babel/services/notice.js","babel/services/pageviews.js","babel/services/product-context.js","babel/services/pusher.js","babel/services/read-notices.js","babel/services/record-audio.js","babel/services/session.js","babel/services/show-response.js","babel/services/speaker-session.js","babel/services/speaker.js","babel/services/store.js","babel/services/student-list.js","babel/services/teacher-assignment-dispatcher.js","babel/services/video.js","babel/services/word-dispatcher.js","babel/services/wordlist-dispatcher.js","babel/services/wordlist.js","babel/session-stores/application.js","babel/storages/collection-sound.js","babel/storages/content-visited.js","babel/storages/interactive-image.js","babel/storages/play-settings.js","babel/storages/read-setting.js","babel/storages/reading-buddy.js","babel/storages/session-states.js","babel/storages/speaker-session.js","babel/storages/ui-messages.js","babel/storages/wordlists.js","babel/templates/404.js","babel/templates/application-loading.js","babel/templates/application.js","babel/templates/embed-audit-collection-loading.js","babel/templates/embed-audit-collection.js","babel/templates/master.js","babel/templates/master/archives.js","babel/templates/master/archives/folders/materials.js","babel/templates/master/areas.js","babel/templates/master/books.js","babel/templates/master/contents.js","babel/templates/master/contents/assignments/edit.js","babel/templates/master/contents/assignments/error.js","babel/templates/master/contents/assignments/index.js","babel/templates/master/contents/assignments/new.js","babel/templates/master/contents/assignments/show.js","babel/templates/master/contents/notes/edit.js","babel/templates/master/contents/notes/error.js","babel/templates/master/contents/notes/index.js","babel/templates/master/contents/notes/new.js","babel/templates/master/contents/wordlists/edit.js","babel/templates/master/contents/wordlists/error.js","babel/templates/master/contents/wordlists/index.js","babel/templates/master/contents/wordlists/new.js","babel/templates/master/contents/wordlists/show/index.js","babel/templates/master/contents/wordlists/show/words/edit.js","babel/templates/master/contents/wordlists/show/words/new.js","babel/templates/master/courses/show.js","babel/templates/master/courses/show/audit.js","babel/templates/master/courses/show/audit/comments.js","babel/templates/master/courses/show/audit/inbox.js","babel/templates/master/courses/show/audit/index.js","babel/templates/master/courses/show/audit/log.js","babel/templates/master/courses/show/audit/missions/index.js","babel/templates/master/courses/show/audit/missions/show.js","babel/templates/master/courses/show/audit/overview.js","babel/templates/master/courses/show/books.js","babel/templates/master/courses/show/index.js","babel/templates/master/courses/show/missions.js","babel/templates/master/courses/show/my-results.js","babel/templates/master/courses/show/settings.js","babel/templates/master/error.js","babel/templates/master/forbidden.js","babel/templates/master/index.js","babel/templates/master/interactives.js","babel/templates/master/interactives/diagnoses/done.js","babel/templates/master/interactives/diagnoses/done/audit.js","babel/templates/master/interactives/diagnoses/done/index.js","babel/templates/master/interactives/diagnoses/index.js","babel/templates/master/interactives/diagnoses/show.js","babel/templates/master/interactives/index.js","babel/templates/master/interactives/practices/show.js","babel/templates/master/materials.js","babel/templates/master/missions.js","babel/templates/master/products.js","babel/templates/master/products/index.js","babel/templates/master/products/my-results.js","babel/templates/nodes.js","babel/transforms/array.js","babel/transforms/object.js","babel/utils/Poller.js","babel/utils/add-course-setting-relationship.js","babel/utils/append-query-params.js","babel/utils/assignments.js","babel/utils/chapter-viewport.js","babel/utils/clone.js","babel/utils/collection-close.js","babel/utils/copy-to-clipboard.js","babel/utils/ember-object-to-native-object.js","babel/utils/entity-is-allowed-in-custom-content.js","babel/utils/errors.js","babel/utils/extract-footnotes-from-editor-value.js","babel/utils/fetch-schools-and-courses.js","babel/utils/generate-fallback-title.js","babel/utils/get-answer.js","babel/utils/get-collection-data.js","babel/utils/get-element.js","babel/utils/get-setting-classes-for-part.js","babel/utils/get-today.js","babel/utils/get-user-license-for-entity.js","babel/utils/handle-cookies.js","babel/utils/handle-dirty-relationship-data.js","babel/utils/himalaya.js","babel/utils/image-dimensions.js","babel/utils/is-workspace-collection-active.js","babel/utils/isEqual.js","babel/utils/license-info.js","babel/utils/load-data-from-store.js","babel/utils/log-opened-product.js","babel/utils/material-download.js","babel/utils/matomo-events.js","babel/utils/native-object-to-ember-object.js","babel/utils/number-to-base-26.js","babel/utils/paged-array.js","babel/utils/part.js","babel/utils/pusher.js","babel/utils/redirect.js","babel/utils/refresh-route-and-notify-exercise-change.js","babel/utils/resolve-path-for-teacher-assignment-answer.js","babel/utils/resource.js","babel/utils/route-args-for-entity.js","babel/utils/routing.js","babel/utils/sanitize-html.js","babel/utils/scroll-to-top-if-needed.js","babel/utils/session-storage.js","babel/utils/shake-element.js","babel/utils/should-reload-on-update.js","babel/utils/sort-by.js","babel/utils/speaker/DigilarAudioSourceHandler.js","babel/utils/speaker/DigilarDomElementsConfig.js","babel/utils/speaker/DigilarDomHelper.js","babel/utils/speaker/DigilarLanguageUtil.js","babel/utils/speaker/DigilarPollyProviderFactory.js","babel/utils/speaker/DigilarPollyProxy.js","babel/utils/speaker/DigilarRecordedSpeechProvider.js","babel/utils/speaker/DigilarSpeakerConfig.js","babel/utils/speaker/DigilarSpeakerType.js","babel/utils/speaker/deviceUtils.js","babel/utils/speaker/digilarDomSpeakerEventHandler.js","babel/utils/speaker/digilarSpeakerControls.js","babel/utils/speaker/digilarSpeakerOptions.js","babel/utils/speaker/ilt/IltApi.js","babel/utils/speaker/ilt/IltDataParser.js","babel/utils/speaker/ilt/IltMockApi.js","babel/utils/speaker/ilt/IltMockDataParser.js","babel/utils/speaker/ilt/IltRecordedSpeechProvider.js","babel/utils/speaker/speaker-voices.js","babel/utils/speaker/text-processing-rule-sets/digilar-general-sv.js","babel/utils/speaker/text-processing-rule-sets/digilar-general.js","babel/utils/speaker/text-processing-rule-sets/helpers/exponents.js","babel/utils/speaker/text-processing-rule-sets/polly/digilar-polly.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/de.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/en.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/es.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/fr.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/it.js","babel/utils/speaker/text-processing-rule-sets/translation/languages/sv.js","babel/utils/speaker/text-processing-rule-sets/translation/translate.js","babel/utils/urls.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n  shouldBackgroundReloadRecord() {\n    return true;\n  },\n\n  shouldBackgroundReloadAll() {\n    return true;\n  },\n});\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  shouldBackgroundReloadRecord() {\n    return false;\n  },\n\n  shouldBackgroundReloadAll() {\n    return false;\n  },\n  \n  urlForFindMany(ids, modelName, snapshots) {\n    const all = snapshots?.[0]?.adapterOptions?.all;\n    let url = this._super(...arguments);\n\n    if (all) {\n      url += '?all=true';\n    }\n\n    return url;\n  },\n});\n","import { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { addCourseSettingRelationship } from 'babel/utils/add-course-setting-relationship';\nimport { chunk } from 'compton/utils/array';\nimport {\n  handleMaintenanceResponse,\n  isMaintenanceResponse,\n} from 'compton/utils/maintenance-response';\nimport OIDCJSONAPIAdapter from 'ember-simple-auth-oidc/adapters/oidc-json-api-adapter';\nimport { v4 as uuid } from 'ember-uuid';\n\nexport default class ApplicationAdapter extends OIDCJSONAPIAdapter {\n  @service session;\n\n  @service store;\n\n  coalesceFindRequests = true;\n\n  host = config.endpoint;\n\n  get headers() {\n    const headers = this.session?.headers;\n\n    if (headers && this.session?.inPreviewMode) {\n      headers['x-preview'] = true;\n    }\n\n    return headers;\n  }\n\n  handleResponse(status, info, payload) {\n    if (isMaintenanceResponse(status, payload)) {\n      return handleMaintenanceResponse(this.host);\n    }\n\n    addCourseSettingRelationship(payload);\n\n    return super.handleResponse(...arguments);\n  }\n\n  generateIdForRecord() {\n    return uuid();\n  }\n\n  groupRecordsForFindMany(_, snapshots) {\n    return chunk(snapshots, 20);\n  }\n\n  shouldBackgroundReloadRecord() {\n    return false; // Can not be true for sections, causes reload of sections that breaks speaker highlighting\n  }\n\n  shouldBackgroundReloadAll() {\n    return false; // Can not be true for sections, causes reload of sections that breaks speaker highlighting\n  }\n\n  createRecord(store, type, snapshot) {\n    const data = {};\n    const serializer = store.serializerFor(type.modelName);\n\n    serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n    const id = snapshot.id;\n    let url = this.buildURL(type.modelName, id, snapshot, 'createRecord');\n\n    if (snapshot.adapterOptions && snapshot.adapterOptions.action) {\n      url += '?action=' + snapshot.adapterOptions.action;\n    }\n\n    return this.ajax(url, 'POST', { data: data }).then((payload) => {\n      if (\n        snapshot.adapterOptions &&\n        snapshot.adapterOptions.ignoreResponsePayload\n      ) {\n        return null;\n      }\n      return payload;\n    });\n  }\n\n  updateRecord(store, type, snapshot) {\n    const data = {};\n    const serializer = store.serializerFor(type.modelName);\n\n    serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n    const id = snapshot.id;\n    let url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n    if (snapshot.adapterOptions && snapshot.adapterOptions.action) {\n      url += '?action=' + snapshot.adapterOptions.action;\n    }\n\n    return this.ajax(url, 'PATCH', { data: data }).then((payload) => {\n      if (\n        snapshot.adapterOptions &&\n        snapshot.adapterOptions.ignoreResponsePayload\n      ) {\n        return null;\n      }\n      return payload;\n    });\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default class CanvasStateAdapter extends ApplicationAdapter {\n  namespace = 'api/v1/meta';\n}\n","import { service } from '@ember/service';\nimport ApplicationAdapter from 'babel/adapters/application';\nimport config from 'babel/config/environment';\nimport { handleDirtyBelongsToRelationshipData } from 'babel/utils/handle-dirty-relationship-data';\nimport { resolve } from 'rsvp';\n\nexport default class CourseAdapter extends ApplicationAdapter {\n  @service session;\n\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  shouldBackgroundReloadRecord(store, snapshot) {\n    // This fixes a bug affecting tests where Ember reloads\n    // the record before it is persisted, leading to an error.\n    if (snapshot.isNew) return false;\n    return true;\n  }\n\n  shouldBackgroundReloadAll() {\n    return true;\n  }\n\n  findBelongsTo(store, snapshot, url, relationship) {\n    if (relationship?.meta?.name === 'setting') {\n      return handleDirtyBelongsToRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      ).then(async (response) => {\n        if (response?.data === null) {\n          const id = snapshot.id;\n          const setting = store.createRecord('setting', { id });\n\n          if (this.session.user?.isTeacher) {\n            await setting.save();\n          } else {\n            // In case the student enters the course before the teacher\n            // we need to add the books as shortcuts. See DINO-3707\n            const course = store.peekRecord('course', id);\n\n            if (course) {\n              const books = await resolve(course.allBooks);\n              const shortcuts = await resolve(setting.shortcuts);\n\n              if (books.length > 0 && shortcuts.length === 0) {\n                shortcuts.addObjects(books);\n              }\n            }\n          }\n\n          return setting.serialize({ includeId: true });\n        }\n\n        return response;\n      });\n    }\n\n    return super.findBelongsTo(...arguments);\n  }\n}\n","import {\n  handleDirtyBelongsToRelationshipData,\n  handleDirtyHasManyRelationshipData,\n} from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = [\n  'entity',\n  'includedEntities',\n  'includedTeacherAssignments',\n  'includedWordlists',\n];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n\n  findBelongsTo(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyBelongsToRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/content',\n});\n","import { get } from '@ember/object';\nimport { isNone } from '@ember/utils';\n\nimport ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/content',\n\n  urlForFindRecord(id, modelName, snapshot) {\n    const url = this._super(...arguments);\n    const adapterOptionsInclude = 'adapterOptions.include';\n    const include = get(snapshot, adapterOptionsInclude) || [];\n\n    if (isNone(snapshot) || include.length === 0) {\n      return url;\n    }\n\n    return `${url}${url.indexOf('?') > -1 ? '&' : '?'}include=${include.join(\n      ','\n    )}`;\n  },\n});\n","import { handleDirtyHasManyRelationshipData } from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['books', 'contents'];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import ApplicationAdapter from 'babel/adapters/application';\nimport config from 'babel/config/environment';\n\nexport default class GroupAdapter extends ApplicationAdapter {\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  shouldBackgroundReloadRecord() {\n    return true;\n  }\n\n  shouldBackgroundReloadAll() {\n    return true;\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default class HelpListAdapter extends ApplicationAdapter {\n  namespace = 'api/v1/meta';\n}\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n});\n","import ApplicationAdapter from 'babel/adapters/application';\nimport config from 'babel/config/environment';\n\nexport default class LicenseAdapter extends ApplicationAdapter {\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  shouldBackgroundReloadRecord() {\n    return true;\n  }\n\n  shouldBackgroundReloadAll() {\n    return true;\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/content',\n});\n","import ApplicationAdapter from 'babel/adapters/application';\nimport { handleReceiversRelationship } from 'babel/utils/handle-dirty-relationship-data';\n\nexport default class MissionAdapter extends ApplicationAdapter {\n  namespace = 'api/v1/meta';\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (relationship?.meta?.name === 'receivers') {\n      return handleReceiversRelationship(\n        store,\n        snapshot,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return super.findHasMany(...arguments).then((response) => {\n      if (relationship?.meta?.name === 'linkedEntities') {\n        const order = snapshot?.record\n          ?.hasMany('linkedEntities')\n          ?.meta()?.order;\n\n        const data = response?.data;\n\n        if (order && data && order.length === data.length) {\n          response.data = order.map((id) =>\n            data.find((item) => item.id === id)\n          );\n        }\n      }\n\n      return response;\n    });\n  }\n}\n","import { handleDirtyHasManyRelationshipData } from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['books', 'contents'];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import config from 'babel/config/environment';\n\nimport ApplicationAdapter from './application';\n\nexport default class NoticeAdapter extends ApplicationAdapter {\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  shouldReloadAll() {\n    return true;\n  }\n}\n","import {\n  handleDirtyHasManyRelationshipData,\n  handleReceiversRelationship,\n} from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['entities'];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  shouldBackgroundReloadRecord() {\n    return true;\n  },\n\n  shouldBackgroundReloadAll() {\n    return true;\n  },\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    } else if (relationship?.meta?.name === 'receivers') {\n      return handleReceiversRelationship(\n        store,\n        snapshot,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import { service } from '@ember/service';\n\nimport ApplicationAdapter from './application';\n\nexport default class ProductAdapter extends ApplicationAdapter {\n  namespace = 'api/v1/public';\n\n  @service session;\n\n  findHasMany(store, snapshot, url, relationship) {\n    return super.findHasMany(...arguments).then((response) => {\n      if (relationship.name === 'books' && this.session.inPreviewMode) {\n        // When previewing the books data from product API sometimes overwrites\n        // the books data from the entity API. The product API cannot handle\n        // preview mode and therefore always servers the published versions of\n        // the books. The following code makes sure that books that are already\n        // present in the store are not overwritten.\n        // For more info see DINO-4594\n\n        response.data.map((book, index) => {\n          const record = store.peekRecord('entity', book.id);\n\n          if (record) {\n            response.data[index] = record.serialize({ includeId: true }).data;\n          }\n        });\n      }\n\n      return response;\n    });\n  }\n}\n","import ApplicationAdapter from 'babel/adapters/application';\nimport config from 'babel/config/environment';\n\nexport default class SchoolAdapter extends ApplicationAdapter {\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  shouldBackgroundReloadRecord() {\n    return false;\n  }\n\n  shouldBackgroundReloadAll() {\n    return false;\n  }\n}\n","import ApplicationAdapter from 'babel/adapters/application';\nimport { handleDirtyHasManyRelationshipData } from 'babel/utils/handle-dirty-relationship-data';\nimport { resolve } from 'rsvp';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['shortcuts', 'books', 'hiddenBooks'];\n\nexport default class SettingAdapter extends ApplicationAdapter {\n  namespace = 'api/v1/meta';\n\n  shouldBackgroundReloadRecord(store, snapshot) {\n    // This fixes a bug affecting tests where Ember reloads\n    // the record before it is persisted, leading to an error.\n    if (snapshot.isNew) return false;\n    return true;\n  }\n\n  shouldBackgroundReloadAll() {\n    return true;\n  }\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      ).then(async (response) => {\n        if (\n          relationship?.meta?.name === 'shortcuts' &&\n          Array.isArray(response?.data)\n        ) {\n          const course = await resolve(snapshot?.record?.course);\n          const allowedBookIds = await resolve(course?.allBooks).then((books) =>\n            books.map((book) => book.id)\n          );\n\n          if (allowedBookIds) {\n            response.data = response.data.filter((shortcut) =>\n              allowedBookIds.includes(shortcut?.attributes?.book_id)\n            );\n          }\n        }\n\n        return response;\n      });\n    }\n\n    return super.findHasMany(...arguments);\n  }\n}\n","import { handleDirtyHasManyRelationshipData } from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['books', 'contents'];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import { service } from '@ember/service';\nimport ApplicationAdapter from 'babel/adapters/application';\nimport config from 'babel/config/environment';\n\nexport default class UserAdapter extends ApplicationAdapter {\n  host = config.userApiEndpoint;\n\n  namespace = 'api';\n\n  @service('ajax') ajaxService;\n\n  queryRecord(modelName, query, options) {\n    if (options.me === true) {\n      return this.ajaxService.request(\n        `${config.userApiEndpoint}/api/users/me`,\n        true,\n        {\n          type: 'GET',\n        }\n      );\n    } else {\n      return super.queryRecord(...arguments);\n    }\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n});\n","import { handleDirtyHasManyRelationshipData } from '../utils/handle-dirty-relationship-data';\nimport ApplicationAdapter from './application';\n\nconst DIRTY_DATA_RELATIONSHIPS = ['books', 'contents'];\n\nexport default ApplicationAdapter.extend({\n  namespace: 'api/v1/meta',\n\n  findHasMany(store, snapshot, url, relationship) {\n    if (DIRTY_DATA_RELATIONSHIPS.includes(relationship?.meta?.name)) {\n      return handleDirtyHasManyRelationshipData(\n        store,\n        url,\n        relationship?.meta?.type\n      );\n    }\n\n    return this._super(...arguments);\n  },\n});\n","import Application from '@ember/application';\nimport config from 'babel/config/environment';\nimport loadInitializers from 'ember-load-initializers';\nimport Resolver from 'ember-resolver';\n\nconst App = Application.extend({\n  modulePrefix: config.modulePrefix,\n  podModulePrefix: config.podModulePrefix,\n  Resolver,\n});\n\nloadInitializers(App, config.modulePrefix);\n\nexport default App;\n","export default {\n  xl: '(min-width: 1600px)',\n  lg: '(min-width: 1200px)',\n  md: '(min-width: 992px)',\n\n  // TODO Fix these:\n\n  sm: '(max-width: 768px)',\n  xs: '(max-width: 480px)',\n  mediumOrLess: '(max-width: 991px)',\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<hr class=\\\"action-menu-divider\\\" data-test-action-menu-divider ...attributes />\", {\"contents\":\"<hr class=\\\"action-menu-divider\\\" data-test-action-menu-divider ...attributes />\",\"moduleName\":\"babel/components/action-menu/divider/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/action-menu/divider/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XPopup\\n  @for={{@for}}\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n  <div\\n    class=\\\"action-menu\\\"\\n    role=\\\"menu\\\"\\n    inert={{this.isInert}}\\n    ...attributes\\n    data-test-action-menu\\n    data-width={{this.width}}\\n    tabindex=\\\"-1\\\"\\n    {{auto-focus}}\\n    {{step-focus orientation=\\\"vertical\\\" searchable=true}}\\n    {{ref (set this \\\"element\\\")}}\\n  >\\n    {{yield\\n      (hash\\n        Item=(component\\n          \\\"action-menu/item\\\"\\n          onSelect=this.handleItemSelect\\n          wrapperElement=this.element\\n          onHighlightChange=(set this \\\"isInert\\\")\\n        )\\n        Divider=(component \\\"action-menu/divider\\\")\\n      )\\n    }}\\n  </div>\\n</XPopup>\\n{{on-document \\\"keydown\\\" this.handleDocumentKeyDown capture=true}}\\n{{on-window \\\"resize\\\" @onClose}}\\n{{on-window \\\"blur\\\" @onClose}}\", {\"contents\":\"<XPopup\\n  @for={{@for}}\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n  <div\\n    class=\\\"action-menu\\\"\\n    role=\\\"menu\\\"\\n    inert={{this.isInert}}\\n    ...attributes\\n    data-test-action-menu\\n    data-width={{this.width}}\\n    tabindex=\\\"-1\\\"\\n    {{auto-focus}}\\n    {{step-focus orientation=\\\"vertical\\\" searchable=true}}\\n    {{ref (set this \\\"element\\\")}}\\n  >\\n    {{yield\\n      (hash\\n        Item=(component\\n          \\\"action-menu/item\\\"\\n          onSelect=this.handleItemSelect\\n          wrapperElement=this.element\\n          onHighlightChange=(set this \\\"isInert\\\")\\n        )\\n        Divider=(component \\\"action-menu/divider\\\")\\n      )\\n    }}\\n  </div>\\n</XPopup>\\n{{on-document \\\"keydown\\\" this.handleDocumentKeyDown capture=true}}\\n{{on-window \\\"resize\\\" @onClose}}\\n{{on-window \\\"blur\\\" @onClose}}\",\"moduleName\":\"babel/components/action-menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/action-menu/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { KEY } from 'compton/utils/event';\n\nexport default class ActionMenu extends Component {\n  element = null;\n\n  @tracked isInert = false;\n\n  get width() {\n    return this.args.width || 'auto';\n  }\n\n  @action\n  handleItemSelect(value) {\n    this.args.onSelect?.(value);\n    this.args.onClose?.();\n  }\n\n  @action\n  handleDocumentKeyDown(evt) {\n    if (evt.key === KEY.tab) {\n      evt.preventDefault();\n      evt.stopImmediatePropagation();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  role=\\\"menuitem\\\"\\n  class=\\\"action-menu-item\\\"\\n  tabindex=\\\"0\\\"\\n  data-test-action-menu-item\\n  data-highlighted={{this.isHighlighted}}\\n  ...attributes\\n  {{on \\\"pointerenter\\\" this.handlePointerEnter}}\\n  {{on \\\"pointerleave\\\" this.handlePointerLeave}}\\n  {{on \\\"click\\\" this.handleClick}}\\n  {{on \\\"keydown\\\" this.handleKeyDown}}\\n  {{ref (set this \\\"element\\\")}}\\n>\\n  {{#if @icon}}\\n    <DcIcon class=\\\"action-menu-icon nr1\\\" @name=\\\"{{@icon}}\\\" />\\n  {{/if}}\\n  <div class=\\\"action-menu-item-text\\\">\\n    <span\\n      class=\\\"action-menu-item-label\\n        {{if @icon 'flex flex-center'}}\\n        {{if @destructive 'action-menu-item-label-destructive '}}\\\"\\n    >\\n      {{yield to=\\\"label\\\"}}\\n    </span>\\n\\n    {{#if (has-block \\\"description\\\")}}\\n      <div class=\\\"action-menu-item-description\\\">\\n        {{yield to=\\\"description\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  role=\\\"menuitem\\\"\\n  class=\\\"action-menu-item\\\"\\n  tabindex=\\\"0\\\"\\n  data-test-action-menu-item\\n  data-highlighted={{this.isHighlighted}}\\n  ...attributes\\n  {{on \\\"pointerenter\\\" this.handlePointerEnter}}\\n  {{on \\\"pointerleave\\\" this.handlePointerLeave}}\\n  {{on \\\"click\\\" this.handleClick}}\\n  {{on \\\"keydown\\\" this.handleKeyDown}}\\n  {{ref (set this \\\"element\\\")}}\\n>\\n  {{#if @icon}}\\n    <DcIcon class=\\\"action-menu-icon nr1\\\" @name=\\\"{{@icon}}\\\" />\\n  {{/if}}\\n  <div class=\\\"action-menu-item-text\\\">\\n    <span\\n      class=\\\"action-menu-item-label\\n        {{if @icon 'flex flex-center'}}\\n        {{if @destructive 'action-menu-item-label-destructive '}}\\\"\\n    >\\n      {{yield to=\\\"label\\\"}}\\n    </span>\\n\\n    {{#if (has-block \\\"description\\\")}}\\n      <div class=\\\"action-menu-item-description\\\">\\n        {{yield to=\\\"description\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/action-menu/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/action-menu/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport waitForAnimation from 'compton/utils/dom/wait-for-animation';\nimport { KEY } from 'compton/utils/event';\n\nfunction sleep(ms) {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport default class ActionMenuItem extends Component {\n  element = null;\n\n  @tracked isHighlighted = false;\n\n  @action\n  handlePointerEnter() {\n    this.element.focus({ preventScroll: true });\n  }\n\n  @action\n  handlePointerLeave() {\n    this.args.wrapperElement.focus({ preventScroll: true });\n  }\n\n  @action\n  async handleClick() {\n    await this.highlight();\n    this.select();\n  }\n\n  @action\n  async handleKeyDown(evt) {\n    if (evt.key === KEY.enter || evt.key === KEY.space) {\n      evt.preventDefault();\n      await this.highlight();\n      this.select();\n    }\n  }\n\n  async highlight() {\n    this.isHighlighted = true;\n    this.args.onHighlightChange?.(true);\n    await sleep(1);\n    await waitForAnimation(this.element);\n    this.isHighlighted = false;\n    this.args.onHighlightChange?.(false);\n  }\n\n  select() {\n    this.args.onSelect(this.args.value);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"addition-collator\\\" {{did-insert this.setElement}}>\\n  <div class=\\\"grid\\\">\\n    <div class=\\\"col-sm-12 col-3\\\">\\n      {{#let (generate-id \\\"book-id-select\\\") as |id|}}\\n        <UiLabel @for={{id}}>\\n          {{t \\\"components.additionCollator.filterSelectLabel\\\"}}\\n        </UiLabel>\\n\\n        <XSelect\\n          @id={{id}}\\n          @value={{@query.bookId}}\\n          @items={{this.bookSelectItems}}\\n          @stretch={{true}}\\n          @onChange={{this.handleFilterSelectChange}}\\n          @loading={{this.bookSelectItemsPromise.isPending}}\\n        />\\n      {{/let}}\\n    </div>\\n\\n    <div class=\\\"col-sm-12 col-9\\\">\\n      {{#let (generate-id \\\"search-input\\\") as |id|}}\\n        <UiLabel @for={{id}}>\\n          {{t \\\"components.additionCollator.searchInputLabel\\\"}}\\n        </UiLabel>\\n\\n        <UiForm class=\\\"flex\\\" @onSubmit={{fn this.handleSearchFormSubmit @query.search}}>\\n          <UiInput\\n            class=\\\"flex-grow\\\"\\n            @controlId={{id}}\\n            @value={{@query.search}}\\n            @type=\\\"search\\\"\\n            @placeholder={{this.placeholderSearchValue}}\\n            @clearable={{true}}\\n            @onClear={{this.handleSearchInputClear}}\\n            data-test-search-input\\n          />\\n\\n          <UiButton\\n            class=\\\"nl1\\\"\\n            @type=\\\"submit\\\"\\n            @ariaLabel={{t \\\"components.additionCollator.searchButtonLabel\\\"}}\\n            data-test-submit-search\\n          >\\n            <DcIcon @name=\\\"search\\\"/>\\n          </UiButton>\\n        </UiForm>\\n      {{/let}}\\n    </div>\\n  </div>\\n\\n  {{#if this.pagedAdditions}}\\n    {{yield this.pagedAdditions}}\\n\\n    {{#if (gt this.pagedAdditions.totalPages 1)}}\\n      <XPagination\\n        class={{class \\\"justify-space-between mt1\\\" (if (eq this.mode \\\"grid\\\") \\\"bt1 pt1\\\")}}\\n        @showFirstLast={{false}}\\n        @routed={{@routed}}\\n        @page={{this.pagedAdditions.page}}\\n        @totalPages={{this.pagedAdditions.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    {{/if}}\\n  {{else}}\\n    <XAlert @variant={{if this.hasQuery \\\"error\\\"}}>\\n      {{if this.hasQuery @noResultMessage @emptytMessage}}\\n    </XAlert>\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"addition-collator\\\" {{did-insert this.setElement}}>\\n  <div class=\\\"grid\\\">\\n    <div class=\\\"col-sm-12 col-3\\\">\\n      {{#let (generate-id \\\"book-id-select\\\") as |id|}}\\n        <UiLabel @for={{id}}>\\n          {{t \\\"components.additionCollator.filterSelectLabel\\\"}}\\n        </UiLabel>\\n\\n        <XSelect\\n          @id={{id}}\\n          @value={{@query.bookId}}\\n          @items={{this.bookSelectItems}}\\n          @stretch={{true}}\\n          @onChange={{this.handleFilterSelectChange}}\\n          @loading={{this.bookSelectItemsPromise.isPending}}\\n        />\\n      {{/let}}\\n    </div>\\n\\n    <div class=\\\"col-sm-12 col-9\\\">\\n      {{#let (generate-id \\\"search-input\\\") as |id|}}\\n        <UiLabel @for={{id}}>\\n          {{t \\\"components.additionCollator.searchInputLabel\\\"}}\\n        </UiLabel>\\n\\n        <UiForm class=\\\"flex\\\" @onSubmit={{fn this.handleSearchFormSubmit @query.search}}>\\n          <UiInput\\n            class=\\\"flex-grow\\\"\\n            @controlId={{id}}\\n            @value={{@query.search}}\\n            @type=\\\"search\\\"\\n            @placeholder={{this.placeholderSearchValue}}\\n            @clearable={{true}}\\n            @onClear={{this.handleSearchInputClear}}\\n            data-test-search-input\\n          />\\n\\n          <UiButton\\n            class=\\\"nl1\\\"\\n            @type=\\\"submit\\\"\\n            @ariaLabel={{t \\\"components.additionCollator.searchButtonLabel\\\"}}\\n            data-test-submit-search\\n          >\\n            <DcIcon @name=\\\"search\\\"/>\\n          </UiButton>\\n        </UiForm>\\n      {{/let}}\\n    </div>\\n  </div>\\n\\n  {{#if this.pagedAdditions}}\\n    {{yield this.pagedAdditions}}\\n\\n    {{#if (gt this.pagedAdditions.totalPages 1)}}\\n      <XPagination\\n        class={{class \\\"justify-space-between mt1\\\" (if (eq this.mode \\\"grid\\\") \\\"bt1 pt1\\\")}}\\n        @showFirstLast={{false}}\\n        @routed={{@routed}}\\n        @page={{this.pagedAdditions.page}}\\n        @totalPages={{this.pagedAdditions.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    {{/if}}\\n  {{else}}\\n    <XAlert @variant={{if this.hasQuery \\\"error\\\"}}>\\n      {{if this.hasQuery @noResultMessage @emptytMessage}}\\n    </XAlert>\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/addition-collator/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/addition-collator/index.hbs\"}});\nimport { A } from '@ember/array';\nimport EmberObject from '@ember/object';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport pagedArray from 'babel/utils/paged-array';\nimport { load } from 'ember-async-data';\nimport scrollParentElement from 'compton/utils/scroll-parent-element';\nimport sanitizeHtml from 'ember-cli-sanitize-html';\nimport { all, resolve } from 'rsvp';\n\nexport default class AdditionCollatorComponent extends Component {\n  /**\n   * Arguments:\n   * additions\n   * routed\n   * query\n   * mode\n   * scrollToTopOnQuery\n   * emptytMessage\n   * noResultMessage\n   * placeholderSearch\n   * onQuery\n   */\n\n  @service intl;\n\n  @tracked element;\n\n  get mode() {\n    return this.args.mode ?? 'grid';\n  }\n\n  get placeholderSearchValue() {\n    return (\n      this.placeholderSearch ||\n      this.intl.t('components.additionCollator.searchInputPlaceholder')\n    );\n  }\n\n  get perPage() {\n    return this.mode === 'list' ? 20 : 12;\n  }\n\n  get hasQuery() {\n    return this.args.query?.bookId || this.args.query?.search ? true : false;\n  }\n\n  @cached get bookSelectItemsPromise() {\n    const bookPromise = all(\n      (this.args.additions || []).map((addition) => {\n        return addition?.books;\n      }),\n    ).then((books) => books.flat());\n\n    const productPromise = resolve(bookPromise)\n      .then(async (books) => {\n        const products = [];\n        for (const book of books) {\n          const bookProducts = await book.products;\n          for (const product of bookProducts) {\n            products.push(product);\n          }\n        }\n        return all(products);\n      })\n      .then((products) => products.flat().uniqBy('id'));\n\n    const promise = all([productPromise, bookPromise]).then(\n      ([products, books]) => ({ products, books }),\n    );\n\n    return load(promise, this);\n  }\n\n  @cached get bookSelectItems() {\n    if (\n      this.bookSelectItemsPromise.isPending ||\n      this.bookSelectItemsPromise.isRejected\n    ) {\n      return A();\n    }\n\n    const items = A();\n\n    items.addObject({\n      label: this.intl.t('components.additionCollator.filterSelectItems.all'),\n      value: null,\n    });\n\n    const groups = A();\n    const products = this.bookSelectItemsPromise.value?.products || [];\n    const books = this.bookSelectItemsPromise.value?.books || [];\n\n    products.forEach((product) => {\n      const filteredBooks = product.userBooks.filter((book) => {\n        return books.includes(book);\n      });\n\n      const group = EmberObject.create({\n        product,\n        books: filteredBooks,\n      });\n\n      groups.addObject(group);\n    });\n\n    if (groups.length > 0) {\n      items.addObject({ type: 'divider' });\n\n      groups\n        .filter((group) => group.books.length > 0)\n        .sortBy('product.title')\n        .forEach((group) => {\n          const hasProduct = group.product ? true : false;\n\n          if (hasProduct) {\n            items.addObject({\n              type: 'heading',\n              label: group.product.title,\n            });\n          }\n\n          group.product?.books?.forEach((book) => {\n            const bookIds = group.books?.mapBy('id');\n            if (bookIds.includes(book.id)) {\n              items.addObject({\n                label: book.title,\n                value: book.id,\n              });\n            }\n          });\n\n          if (!hasProduct) {\n            items.addObject({ type: 'divider' });\n          }\n        });\n    }\n\n    return items;\n  }\n\n  @cached get filteredAdditions() {\n    const bookId = this.args.query?.bookId;\n    const search = this.args.query?.search;\n\n    let filteredAdditions = this.args.additions.rejectBy('isDeleted');\n\n    if (isPresent(bookId)) {\n      filteredAdditions = filteredAdditions.filter((addition) =>\n        addition.bookIds.includes(bookId),\n      );\n    }\n\n    if (isPresent(search)) {\n      const searchLower = search.toLowerCase();\n\n      filteredAdditions = filteredAdditions.filter((addition) => {\n        if (addition.title?.toLowerCase().includes(searchLower)) {\n          return true;\n        }\n\n        if (this._searchHTML(addition.content, searchLower)) {\n          return true;\n        }\n\n        if (this._searchHTML(addition.questionHtml, searchLower)) {\n          return true;\n        }\n\n        return false;\n      });\n    }\n\n    return filteredAdditions.sortBy('created').reverse();\n  }\n\n  get pagedAdditions() {\n    return pagedArray({\n      content: this.filteredAdditions,\n      page: this.args.query?.page,\n      perPage: this.perPage,\n    });\n  }\n\n  @action handleFilterSelectChange(bookId) {\n    return this._query({ bookId, page: 1 });\n  }\n\n  @action handleSearchFormSubmit(search) {\n    return this._query({ search, page: 1 });\n  }\n\n  @action handleSearchInputClear() {\n    return this._query({ search: '', page: 1 });\n  }\n\n  @action handlePaginationChange(page) {\n    return this._query({ page });\n  }\n\n  @action setElement(element) {\n    this.element = element;\n  }\n\n  _query(query) {\n    if (this.element && this.args.scrollToTopOnQuery) {\n      const parentScrollElement = scrollParentElement(this.element);\n\n      if (parentScrollElement) {\n        parentScrollElement.scrollTo({ top: 0 });\n      }\n    }\n\n    this.args.onQuery?.({ ...this.query, ...query });\n  }\n\n  _searchHTML(str, search) {\n    if (!str) return false;\n\n    return sanitizeHtml(str, { allowedTags: [], allowedAttributes: [] })\n      .toLowerCase()\n      .includes(search);\n  }\n}\n","import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AdditionCustomizerComponent extends Component {\n  /**\n   * Arguments:\n   * teacherAssignments (array)\n   * wordlists (array)\n   * includedTeacherAssignments (array)\n   * includedWordlists (array)\n   * onIncludeTeacherAssignment (function)\n   * onExcludeTeacherAssignment (function)\n   * onIncludeWordlist (function)\n   * onExcludeWordlist (function)\n   */\n\n  @cached get additionsGroupedByUserProxy() {\n    const promise = all([\n      this.args.teacherAssignments,\n      this.args.wordlists,\n    ]).then(async (types) => {\n      const result = [];\n\n      await all(\n        types.map(async (arr, idx) => {\n          const key = idx === 0 ? 'teacherAssignments' : 'wordlists';\n\n          await all(\n            (arr || []).map(async (item) => {\n              const user = await resolve(item.user);\n\n              if (!result.findBy('user', user)) {\n                result.addObject({\n                  user,\n                  teacherAssignments: [],\n                  wordlists: [],\n                });\n              }\n\n              result.findBy('user', user)[key].addObject(item);\n            })\n          );\n        })\n      );\n\n      return result.sortBy('user.showname');\n    });\n\n    return load(promise, this);\n  }\n\n  get additionsGroupedByUser() {\n    return this.additionsGroupedByUserProxy.isResolved\n      ? this.additionsGroupedByUserProxy.value\n      : [];\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class AdditionCustomizerGroupSectionComponent extends Component {\n  /**\n   * Arguments:\n   * additions (array)\n   * includedAdditions (array)\n   * type (string)\n   * onInclude (function)\n   * onExclude (function)\n   */\n\n  @tracked isExpanded = false;\n\n  get classes() {\n    const classes = ['addition-customizer-group-section'];\n\n    if (this.isExpanded) {\n      classes.push('addition-customizer-group-section--expanded');\n    }\n\n    return classes.join(' ');\n  }\n\n  get includedGroupAdditions() {\n    const additions = this.args.additions || [];\n    const includedAdditions = this.args.includedAdditions || [];\n    const intersection = [];\n\n    additions.forEach((item) => {\n      if (includedAdditions.includes(item)) {\n        intersection.push(item);\n      }\n    });\n\n    return intersection;\n  }\n\n  get excludedAdditions() {\n    const additions = this.args.additions || [];\n    const includedGroupAdditions = this.includedGroupAdditions;\n    const diff = [];\n\n    additions.forEach((item) => {\n      if (!includedGroupAdditions.includes(item)) {\n        diff.push(item);\n      }\n    });\n\n    return diff;\n  }\n\n  get hasFullInclusion() {\n    return this.excludedAdditions.length === 0;\n  }\n\n  get hasPartialInclusion() {\n    return this.includedGroupAdditions.length && this.excludedAdditions.length;\n  }\n\n  @action handleCheckboxChange() {\n    if (this.hasFullInclusion) {\n      this.#excludeAll();\n    } else {\n      this.#includeAll();\n    }\n  }\n\n  @action handleToggleButtonClick() {\n    this.isExpanded = !this.isExpanded;\n  }\n\n  #includeAll() {\n    (this.args.additions || []).forEach((addition) => {\n      this.args.onInclude?.(addition);\n    });\n  }\n\n  #excludeAll() {\n    (this.args.additions || []).forEach((addition) => {\n      this.args.onExclude?.(addition);\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}}>\\n  <div class=\\\"addition-customizer-group-section-content\\\">\\n    <XCheckbox\\n      @twoWay={{false}}\\n      @checked={{this.hasFullInclusion}}\\n      @indeterminate={{this.hasPartialInclusion}}\\n      @onChange={{this.handleCheckboxChange}}\\n    >\\n      <div class=\\\"flex flex-center text-bold text-color-default\\\">\\n        {{t\\n          \\\"components.additionCustomizer.group.section.typeLabel\\\"\\n          type=(camelize @type)\\n        }}\\n      </div>\\n    </XCheckbox>\\n\\n    {{#let\\n      (generate-id \\\"toggle-button\\\")\\n      (t\\n        \\\"components.additionCustomizer.group.section.toggleButtonLabel\\\"\\n        isExpanded=this.isExpanded\\n      )\\n      as |id label|\\n    }}\\n      <UiButton\\n        id={{id}}\\n        class=\\\"addition-customizer-group-section-toggle-button\\\"\\n        @appearance=\\\"none\\\"\\n        @ariaLabel={{label}}\\n        @onClick={{this.handleToggleButtonClick}}\\n      >\\n        <DcIcon\\n          @name=\\\"small-down\\\"\\n          class=\\\"addition-customizer-group-section-toggle-icon\\\"\\n        />\\n      </UiButton>\\n\\n      <XTooltip @for={{id}} @delay={{1000}}>\\n        {{label}}\\n      </XTooltip>\\n    {{/let}}\\n  </div>\\n\\n  {{#if this.isExpanded}}\\n    <AdditionCustomizer::Group::Section::Tree\\n      @additions={{@additions}}\\n      @includedAdditions={{@includedAdditions}}\\n      @onInclude={{@onInclude}}\\n      @onExclude={{@onExclude}}\\n    />\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/addition-customizer/group/section/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class AdditionCustomizerGroupSectionTreeItemComponent extends Component {\n  /**\n   * Arguments:\n   * addition (object)\n   * includedAdditions (array)\n   * onInclude (function)\n   * onExclude (function)\n   */\n\n  get isIncluded() {\n    return (this.args.includedAdditions || []).includes(this.args.addition);\n  }\n\n  @action handleCheckboxChange() {\n    if (this.isIncluded) {\n      this.#exclude();\n    } else {\n      this.#include();\n    }\n  }\n\n  #include() {\n    this.args.onInclude?.(this.args.addition);\n  }\n\n  #exclude() {\n    this.args.onExclude?.(this.args.addition);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"addition-customizer-group-section-tree-item\\\">\\n  <XCheckbox\\n    @twoWay={{false}}\\n    @checked={{this.isIncluded}}\\n    @onChange={{this.handleCheckboxChange}}\\n  >\\n    <div class=\\\"flex flex-center text-color-default\\\">\\n      {{@addition.title}}\\n    </div>\\n  </XCheckbox>\\n</div>\\n', { moduleName: 'babel/components/addition-customizer/group/section/tree/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"addition-customizer-group-section-tree\\\">\\n  {{#each @additions as |addition|}}\\n    <AdditionCustomizer::Group::Section::Tree::Item\\n      @addition={{addition}}\\n      @includedAdditions={{@includedAdditions}}\\n      @onInclude={{@onInclude}}\\n      @onExclude={{@onExclude}}\\n    />\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/addition-customizer/group/section/tree/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"mt1\\\">\\n  <div class=\\\"flex flex-center pb1 bb1\\\">\\n    <DcAvatar class=\\\"flex-shrink nr1\\\" @user={{@user}} />\\n    <div class=\\\"text-quarternary\\\">{{@user.showname}}</div>\\n  </div>\\n\\n  {{#if @teacherAssignments}}\\n    <XAwait @value={{@includedTeacherAssignments}} as |included|>\\n      <AdditionCustomizer::Group::Section\\n        @additions={{@teacherAssignments}}\\n        @includedAdditions={{included}}\\n        @type=\\\"teacher-assignments\\\"\\n        @onInclude={{@onIncludeTeacherAssignment}}\\n        @onExclude={{@onExcludeTeacherAssignment}}\\n      />\\n    </XAwait>\\n  {{/if}}\\n\\n  {{#if @wordlists}}\\n    <XAwait @value={{@includedWordlists}} as |included|>\\n      <AdditionCustomizer::Group::Section\\n        @additions={{@wordlists}}\\n        @includedAdditions={{included}}\\n        @type=\\\"wordlists\\\"\\n        @onInclude={{@onIncludeWordlist}}\\n        @onExclude={{@onExcludeWordlist}}\\n      />\\n    </XAwait>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/addition-customizer/group/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"addition-customizer\\\" ...attributes>\\n  {{#each this.additionsGroupedByUser as |group|}}\\n    <AdditionCustomizer::Group\\n      @user={{group.user}}\\n      @teacherAssignments={{group.teacherAssignments}}\\n      @includedTeacherAssignments={{@includedTeacherAssignments}}\\n      @wordlists={{group.wordlists}}\\n      @includedWordlists={{@includedWordlists}}\\n      @onIncludeTeacherAssignment={{@onIncludeTeacherAssignment}}\\n      @onExcludeTeacherAssignment={{@onExcludeTeacherAssignment}}\\n      @onIncludeWordlist={{@onIncludeWordlist}}\\n      @onExcludeWordlist={{@onExcludeWordlist}}\\n    />\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/addition-customizer/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{class \\\"addition-grid\\\" (concat \\\"addition-grid--range-\\\" this.range)}}\\n  ...attributes\\n>\\n  {{yield}}\\n</div>\", {\"contents\":\"<div\\n  class={{class \\\"addition-grid\\\" (concat \\\"addition-grid--range-\\\" this.range)}}\\n  ...attributes\\n>\\n  {{yield}}\\n</div>\",\"moduleName\":\"babel/components/addition-grid/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/addition-grid/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport Component from '@glimmer/component';\n\n// export interface AdditionGridComponentArgs {\n//   range: 'small' | 'medium' | 'large';\n// }\n\nexport default class AdditionGridComponent extends Component {\n  get range() {\n    const range = this.args.range ?? 'medium';\n\n    assert(\n      \"The @range arg passed to <AdditionGrid> is not valid. Valid values are 'small', 'medium' and 'large'.\",\n      ['small', 'medium', 'large'].includes(range)\n    );\n\n    return range;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"addition-list\\\" ...attributes>\\n  {{yield}}\\n</div>\", {\"contents\":\"<div class=\\\"addition-list\\\" ...attributes>\\n  {{yield}}\\n</div>\",\"moduleName\":\"babel/components/addition-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/addition-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"ai-widget-host\\\">\\n  <span\\n    class=\\\"ai-widget__arg-sync\\\"\\n    aria-hidden=\\\"true\\\"\\n    {{did-update this.syncIsEnabledWhenArgsChange @isbn this.bookId this.courseId}}\\n  ></span>\\n  {{#if (and this.isEnabled this.url)}}\\n    <div class=\\\"ai-widget\\\">\\n    <UiButton\\n      id=\\\"ai-widget-button\\\"\\n      @variant=\\\"frosted\\\"\\n      @shape=\\\"rounded\\\"\\n      {{on \\\"click\\\" this.openModal}}\\n    >\\n      <img\\n        src=\\\"/assets/images/icons/ai_icon.svg\\\"\\n        alt=\\\"{{t 'components.aiWidget.open'}}\\\"\\n      />\\n    </UiButton>\\n\\n    <XTooltip @for=\\\"ai-widget-button\\\">\\n      {{t \\\"components.aiWidget.tooltip\\\"}}\\n    </XTooltip>\\n\\n    {{#if this.isLoaded}}\\n      <XModal\\n        class={{unless this.showModal \\\"ai-widget--modal-hide\\\"}}\\n        @onClose={{this.closeModal}}\\n        @size={{hash width=\\\"large\\\" height=\\\"large\\\"}}\\n      >\\n        <iframe\\n          class=\\\"ai-widget--iframe\\\"\\n          src={{this.url}}\\n          title=\\\"{{t 'components.aiWidget.title'}}\\\"\\n          allow=\\\"microphone {{this.aiEndpoint}}\\\"\\n          {{did-insert this.didInsert}}\\n          {{will-destroy this.willDestroyIframe}}\\n        />\\n      </XModal>\\n    {{/if}}\\n    </div>\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"ai-widget-host\\\">\\n  <span\\n    class=\\\"ai-widget__arg-sync\\\"\\n    aria-hidden=\\\"true\\\"\\n    {{did-update this.syncIsEnabledWhenArgsChange @isbn this.bookId this.courseId}}\\n  ></span>\\n  {{#if (and this.isEnabled this.url)}}\\n    <div class=\\\"ai-widget\\\">\\n    <UiButton\\n      id=\\\"ai-widget-button\\\"\\n      @variant=\\\"frosted\\\"\\n      @shape=\\\"rounded\\\"\\n      {{on \\\"click\\\" this.openModal}}\\n    >\\n      <img\\n        src=\\\"/assets/images/icons/ai_icon.svg\\\"\\n        alt=\\\"{{t 'components.aiWidget.open'}}\\\"\\n      />\\n    </UiButton>\\n\\n    <XTooltip @for=\\\"ai-widget-button\\\">\\n      {{t \\\"components.aiWidget.tooltip\\\"}}\\n    </XTooltip>\\n\\n    {{#if this.isLoaded}}\\n      <XModal\\n        class={{unless this.showModal \\\"ai-widget--modal-hide\\\"}}\\n        @onClose={{this.closeModal}}\\n        @size={{hash width=\\\"large\\\" height=\\\"large\\\"}}\\n      >\\n        <iframe\\n          class=\\\"ai-widget--iframe\\\"\\n          src={{this.url}}\\n          title=\\\"{{t 'components.aiWidget.title'}}\\\"\\n          allow=\\\"microphone {{this.aiEndpoint}}\\\"\\n          {{did-insert this.didInsert}}\\n          {{will-destroy this.willDestroyIframe}}\\n        />\\n      </XModal>\\n    {{/if}}\\n    </div>\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/ai-widget/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/ai-widget/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nexport default class AiWidgetComponent extends Component {\n  @service session;\n  @service fetch;\n  @service contextHelper;\n  @service pusher;\n\n  @tracked showModal = false;\n  @tracked isEnabled = false;\n  @tracked isLoaded = false;\n\n  iframeElement = null;\n  iframeLoadEvent = null;\n  windowMessageEvent = null;\n\n  constructor() {\n    super(...arguments);\n\n    this.pusher.on('course', this.#onCourseUpdate);\n\n    this.#refreshIsEnabledFromArgs();\n  }\n\n  get bookId() {\n    return this.args.book?.id ?? null;\n  }\n\n  get courseId() {\n    return this.args.course?.id ?? null;\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n\n    this.pusher.off('course', this.#onCourseUpdate);\n  }\n\n  #onCourseUpdate = async () => {\n    this.isEnabled = await this.#checkIsEnabled();\n    if (!this.isEnabled) {\n      this.closeModal();\n    }\n  };\n\n  #refreshIsEnabledFromArgs() {\n    this.#checkIsEnabled().then((isEnabled) => {\n      this.isEnabled = isEnabled;\n    });\n  }\n\n  @action\n  syncIsEnabledWhenArgsChange() {\n    this.#refreshIsEnabledFromArgs();\n  }\n\n  async #checkIsEnabled() {\n    if (config.environment === 'test') {\n      return false;\n    }\n\n    if (!this.args.isbn) {\n      return false;\n    }\n\n    if (!this.args.book?.id) {\n      return false;\n    }\n\n    const statusUrl = new URL(\n      `/chat/status/${this.args.isbn}`,\n      config.aiApiEndpoint\n    );\n\n    if (this.args.course?.id) {\n      statusUrl.searchParams.set('courseId', this.args.course.id);\n    }\n\n    return this.fetch\n      .request(statusUrl.toString(), true, { type: 'GET' })\n      .then((response) => response?.is_active ?? false)\n      .catch(() => {\n        /* The icon will stay hidden, since something is wrong with the API. */\n      });\n  }\n\n  get aiEndpoint() {\n    return config.aiEndpoint;\n  }\n\n  get url() {\n    const args = this.args;\n    if (!args || !args.book?.id) return null;\n\n    const aiUrl = new URL(`/${args.isbn}/${args.book.id}`, config.aiEndpoint);\n\n    const tryAddParameter = (prop, value) => {\n      if (value) {\n        aiUrl.searchParams.set(prop, value);\n      }\n    };\n\n    tryAddParameter('isModal', 'true');\n    tryAddParameter('baseUrl', config.aiApiEndpoint);\n    tryAddParameter('courseId', args.course?.id);\n    tryAddParameter('sectionId', args.section?.id);\n    tryAddParameter('areaId', args.area?.id);\n\n    return aiUrl.toString();\n  }\n\n  @action\n  didInsert(element) {\n    this.iframeElement = element;\n\n    this.iframeLoadEvent = () => {\n      const token = {\n        type: 'token',\n        token: this.session.accessToken,\n      };\n\n      this.iframeElement.contentWindow.postMessage(token, '*');\n    };\n\n    this.windowMessageEvent = async ({ data }) => {\n      switch (data.type) {\n        case 'ai:close-chat':\n          this.closeModal();\n          break;\n        case 'ai:refresh-token':\n          {\n            await this.session.refreshAuthentication.perform();\n\n            this.iframeElement.contentWindow.postMessage(\n              {\n                type: 'token',\n                token: this.session.accessToken,\n              },\n              '*'\n            );\n          }\n          break;\n      }\n    };\n\n    this.iframeElement.addEventListener('load', this.iframeLoadEvent);\n    window.addEventListener('message', this.windowMessageEvent);\n  }\n\n  @action\n  willDestroyIframe() {\n    this.iframeElement?.removeEventListener('load', this.iframeLoadEvent);\n    window.removeEventListener('message', this.windowMessageEvent);\n  }\n\n  @action\n  openModal() {\n    if (this.isLoaded) {\n      document.body.classList.add('overflow-hidden');\n    }\n\n    this.showModal = true;\n    this.isLoaded = true;\n  }\n\n  @action\n  closeModal() {\n    document.body.classList.remove('overflow-hidden');\n\n    this.iframeElement.contentWindow.postMessage(\n      {\n        type: 'close',\n      },\n      '*'\n    );\n\n    this.showModal = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"answer-comments\\\">\\n  <XTab @value={{this.section}} as |Tab|>\\n    <Tab.pane @value=\\\"comment\\\" @label={{t \\\"components.answerComments.tabs.comment\\\"}}>\\n      <UiTextarea\\n        @disabled={{@commentsDisabled}}\\n        @placeholder={{t \\\"components.answerComments.commentPlaceholder\\\"}}\\n        @value={{this.commentTxt}}\\n        @rows={{1}}\\n      />\\n\\n      <UiButton\\n        class=\\\"mt1 mb1 flex flex-right\\\"\\n        @disabled={{or @commentsDisabled (not this.commentTxt)}}\\n        @onClick={{this.sendComment}}\\n      >\\n        {{t \\\"components.answerComments.commentButton\\\"}}\\n      </UiButton>\\n    </Tab.pane>\\n\\n    {{#if this.session.user.isTeacher}}\\n      <Tab.pane @value=\\\"note\\\" @label={{t \\\"components.answerComments.tabs.note\\\"}}>\\n        <UiTextarea\\n          @disabled={{@commentsDisabled}}\\n          @placeholder={{t \\\"components.answerComments.notePlaceholder\\\"}}\\n          @value={{this.noteTxt}}\\n          @rows={{2}}\\n          class=\\\"nb1\\\"\\n        />\\n\\n        <div class=\\\"text-small text-italic\\\">{{t \\\"components.answerComments.notesDisclaimer\\\"}}</div>\\n\\n        <UiButton\\n          class=\\\"nt1 mb1 flex flex-right\\\"\\n          @disabled={{or @commentsDisabled (not this.noteTxt)}}\\n          @onClick={{this.sendPrivateNote}}\\n        >\\n          {{t \\\"components.answerComments.noteButton\\\"}}\\n        </UiButton>\\n      </Tab.pane>\\n    {{/if}}\\n  </XTab>\\n\\n  {{#unless this.comments}}\\n    <div class=\\\"text-small text-italic mb1\\\">{{t \\\"components.answerComments.noComments\\\"}}</div>\\n  {{/unless}}\\n\\n  {{#if @answer.comments.isPending}}\\n    <DcLoader class=\\\"py2\\\" />\\n  {{/if}}\\n\\n  {{#each this.events as |event index|}}\\n    {{#if (not-eq index 0)}}\\n      <div class=\\\"divider\\\"></div>\\n    {{/if}}\\n\\n    {{#if (or (eq event.type \\\"comment\\\") (eq event.type \\\"note\\\"))}}\\n      <div class=\\\"answer-event{{if (eq event.type \\\"note\\\") \\\" answer-note\\\"}}\\\">\\n        <div class=\\\"flex\\\">\\n          <div class=\\\"flex-auto\\\">\\n            <div class=\\\"text-small\\\">\\n              {{event.message}} {{event.dateString}}\\n            </div>\\n          </div>\\n\\n          <div class=\\\"flex-shrink\\\">\\n            {{#if (eq this.session.user.id event.user.id)}}\\n              <UiButton\\n                @appearance=\\\"link\\\"\\n                @variant=\\\"error\\\"\\n                @size=\\\"small\\\"\\n                @onClick={{fn this.removeComment event.model}}\\n              >\\n                {{t \\\"components.answerComments.remove\\\"}}\\n              </UiButton>\\n            {{/if}}\\n          </div>\\n        </div>\\n\\n        <div class=\\\"white-space-pre-line text-ui\\\">{{event.text}}</div>\\n      </div>\\n    {{/if}}\\n\\n    {{#if (or (eq event.type \\\"submitted\\\") (eq event.type \\\"started\\\"))}}\\n      <div class=\\\"answer-event\\\">\\n        <div class=\\\"text-small\\\">{{event.dateString}}</div>\\n        <div class=\\\"text-muted\\\">{{event.message}}</div>\\n      </div>\\n    {{/if}}\\n  {{/each}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"answer-comments\\\">\\n  <XTab @value={{this.section}} as |Tab|>\\n    <Tab.pane @value=\\\"comment\\\" @label={{t \\\"components.answerComments.tabs.comment\\\"}}>\\n      <UiTextarea\\n        @disabled={{@commentsDisabled}}\\n        @placeholder={{t \\\"components.answerComments.commentPlaceholder\\\"}}\\n        @value={{this.commentTxt}}\\n        @rows={{1}}\\n      />\\n\\n      <UiButton\\n        class=\\\"mt1 mb1 flex flex-right\\\"\\n        @disabled={{or @commentsDisabled (not this.commentTxt)}}\\n        @onClick={{this.sendComment}}\\n      >\\n        {{t \\\"components.answerComments.commentButton\\\"}}\\n      </UiButton>\\n    </Tab.pane>\\n\\n    {{#if this.session.user.isTeacher}}\\n      <Tab.pane @value=\\\"note\\\" @label={{t \\\"components.answerComments.tabs.note\\\"}}>\\n        <UiTextarea\\n          @disabled={{@commentsDisabled}}\\n          @placeholder={{t \\\"components.answerComments.notePlaceholder\\\"}}\\n          @value={{this.noteTxt}}\\n          @rows={{2}}\\n          class=\\\"nb1\\\"\\n        />\\n\\n        <div class=\\\"text-small text-italic\\\">{{t \\\"components.answerComments.notesDisclaimer\\\"}}</div>\\n\\n        <UiButton\\n          class=\\\"nt1 mb1 flex flex-right\\\"\\n          @disabled={{or @commentsDisabled (not this.noteTxt)}}\\n          @onClick={{this.sendPrivateNote}}\\n        >\\n          {{t \\\"components.answerComments.noteButton\\\"}}\\n        </UiButton>\\n      </Tab.pane>\\n    {{/if}}\\n  </XTab>\\n\\n  {{#unless this.comments}}\\n    <div class=\\\"text-small text-italic mb1\\\">{{t \\\"components.answerComments.noComments\\\"}}</div>\\n  {{/unless}}\\n\\n  {{#if @answer.comments.isPending}}\\n    <DcLoader class=\\\"py2\\\" />\\n  {{/if}}\\n\\n  {{#each this.events as |event index|}}\\n    {{#if (not-eq index 0)}}\\n      <div class=\\\"divider\\\"></div>\\n    {{/if}}\\n\\n    {{#if (or (eq event.type \\\"comment\\\") (eq event.type \\\"note\\\"))}}\\n      <div class=\\\"answer-event{{if (eq event.type \\\"note\\\") \\\" answer-note\\\"}}\\\">\\n        <div class=\\\"flex\\\">\\n          <div class=\\\"flex-auto\\\">\\n            <div class=\\\"text-small\\\">\\n              {{event.message}} {{event.dateString}}\\n            </div>\\n          </div>\\n\\n          <div class=\\\"flex-shrink\\\">\\n            {{#if (eq this.session.user.id event.user.id)}}\\n              <UiButton\\n                @appearance=\\\"link\\\"\\n                @variant=\\\"error\\\"\\n                @size=\\\"small\\\"\\n                @onClick={{fn this.removeComment event.model}}\\n              >\\n                {{t \\\"components.answerComments.remove\\\"}}\\n              </UiButton>\\n            {{/if}}\\n          </div>\\n        </div>\\n\\n        <div class=\\\"white-space-pre-line text-ui\\\">{{event.text}}</div>\\n      </div>\\n    {{/if}}\\n\\n    {{#if (or (eq event.type \\\"submitted\\\") (eq event.type \\\"started\\\"))}}\\n      <div class=\\\"answer-event\\\">\\n        <div class=\\\"text-small\\\">{{event.dateString}}</div>\\n        <div class=\\\"text-muted\\\">{{event.message}}</div>\\n      </div>\\n    {{/if}}\\n  {{/each}}\\n</div>\\n\",\"moduleName\":\"babel/components/answer-comments/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-comments/index.hbs\"}});\nimport { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { load } from 'ember-async-data';\nimport moment from 'moment';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerCommentsComponent extends Component {\n  /**\n   * Arguments:\n   * answer (object)\n   * assignment (object)\n   * commentsDisabled (bool)\n   */\n\n  @service intl;\n\n  @service store;\n\n  @service session;\n\n  @tracked section = 'comment';\n\n  @tracked commentTxt;\n\n  @tracked noteTxt;\n\n  @cached\n  get commentsProxy() {\n    const sessionUserId = this.session.user?.id;\n\n    const promise = resolve(this.args.answer?.comments).then((comments) =>\n      all(\n        comments.map(async (comment) => {\n          let user;\n\n          try {\n            user = await resolve(comment.user);\n          } catch (err) {\n            // deleted user is fine\n          }\n\n          if (comment.type !== 'note' || user?.id === sessionUserId) {\n            return comment;\n          }\n\n          return null;\n        })\n      ).then((resolved) => resolved.filter((x) => x))\n    );\n\n    return load(promise, this);\n  }\n\n  get comments() {\n    const comments = this.commentsProxy.isResolved\n      ? this.commentsProxy.value\n      : A();\n\n    return comments\n      .filter((comment) => !comment.isDeleted)\n      .map((comment) => ({\n        date: comment.created,\n        type: comment.type,\n        text: comment.comment,\n        user: comment.user,\n        model: comment,\n      }));\n  }\n\n  @cached\n  get versionsProxy() {\n    const promise = resolve(this.args.answer?.versions).then((versions) =>\n      all(versions.map((version) => resolve(version.user))).then(() => versions)\n    );\n\n    return load(promise, this);\n  }\n\n  get versions() {\n    const versions = this.versionsProxy.isResolved\n      ? this.versionsProxy.value\n      : A();\n\n    return versions.map((version) => ({\n      date: version.created,\n      type: 'submitted',\n      user: version.user,\n      model: version,\n      version: version.version,\n      status: version.status,\n    }));\n  }\n\n  @cached\n  get answerUserProxy() {\n    return load(this.args.answer?.user, this);\n  }\n\n  get events() {\n    const events = A();\n\n    const comments = this.comments;\n    const versions = this.versions;\n    const answer = this.args.answer;\n    const answerUser = this.answerUserProxy.isResolved\n      ? this.answerUserProxy.value\n      : null;\n\n    events.addObjects(comments);\n    events.addObjects(versions);\n\n    if (answer?.status === 'started') {\n      events.addObject({\n        date: answer.updated,\n        type: 'started',\n        user: answerUser,\n        model: answer,\n        version: null,\n        status: answer.status,\n      });\n    }\n\n    return events\n      .sortBy('date')\n      .reverse()\n      .map((event) => {\n        const dayName = moment(event.date).format('dddd');\n        const time = moment(event.date).format('HH:mm');\n        const lower = ['comment', 'note'].includes(event.type) ? 'Lower' : '';\n\n        const todayAtTime = this.intl.t(\n          `components.answerComments.calendar.todayAtTime${lower}`,\n          {\n            time,\n          }\n        );\n        const yesterdayAtTime = this.intl.t(\n          `components.answerComments.calendar.yesterdayAtTime${lower}`,\n          { time }\n        );\n        const lastWeek = this.intl.t(\n          `components.answerComments.calendar.lastWeekAtTime${lower}`,\n          {\n            time,\n            dayName,\n          }\n        );\n\n        event.dateString = moment(event.date).calendar(null, {\n          sameDay: `[${todayAtTime}]`,\n          lastDay: `[${yesterdayAtTime}]`,\n          lastWeek: `[${lastWeek}]`,\n          sameElse: `YYYY-MM-DD HH:mm`,\n        });\n\n        const messageParts = ['components', 'answerComments', 'events'];\n\n        const data = {\n          name: event.user?.get('showname'),\n          version: event.version,\n        };\n\n        let userStr = 'someone';\n\n        if (event.user?.get('isRejected')) {\n          userStr = 'rejectedUser';\n        } else if (this.session.user?.id === event.user?.get('id')) {\n          userStr = 'you';\n        }\n\n        switch (event.type) {\n          case 'note':\n          case 'comment':\n            messageParts.push(`${userStr}Commented`);\n            break;\n          case 'submitted':\n            if (event.status === 'correct') {\n              messageParts.push(`${userStr}Correct`);\n            } else if (event.status === 'wrong') {\n              messageParts.push(`${userStr}Wrong`);\n            } else {\n              messageParts.push(`${userStr}Submitted`);\n            }\n            break;\n          case 'started':\n            messageParts.push(`${userStr}StartedVersion`);\n            break;\n        }\n\n        event.message = this.intl.t(messageParts.join('.'), data);\n\n        if (event.user?.get('isRejected')) {\n          event.message = htmlSafe(event.message);\n        }\n\n        return event;\n      });\n  }\n\n  @action\n  sendComment() {\n    trackAuditEvent('Kommentarer - Skicka', 'Kommentar');\n\n    const comment = this.store.createRecord('answer-comment', {\n      comment: this.commentTxt,\n      answer: this.args.answer,\n      assignment: this.args.assignment,\n      type: 'comment',\n      public: true,\n      user: this.session.user,\n    });\n\n    this.commentTxt = ' ';\n\n    return comment.save();\n  }\n\n  @action\n  sendPrivateNote() {\n    trackAuditEvent('Kommentarer - Skicka', 'Notering');\n\n    const comment = this.store.createRecord('answer-comment', {\n      comment: this.noteTxt,\n      answer: this.args.answer,\n      assignment: this.args.assignment,\n      type: 'note',\n      public: false,\n      user: this.session.user,\n    });\n\n    this.noteTxt = ' ';\n\n    return comment.save();\n  }\n\n  @action\n  removeComment(comment) {\n    return comment.destroyRecord();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"grid\\\" ...attributes>\\n  {{#if @canSearch}}\\n    <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n      <UiLabel @for=\\\"assignment-search\\\">\\n        {{t \\\"components.answerLog.entityFilter.assignmentSearchLabel\\\"}}\\n      </UiLabel>\\n\\n      <UiInput\\n        @id=\\\"assignment-search\\\"\\n        @onChange={{@searchAssignments}}\\n        @placeholder={{t \\\"components.answerLog.entityFilter.assignmentSearchPlaceholder\\\"}}\\n      />\\n    </div>\\n  {{/if}}\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"book-select\\\">\\n      {{t \\\"components.answerLog.entityFilter.bookLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"book-select\\\"\\n      @items={{this.filterBooks}}\\n      @stretch={{true}}\\n      @value={{this.bookFilter}}\\n      @onChange={{this.changeBookFilterOption}}\\n    />\\n  </div>\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"area-filter\\\">\\n      {{t \\\"components.answerLog.entityFilter.areaLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"area-filter\\\"\\n      @value={{this.areaFilter}}\\n      @disabled={{not this.bookFilter}}\\n      @items={{this.areaFilterOptions}}\\n      @stretch={{true}}\\n      @placeholder={{t \\\"components.answerLog.entityFilter.areaPlaceholder\\\"}}\\n      @onChange={{this.changeAreaFilterOption}}\\n    />\\n  </div>\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"content-filter\\\">\\n      {{t \\\"components.answerLog.entityFilter.contentLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"content-filter\\\"\\n      @value={{this.contentFilter}}\\n      @disabled={{not this.areaFilter}}\\n      @items={{this.contentFilterOptions}}\\n      @stretch={{true}}\\n      @placeholder={{t \\\"components.answerLog.entityFilter.contentPlaceholder\\\"}}\\n      @onChange={{this.changeContentFilterOption}}\\n    />\\n  </div>\\n</div>\\n\", {\"contents\":\"<div class=\\\"grid\\\" ...attributes>\\n  {{#if @canSearch}}\\n    <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n      <UiLabel @for=\\\"assignment-search\\\">\\n        {{t \\\"components.answerLog.entityFilter.assignmentSearchLabel\\\"}}\\n      </UiLabel>\\n\\n      <UiInput\\n        @id=\\\"assignment-search\\\"\\n        @onChange={{@searchAssignments}}\\n        @placeholder={{t \\\"components.answerLog.entityFilter.assignmentSearchPlaceholder\\\"}}\\n      />\\n    </div>\\n  {{/if}}\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"book-select\\\">\\n      {{t \\\"components.answerLog.entityFilter.bookLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"book-select\\\"\\n      @items={{this.filterBooks}}\\n      @stretch={{true}}\\n      @value={{this.bookFilter}}\\n      @onChange={{this.changeBookFilterOption}}\\n    />\\n  </div>\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"area-filter\\\">\\n      {{t \\\"components.answerLog.entityFilter.areaLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"area-filter\\\"\\n      @value={{this.areaFilter}}\\n      @disabled={{not this.bookFilter}}\\n      @items={{this.areaFilterOptions}}\\n      @stretch={{true}}\\n      @placeholder={{t \\\"components.answerLog.entityFilter.areaPlaceholder\\\"}}\\n      @onChange={{this.changeAreaFilterOption}}\\n    />\\n  </div>\\n\\n  <div class=\\\"col-sm-12 col-md-3 col-3\\\">\\n    <UiLabel @for=\\\"content-filter\\\">\\n      {{t \\\"components.answerLog.entityFilter.contentLabel\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @id=\\\"content-filter\\\"\\n      @value={{this.contentFilter}}\\n      @disabled={{not this.areaFilter}}\\n      @items={{this.contentFilterOptions}}\\n      @stretch={{true}}\\n      @placeholder={{t \\\"components.answerLog.entityFilter.contentPlaceholder\\\"}}\\n      @onChange={{this.changeContentFilterOption}}\\n    />\\n  </div>\\n</div>\\n\",\"moduleName\":\"babel/components/answer-log/context-filter/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/context-filter/index.hbs\"}});\nimport { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogContextFilterComponent extends Component {\n  /**\n   * Arguments:\n   * presentBooks (array)\n   * canSearch (bool)\n   * searchAssignments (function)\n   * onSelectedBook (function)\n   * onSelectedArea (function)\n   * onSelectedContent (function)\n   */\n\n  @service intl;\n\n  @service session;\n\n  @service contextHelper;\n\n  @tracked bookFilter;\n\n  @tracked areaFilter;\n\n  @tracked contentFilter;\n\n  @tracked areaFilterOptions = A();\n\n  @tracked contentFilterOptions = A();\n\n  @cached\n  get booksProxy() {\n    const promise = all([\n      this.session.user.licenses,\n      this.contextHelper.activeCourse,\n    ])\n      .then(([licenses, activeCourse]) => {\n        const promises = [];\n\n        licenses.forEach((license) => {\n          promises.push(license.product);\n        });\n\n        if (activeCourse) {\n          promises.push(activeCourse.products);\n        }\n\n        return all(promises).then((results) => {\n          if (activeCourse) {\n            return resolve(results.pop());\n          }\n\n          return resolve(results.filter((x) => x));\n        });\n      })\n      .then((products) => {\n        const filterBooks = [\n          {\n            label: this.intl.t('components.answerLog.files.filterOptions.all'),\n            value: null,\n          },\n        ];\n\n        const presentBooks = this.args.presentBooks?.sortBy('sort') || [];\n\n        products.sortBy('title').forEach((product) => {\n          let productAdded = false;\n          const bookIds = product.hasMany('books').ids();\n\n          presentBooks.forEach((book) => {\n            if (bookIds.includes(book.id)) {\n              if (!productAdded) {\n                filterBooks.push({\n                  label: product.title,\n                  value: null,\n                  type: 'heading',\n                });\n\n                productAdded = true;\n              }\n\n              filterBooks.push({\n                label: book.title,\n                value: book,\n                disabled: [\n                  'books_external',\n                  'books_junior',\n                  'books_pdf',\n                ].includes(book.type),\n              });\n            }\n          });\n        });\n\n        return filterBooks;\n      });\n\n    return load(promise, this);\n  }\n\n  get filterBooks() {\n    return this.booksProxy.isResolved ? this.booksProxy.value : A();\n  }\n\n  @action\n  changeBookFilterOption(book) {\n    this.areaFilterOptions = A();\n    this.areaFilter = null;\n\n    this.contentFilterOptions = A();\n    this.contentFilter = null;\n\n    if (book) {\n      resolve(book.children).then((children) => {\n        children.forEach((area) =>\n          this._addToArray(area, this.areaFilterOptions)\n        );\n\n        this._addAllOption(this.areaFilterOptions);\n      });\n    }\n\n    this.args.onSelectedBook?.(book);\n  }\n\n  @action\n  changeAreaFilterOption(area) {\n    this.contentFilterOptions = A();\n    this.contentFilter = null;\n\n    if (area) {\n      resolve(area.children).then((children) => {\n        children.forEach((content) =>\n          this._addToArray(content, this.contentFilterOptions)\n        );\n\n        this._addAllOption(this.contentFilterOptions);\n      });\n    }\n\n    this.args.onSelectedArea?.(area);\n  }\n\n  @action\n  changeContentFilterOption(content) {\n    this.args.onSelectedContent?.(content);\n  }\n\n  _addToArray(obj, arr) {\n    arr.addObject({\n      label: obj.title,\n      value: obj,\n    });\n  }\n\n  _addAllOption(arr) {\n    arr.unshiftObject({\n      label: this.intl.t('components.answerLog.entityFilter.allOption'),\n      value: null,\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class={{if (not-eq @entity.id @result.entity.children.lastObject.id) \\\"bb1\\\"}}>\\n  <UiButton\\n    @appearance=\\\"link\\\"\\n    @onClick={{this.openAudit}}\\n    class=\\\"py1\\\"\\n  >\\n    <AnswerStatusIcon\\n      @status={{this.answer.computedStatus}}\\n      class=\\\"flex flex-center nl1 nr1\\\"\\n    />\\n\\n    <div class=\\\"text-ui\\\">\\n      {{this.indexDot}}{{or @entity.header @entity.title \\\"no title\\\"}}\\n    </div>\\n  </UiButton>\\n</div>\\n\", {\"contents\":\"<div class={{if (not-eq @entity.id @result.entity.children.lastObject.id) \\\"bb1\\\"}}>\\n  <UiButton\\n    @appearance=\\\"link\\\"\\n    @onClick={{this.openAudit}}\\n    class=\\\"py1\\\"\\n  >\\n    <AnswerStatusIcon\\n      @status={{this.answer.computedStatus}}\\n      class=\\\"flex flex-center nl1 nr1\\\"\\n    />\\n\\n    <div class=\\\"text-ui\\\">\\n      {{this.indexDot}}{{or @entity.header @entity.title \\\"no title\\\"}}\\n    </div>\\n  </UiButton>\\n</div>\\n\",\"moduleName\":\"babel/components/answer-log/diagnosis-list/answer-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/diagnosis-list/answer-item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogDiagnosisListAnswerItemComponent extends Component {\n  /**\n   * Arguments:\n   * result (object)\n   * entity (object)\n   * index (number)\n   */\n\n  @service router;\n\n  get indexDot() {\n    if (this.args.entity.hideAssignmentSortNumbers) return null;\n    const index = this.args.index;\n    return index !== null && `${index + 1}. `;\n  }\n\n  @cached\n  get answerProxy() {\n    let promise = resolve();\n\n    if (this.args.result) {\n      promise = resolve(this.args.result.answers).then((answers) =>\n        all(\n          answers?.map((answer) =>\n            resolve(answer.entity).then((entity) => {\n              if (entity.id === this.args.entity.id) {\n                return answer;\n              }\n\n              return null;\n            })\n          )\n        ).then((results) => results.find((x) => x))\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get answer() {\n    return this.answerProxy.isResolved ? this.answerProxy.value : null;\n  }\n\n  @action\n  openAudit() {\n    return all([this.answer.entity, this.args.result.entity])\n      .then(([answerEntity, resultEntity]) =>\n        all([answerEntity, resultEntity, resultEntity.parent])\n      )\n      .then(([answerEntity, resultEntity, resultEntityParent]) =>\n        this.router.transitionTo(\n          'master.interactives.diagnoses.done.audit',\n          resultEntityParent.id,\n          resultEntity.id,\n          this.args.result.id,\n          {\n            queryParams: { exercise_id: answerEntity.id },\n          }\n        )\n      )\n      .catch(() => {\n        // do nothing\n      });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<AnswerLog::ContextFilter\\n  @presentBooks={{@books}}\\n  class=\\\"mb1\\\"\\n  @canSearch={{false}}\\n  @onSelectedBook={{this.handleBookFilterChange}}\\n  @onSelectedArea={{this.handleAreaFilterChange}}\\n  @onSelectedContent={{this.handleContentFilterChange}}\\n  {{did-update this._fetchData @users}}\\n/>\\n\\n{{#if this.isLoaded}}\\n  {{#each this.model as |result|}}\\n    <AnswerLog::DiagnosisList::Item @result={{result}}/>\\n  {{/each}}\\n\\n  {{#if this.noResults}}\\n    <XAlert>\\n      {{t \\\"components.answerLog.diagnosis.noResults\\\"}}\\n    </XAlert>\\n  {{/if}}\\n{{else}}\\n  <DcLoader class=\\\"mt5\\\" />\\n{{/if}}\\n\\n{{#if (gt this.model.meta.totalPages 1)}}\\n  <div class=\\\"flex justify-center\\\">\\n    <XPagination\\n      @routed={{false}}\\n      @page={{this.pageNumber}}\\n      @showFirstLast={{false}}\\n      @totalPages={{this.model.meta.totalPages}}\\n      @onChange={{this.handlePaginationChange}}\\n    />\\n  </div>\\n{{/if}}\\n\", {\"contents\":\"<AnswerLog::ContextFilter\\n  @presentBooks={{@books}}\\n  class=\\\"mb1\\\"\\n  @canSearch={{false}}\\n  @onSelectedBook={{this.handleBookFilterChange}}\\n  @onSelectedArea={{this.handleAreaFilterChange}}\\n  @onSelectedContent={{this.handleContentFilterChange}}\\n  {{did-update this._fetchData @users}}\\n/>\\n\\n{{#if this.isLoaded}}\\n  {{#each this.model as |result|}}\\n    <AnswerLog::DiagnosisList::Item @result={{result}}/>\\n  {{/each}}\\n\\n  {{#if this.noResults}}\\n    <XAlert>\\n      {{t \\\"components.answerLog.diagnosis.noResults\\\"}}\\n    </XAlert>\\n  {{/if}}\\n{{else}}\\n  <DcLoader class=\\\"mt5\\\" />\\n{{/if}}\\n\\n{{#if (gt this.model.meta.totalPages 1)}}\\n  <div class=\\\"flex justify-center\\\">\\n    <XPagination\\n      @routed={{false}}\\n      @page={{this.pageNumber}}\\n      @showFirstLast={{false}}\\n      @totalPages={{this.model.meta.totalPages}}\\n      @onChange={{this.handlePaginationChange}}\\n    />\\n  </div>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/answer-log/diagnosis-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/diagnosis-list/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { resolve } from 'rsvp';\n\nexport default class AnswerLogDiagnosisListComponent extends Component {\n  /**\n   * Arguments:\n   * books (array)\n   * users (array)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._fetchData();\n  }\n\n  @service store;\n\n  @tracked model;\n\n  @tracked pageNumber = 1;\n\n  @tracked bookFilter;\n\n  @tracked areaFilter;\n\n  @tracked contentFilter;\n\n  @tracked noResults = false;\n\n  @tracked isLoaded = false;\n\n  limit = 100;\n\n  @action async _fetchData() {\n    this.isLoaded = false;\n    this.noResults = false;\n\n    let bookId = null;\n    let areaId = null;\n    let contentId = null;\n    let userId = null;\n\n    if (this.bookFilter) {\n      bookId = this.bookFilter.id;\n    } else {\n      const books = await resolve(this.args.books);\n\n      if (books.length > 0) {\n        bookId = books.map((x) => x.id).join(',');\n      }\n    }\n\n    if (this.areaFilter) {\n      areaId = this.areaFilter.id;\n    }\n\n    if (this.contentFilter) {\n      contentId = this.contentFilter.id;\n    }\n\n    if (this.args.users) {\n      userId = this.args.users;\n    }\n\n    const limit = this.limit;\n    const filter = {\n      type: 'diagnosis_part',\n    };\n\n    if (bookId) filter.book_id = bookId;\n    if (areaId) filter.area_id = areaId;\n    if (contentId) filter.content_id = contentId;\n    if (userId) filter.user_id = userId;\n\n    let answers = [];\n\n    try {\n      answers = await this.store.query('interactive', {\n        all: true,\n        page: { size: limit, number: this.pageNumber },\n        order: [{ field: 'started', direction: 'DESC' }],\n        filter,\n      });\n    } catch (err) {\n      // do nothing\n    }\n\n    if (answers.length === 0) {\n      this.noResults = true;\n    }\n\n    this.model = answers;\n    this.isLoaded = true;\n  }\n\n  @action handlePaginationChange(pageNumber) {\n    this.pageNumber = pageNumber;\n    this._fetchData();\n  }\n\n  @action handleBookFilterChange(bookModel) {\n    this.pageNumber = 1;\n    this.bookFilter = bookModel;\n    this.areaFilter = null;\n    this.contentFilter = null;\n    this._fetchData();\n  }\n\n  @action handleAreaFilterChange(areaModel) {\n    this.pageNumber = 1;\n    this.areaFilter = areaModel;\n    this.contentFilter = null;\n    this._fetchData();\n  }\n\n  @action handleContentFilterChange(contentModel) {\n    this.pageNumber = 1;\n    this.contentFilter = contentModel;\n    this._fetchData();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @result.entity.title}}\\n  <DcCard class=\\\"mb1\\\" @appearance=\\\"border\\\">\\n    <XAccordion\\n      @disabled={{or @result.isActive @result.isAborted}}\\n      as |accordion|\\n    >\\n      <accordion.header class=\\\"p1\\\">\\n        <div class=\\\"flex justify-space-between\\\">\\n          <div>\\n            <div class=\\\"text-tertiary snb1\\\">\\n              {{#if @result.entity.isDiagnosis}}\\n                {{@result.entity.title}}\\n              {{/if}}\\n            </div>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n              .. /{{@result.entity.parent.parent.title}}\\n              /\\n              {{@result.entity.parent.title}}\\n            </div>\\n          </div>\\n\\n          <div class=\\\"flex flex-center\\\">\\n            {{#if @result.attempt}}\\n              <UiLink\\n                @route=\\\"master.interactives.diagnoses.done\\\"\\n                @models={{array\\n                  @result.entity.parent.id\\n                  @result.entity.id\\n                  @result.id\\n                }}\\n                class=\\\"mr1\\\"\\n              >\\n                <XBadge @size=\\\"small\\\">\\n                  {{t \\\"components.answerLog.diagnosis.attempt\\\" attempt=@result.attempt}}\\n                </XBadge>\\n              </UiLink>\\n\\n              {{#unless @result.isAborted}}\\n                <div\\n                  class=\\\"text-ui mr1\\n                    {{if\\n                      (gte @result.score @result.entity.pointsRequired)\\n                      'text-color-success'\\n                      'text-color-error'\\n                    }}\\\"\\n                >\\n                  {{or @result.score 0}}\\n                  /\\n                  {{@result.entity.children.length}}\\n                </div>\\n              {{/unless}}\\n            {{/if}}\\n\\n            {{#if @result.isActive}}\\n              <div class=\\\"active-diagnosis-result mr1\\\" id=\\\"{{@result.id}}\\\">\\n                <DcIcon @name=\\\"info-circle\\\" />\\n              </div>\\n\\n              <XTooltip @for={{@result.id}}>\\n                {{t \\\"components.answerLog.diagnosis.active\\\"}}\\n              </XTooltip>\\n            {{else if @result.isAborted}}\\n              <div class=\\\"aborted-diagnosis-result mr1\\\" id=\\\"{{@result.id}}\\\">\\n                <DcIcon @name=\\\"info-circle\\\" />\\n              </div>\\n\\n              <XTooltip @for={{@result.id}}>\\n                {{t \\\"components.answerLog.diagnosis.aborted\\\"}}\\n              </XTooltip>\\n            {{else if @result.entity.children.length}}\\n              <XPercentageCircle\\n                @value={{@result.score}}\\n                @valueMax={{@result.entity.children.length}}\\n                @size=\\\"mini\\\"\\n                class=\\\"nr1 diagnosis-list-progress\\\"\\n                @showPercent={{true}}\\n              />\\n            {{/if}}\\n          </div>\\n        </div>\\n      </accordion.header>\\n\\n      <accordion.content class=\\\"p1\\\">\\n        {{#if @result.answers.isFulfilled}}\\n          {{#each @result.entity.children as |entity index|}}\\n            <AnswerLog::DiagnosisList::AnswerItem\\n              @entity={{entity}}\\n              @result={{@result}}\\n              @index={{index}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      </accordion.content>\\n    </XAccordion>\\n  </DcCard>\\n{{/if}}\", {\"contents\":\"{{#if @result.entity.title}}\\n  <DcCard class=\\\"mb1\\\" @appearance=\\\"border\\\">\\n    <XAccordion\\n      @disabled={{or @result.isActive @result.isAborted}}\\n      as |accordion|\\n    >\\n      <accordion.header class=\\\"p1\\\">\\n        <div class=\\\"flex justify-space-between\\\">\\n          <div>\\n            <div class=\\\"text-tertiary snb1\\\">\\n              {{#if @result.entity.isDiagnosis}}\\n                {{@result.entity.title}}\\n              {{/if}}\\n            </div>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n              .. /{{@result.entity.parent.parent.title}}\\n              /\\n              {{@result.entity.parent.title}}\\n            </div>\\n          </div>\\n\\n          <div class=\\\"flex flex-center\\\">\\n            {{#if @result.attempt}}\\n              <UiLink\\n                @route=\\\"master.interactives.diagnoses.done\\\"\\n                @models={{array\\n                  @result.entity.parent.id\\n                  @result.entity.id\\n                  @result.id\\n                }}\\n                class=\\\"mr1\\\"\\n              >\\n                <XBadge @size=\\\"small\\\">\\n                  {{t \\\"components.answerLog.diagnosis.attempt\\\" attempt=@result.attempt}}\\n                </XBadge>\\n              </UiLink>\\n\\n              {{#unless @result.isAborted}}\\n                <div\\n                  class=\\\"text-ui mr1\\n                    {{if\\n                      (gte @result.score @result.entity.pointsRequired)\\n                      'text-color-success'\\n                      'text-color-error'\\n                    }}\\\"\\n                >\\n                  {{or @result.score 0}}\\n                  /\\n                  {{@result.entity.children.length}}\\n                </div>\\n              {{/unless}}\\n            {{/if}}\\n\\n            {{#if @result.isActive}}\\n              <div class=\\\"active-diagnosis-result mr1\\\" id=\\\"{{@result.id}}\\\">\\n                <DcIcon @name=\\\"info-circle\\\" />\\n              </div>\\n\\n              <XTooltip @for={{@result.id}}>\\n                {{t \\\"components.answerLog.diagnosis.active\\\"}}\\n              </XTooltip>\\n            {{else if @result.isAborted}}\\n              <div class=\\\"aborted-diagnosis-result mr1\\\" id=\\\"{{@result.id}}\\\">\\n                <DcIcon @name=\\\"info-circle\\\" />\\n              </div>\\n\\n              <XTooltip @for={{@result.id}}>\\n                {{t \\\"components.answerLog.diagnosis.aborted\\\"}}\\n              </XTooltip>\\n            {{else if @result.entity.children.length}}\\n              <XPercentageCircle\\n                @value={{@result.score}}\\n                @valueMax={{@result.entity.children.length}}\\n                @size=\\\"mini\\\"\\n                class=\\\"nr1 diagnosis-list-progress\\\"\\n                @showPercent={{true}}\\n              />\\n            {{/if}}\\n          </div>\\n        </div>\\n      </accordion.header>\\n\\n      <accordion.content class=\\\"p1\\\">\\n        {{#if @result.answers.isFulfilled}}\\n          {{#each @result.entity.children as |entity index|}}\\n            <AnswerLog::DiagnosisList::AnswerItem\\n              @entity={{entity}}\\n              @result={{@result}}\\n              @index={{index}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      </accordion.content>\\n    </XAccordion>\\n  </DcCard>\\n{{/if}}\",\"moduleName\":\"babel/components/answer-log/diagnosis-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/diagnosis-list/item/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XTab @appearance=\\\"pill\\\" @value={{this.inboxType}} as |TypeTab|>\\n  <TypeTab.pane\\n    @value=\\\"standard\\\"\\n    @label={{t \\\"components.answerLog.results.types.standard\\\"}}\\n    @icon=\\\"assignments\\\"\\n  >\\n    <AnswerLog::StandardList\\n      @books={{@books}}\\n      @users={{this.users}}\\n      @inboxMode={{@inboxMode}}\\n      @trackAuditEvents={{@trackAuditEvents}}\\n      @onSelect={{this.handleAnswerClick}}\\n    />\\n  </TypeTab.pane>\\n\\n  {{#unless @inboxMode}}\\n    <TypeTab.pane\\n      @value=\\\"diagnosis\\\"\\n      @label={{t \\\"components.answerLog.results.types.diagnosis\\\"}}\\n      @icon=\\\"diagnosis\\\"\\n    >\\n      <AnswerLog::DiagnosisList\\n        @books={{@books}}\\n        @users={{this.users}}\\n      />\\n    </TypeTab.pane>\\n  {{/unless}}\\n\\n  {{#if this.showTeacherAssignments}}\\n    <TypeTab.pane\\n      @value=\\\"teacher_assignments\\\"\\n      @label={{t \\\"components.answerLog.results.types.teacher_assignments\\\"}}\\n      @icon=\\\"teacher-assignments\\\"\\n    >\\n      <AnswerLog::TeacherAssignmentList\\n        @course={{@course}}\\n        @books={{@books}}\\n        @users={{this.users}}\\n        @inboxMode={{@inboxMode}}\\n        @trackAuditEvents={{@trackAuditEvents}}\\n        @onSelect={{this.handleAnswerClick}}\\n      />\\n    </TypeTab.pane>\\n  {{/if}}\\n</XTab>\\n\\n{{#if this.isModalOpen}}\\n  <XModal\\n    @onClose={{fn (mut this.isModalOpen) false}}\\n    @size={{hash width=\\\"xlarge\\\" height=\\\"xlarge\\\"}}\\n    @title={{this.collectionData.collection.title}}\\n    as |Modal|\\n  >\\n    <Modal.header />\\n    <Modal.content>\\n      <CollectionView\\n        @collection={{this.collectionData.collection}}\\n        @exercises={{this.collectionData.exercises}}\\n        @activeExercise={{this.collectionData.activeExercise}}\\n        @answers={{this.collectionData.answers}}\\n        @activeAnswer={{this.collectionData.activeAnswer}}\\n        @shortCode={{this.collectionData.book.body.shortcode}}\\n        @editor={{this.collectionData.editorExceptForSections}}\\n        @openExercise={{this.openExercise}}\\n        @isShowingResultsForCarousel={{this.collectionData.isShowingResultsForCarousel}}\\n        as |CollectionViewYield|\\n      >\\n        <CollectionViewYield.ExerciseTopbar>\\n          {{#if CollectionViewYield.ExerciseTarget}}\\n            <ExerciseTopbar @target={{CollectionViewYield.ExerciseTarget}} />\\n          {{/if}}\\n        </CollectionViewYield.ExerciseTopbar>\\n      </CollectionView>\\n    </Modal.content>\\n  </XModal>\\n{{/if}}\\n\", {\"contents\":\"<XTab @appearance=\\\"pill\\\" @value={{this.inboxType}} as |TypeTab|>\\n  <TypeTab.pane\\n    @value=\\\"standard\\\"\\n    @label={{t \\\"components.answerLog.results.types.standard\\\"}}\\n    @icon=\\\"assignments\\\"\\n  >\\n    <AnswerLog::StandardList\\n      @books={{@books}}\\n      @users={{this.users}}\\n      @inboxMode={{@inboxMode}}\\n      @trackAuditEvents={{@trackAuditEvents}}\\n      @onSelect={{this.handleAnswerClick}}\\n    />\\n  </TypeTab.pane>\\n\\n  {{#unless @inboxMode}}\\n    <TypeTab.pane\\n      @value=\\\"diagnosis\\\"\\n      @label={{t \\\"components.answerLog.results.types.diagnosis\\\"}}\\n      @icon=\\\"diagnosis\\\"\\n    >\\n      <AnswerLog::DiagnosisList\\n        @books={{@books}}\\n        @users={{this.users}}\\n      />\\n    </TypeTab.pane>\\n  {{/unless}}\\n\\n  {{#if this.showTeacherAssignments}}\\n    <TypeTab.pane\\n      @value=\\\"teacher_assignments\\\"\\n      @label={{t \\\"components.answerLog.results.types.teacher_assignments\\\"}}\\n      @icon=\\\"teacher-assignments\\\"\\n    >\\n      <AnswerLog::TeacherAssignmentList\\n        @course={{@course}}\\n        @books={{@books}}\\n        @users={{this.users}}\\n        @inboxMode={{@inboxMode}}\\n        @trackAuditEvents={{@trackAuditEvents}}\\n        @onSelect={{this.handleAnswerClick}}\\n      />\\n    </TypeTab.pane>\\n  {{/if}}\\n</XTab>\\n\\n{{#if this.isModalOpen}}\\n  <XModal\\n    @onClose={{fn (mut this.isModalOpen) false}}\\n    @size={{hash width=\\\"xlarge\\\" height=\\\"xlarge\\\"}}\\n    @title={{this.collectionData.collection.title}}\\n    as |Modal|\\n  >\\n    <Modal.header />\\n    <Modal.content>\\n      <CollectionView\\n        @collection={{this.collectionData.collection}}\\n        @exercises={{this.collectionData.exercises}}\\n        @activeExercise={{this.collectionData.activeExercise}}\\n        @answers={{this.collectionData.answers}}\\n        @activeAnswer={{this.collectionData.activeAnswer}}\\n        @shortCode={{this.collectionData.book.body.shortcode}}\\n        @editor={{this.collectionData.editorExceptForSections}}\\n        @openExercise={{this.openExercise}}\\n        @isShowingResultsForCarousel={{this.collectionData.isShowingResultsForCarousel}}\\n        as |CollectionViewYield|\\n      >\\n        <CollectionViewYield.ExerciseTopbar>\\n          {{#if CollectionViewYield.ExerciseTarget}}\\n            <ExerciseTopbar @target={{CollectionViewYield.ExerciseTarget}} />\\n          {{/if}}\\n        </CollectionViewYield.ExerciseTopbar>\\n      </CollectionView>\\n    </Modal.content>\\n  </XModal>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/answer-log/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { resolve } from 'rsvp';\n\nclass CollectionData {\n  constructor({\n    book,\n    collection,\n    exercises,\n    activeExercise,\n    answers,\n    activeAnswer,\n    editor,\n    isShowingResultsForCarousel = false,\n  }) {\n    this.book = book;\n    this.collection = collection;\n    this.exercises = exercises;\n    this.activeExercise = activeExercise;\n    this.answers = answers;\n    this.activeAnswer = activeAnswer;\n    this.editor = editor;\n    this.isShowingResultsForCarousel = isShowingResultsForCarousel;\n  }\n\n  @tracked book;\n  @tracked collection;\n  @tracked exercises;\n  @tracked activeExercise;\n  @tracked answers;\n  @tracked activeAnswer;\n  @tracked editor;\n  @tracked isShowingResultsForCarousel;\n\n  get editorExceptForSections() {\n    // We always want to show the sidebar in the collection view for 'sections'\n    // therefore returning null here, which means that the editor will not be rendered\n    // in the collection view modal.\n    return this.collection?.type === 'sections' ? null : this.editor;\n  }\n}\n\nexport default class AnswerLogComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   * books (array)\n   * users (array)\n   * inboxType (string)\n   * inboxMode (bool)\n   * onAnswerClick (function)\n   * showTeacherAssignments (bool)\n   */\n\n  @service assignmentEvents;\n\n  @service session;\n\n  @service store;\n\n  @tracked collectionData;\n\n  @tracked isModalOpen = false;\n\n  @tracked inboxType = this.args.inboxType || 'standard';\n\n  get users() {\n    return this.args.users || [this.session.user.id];\n  }\n\n  get showTeacherAssignments() {\n    return this.args.showTeacherAssignments === false ? false : true;\n  }\n\n  @action\n  async handleAnswerClick(entity, answer) {\n    if (this.args.onAnswerClick) {\n      return this.args.onAnswerClick(entity, answer);\n    }\n\n    const activeExercise = await resolve(entity);\n    const collection = await resolve(activeExercise.parent);\n\n    const { book, exercises, editor } = await getCollectionData(\n      this.store,\n      collection\n    );\n\n    const answers =\n      await this.assignmentEvents.getAnswersForExercises(exercises);\n\n    this.collectionData = new CollectionData({\n      book,\n      collection: collection.template === 'carousel' ? null : collection,\n      exercises,\n      activeExercise,\n      answers,\n      activeAnswer: answer,\n      editor,\n      isShowingResultsForCarousel: collection.template === 'carousel',\n    });\n\n    this.isModalOpen = true;\n  }\n\n  @action\n  async openExercise(exerciseId) {\n    const exercise = this.collectionData.exercises.findBy('id', exerciseId);\n    const answers = this.collectionData.answers;\n    const answer = await this.assignmentEvents.getOrCreateAnswerForExercise(\n      exercise,\n      answers\n    );\n\n    this.collectionData.activeExercise = exercise;\n    this.collectionData.activeAnswer = answer;\n\n    return resolve();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @multipleUsers}}\\n  <div class=\\\"flex flex-column bb1\\\">\\n    <div class=\\\"flex nt1 nb1 {{if this.entity \\\"\\\" \\\"dimmed\\\"}}\\\">\\n      <div>\\n        {{#if this.entity}}\\n          <UiButton\\n            class=\\\"flex\\\"\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity @answers}}\\n          >\\n            {{#unless this.entity.hideAssignmentSortNumbers}}\\n              {{#if this.entity.sort}}\\n                {{this.entity.sort}}.\\n              {{/if}}\\n            {{/unless}}\\n\\n            {{or this.entity.header this.entity.title this.answer.assignment_title}}\\n          </UiButton>\\n\\n          <div class=\\\"flex flex-center\\\">\\n            <DcIcon @name=\\\"group\\\" class=\\\"nr1\\\"/>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small mr1\\\">\\n              {{~t \\\"components.answerLog.results.numStudentsAnswered\\\" num=this.numStudentsAnswered~}}\\n            </div>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small\\\">.. /\\n              {{this.answer.area.title}} / {{this.answer.content.title~}}\\n            </div>\\n          </div>\\n        {{else}}\\n          <div class=\\\"flex text-bold\\\">\\n            {{this.answer.assignment_title}}\\n          </div>\\n\\n          <div class=\\\"text-small\\\">{{t \\\"components.answerLog.results.entityFailed\\\"}}</div>\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n{{else}}\\n  <AnswerLog::StandardList::Item\\n    @answer={{this.answer}}\\n    @onClick={{@onClick}}\\n  />\\n{{/if}}\\n\", {\"contents\":\"{{#if @multipleUsers}}\\n  <div class=\\\"flex flex-column bb1\\\">\\n    <div class=\\\"flex nt1 nb1 {{if this.entity \\\"\\\" \\\"dimmed\\\"}}\\\">\\n      <div>\\n        {{#if this.entity}}\\n          <UiButton\\n            class=\\\"flex\\\"\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity @answers}}\\n          >\\n            {{#unless this.entity.hideAssignmentSortNumbers}}\\n              {{#if this.entity.sort}}\\n                {{this.entity.sort}}.\\n              {{/if}}\\n            {{/unless}}\\n\\n            {{or this.entity.header this.entity.title this.answer.assignment_title}}\\n          </UiButton>\\n\\n          <div class=\\\"flex flex-center\\\">\\n            <DcIcon @name=\\\"group\\\" class=\\\"nr1\\\"/>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small mr1\\\">\\n              {{~t \\\"components.answerLog.results.numStudentsAnswered\\\" num=this.numStudentsAnswered~}}\\n            </div>\\n\\n            <div class=\\\"answer-log-path text-muted text-separator text-small\\\">.. /\\n              {{this.answer.area.title}} / {{this.answer.content.title~}}\\n            </div>\\n          </div>\\n        {{else}}\\n          <div class=\\\"flex text-bold\\\">\\n            {{this.answer.assignment_title}}\\n          </div>\\n\\n          <div class=\\\"text-small\\\">{{t \\\"components.answerLog.results.entityFailed\\\"}}</div>\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n{{else}}\\n  <AnswerLog::StandardList::Item\\n    @answer={{this.answer}}\\n    @onClick={{@onClick}}\\n  />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/answer-log/standard-list/exercise/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/standard-list/exercise/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { getLatestVersion } from 'babel/utils/get-answer';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogStandardListExerciseComponent extends Component {\n  /**\n   * Arguments:\n   * answers (array)\n   * onClick (function)\n   * multipleUsers (bool)\n   */\n\n  @cached get entityProxy() {\n    let promise = resolve();\n\n    if (this.args.answers?.length > 0) {\n      promise = resolve(this.args.answers.firstObject.entity);\n    }\n\n    return load(promise, this);\n  }\n\n  get entity() {\n    return this.entityProxy.isResolved ? this.entityProxy.value : null;\n  }\n\n  @cached get answer() {\n    return getLatestVersion(this.entity, this.args.answers);\n  }\n\n  @cached get numStudentsAnsweredProxy() {\n    let promise = resolve();\n\n    if (this.args.answers?.length > 0) {\n      promise = all(this.args.answers.map((x) => resolve(x.user))).then(\n        (users) =>\n          users\n            .mapBy('id')\n            .filter((val, idx, self) => self.indexOf(val) === idx).length\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get numStudentsAnswered() {\n    return this.numStudentsAnsweredProxy.isResolved\n      ? this.numStudentsAnsweredProxy.value\n      : 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"standard-list-filter mb1\\\" {{did-update this._fetchData @users}}>\\n  <div class=\\\"standard-list-filtered\\\">\\n    <span class=\\\"text-ui\\\">{{t \\\"components.answerLog.filterShowing\\\"}}</span>\\n    {{this.filterString}}\\n  </div>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton\\n      @onClick={{this.toggleFilters}}\\n      @appearance=\\\"link\\\"\\n      @size=\\\"small\\\"\\n      class=\\\"text-base nr1\\\"\\n    >\\n      {{#if this.showFilters}}\\n        {{t \\\"components.answerLog.standard.hideFilters\\\"}}\\n      {{else}}\\n        {{t \\\"components.answerLog.standard.showFilters\\\"}}\\n      {{/if}}\\n    </UiButton>\\n\\n    {{#if @inboxMode}}\\n      <UiButton\\n        @onClick={{this.markAllAsRead}}\\n        @appearance=\\\"link\\\"\\n        @size=\\\"small\\\"\\n        @variant=\\\"error\\\"\\n        class=\\\"text-base\\\"\\n      >\\n        {{t \\\"components.answerLog.markAllAsRead\\\"}}\\n      </UiButton>\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.showFilters}}\\n    <DcCard @appearance=\\\"border\\\" class=\\\"mt1\\\" as |card|>\\n      <card.content>\\n        <AnswerLog::ContextFilter\\n          @presentBooks={{@books}}\\n          @searchAssignments={{this.searchAssignments}}\\n          @onSelectedBook={{this.handleBookFilterChange}}\\n          @onSelectedArea={{this.handleAreaFilterChange}}\\n          @onSelectedContent={{this.handleContentFilterChange}}\\n        />\\n\\n        {{#unless @inboxMode}}\\n          <div class=\\\"text-ui nb1\\\">\\n            {{t \\\"components.answerLog.standard.allAssignments\\\"}}\\n          </div>\\n\\n          <div class=\\\"flex flex-wrap nb1\\\">\\n            <XCheckbox\\n              class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n              @value={{this.started}}\\n              @checked={{this.started}}\\n              @onChange={{this.handleStatusFilter}}\\n            >\\n              {{t \\\"components.answerLog.standard.filters.started\\\"}}\\n            </XCheckbox>\\n\\n            <UiRadioButtonGroup\\n              class=\\\"nb1\\\"\\n              @groupValue={{this.commentStatus}}\\n              @options={{this.commentOptions}}\\n              @direction=\\\"horizontal\\\"\\n              @onChange={{this.changeCommentStatus}}\\n            />\\n          </div>\\n\\n          <div class=\\\"flex flex-wrap\\\">\\n            <div class=\\\"nb1\\\">\\n              <div class=\\\"text-ui nb1\\\">{{t\\n                  \\\"components.answerLog.standard.teacherCorrected\\\"\\n                }}</div>\\n\\n              <div class=\\\"flex flex-wrap\\\">\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.turnedIn}}\\n                  @checked={{this.turnedIn}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.turnedIn\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.audited}}\\n                  @checked={{this.audited}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.audited\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.teacherCorrect}}\\n                  @checked={{this.teacherCorrect}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.teacherCorrect\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.teacherWrong}}\\n                  @checked={{this.teacherWrong}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.teacherWrong\\\"}}\\n                </XCheckbox>\\n              </div>\\n            </div>\\n\\n            <div class=\\\"nb1\\\">\\n\\n              <div class=\\\"text-ui nb1\\\">{{t\\n                  \\\"components.answerLog.standard.autoCorrected\\\"\\n                }}</div>\\n\\n              <div class=\\\"flex flex-wrap\\\">\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.correct}}\\n                  @checked={{this.correct}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.correct\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.wrong}}\\n                  @checked={{this.wrong}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.wrong\\\"}}\\n                </XCheckbox>\\n              </div>\\n            </div>\\n          </div>\\n        {{/unless}}\\n      </card.content>\\n    </DcCard>\\n  {{/if}}\\n</div>\\n\\n{{#if this.isLoaded}}\\n  {{#each this.groupedAnswers as |answers|}}\\n    <div class=\\\"text-tertiary mt1 nb1\\\">{{answers.createdDate}}</div>\\n\\n    <div class=\\\"standard-list-group mb2\\\">\\n      {{#each answers.content as |answer|}}\\n        {{#if @inboxMode}}\\n          <AnswerLog::StandardList::Exercise\\n            @answers={{answer.content}}\\n            @multipleUsers={{this.multipleUsers}}\\n            @onClick={{@onSelect}}\\n          />\\n        {{else}}\\n          {{#each answer.content as |a|}}\\n            <AnswerLog::StandardList::Item\\n              @answer={{a}}\\n              @onClick={{@onSelect}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/each}}\\n    </div>\\n  {{/each}}\\n\\n  {{#if this.noResults}}\\n    <XAlert class=\\\"mt1\\\">\\n      {{t \\\"components.answerLog.standard.noResults\\\"}}\\n    </XAlert>\\n  {{/if}}\\n\\n  {{#if (gt this.model.meta.totalPages 1)}}\\n    <div class=\\\"flex justify-center mt2\\\">\\n      <XPagination\\n        @routed={{false}}\\n        @page={{this.pageNumber}}\\n        @showFirstLast={{false}}\\n        @totalPages={{this.model.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    </div>\\n  {{/if}}\\n{{else}}\\n  <DcLoader class=\\\"mt5\\\" />\\n{{/if}}\", {\"contents\":\"<div class=\\\"standard-list-filter mb1\\\" {{did-update this._fetchData @users}}>\\n  <div class=\\\"standard-list-filtered\\\">\\n    <span class=\\\"text-ui\\\">{{t \\\"components.answerLog.filterShowing\\\"}}</span>\\n    {{this.filterString}}\\n  </div>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton\\n      @onClick={{this.toggleFilters}}\\n      @appearance=\\\"link\\\"\\n      @size=\\\"small\\\"\\n      class=\\\"text-base nr1\\\"\\n    >\\n      {{#if this.showFilters}}\\n        {{t \\\"components.answerLog.standard.hideFilters\\\"}}\\n      {{else}}\\n        {{t \\\"components.answerLog.standard.showFilters\\\"}}\\n      {{/if}}\\n    </UiButton>\\n\\n    {{#if @inboxMode}}\\n      <UiButton\\n        @onClick={{this.markAllAsRead}}\\n        @appearance=\\\"link\\\"\\n        @size=\\\"small\\\"\\n        @variant=\\\"error\\\"\\n        class=\\\"text-base\\\"\\n      >\\n        {{t \\\"components.answerLog.markAllAsRead\\\"}}\\n      </UiButton>\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.showFilters}}\\n    <DcCard @appearance=\\\"border\\\" class=\\\"mt1\\\" as |card|>\\n      <card.content>\\n        <AnswerLog::ContextFilter\\n          @presentBooks={{@books}}\\n          @searchAssignments={{this.searchAssignments}}\\n          @onSelectedBook={{this.handleBookFilterChange}}\\n          @onSelectedArea={{this.handleAreaFilterChange}}\\n          @onSelectedContent={{this.handleContentFilterChange}}\\n        />\\n\\n        {{#unless @inboxMode}}\\n          <div class=\\\"text-ui nb1\\\">\\n            {{t \\\"components.answerLog.standard.allAssignments\\\"}}\\n          </div>\\n\\n          <div class=\\\"flex flex-wrap nb1\\\">\\n            <XCheckbox\\n              class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n              @value={{this.started}}\\n              @checked={{this.started}}\\n              @onChange={{this.handleStatusFilter}}\\n            >\\n              {{t \\\"components.answerLog.standard.filters.started\\\"}}\\n            </XCheckbox>\\n\\n            <UiRadioButtonGroup\\n              class=\\\"nb1\\\"\\n              @groupValue={{this.commentStatus}}\\n              @options={{this.commentOptions}}\\n              @direction=\\\"horizontal\\\"\\n              @onChange={{this.changeCommentStatus}}\\n            />\\n          </div>\\n\\n          <div class=\\\"flex flex-wrap\\\">\\n            <div class=\\\"nb1\\\">\\n              <div class=\\\"text-ui nb1\\\">{{t\\n                  \\\"components.answerLog.standard.teacherCorrected\\\"\\n                }}</div>\\n\\n              <div class=\\\"flex flex-wrap\\\">\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.turnedIn}}\\n                  @checked={{this.turnedIn}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.turnedIn\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.audited}}\\n                  @checked={{this.audited}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.audited\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.teacherCorrect}}\\n                  @checked={{this.teacherCorrect}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.teacherCorrect\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.teacherWrong}}\\n                  @checked={{this.teacherWrong}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.teacherWrong\\\"}}\\n                </XCheckbox>\\n              </div>\\n            </div>\\n\\n            <div class=\\\"nb1\\\">\\n\\n              <div class=\\\"text-ui nb1\\\">{{t\\n                  \\\"components.answerLog.standard.autoCorrected\\\"\\n                }}</div>\\n\\n              <div class=\\\"flex flex-wrap\\\">\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.correct}}\\n                  @checked={{this.correct}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.correct\\\"}}\\n                </XCheckbox>\\n\\n                <XCheckbox\\n                  class=\\\"mr1 nb1 white-space-no-wrap\\\"\\n                  @value={{this.wrong}}\\n                  @checked={{this.wrong}}\\n                  @onChange={{this.handleStatusFilter}}\\n                >\\n                  {{t \\\"components.answerLog.standard.filters.wrong\\\"}}\\n                </XCheckbox>\\n              </div>\\n            </div>\\n          </div>\\n        {{/unless}}\\n      </card.content>\\n    </DcCard>\\n  {{/if}}\\n</div>\\n\\n{{#if this.isLoaded}}\\n  {{#each this.groupedAnswers as |answers|}}\\n    <div class=\\\"text-tertiary mt1 nb1\\\">{{answers.createdDate}}</div>\\n\\n    <div class=\\\"standard-list-group mb2\\\">\\n      {{#each answers.content as |answer|}}\\n        {{#if @inboxMode}}\\n          <AnswerLog::StandardList::Exercise\\n            @answers={{answer.content}}\\n            @multipleUsers={{this.multipleUsers}}\\n            @onClick={{@onSelect}}\\n          />\\n        {{else}}\\n          {{#each answer.content as |a|}}\\n            <AnswerLog::StandardList::Item\\n              @answer={{a}}\\n              @onClick={{@onSelect}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/each}}\\n    </div>\\n  {{/each}}\\n\\n  {{#if this.noResults}}\\n    <XAlert class=\\\"mt1\\\">\\n      {{t \\\"components.answerLog.standard.noResults\\\"}}\\n    </XAlert>\\n  {{/if}}\\n\\n  {{#if (gt this.model.meta.totalPages 1)}}\\n    <div class=\\\"flex justify-center mt2\\\">\\n      <XPagination\\n        @routed={{false}}\\n        @page={{this.pageNumber}}\\n        @showFirstLast={{false}}\\n        @totalPages={{this.model.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    </div>\\n  {{/if}}\\n{{else}}\\n  <DcLoader class=\\\"mt5\\\" />\\n{{/if}}\",\"moduleName\":\"babel/components/answer-log/standard-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/standard-list/index.hbs\"}});\nimport { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { all } from 'rsvp';\n\nexport default class AnswerLogStandardListComponent extends Component {\n  /**\n   * Arguments:\n   * books (array)\n   * users (array)\n   * inboxMode (bool)\n   * onSelect (function)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._fetchData();\n  }\n\n  @service store;\n\n  @service ajax;\n\n  @service intl;\n\n  @tracked pageNumber = 1;\n\n  @tracked showFilters = false;\n\n  @tracked assignmentSearch;\n\n  @tracked commentStatus = null;\n\n  @tracked bookFilter;\n\n  @tracked areaFilter;\n\n  @tracked contentFilter;\n\n  @tracked started = true;\n\n  @tracked turnedIn = true;\n\n  @tracked correct = true;\n\n  @tracked audited = true;\n\n  @tracked wrong = true;\n\n  @tracked teacherCorrect = true;\n\n  @tracked teacherWrong = true;\n\n  @tracked model;\n\n  @tracked isLoaded = false;\n\n  limit = 10;\n\n  type = 'standard';\n\n  commentOptions = [\n    {\n      value: null,\n      label: this.intl.t('components.answerLog.commentFilter.all'),\n    },\n    {\n      value: 'commented',\n      label: this.intl.t('components.answerLog.commentFilter.commented'),\n    },\n  ];\n\n  get statuses() {\n    if (this.args.inboxMode) {\n      return ['turned-in'];\n    }\n\n    const statuses = [];\n\n    if (this.started) statuses.push('started');\n    if (this.turnedIn) statuses.push('turned-in');\n    if (this.audited) statuses.push('audited');\n    if (this.teacherCorrect) statuses.push('teacher-correct');\n    if (this.teacherWrong) statuses.push('teacher-wrong');\n    if (this.correct) statuses.push('correct');\n    if (this.wrong) statuses.push('wrong');\n\n    return statuses;\n  }\n\n  get statusString() {\n    if (this.args.inboxMode) {\n      return [\n        `<strong>${this.intl.t(\n          'components.answerLog.standard.filters.inbox'\n        )}</strong>`,\n      ];\n    }\n\n    return this.statuses?.map(\n      (x) =>\n        `<strong>${this.intl.t(\n          'components.answerLog.standard.filters.' + camelize(x)\n        )}</strong>`\n    );\n  }\n\n  get selectedContent() {\n    if (this.contentFilter) {\n      return this.contentFilter.title;\n    }\n\n    if (this.areaFilter) {\n      return this.areaFilter.title;\n    }\n\n    if (this.bookFilter) {\n      return this.bookFilter.title;\n    }\n\n    return null;\n  }\n\n  get filterString() {\n    const statuses = this.statusString?.slice();\n    const numStatuses = statuses?.length;\n    const lastStatus = statuses?.pop();\n    const otherStatuses = statuses?.join(', ');\n    const selectedContent = this.selectedContent;\n    const assignmentSearch =\n      this.assignmentSearch && this.assignmentSearch !== ''\n        ? `<em>${this.assignmentSearch}</em>`\n        : null;\n    const commentStatus = this.commentStatus;\n\n    return htmlSafe(\n      this.intl.t('components.answerLog.filterString', {\n        numStatuses,\n        lastStatus,\n        otherStatuses,\n        selectedContent,\n        assignmentSearch,\n        commentStatus,\n      })\n    );\n  }\n\n  get multipleUsers() {\n    return this.args.users?.length > 1;\n  }\n\n  get noResults() {\n    return !this.model || this.model.length === 0;\n  }\n\n  @cached get groupedAnswers() {\n    const grouped = A();\n    let key = this.args.inboxMode ? 'node_id' : 'id';\n\n    this.model?.forEach((item) => {\n      const val = item[key];\n\n      if (!grouped.findBy(key, val)) {\n        grouped.addObject({\n          [key]: val,\n          content: A(),\n          createdDate: item.createdDate,\n        });\n      }\n\n      grouped.findBy(key, val).content.addObject(item);\n    });\n\n    const result = A();\n    key = 'createdDate';\n\n    grouped.forEach((item) => {\n      const val = item[key];\n\n      if (!result.findBy(key, val)) {\n        result.addObject({\n          [key]: val,\n          content: A(),\n        });\n      }\n\n      result.findBy(key, val).content.addObject(item);\n    });\n\n    return result;\n  }\n\n  @action async _fetchData() {\n    this.isLoaded = false;\n    let answers = [];\n\n    try {\n      const filter = await this._getFilters();\n\n      answers = await this.store.query('answer', {\n        page: { size: this.limit, number: this.pageNumber },\n        order: [\n          { field: 'updated', direction: 'DESC' },\n          { field: 'created', direction: 'DESC' },\n        ],\n        filter,\n      });\n\n      const promises = [];\n\n      answers.forEach((answer) => {\n        promises.push(\n          this.store.findRecord('entity', answer.belongsTo('entity').id()),\n          this.store.findRecord('entity', answer.belongsTo('collection').id()),\n          this.store.findRecord('entity', answer.belongsTo('content').id()),\n          this.store.findRecord('entity', answer.belongsTo('area').id())\n        );\n\n        answer\n          .hasMany('versions')\n          .ids()\n          ?.forEach((id) => promises.push(this.store.findRecord('answer', id)));\n\n        answer\n          .hasMany('comments')\n          .ids()\n          ?.forEach((id) =>\n            promises.push(this.store.findRecord('answer-comment', id))\n          );\n      });\n\n      await all(promises);\n    } catch (err) {\n      // do nothing\n    }\n\n    this.isLoaded = true;\n    this.model = answers;\n  }\n\n  async _getFilters() {\n    const filter = {\n      type: this.type,\n      status: this.statuses,\n      book_id: null,\n      area_id: this.areaFilter?.id || null,\n      content_id: this.contentFilter?.id || null,\n      user_id: this.args.users ? this.args.users : null,\n    };\n\n    if (this.bookFilter) {\n      filter.book_id = this.bookFilter.id;\n    } else {\n      const books = await all(this.args.books.map((x) => x.id));\n\n      if (books.length > 0) {\n        filter.book_id = books.join(',');\n      }\n    }\n\n    if (this.args.inboxMode) {\n      filter.group_key = 'node_id';\n      filter.assignment_types = 'assignments';\n    }\n\n    if (this.assignmentSearch) {\n      filter['assignment_title ilike '] = `%${this.assignmentSearch}%`;\n    }\n\n    if (this.commentStatus === 'commented') {\n      filter['comments'] = true;\n    }\n\n    return filter;\n  }\n\n  @action handlePaginationChange(pageNumber) {\n    this.pageNumber = pageNumber;\n    this._fetchData();\n  }\n\n  @action handleStatusFilter() {\n    this.pageNumber = 1;\n    this._fetchData();\n  }\n\n  @action handleBookFilterChange(bookModel) {\n    this.pageNumber = 1;\n    this.bookFilter = bookModel;\n    this.areaFilter = null;\n    this.contentFilter = null;\n    this._fetchData();\n  }\n\n  @action handleAreaFilterChange(areaModel) {\n    this.pageNumber = 1;\n    this.areaFilter = areaModel;\n    this.contentFilter = null;\n    this._fetchData();\n  }\n\n  @action handleContentFilterChange(contentModel) {\n    this.pageNumber = 1;\n    this.contentFilter = contentModel;\n    this._fetchData();\n  }\n\n  @action toggleFilters() {\n    this.showFilters = !this.showFilters;\n\n    if (this.args.trackAuditEvents) {\n      trackAuditEvent(\n        this.showFilters ? 'Filter - Visa filter' : 'Filter - Dölj filter'\n      );\n    }\n  }\n\n  @action searchAssignments(val) {\n    this.assignmentSearch = val;\n    this._fetchData();\n  }\n\n  @action changeCommentStatus() {\n    this._fetchData();\n  }\n\n  @action markAllAsRead() {\n    if (this.args.trackAuditEvents) {\n      trackAuditEvent('Markera alla i urvalet som granskade');\n    }\n\n    return this._getFilters().then((filter) => {\n      return this.ajax\n        .request(\n          `${config.endpoint}/api/v1/meta/answers/mark-all-as-read`,\n          true,\n          {\n            type: 'GET',\n            data: { filter },\n          }\n        )\n        .then(() => {\n          this.pageNumber = 1;\n          this._fetchData();\n        });\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"flex flex-column bb1\\\">\\n  <div class=\\\"flex nt1 nb1 {{if @answer.entity.isFulfilled \\\"\\\" \\\"dimmed\\\"}}\\\">\\n    {{#if this.hasComments}}\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @disabled={{not @answer.entity.isFulfilled}}\\n        @onClick={{fn @onClick @answer.entity @answer true}}\\n      >\\n        <DcIcon @name=\\\"chat-round\\\" class=\\\"text-muted\\\"/>\\n      </UiButton>\\n    {{else}}\\n      <div class=\\\"n1\\\"></div>\\n    {{/if}}\\n\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      class=\\\"mx1 sb1\\\"\\n      @disabled={{not @answer.entity.isFulfilled}}\\n      @onClick={{fn @onClick @answer.entity @answer}}\\n    >\\n      <AnswerStatusIcon @status={{this.status}} class=\\\"flex flex-center\\\"/>\\n    </UiButton>\\n\\n    <div>\\n      {{#if @answer.entity.isFulfilled}}\\n        <UiButton\\n          class=\\\"flex\\\"\\n          @appearance=\\\"link\\\"\\n          @onClick={{fn @onClick @answer.entity @answer}}\\n        >\\n          {{#unless @answer.entity.hideAssignmentSortNumbers}}\\n            {{#if @answer.entity.sort}}\\n              {{@answer.entity.sort}}.\\n            {{/if}}\\n          {{/unless}}\\n\\n          {{or @answer.entity.header @answer.entity.title @answer.assignment_title}}\\n        </UiButton>\\n\\n        <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n          .. / {{@answer.area.title}} / {{@answer.content.title}}\\n\\n          {{#if this.showTextEdition}}\\n            ({{@answer.collection.category.name}})\\n          {{/if}}\\n        </div>\\n      {{else}}\\n        <div class=\\\"flex text-bold\\\">\\n          {{@answer.assignment_title}}\\n        </div>\\n\\n        <div class=\\\"text-small\\\">{{this.errorMessage}}</div>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\\n\", {\"contents\":\"<div class=\\\"flex flex-column bb1\\\">\\n  <div class=\\\"flex nt1 nb1 {{if @answer.entity.isFulfilled \\\"\\\" \\\"dimmed\\\"}}\\\">\\n    {{#if this.hasComments}}\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @disabled={{not @answer.entity.isFulfilled}}\\n        @onClick={{fn @onClick @answer.entity @answer true}}\\n      >\\n        <DcIcon @name=\\\"chat-round\\\" class=\\\"text-muted\\\"/>\\n      </UiButton>\\n    {{else}}\\n      <div class=\\\"n1\\\"></div>\\n    {{/if}}\\n\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      class=\\\"mx1 sb1\\\"\\n      @disabled={{not @answer.entity.isFulfilled}}\\n      @onClick={{fn @onClick @answer.entity @answer}}\\n    >\\n      <AnswerStatusIcon @status={{this.status}} class=\\\"flex flex-center\\\"/>\\n    </UiButton>\\n\\n    <div>\\n      {{#if @answer.entity.isFulfilled}}\\n        <UiButton\\n          class=\\\"flex\\\"\\n          @appearance=\\\"link\\\"\\n          @onClick={{fn @onClick @answer.entity @answer}}\\n        >\\n          {{#unless @answer.entity.hideAssignmentSortNumbers}}\\n            {{#if @answer.entity.sort}}\\n              {{@answer.entity.sort}}.\\n            {{/if}}\\n          {{/unless}}\\n\\n          {{or @answer.entity.header @answer.entity.title @answer.assignment_title}}\\n        </UiButton>\\n\\n        <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n          .. / {{@answer.area.title}} / {{@answer.content.title}}\\n\\n          {{#if this.showTextEdition}}\\n            ({{@answer.collection.category.name}})\\n          {{/if}}\\n        </div>\\n      {{else}}\\n        <div class=\\\"flex text-bold\\\">\\n          {{@answer.assignment_title}}\\n        </div>\\n\\n        <div class=\\\"text-small\\\">{{this.errorMessage}}</div>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\\n\",\"moduleName\":\"babel/components/answer-log/standard-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/standard-list/item/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogStandardListItemComponent extends Component {\n  /**\n   * Arguments:\n   * answer (object)\n   * onClick (function)\n   */\n\n  @service intl;\n\n  get errorMessage() {\n    const errorCode =\n      this.args.answer?.entity?.reason?.errors?.firstObject?.status;\n\n    if (errorCode === 404) {\n      return this.intl.t('components.answerLog.results.entityMissing');\n    } else if (errorCode === 403) {\n      return this.intl.t('components.answerLog.results.entityFailed');\n    }\n\n    return null;\n  }\n\n  @cached get originalAnswerProxy() {\n    const answer = this.args.answer;\n\n    let promise;\n\n    if (!answer) {\n      promise = resolve();\n    } else if (answer.belongsTo('originalAnswer').id() === null) {\n      promise = resolve(answer);\n    } else {\n      promise = resolve(answer.originalAnswer);\n    }\n\n    promise = promise.then((answer) => {\n      if (answer) {\n        return all([resolve(answer.comments), resolve(answer.versions)]).then(\n          () => answer\n        );\n      }\n\n      return answer;\n    });\n\n    return load(promise, this);\n  }\n\n  get originalAnswer() {\n    return this.originalAnswerProxy.isResolved\n      ? this.originalAnswerProxy.value\n      : null;\n  }\n\n  get status() {\n    const answer = this.originalAnswer;\n\n    if (!answer) {\n      return null;\n    }\n\n    if (answer.status === 'started') {\n      return answer.status;\n    }\n\n    const versions = answer.versions;\n\n    if (!versions || versions.length === 0) {\n      return answer.status;\n    }\n\n    const sorted = versions.sortBy('created');\n\n    return sorted.pop().computedStatus;\n  }\n\n  get hasComments() {\n    if (\n      this.originalAnswer?.comments?.filter(\n        (x) => !x.isDeleted && x.public === true\n      )?.length > 0\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  @cached get contentProxy() {\n    return load(resolve(this.args.answer.content), this);\n  }\n\n  get content() {\n    return this.contentProxy.isResolved ? this.contentProxy.value : null;\n  }\n\n  get showTextEdition() {\n    return this.content?.metadata?.sort?.entities?.categories?.length > 1;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.entity}}\\n  {{#if @multipleUsers}}\\n    <div class=\\\"bb1\\\">\\n      <div class=\\\"flex nt1 nb1 justify-space-between\\\">\\n        <div class=\\\"flex\\\">\\n          <div>\\n            <UiButton\\n              class=\\\"flex nb1\\\"\\n              @appearance=\\\"link\\\"\\n              @onClick={{fn @onClick this.entity @answers}}\\n            >\\n              {{this.entity.title}}\\n            </UiButton>\\n\\n            <div class=\\\"flex flex-center\\\">\\n              <DcIcon @name=\\\"group\\\" class=\\\"nr1\\\"/>\\n\\n              <div class=\\\"answer-log-path text-muted text-muted text-separator text-small mr1\\\">\\n                {{~t \\\"components.answerLog.results.numStudentsAnswered\\\" num=this.numStudentsAnswered~}}\\n              </div>\\n\\n              <div class=\\\"answer-log-path text-muted text-separator text-small\\\">.. /\\n                {{this.area.title}} / {{this.content.title~}}\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n\\n        <div class=\\\"flex flex-center text-small\\\">\\n          {{this.answer.teacherAssignment.user.showname}}\\n        </div>\\n      </div>\\n    </div>\\n  {{else}}\\n    <AnswerLog::TeacherAssignmentList::Item\\n      @answer={{this.answer}}\\n      @onClick={{@onClick}}\\n    />\\n  {{/if}}\\n{{/if}}\\n\", {\"contents\":\"{{#if this.entity}}\\n  {{#if @multipleUsers}}\\n    <div class=\\\"bb1\\\">\\n      <div class=\\\"flex nt1 nb1 justify-space-between\\\">\\n        <div class=\\\"flex\\\">\\n          <div>\\n            <UiButton\\n              class=\\\"flex nb1\\\"\\n              @appearance=\\\"link\\\"\\n              @onClick={{fn @onClick this.entity @answers}}\\n            >\\n              {{this.entity.title}}\\n            </UiButton>\\n\\n            <div class=\\\"flex flex-center\\\">\\n              <DcIcon @name=\\\"group\\\" class=\\\"nr1\\\"/>\\n\\n              <div class=\\\"answer-log-path text-muted text-muted text-separator text-small mr1\\\">\\n                {{~t \\\"components.answerLog.results.numStudentsAnswered\\\" num=this.numStudentsAnswered~}}\\n              </div>\\n\\n              <div class=\\\"answer-log-path text-muted text-separator text-small\\\">.. /\\n                {{this.area.title}} / {{this.content.title~}}\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n\\n        <div class=\\\"flex flex-center text-small\\\">\\n          {{this.answer.teacherAssignment.user.showname}}\\n        </div>\\n      </div>\\n    </div>\\n  {{else}}\\n    <AnswerLog::TeacherAssignmentList::Item\\n      @answer={{this.answer}}\\n      @onClick={{@onClick}}\\n    />\\n  {{/if}}\\n{{/if}}\\n\",\"moduleName\":\"babel/components/answer-log/teacher-assignment-list/exercise/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/teacher-assignment-list/exercise/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { getLatestVersion } from 'babel/utils/get-answer';\nimport { resolvePathForTeacherAssignmentAnswer } from 'babel/utils/resolve-path-for-teacher-assignment-answer';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogTeacherAssignmentListExerciseComponent extends Component {\n  /**\n   * Arguments:\n   * answers (array)\n   * books (array)\n   * multipleUsers (bool)\n   * onClick (function)\n   */\n\n  @service store;\n\n  @cached get proxy() {\n    let promise = resolve();\n\n    const answer = this.args.answers?.firstObject;\n\n    if (answer) {\n      promise = resolvePathForTeacherAssignmentAnswer(answer, this.args.books);\n    }\n\n    return load(promise, this);\n  }\n\n  get entity() {\n    return this.proxy.isResolved ? this.proxy.value?.entity : null;\n  }\n\n  get content() {\n    return this.proxy.isResolved ? this.proxy.value?.content : null;\n  }\n\n  get area() {\n    return this.proxy.isResolved ? this.proxy.value?.area : null;\n  }\n\n  @cached get answer() {\n    return getLatestVersion(this.entity, this.args.answers);\n  }\n\n  @cached get answerUsersProxy() {\n    let promise = resolve();\n\n    if (this.args.answers?.length > 0) {\n      promise = all(this.args.answers.map((x) => resolve(x.user)));\n    }\n\n    return load(promise, this);\n  }\n\n  get numStudentsAnswered() {\n    const users = this.answerUsersProxy.isResolved\n      ? this.answerUsersProxy.value\n      : null;\n\n    return (\n      users\n        ?.map((x) => x.id)\n        ?.filter((val, idx, self) => self.indexOf(val) === idx).length || 0\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div {{did-update this._fetchData @users}}>\\n  <div class=\\\"standard-list-filter-message\\\">\\n    <span class=\\\"text-ui\\\">{{t \\\"components.answerLog.filterShowing\\\"}}</span>\\n    {{this.filterString}}\\n  </div>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    {{#if @inboxMode}}\\n      <UiButton\\n        @onClick={{this.markAllAsRead}}\\n        @appearance=\\\"link\\\"\\n        @size=\\\"small\\\"\\n        @variant=\\\"error\\\"\\n        class=\\\"text-base\\\"\\n      >\\n        {{t \\\"components.answerLog.markAllAsRead\\\"}}\\n      </UiButton>\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.isLoaded}}\\n    {{#each this.groupedAnswers as |answers|}}\\n      <div class=\\\"text-tertiary mt1 mb1\\\">{{answers.createdDate}}</div>\\n\\n      {{#each answers.content as |answer|}}\\n        {{#if @inboxMode}}\\n          <AnswerLog::TeacherAssignmentList::Exercise\\n            @answers={{answer.content}}\\n            @books={{@books}}\\n            @multipleUsers={{this.multipleUsers}}\\n            @onClick={{@onSelect}}\\n          />\\n        {{else}}\\n          {{#each answer.content as |a|}}\\n            <AnswerLog::TeacherAssignmentList::Item\\n              @answer={{a}}\\n              @books={{@books}}\\n              @onClick={{@onSelect}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/each}}\\n    {{/each}}\\n\\n    {{#if this.noResults}}\\n      <XAlert class=\\\"mt1\\\">\\n        {{t \\\"components.answerLog.teacherAssignment.noResults\\\"}}\\n      </XAlert>\\n    {{/if}}\\n  {{else}}\\n    <DcLoader class=\\\"mt5\\\" />\\n  {{/if}}\\n\\n  {{#if (gt this.model.meta.totalPages 1)}}\\n    <div class=\\\"flex justify-center mt2\\\">\\n      <XPagination\\n        @routed={{false}}\\n        @page={{this.pageNumber}}\\n        @showFirstLast={{false}}\\n        @totalPages={{this.model.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    </div>\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div {{did-update this._fetchData @users}}>\\n  <div class=\\\"standard-list-filter-message\\\">\\n    <span class=\\\"text-ui\\\">{{t \\\"components.answerLog.filterShowing\\\"}}</span>\\n    {{this.filterString}}\\n  </div>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    {{#if @inboxMode}}\\n      <UiButton\\n        @onClick={{this.markAllAsRead}}\\n        @appearance=\\\"link\\\"\\n        @size=\\\"small\\\"\\n        @variant=\\\"error\\\"\\n        class=\\\"text-base\\\"\\n      >\\n        {{t \\\"components.answerLog.markAllAsRead\\\"}}\\n      </UiButton>\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.isLoaded}}\\n    {{#each this.groupedAnswers as |answers|}}\\n      <div class=\\\"text-tertiary mt1 mb1\\\">{{answers.createdDate}}</div>\\n\\n      {{#each answers.content as |answer|}}\\n        {{#if @inboxMode}}\\n          <AnswerLog::TeacherAssignmentList::Exercise\\n            @answers={{answer.content}}\\n            @books={{@books}}\\n            @multipleUsers={{this.multipleUsers}}\\n            @onClick={{@onSelect}}\\n          />\\n        {{else}}\\n          {{#each answer.content as |a|}}\\n            <AnswerLog::TeacherAssignmentList::Item\\n              @answer={{a}}\\n              @books={{@books}}\\n              @onClick={{@onSelect}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/each}}\\n    {{/each}}\\n\\n    {{#if this.noResults}}\\n      <XAlert class=\\\"mt1\\\">\\n        {{t \\\"components.answerLog.teacherAssignment.noResults\\\"}}\\n      </XAlert>\\n    {{/if}}\\n  {{else}}\\n    <DcLoader class=\\\"mt5\\\" />\\n  {{/if}}\\n\\n  {{#if (gt this.model.meta.totalPages 1)}}\\n    <div class=\\\"flex justify-center mt2\\\">\\n      <XPagination\\n        @routed={{false}}\\n        @page={{this.pageNumber}}\\n        @showFirstLast={{false}}\\n        @totalPages={{this.model.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    </div>\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/answer-log/teacher-assignment-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/teacher-assignment-list/index.hbs\"}});\nimport { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogTeacherAssignmentListComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   * books (array)\n   * users (array)\n   * inboxMode (bool)\n   * onSelect (function)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._fetchData();\n  }\n\n  @service store;\n\n  @service ajax;\n\n  @service session;\n\n  @service intl;\n\n  @tracked isLoaded = false;\n\n  @tracked model;\n\n  @tracked pageNumber = 1;\n\n  @tracked assignmentSearch = null;\n\n  limit = 10;\n\n  type = 'teacher_assignment';\n\n  get filterString() {\n    const assignmentSearch = this.assignmentSearch;\n    const inboxMode = this.args.inboxMode;\n\n    return htmlSafe(\n      this.intl.t('components.answerLog.filterString', {\n        numStatuses: inboxMode ? 1 : 7,\n        lastStatus: inboxMode\n          ? `<strong>${this.intl.t(\n              'components.answerLog.standard.filters.turnedIn'\n            )}</strong>`\n          : null,\n        otherStatuses: null,\n        selectedContent: null,\n        assignmentSearch:\n          assignmentSearch && assignmentSearch !== ''\n            ? `<em>${assignmentSearch}</em>`\n            : null,\n        commentStatus: null,\n      })\n    );\n  }\n\n  get multipleUsers() {\n    return this.args.users?.length > 1;\n  }\n\n  get noResults() {\n    return !this.model || this.model.length === 0;\n  }\n\n  @cached get groupedAnswers() {\n    const grouped = A();\n    let key = this.args.inboxMode ? 'teacher_assignment_id' : 'id';\n\n    this.model?.forEach((item) => {\n      const val = this.args.inboxMode\n        ? item?.teacherAssignment?.get('id')\n        : item[key];\n\n      if (!grouped.findBy(key, val)) {\n        grouped.addObject({\n          [key]: val,\n          content: A(),\n          createdDate: item.createdDate,\n        });\n      }\n\n      grouped.findBy(key, val).content.addObject(item);\n    });\n\n    const result = A();\n    key = 'createdDate';\n\n    grouped.forEach((item) => {\n      const val = item[key];\n\n      if (!result.findBy(key, val)) {\n        result.addObject({\n          [key]: val,\n          content: A(),\n        });\n      }\n\n      result.findBy(key, val).content.addObject(item);\n    });\n\n    return result;\n  }\n\n  @action async _fetchData() {\n    this.isLoaded = false;\n\n    const model = [];\n\n    try {\n      const filter = await this._getFilters();\n\n      if (filter.teacher_assignment_id.length > 0) {\n        const answers = await this.store.query('answer', {\n          page: { size: this.limit, number: this.pageNumber },\n          order: [\n            { field: 'updated', direction: 'DESC' },\n            { field: 'created', direction: 'DESC' },\n          ],\n          filter,\n        });\n\n        await all(\n          answers.map((answer) =>\n            resolve(answer.content)\n              .then(() => model.push(answer))\n              .catch(() => {})\n          )\n        );\n      }\n    } catch (err) {\n      // do nothing\n    }\n\n    this.model = model;\n    this.isLoaded = true;\n  }\n\n  async _getFilters() {\n    const filter = {\n      type: this.type,\n      user_id: null,\n      group_key: this.args.inboxMode ? 'teacher_assignment_id' : false,\n      'status <>': 'not-started',\n    };\n\n    const books = await resolve(this.args.books);\n\n    if (this.args.users) {\n      filter.user_id = this.args.users;\n    }\n\n    if (this.assignmentSearch) {\n      filter['assignment_title ilike '] = `%${this.assignmentSearch}%`;\n    }\n\n    const course = this.args.course;\n\n    let teachers;\n\n    if (course) {\n      teachers = await resolve(course.teachers);\n    } else if (this.session?.user?.isTeacher) {\n      teachers = [this.session.user];\n    } else {\n      filter.teacher_assignment_id = [];\n      return filter;\n    }\n\n    const teacherIds = teachers.map((teacher) => teacher.id);\n    const teacherAssignments = await this.store.findAll('teacher-assignment');\n    const matchingTeacherAssignments = A();\n\n    await all(teacherAssignments.map((x) => resolve(x.books)));\n\n    teacherAssignments.forEach((teacherAssignment) => {\n      let validBook = false;\n\n      if (books.length > 0) {\n        books.forEach((book) => {\n          if (teacherAssignment.hasBook(book)) validBook = true;\n        });\n      } else {\n        validBook = true;\n      }\n\n      let validTeacher = false;\n\n      if (teachers) {\n        if (teacherIds.includes(teacherAssignment.userId)) {\n          validTeacher = true;\n        }\n      } else {\n        validTeacher = false;\n      }\n\n      if (validBook && validTeacher) {\n        matchingTeacherAssignments.addObject(teacherAssignment);\n      }\n    });\n\n    filter.teacher_assignment_id = matchingTeacherAssignments.map((x) => x.id);\n\n    return filter;\n  }\n\n  @action handlePaginationChange(pageNumber) {\n    this.pageNumber = pageNumber;\n    this._fetchData();\n  }\n\n  @action searchAssignments(val) {\n    this.assignmentSearch = val;\n    this._fetchData();\n  }\n\n  @action markAllAsRead() {\n    if (this.args.trackAuditEvents) {\n      trackAuditEvent('Markera alla i urvalet som granskade');\n    }\n\n    return this._getFilters().then((filter) => {\n      return this.ajax\n        .request(\n          `${config.endpoint}/api/v1/meta/answers/mark-all-as-read`,\n          true,\n          {\n            type: 'GET',\n            data: { filter: filter },\n          }\n        )\n        .then(() => {\n          this.pageNumber = 1;\n          this._fetchData();\n        });\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.entity}}\\n  <div class=\\\"bb1\\\">\\n    <div class=\\\"flex nt1 nb1 justify-space-between\\\">\\n      <div class=\\\"flex\\\">\\n        {{#if this.hasComments}}\\n          <UiButton\\n            @disabled={{this.answer.isNew}}\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity this.answer true}}\\n          >\\n            <DcIcon @name=\\\"chat-round\\\" class=\\\"text-muted\\\"/>\\n          </UiButton>\\n        {{else}}\\n          <div class=\\\"n1\\\"></div>\\n        {{/if}}\\n\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          class=\\\"mx1 snb1\\\"\\n          @onClick={{fn @onClick this.entity this.answer}}\\n        >\\n          <AnswerStatusIcon @status={{this.status}} class=\\\"flex flex-center\\\"/>\\n        </UiButton>\\n\\n        <div>\\n          <UiButton\\n            class=\\\"snb1\\\"\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity this.answer}}\\n          >\\n            {{this.entity.title}}\\n          </UiButton>\\n\\n          <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n            .. / {{this.area.title}} / {{this.content.title}}\\n          </div>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"flex flex-center\\\">\\n        {{this.answer.teacherAssignment.user.showname}}\\n      </div>\\n    </div>\\n  </div>\\n{{/if}}\\n\", {\"contents\":\"{{#if this.entity}}\\n  <div class=\\\"bb1\\\">\\n    <div class=\\\"flex nt1 nb1 justify-space-between\\\">\\n      <div class=\\\"flex\\\">\\n        {{#if this.hasComments}}\\n          <UiButton\\n            @disabled={{this.answer.isNew}}\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity this.answer true}}\\n          >\\n            <DcIcon @name=\\\"chat-round\\\" class=\\\"text-muted\\\"/>\\n          </UiButton>\\n        {{else}}\\n          <div class=\\\"n1\\\"></div>\\n        {{/if}}\\n\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          class=\\\"mx1 snb1\\\"\\n          @onClick={{fn @onClick this.entity this.answer}}\\n        >\\n          <AnswerStatusIcon @status={{this.status}} class=\\\"flex flex-center\\\"/>\\n        </UiButton>\\n\\n        <div>\\n          <UiButton\\n            class=\\\"snb1\\\"\\n            @appearance=\\\"link\\\"\\n            @onClick={{fn @onClick this.entity this.answer}}\\n          >\\n            {{this.entity.title}}\\n          </UiButton>\\n\\n          <div class=\\\"answer-log-path text-muted text-separator text-small\\\">\\n            .. / {{this.area.title}} / {{this.content.title}}\\n          </div>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"flex flex-center\\\">\\n        {{this.answer.teacherAssignment.user.showname}}\\n      </div>\\n    </div>\\n  </div>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/answer-log/teacher-assignment-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-log/teacher-assignment-list/item/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { resolvePathForTeacherAssignmentAnswer } from 'babel/utils/resolve-path-for-teacher-assignment-answer';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class AnswerLogTeacherAssignmentListItemComponent extends Component {\n  /**\n   * Arguments:\n   * answer (object)\n   * books (array)\n   * onClick (function)\n   */\n\n  @service store;\n\n  @cached get answerProxy() {\n    return load(resolve(this.args.answer), this);\n  }\n\n  get answer() {\n    return this.answerProxy.isResolved ? this.answerProxy.value : null;\n  }\n\n  @cached get originalAnswerProxy() {\n    const answer = this.answer;\n\n    let promise;\n\n    if (!answer) {\n      promise = resolve();\n    } else if (answer.belongsTo('originalAnswer').id() === null) {\n      promise = resolve(answer);\n    } else {\n      promise = resolve(answer.originalAnswer);\n    }\n\n    promise = promise.then((answer) => {\n      if (answer) {\n        return all([resolve(answer.comments), resolve(answer.versions)]).then(\n          () => answer\n        );\n      }\n\n      return answer;\n    });\n\n    return load(promise, this);\n  }\n\n  get originalAnswer() {\n    return this.originalAnswerProxy.isResolved\n      ? this.originalAnswerProxy.value\n      : null;\n  }\n\n  @cached get proxy() {\n    let promise = resolve();\n\n    if (this.originalAnswer) {\n      promise = resolvePathForTeacherAssignmentAnswer(\n        this.originalAnswer,\n        this.args.books\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get entity() {\n    return this.proxy.isResolved ? this.proxy.value?.entity : null;\n  }\n\n  get content() {\n    return this.proxy.isResolved ? this.proxy.value?.content : null;\n  }\n\n  get area() {\n    return this.proxy.isResolved ? this.proxy.value?.area : null;\n  }\n\n  get status() {\n    const answer = this.originalAnswer;\n\n    if (!answer) {\n      return null;\n    }\n\n    if (answer.status === 'started') {\n      return answer.status;\n    }\n\n    const versions = answer.versions;\n\n    if (!versions || versions.length === 0) {\n      return answer.status;\n    }\n\n    const sorted = versions.sortBy('created');\n\n    return sorted.pop().computedStatus;\n  }\n\n  get hasComments() {\n    const answer = this.originalAnswer;\n\n    if (\n      answer?.comments?.filter((x) => !x.isDeleted && x.public === true)\n        ?.length > 0\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcIcon\\n  @size=\\\"lg\\\"\\n  @name={{this.iconName}}\\n  id={{this.id}}\\n  class={{this.classNames}}\\n  data-test-answer-status-icon\\n  ...attributes\\n/>\\n\\n{{~trim~}}\\n\\n<XTooltip @for={{this.id}}>{{this.statusText}}</XTooltip>\\n\\n{{~trim~}}\\n\", {\"contents\":\"<DcIcon\\n  @size=\\\"lg\\\"\\n  @name={{this.iconName}}\\n  id={{this.id}}\\n  class={{this.classNames}}\\n  data-test-answer-status-icon\\n  ...attributes\\n/>\\n\\n{{~trim~}}\\n\\n<XTooltip @for={{this.id}}>{{this.statusText}}</XTooltip>\\n\\n{{~trim~}}\\n\",\"moduleName\":\"babel/components/answer-status-icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/answer-status-icon/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport Component from '@glimmer/component';\nimport generateId from 'compton/utils/generate-id';\n\nexport default class AnswerStatusIconComponent extends Component {\n  /**\n   * Arguments:\n   * status (string)\n   */\n\n  @service intl;\n\n  get id() {\n    return generateId('answer-status-icon');\n  }\n\n  get iconName() {\n    return `assignment-${this.args.status}`;\n  }\n\n  get classNames() {\n    return `answer-status-icon status-icon status-icon--${this.args.status}`;\n  }\n\n  get statusText() {\n    return this.intl.t(\n      `components.answerStatusIcon.exercise.status.${camelize(\n        this.args.status\n      )}`\n    );\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ArchiveFormComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * routed (bool)\n   * cancelRouteParams (array)\n   * onUnlink (function)\n   * onDelete (function)\n   * onCancel (function)\n   * onSave (function)\n   */\n\n  @service router;\n\n  @action onCancel() {\n    if (this.args.routed) {\n      return this.router.transitionTo(...this.args.cancelRouteParams);\n    }\n\n    return this.args.onCancel?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<UiFormFor\\n  @object={{@model}}\\n  @validate={{true}}\\n  @onSubmit={{@onSave}}\\n  as |Form|\\n>\\n  {{yield Form}}\\n\\n  <div class=\\\"flex justify-{{if @model.isNew \\\"flex-end\\\" \\\"space-between\\\"}} flex-center mt2\\\">\\n    {{#unless @model.isNew}}\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @variant=\\\"error\\\"\\n        @onClick={{@onDelete}}\\n      >\\n        {{t \\\"components.archiveForm.deleteButtonLabel\\\"}}\\n      </UiButton>\\n    {{/unless}}\\n\\n    <div class=\\\"flex flex-center\\\">\\n      <UiButton\\n        class=\\\"nr1 text-color-default\\\"\\n        @variant=\\\"alternative\\\"\\n        @onClick={{this.onCancel}}\\n      >\\n        {{t \\\"components.archiveForm.cancelLinkOrButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <Form.submit @variant=\\\"default\\\">\\n        {{t \\\"components.archiveForm.saveButtonLabel\\\"}}\\n      </Form.submit>\\n    </div>\\n  </div>\\n</UiFormFor>\\n', { moduleName: 'babel/components/archive-form/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport sortBy from 'babel/utils/sort-by';\nimport { task } from 'ember-concurrency';\n// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport DS from 'ember-data';\n\nconst { PromiseArray } = DS;\n\nexport default Component.extend({\n  // SETUP\n\n  intl: service(),\n\n  router: service(),\n\n  store: service(),\n\n  classNames: ['archive-view'],\n\n  // INTERNAL PROPERTIES\n\n  implicitSearchResults: null,\n\n  isLoading: false,\n\n  isLoadingImplicit: false,\n\n  searchResults: null,\n\n  searchVal: null,\n\n  searchValue: '',\n\n  sortValue: null,\n\n  // EXTERNAL PROPERTIES\n\n  archive: null,\n\n  folder: null,\n\n  materials: null,\n\n  init() {\n    this._super(...arguments);\n    this.set('sortValue', 'standard');\n  },\n\n  // COMPUTED PROPERTIES\n\n  noResults: computed('searchValue', 'searchResults', 'isLoading', function () {\n    return (\n      this.get('searchValue.length') > 0 &&\n      this.get('searchResults.length') === 0 &&\n      !this.get('isLoading')\n    );\n  }),\n\n  showSearchBar: computed('archive.body.show_search_field', function () {\n    return this.get('archive.body.show_search_field') !== false;\n  }),\n\n  isPaginated: computed('archive.body.show_pagination', function () {\n    return this.get('archive.body.show_pagination') === true;\n  }),\n\n  hasFilters: computed('archive.body.show_filters', function () {\n    return this.get('archive.body.show_filters') === true;\n  }),\n\n  hasOrder: computed('archive.body.show_order', function () {\n    return this.get('archive.body.show_order') === true;\n  }),\n\n  hasRandom: computed('archive.body.show_random', function () {\n    return this.get('archive.body.show_random') === true;\n  }),\n\n  hasCategorySelect: computed(\n    'hasFilters',\n    'archive.children.length',\n    function () {\n      if (!this.get('hasFilters')) return false;\n      if (this.get('archive.children.length') < 2) return false;\n\n      return true;\n    }\n  ),\n\n  hasSortSelect: computed('hasOrder', 'archive.body.show_titles', function () {\n    if (!this.get('hasOrder')) return false;\n    if (this.get('archive.body.show_titles') === false) return false;\n\n    return true;\n  }),\n\n  categoryOptions: computed(\n    'hasCategorySelect',\n    'archive.children.[]',\n    function () {\n      if (!this.get('hasCategorySelect')) return [];\n\n      const options = this.get('archive.children').map((x) => {\n        return { label: x.get('title'), value: x.get('id') };\n      });\n\n      options.unshift({\n        label: this.get('intl').t('components.archiveView.allCategories'),\n        value: null,\n      });\n\n      return options;\n    }\n  ),\n\n  sortOptions: computed('hasSortSelect', function () {\n    if (!this.get('hasSortSelect')) return [];\n\n    return [\n      {\n        label: this.get('intl').t('components.archiveView.sort.standard'),\n        value: 'standard',\n      },\n      {\n        label: this.get('intl').t('components.archiveView.sort.name_asc'),\n        value: 'name_asc',\n      },\n      {\n        label: this.get('intl').t('components.archiveView.sort.name_desc'),\n        value: 'name_desc',\n      },\n    ];\n  }),\n\n  folderId: computed('folder.id', {\n    get() {\n      return this.get('folder.id') ? this.get('folder.id') : null;\n    },\n    set(key, val) {\n      if (!val) {\n        this.get('router').transitionTo(\n          'master.archives',\n          this.get('archive.id'),\n          { queryParams: { page: 1 } }\n        );\n      } else {\n        this.get('router').transitionTo('master.archives.folders', val, {\n          queryParams: { page: 1 },\n        });\n      }\n\n      return val;\n    },\n  }),\n\n  sortedCategories: computed(\n    'archive.{body.archive_sort,children.[]}',\n    function () {\n      let sort = this.get('archive.body.archive_sort');\n\n      if (sort) {\n        if (sort === 'name_asc') sort = 'title_asc';\n        else if (sort === 'name_desc') sort = 'title_desc';\n\n        return sortBy(this.get('archive.children'), sort);\n      } else {\n        return this.get('archive.children');\n      }\n    }\n  ),\n\n  // PRIVATE METHODS\n\n  _search() {\n    this.set('isLoading', true);\n    this.set('pageNumber', 1);\n\n    return this.get('store')\n      .query('material', {\n        entity_id: this.get('archive.id'),\n        search: this.get('searchValue'),\n        action: 'explicit',\n      })\n      .then((hits) => {\n        const folders = this.get('archive.children');\n\n        if (folders) {\n          hits.forEach((hit) => {\n            folders.forEach((folder) => {\n              if (folder.get('materials').indexOf(hit) !== -1) {\n                hit.set('folder', folder);\n              }\n            });\n          });\n        }\n\n        if (hits.get('length') === 0) {\n          this.set('isLoadingImplicit', true);\n          this.set('searchResults', []);\n\n          this.get('store')\n            .query('material', {\n              entity_id: this.get('archive.id'),\n              search: this.get('searchValue'),\n              action: 'implicit',\n            })\n            .then((hits) => {\n              this.set('implicitSearchResults', hits.sortBy('rank').reverse());\n              this.set('isLoadingImplicit', false);\n              this.set('isLoading', false);\n            });\n        } else {\n          this.set('implicitSearchResults', null);\n          this.set('searchResults', hits.sortBy('rank').reverse());\n          this.set('isLoading', false);\n        }\n      });\n  },\n\n  // TASKS\n\n  search: task(function* () {\n    yield this._search();\n  }).keepLatest(),\n\n  doSearch: task(function* () {\n    const searchVal = this.get('searchVal');\n    const searchValue = this.get('searchValue');\n\n    if (searchValue === searchVal) {\n      return;\n    }\n\n    this.set('searchValue', searchVal);\n\n    this.set('isLoading', true);\n\n    if (this.get('folder')) {\n      this.get('router').transitionTo('nodes', this.get('archive'));\n    }\n\n    yield this.get('search').perform();\n  }).restartable(),\n\n  // ACTIONS\n\n  actions: {\n    openRandom() {\n      const materials = this.get('materials');\n\n      if (materials && materials.length > 0) {\n        const rand = Math.floor(Math.random() * materials.length);\n        const material = materials.objectAt(rand);\n        const materialId = material.get('id');\n        const folderId = this.get('folder')\n          ? this.get('folder.id')\n          : material.get('folder.id');\n        const archiveId = this.get('archive.id');\n\n        return this.get('router').transitionTo(\n          'master.archives.folders.materials',\n          archiveId,\n          folderId,\n          materialId\n        );\n      }\n    },\n    changeSortValue(value) {\n      this.set('sortValue', value);\n    },\n  },\n});\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport pagedArray from 'babel/utils/paged-array';\nimport shuffle from 'compton/utils/array-shuffle';\n\nexport default class ArchiveViewFolderViewComponent extends Component {\n  /**\n   * Arguments:\n   * archive (object)\n   * folder (object)\n   * materials (array)\n   * perPage (number)\n   * pageNumber (number)\n   * sortValue (string)\n   * onPageChange (function)\n   */\n\n  @service router;\n\n  @service routerScroll;\n\n  get perPage() {\n    return this.args.perPage || 24;\n  }\n\n  get isGridView() {\n    return this.args.archive?.template === 'grid';\n  }\n\n  get folderId() {\n    return this.args.folder?.id;\n  }\n\n  get showTitles() {\n    return this.args.archive?.body?.show_titles !== false ? true : false;\n  }\n\n  get sort() {\n    if (this.args.sortValue === 'standard') {\n      return this.args.archive?.body?.archive_sort;\n    }\n\n    return this.args.sortValue;\n  }\n\n  @cached get sortedMaterials() {\n    const materials = this.args.materials;\n    const items = this.args.folder?.body?.items;\n    const sort = this.sort;\n    const comp = materials.mapBy('id');\n\n    const arr = (\n      items\n        ? items.map((id) => {\n            const index = comp.indexOf(id);\n\n            if (index !== -1) {\n              return materials.objectAt(index);\n            }\n\n            return null;\n          })\n        : materials.slice()\n    )\n      .compact()\n      .uniqBy('id');\n\n    switch (sort) {\n      case 'inverse':\n        return arr;\n      case 'random':\n        return shuffle(arr);\n      case 'name_desc':\n      case 'title_desc':\n        return arr.sortBy('name').reverse();\n      case 'name_asc':\n      case 'title_asc':\n        return arr.sortBy('name');\n      case 'date_desc':\n        return arr.sortBy('created').reverse();\n      case 'date_asc':\n        return arr.sortBy('created');\n      default:\n        return arr.reverse();\n    }\n  }\n\n  get pagedMaterials() {\n    return pagedArray({\n      content: this.sortedMaterials,\n      perPage: this.perPage,\n      page: this.args.pageNumber,\n    });\n  }\n\n  get totalPages() {\n    return this.pagedMaterials?.totalPages || 1;\n  }\n\n  @action openMaterial(material, evt) {\n    evt?.preventDefault?.();\n\n    this.routerScroll.preserveScrollPosition = true;\n\n    const returnUrl = this.router.currentURL;\n\n    return this.router\n      .transitionTo(\n        'master.archives.folders.materials',\n        this.args.archive.id,\n        this.folderId || material.folder.id,\n        material.id,\n        {\n          queryParams: { 'return-url': returnUrl },\n        }\n      )\n      .then(() => {\n        later(\n          this,\n          () => {\n            this.routerScroll.preserveScrollPosition = false;\n          },\n          100\n        );\n      });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"folder-view\\\" ...attributes>\\n  {{#if this.isGridView}}\\n    <div class=\\\"grid\\\">\\n      {{#each this.pagedMaterials as |material|}}\\n        <div class=\\\"col-3 col-sm-6 col-xs-12 flex cursor-pointer\\\">\\n          <a\\n            href=\\\"#\\\"\\n            class=\\\"flex-auto\\\"\\n            data-test-archive-folder-material-link\\n            {{on \\\"click\\\" (fn this.openMaterial material)}}\\n          >\\n            <ImageCard\\n              @image={{image-source material.imageURL preset=\\\"small\\\"}}\\n              @backgroundColor={{material.backgroundColor}}\\n              @title={{if this.showTitles material.name}}\\n            />\\n          </a>\\n        </div>\\n      {{/each}}\\n    </div>\\n  {{else}}\\n    {{#each this.pagedMaterials as |material|}}\\n      <div class=\\\"nt1 mb1\\\">\\n        <UiButton\\n          @appearance=\\\"none\\\"\\n          @onClick={{fn this.openMaterial material}}\\n          class=\\\"inline-block\\\"\\n        >\\n          {{material.name}}\\n\\n          {{#if (eq material.type \\\"links\\\")}}\\n            <DcIcon @name=\\\"share\\\" @size=\\\"sm\\\" class=\\\"nl1\\\" />\\n          {{/if}}\\n        </UiButton>\\n\\n        {{#if material.metadata.description}}\\n          <p>{{material.metadata.description}}</p>\\n        {{/if}}\\n      </div>\\n    {{/each}}\\n  {{/if}}\\n\\n  {{#if (gt this.totalPages 1)}}\\n    <div class=\\\"mb2 flex justify-center\\\">\\n      <XPagination\\n        @routed={{false}}\\n        @page={{@pageNumber}}\\n        @showFirstLast={{false}}\\n        @totalPages={{this.totalPages}}\\n        @onChange={{@onPageChange}}\\n      />\\n    </div>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/archive-view/folder-view/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.archive.parent.title}}\\n{{page-title this.archive.title}}\\n\\n<div class=\\\"container\\\">\\n\\n  <div class=\\\"flex flex-center mt6 mb1\\\">\\n    <ContentMeta\\n      @taxonomy={{this.archive}}\\n      @model={{this.archive}}\\n    />\\n  </div>\\n\\n  <h1 class=\\\"content-title\\\">\\n\\n    {{this.archive.title}}\\n\\n  </h1>\\n\\n  {{content/c-preamble value=this.archive.body.preamble class=\\\"mt1\\\"}}\\n\\n  {{model-rejection archive=this.archive}}\\n  {{model-rejection archive=this.archive.children}}\\n\\n  {{#if this.showSearchBar}}\\n\\n    {{search-bar\\n      clearable=true\\n      placeholder=(t \\\"components.archiveView.search.placeholder\\\")\\n      value=this.searchVal\\n      onClear=(action (perform this.doSearch))\\n      onEnter=(action (perform this.doSearch))\\n      onClick=(action (perform this.doSearch))\\n      class=\\\"my2\\\"\\n    }}\\n\\n  {{/if}}\\n\\n  {{#if this.searchValue}}\\n\\n    {{#if this.isLoading}}\\n\\n      <DcLoader class=\\\"archive-search-loader mt2\\\">\\n        {{t \\\"components.archiveView.search.searching\\\"}}\\n      </DcLoader>\\n\\n    {{else}}\\n\\n      {{#if this.noResults}}\\n\\n        {{#if this.implicitSearchResults}}\\n\\n          <h2 class=\\\"text-secondary mt2\\\">\\n            {{t \\\"components.archiveView.search.relatedSearchResults\\\"}}\\n          </h2>\\n\\n          {{#if (gt this.implicitSearchResults.length 24)}}\\n\\n            <div class=\\\"text-small nb1\\\">\\n              {{t\\n                \\\"components.archiveView.search.showingResults\\\"\\n                results=24\\n                total=this.implicitSearchResults.length\\n              }}\\n            </div>\\n\\n          {{/if}}\\n\\n          {{archive-view/folder-view\\n            materials=this.implicitSearchResults\\n            archive=this.archive\\n            pageNumber=this.pageNumber\\n            onPageChange=this.onPageChange\\n            class=\\\"mt1\\\"\\n          }}\\n\\n        {{else}}\\n\\n          <div class=\\\"nb1\\\">\\n            {{t \\\"components.archiveView.search.noResultsOn\\\"}}\\n          </div>\\n\\n        {{/if}}\\n\\n      {{else}}\\n\\n        {{#if this.searchResults}}\\n\\n          <h2 class=\\\"text-secondary mt2\\\">\\n            {{t \\\"components.archiveView.search.searchResults\\\"}}\\n          </h2>\\n\\n          {{#if (gt this.searchResults.length 24)}}\\n\\n            <div class=\\\"text-small nb1\\\">\\n              {{t\\n                \\\"components.archiveView.search.showingResults\\\"\\n                results=24\\n                total=this.searchResults.length\\n              }}\\n            </div>\\n\\n          {{/if}}\\n\\n          {{archive-view/folder-view\\n            materials=this.searchResults\\n            archive=this.archive\\n            pageNumber=this.pageNumber\\n            onPageChange=this.onPageChange\\n            class=\\\"mt1\\\"\\n          }}\\n\\n        {{/if}}\\n\\n      {{/if}}\\n\\n    {{/if}}\\n\\n  {{else}}\\n\\n    {{#if (or this.hasCategorySelect this.hasSortSelect this.hasRandom)}}\\n\\n      <div class=\\\"flex flex-wrap flex-end justify-space-between mb1\\\">\\n\\n        {{#if (or this.hasCategorySelect this.hasSortSelect)}}\\n\\n          <div class=\\\"flex flex-wrap flex-center mr1\\\">\\n\\n            {{#if this.hasCategorySelect}}\\n\\n              <div class=\\\"mr1 mb1\\\" data-test-archive-category-select>\\n                {{#ui-label}}\\n                  {{t \\\"components.archiveView.category\\\"}}\\n                {{/ui-label}}\\n\\n                {{x-select items=this.categoryOptions value=this.folderId}}\\n              </div>\\n\\n            {{/if}}\\n\\n            {{#if this.hasSortSelect}}\\n\\n              <div class=\\\"mb1\\\">\\n                {{#ui-label}}{{t \\\"components.archiveView.orderBy\\\"}}{{/ui-label}}\\n\\n                {{x-select\\n                  items=this.sortOptions\\n                  onChange=(action \\\"changeSortValue\\\")\\n                  value=this.sortValue\\n                }}\\n\\n              </div>\\n\\n            {{/if}}\\n\\n          </div>\\n\\n        {{/if}}\\n\\n        {{#if this.hasRandom}}\\n\\n          {{#ui-button class=\\\"flex-shrink mb1\\\" onClick=(action \\\"openRandom\\\")}}\\n\\n            {{t \\\"components.archiveView.random\\\"}}\\n\\n          {{/ui-button}}\\n\\n        {{/if}}\\n\\n      </div>\\n\\n    {{/if}}\\n\\n    {{#if this.isPaginated}}\\n\\n      {{#if this.folder}}\\n\\n        {{archive-view/folder-view\\n          archive=this.archive\\n          folder=this.folder\\n          sortValue=this.sortValue\\n          materials=this.folder.materials\\n          pageNumber=this.pageNumber\\n          onPageChange=this.onPageChange\\n        }}\\n\\n      {{else}}\\n\\n        {{archive-view/folder-view\\n          archive=this.archive\\n          folder=this.folder\\n          sortValue=this.sortValue\\n          materials=this.materials\\n          pageNumber=this.pageNumber\\n          onPageChange=this.onPageChange\\n        }}\\n\\n      {{/if}}\\n\\n    {{else if this.folder}}\\n\\n      <h2 class=\\\"text-primary mb1\\\">{{this.folder.title}}</h2>\\n\\n      {{#let this.folder.body.preamble as |preamble|}}\\n        {{#if preamble}}\\n          <p class=\\\"paragraph\\\"><TbRenderInline @value={{preamble}} /></p>\\n        {{/if}}\\n      {{/let}}\\n\\n      {{archive-view/folder-view\\n        folder=this.folder\\n        archive=this.archive\\n        sortValue=this.sortValue\\n        materials=this.folder.materials\\n        perPage=this.folder.materials.length\\n        onPageChange=this.onPageChange\\n        class=\\\"mb2\\\"\\n      }}\\n\\n    {{else}}\\n\\n      {{#each this.sortedCategories as |folder|}}\\n\\n        <h2 class=\\\"text-primary mb1\\\">{{folder.title}}</h2>\\n\\n        {{#let folder.body.preamble as |preamble|}}\\n          {{#if preamble}}\\n            <p class=\\\"paragraph\\\"><TbRenderInline @value={{preamble}} /></p>\\n          {{/if}}\\n        {{/let}}\\n\\n        {{archive-view/folder-view\\n          folder=folder\\n          archive=this.archive\\n          sortValue=this.sortValue\\n          materials=folder.materials\\n          perPage=folder.materials.length\\n          onPageChange=this.onPageChange\\n          class=\\\"mb2\\\"\\n        }}\\n\\n      {{/each}}\\n\\n    {{/if}}\\n\\n  {{/if}}\\n\\n  <div class=\\\"bottom-space\\\"></div>\\n\\n</div>', { moduleName: 'babel/components/archive-view/template.hbs' });\n","import Component from '@ember/component';\nimport { computed, set } from '@ember/object';\nimport EmberObject from '@ember/object';\nimport { alias, oneWay } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport pagedArray from 'babel/utils/paged-array';\nimport sortBy from 'babel/utils/sort-by';\nimport { task } from 'ember-concurrency';\n\nexport default Component.extend({\n  classNames: ['area-view'],\n\n  intl: service(),\n\n  router: service(),\n\n  pageNumber: 1,\n\n  sortedChildren: computed(\n    'model.{sortBy,children.[]}',\n    'sortValue',\n    function () {\n      let sortValue = this.get('sortValue');\n\n      if (sortValue === 'standard') {\n        sortValue = this.get('model.sortBy');\n      }\n\n      return sortBy(this.get('model.children'), sortValue);\n    }\n  ),\n\n  pagedModels: computed(\n    'sortedChildren.{isFulfilled,content,length}',\n    'pageNumber',\n    function () {\n      let sortedChildren = [];\n\n      if (this.sortedChildren.isFulfilled) {\n        sortedChildren = this.sortedChildren.toArray();\n      }\n\n      return pagedArray({\n        content: sortedChildren,\n        page: this.pageNumber,\n        perPage: 32,\n      });\n    }\n  ),\n\n  totalPages: oneWay('pagedModels.totalPages'),\n\n  groupedSortedContents: computed('pagedModels.@each', function () {\n    return this.get('pagedModels').map((entity) => {\n      return EmberObject.create({\n        entity,\n      });\n    });\n  }),\n\n  store: service(),\n\n  onSearchCleared() {},\n\n  searchValue: '',\n\n  searchVal: null,\n\n  categoryId: null,\n\n  sortValue: 'standard',\n\n  _search() {\n    if (!this.get('searchValue.length') || this.get('searchValue.length') < 2) {\n      return;\n    }\n\n    this.set('isLoading', true);\n    this.set('pageNumber', 1);\n    this.set('categoryId', null);\n\n    return this.get('store')\n      .query('entity', {\n        filter: {\n          book_id: [this.get('model.book_id')],\n          parent_id: this.get('model.id'),\n        },\n        search: this.get('searchValue'),\n      })\n      .then((hits) => {\n        this.set('isLoading', false);\n\n        let entities = hits.sortBy('rank').reverse();\n\n        entities = entities.map((entity) => {\n          return EmberObject.create({\n            entity,\n          });\n        });\n\n        this.set('searchResults', entities);\n      });\n  },\n\n  noResults: computed('searchValue', 'searchResults', 'isLoading', function () {\n    if (\n      this.get('searchValue.length') > 0 &&\n      this.get('searchResults.length') === 0 &&\n      !this.get('isLoading')\n    ) {\n      return true;\n    } else {\n      return false;\n    }\n  }),\n\n  hideEditions: computed('model.template', function () {\n    if (this.get('model.template') === 'grid') {\n      return true;\n    }\n    return false;\n  }),\n\n  showSearchBar: computed('model.metadata.searchable', function () {\n    return this.get('model.metadata.searchable') === true;\n  }),\n\n  isPaginated: computed('model.metadata.paginated', function () {\n    return this.get('model.metadata.paginated') === true;\n  }),\n\n  hasFilters: computed('model.metadata.show_filters', function () {\n    return this.get('model.metadata.show_filters') === true;\n  }),\n\n  hasOrder: computed('model.metadata.show_order', function () {\n    return this.get('model.metadata.show_order') === true;\n  }),\n\n  hasRandom: computed('model.metadata.show_random', function () {\n    return this.get('model.metadata.show_random') === true;\n  }),\n\n  hasCategorySelect: computed(\n    'hasFilters',\n    'model.categories.length',\n    function () {\n      if (!this.get('hasFilters')) return false;\n      if (this.get('model.categories.length') < 2) return false;\n\n      return true;\n    }\n  ),\n\n  categoryEntities: computed('model.categories.@each.entities', function () {\n    return this.get('model.categories').mapBy('entities');\n  }),\n\n  categoryOptions: computed(\n    'hasCategorySelect',\n    'model.categories.[]',\n    'categoryEntities.@each.isFulfilled',\n    function () {\n      if (!this.get('hasCategorySelect')) return [];\n\n      const categoryEntities = this.get('categoryEntities');\n\n      const options = this.get('model.categories')\n        .map((x, idx) => {\n          const entities = categoryEntities[idx];\n          if (!entities || !entities.isFulfilled || entities.length === 0)\n            return null;\n          return { label: x.get('name'), value: x.get('id') };\n        })\n        .filter((x) => x);\n\n      options.unshift({\n        label: this.get('intl').t('components.areaView.allCategories'),\n        value: null,\n      });\n\n      return options;\n    }\n  ),\n\n  sortOptions: computed('hasOrder', function () {\n    if (!this.get('hasOrder')) return [];\n\n    return [\n      {\n        label: this.get('intl').t('components.areaView.sort.standard'),\n        value: 'standard',\n      },\n      {\n        label: this.get('intl').t('components.areaView.sort.name_asc'),\n        value: 'title_asc',\n      },\n      {\n        label: this.get('intl').t('components.areaView.sort.name_desc'),\n        value: 'title_desc',\n      },\n    ];\n  }),\n\n  search: task(function* () {\n    yield this._search();\n  }).keepLatest(),\n\n  doSearch: task(function* () {\n    const searchVal = this.get('searchVal');\n    const searchValue = this.get('searchValue');\n\n    if (searchValue === searchVal) {\n      return;\n    }\n\n    this.set('searchValue', searchVal);\n\n    this.set('isLoading', true);\n\n    if (this.get('searchValue.length') === 0) {\n      this.get('onSearchCleared')();\n      this.set('searchResults', []);\n    } else {\n      yield this.get('search').perform();\n    }\n  }).restartable(),\n\n  actions: {\n    handlePaginationChange(pageNumber) {\n      set(this, 'pageNumber', pageNumber);\n    },\n\n    openRandom() {\n      const contents = this.get('model.children');\n\n      if (contents && contents.length > 0) {\n        const rand = Math.floor(Math.random() * contents.length);\n        const content = contents.objectAt(rand);\n\n        return this.get('router').transitionTo(\n          'master.' + content.get('type'),\n          content.get('id')\n        );\n      }\n    },\n\n    changeSortValue(value) {\n      this.set('sortValue', value);\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<LinkTo\\n  @route={{concat \\\"master.\\\" @item.entity.type}}\\n  @model={{@item.entity.id}}\\n  class=\\\"block\\\"\\n>\\n  <CoverCard\\n    @entity={{@item.entity}}\\n    @index={{unless @item.entity.hideSortNumbers @item.index}}\\n  >\\n    <:subtitle>\\n      {{#if @item.entity.subtitle}}\\n        <div class=\\\"nt1 text-small text-base\\\">\\n          {{@item.entity.subtitle}}\\n        </div>\\n      {{/if}}\\n    </:subtitle>\\n  </CoverCard>\\n</LinkTo>', { moduleName: 'babel/components/area-view/cover/card/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"area-cover\\\">\\n  <div class=\\\"mb2\\\">\\n    {{#if @model.body.preamble}}\\n      <Content::CPreamble\\n        @value={{@model.body.preamble}}\\n        @template={{@model.template}}\\n      />\\n    {{/if}}\\n\\n    <div class=\\\"flex justify-center\\\">\\n      <XImage\\n        @source={{image-source @model.image.imageUrl}}\\n        @color={{@model.image.backgroundColor}}\\n        width=\\\"100%\\\"\\n      />\\n    </div>\\n  </div>\\n\\n  <div class=\\\"nx1\\\">\\n    <EntityCategorizer @entity={{@model}} as |obj|>\\n      <div class=\\\"mb2\\\">\\n        {{#if obj.category}}\\n          <div class=\\\"text-secondary mb1\\\">{{obj.category.name}}</div>\\n        {{/if}}\\n\\n        {{#each obj.entities as |item|}}\\n          <AreaView::Cover::Card @item={{item}}/>\\n        {{/each}}\\n      </div>\\n    </EntityCategorizer>\\n  </div>\\n</div>\\n', { moduleName: 'babel/components/area-view/cover/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each @contents as |content|}}\\n  <EntityLink\\n    @entity={{content.entity}}\\n    class=\\\"delimited-list-item\\\"\\n  >\\n    <div class=\\\"delimited-list-container\\\">\\n      <div class=\\\"image-wrapper flex-shrink nr1\\\">\\n        {{#if content.entity.featuredImage}}\\n          <XImage\\n            @source={{image-source\\n              content.entity.featuredImage\\n              preset=\\\"thumbnail\\\"\\n            }}\\n            class=\\\"delimited-list-image\\\"\\n          />\\n        {{else}}\\n          {{#if (eq content.entity.type \\\"books\\\")}}\\n            <DcIcon @name=\\\"book\\\" />\\n          {{else if (eq content.entity.type \\\"collections\\\")}}\\n            <DcIcon @name=\\\"collection\\\" />\\n          {{else if (eq content.entity.type \\\"sections\\\")}}\\n            <DcIcon @name=\\\"segmentation\\\" />\\n          {{else if (eq content.entity.type \\\"glossaries\\\")}}\\n            <DcIcon @name=\\\"glossaries\\\" />\\n          {{else if (eq content.entity.type \\\"contents\\\")}}\\n            <DcIcon @name=\\\"content\\\" />\\n          {{else if (eq content.entity.type \\\"interactives\\\")}}\\n            <DcIcon @name=\\\"interactives\\\" />\\n          {{else if (eq content.entity.type \\\"assignments\\\")}}\\n            <DcIcon @name=\\\"assignments\\\" />\\n          {{else if (eq content.entity.type \\\"exercises\\\")}}\\n            <DcIcon @name=\\\"exercise\\\" />\\n          {{else if (eq content.entity.type \\\"studies\\\")}}\\n            <DcIcon @name=\\\"study\\\" />\\n          {{else if (eq content.entity.type \\\"archives\\\")}}\\n            <DcIcon @name=\\\"archive\\\" />\\n          {{else if (eq content.entity.type \\\"areas\\\")}}\\n            <DcIcon @name=\\\"area\\\" />\\n          {{else if (eq content.entity.type \\\"folders\\\")}}\\n            <DcIcon @name=\\\"folder-file\\\" />\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n\\n      <div class=\\\"nl1\\\">\\n        <span class=\\\"delimited-list-title\\\">\\n          {{content.entity.title}}\\n        </span>\\n        <div class=\\\"text-small text-base\\\">\\n          {{content.entity.typeLabel}}\\n        </div>\\n      </div>\\n    </div>\\n  </EntityLink>\\n{{/each}}\\n', { moduleName: 'babel/components/area-view/delimited-list/template.hbs' });\n","import { service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class AreaViewGridItemComponent extends Component {\n  @service router;\n\n  get query() {\n    return {\n      activeExerciseId: null,\n      activeSectionId: null,\n      missionId: null,\n      customContentId: null,\n      closeUrl: this.router.currentUrl,\n      returnUrl: null,\n    };\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"area-view-grid-item col-sm-6 col-md-4 col-3 mb2\\\">\\n  <UiLink\\n    @route={{concat \\\"master.\\\" @entity.type}}\\n    @model={{@entity.id}}\\n    @query={{this.query}}\\n    class=\\\"block bradius text-color\\\"\\n    data-test-area-view-item-link\\n    data-info={{@entity.id}}\\n  >\\n    <ImageCard\\n      @image={{image-source @entity.featuredImage preset=\\\"small\\\"}}\\n      @backgroundColor={{@entity.image.backgroundColor}}\\n      @index={{if @showIndex @entity.sort}}\\n      @title={{@entity.title}}\\n      @materialType={{@entity.selectedMaterial.content.type}}\\n    >\\n      <:subtitle>\\n        {{#if @entity.subtitle}}\\n          <span class=\\\"nt1 text-small text-base\\\">\\n            {{@entity.subtitle}}\\n          </span>\\n        {{/if}}\\n      </:subtitle>\\n    </ImageCard>\\n  </UiLink>\\n</div>', { moduleName: 'babel/components/area-view/grid-item/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  contents: null,\n\n  classNames: ['grid'],\n\n  hideEditions: false,\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.contents as |content|}}\\n\\n  {{area-view/grid-item\\n    entity=content.entity\\n    showIndex=(not content.entity.hideSortNumbers)\\n    hideEditions=this.hideEditions\\n  }}\\n\\n{{/each}}', { moduleName: 'babel/components/area-view/grid/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  contents: null,\n\n  classNames: ['area-view-list', 'mb2'],\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.contents as |content|}}\\n  <div class=\\\"area-view-list-item flex flex-row flex-justify\\\">\\n    <div class=\\\"flex\\\">\\n      {{#unless content.entity.hideSortNumbers}}\\n        <div class=\\\"flex flex-start mx1\\\">\\n          <IndexCircle @content={{content.entity.sort}} @style=\\\"grey\\\" />\\n        </div>\\n      {{/unless}}\\n\\n      <div class=\\\"flex flex-stretch\\\">\\n        <EntityLink\\n          class=\\\"text-tertiary {{if content.entity.subtitle \\'block\\'}}\\\"\\n          @entity={{content.entity}}\\n        >\\n          {{content.entity.title}}\\n          {{#if content.entity.subtitle}}\\n            <div class=\\\"nt1 text-small text-base\\\">\\n              {{content.entity.subtitle}}\\n            </div>\\n          {{/if}}\\n        </EntityLink>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"flex flex-center\\\">\\n      {{#if (eq content.entity.selectedMaterial.content.type \\\"links\\\")}}\\n        <DcIcon @name=\\\"external\\\" class=\\\"text-color-default\\\" />\\n      {{else if\\n        (eq content.entity.selectedMaterial.content.type \\\"attachments\\\")\\n      }}\\n        <DcIcon @name=\\\"cloud-download\\\" class=\\\"text-color-default\\\" />\\n      {{/if}}\\n    </div>\\n  </div>\\n{{/each}}', { moduleName: 'babel/components/area-view/list/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (eq this.model.template \\\"cover\\\")}}\\n\\n  {{area-view/cover model=this.model}}\\n\\n{{else}}\\n\\n  {{content/c-preamble\\n    value=this.model.body.preamble\\n    template=this.model.template\\n  }}\\n\\n  {{#if this.showSearchBar}}\\n\\n    {{search-bar\\n      clearable=true\\n      placeholder=(t \\\"components.areaView.search.placeholder\\\")\\n      value=this.searchVal\\n      onClear=(action (perform this.doSearch))\\n      onEnter=(action (perform this.doSearch))\\n      onClick=(action (perform this.doSearch))\\n      class=\\\"my2\\\"\\n    }}\\n\\n    {{#if this.searchValue}}\\n\\n      {{#if this.isLoading}}\\n        <DcLoader class=\\\"archive-search-loader mt2\\\">\\n          {{t \\\"components.areaView.search.searching\\\"}}\\n        </DcLoader>\\n      {{else}}\\n\\n        {{#if this.noResults}}\\n\\n          <div class=\\\"nb1\\\">\\n            {{t \\\"components.areaView.search.noResultsOn\\\"}}\\n          </div>\\n\\n        {{else}}\\n\\n          {{#if this.searchResults}}\\n\\n            <h2 class=\\\"text-secondary mt1 mb0\\\">{{t \\\"components.areaView.search.label\\\"}}</h2>\\n\\n            <div class=\\\"text-small mb1\\\">\\n              {{t \\\"components.areaView.search.results\\\" hits=this.searchResults.length}}\\n            </div>\\n\\n            {{component\\n              (concat \\\"area-view/\\\" this.model.template)\\n              contents=this.searchResults\\n            }}\\n\\n          {{/if}}\\n\\n        {{/if}}\\n\\n      {{/if}}\\n\\n    {{/if}}\\n\\n  {{/if}}\\n\\n  {{#unless this.searchValue}}\\n\\n    {{#if (or this.hasCategorySelect this.hasOrder this.hasRandom)}}\\n\\n      <div class=\\\"flex flex-wrap flex-end justify-space-between mb1\\\">\\n\\n        {{#if (or this.hasCategorySelect this.hasOrder)}}\\n\\n          <div class=\\\"flex flex-wrap flex-center mr1\\\">\\n\\n            {{#if this.hasCategorySelect}}\\n\\n              <div class=\\\"mr1 mb1\\\">\\n                {{#ui-label}}{{t \\\"components.areaView.category\\\"}}{{/ui-label}}\\n\\n                {{x-select items=this.categoryOptions value=this.categoryId}}\\n              </div>\\n\\n            {{/if}}\\n\\n            {{#if this.hasOrder}}\\n\\n              <div class=\\\"mb1\\\">\\n                {{#ui-label}}{{t \\\"components.areaView.orderBy\\\"}}{{/ui-label}}\\n\\n                {{x-select\\n                  items=this.sortOptions\\n                  value=this.sortValue\\n                  onChange=(action \\\"changeSortValue\\\")\\n                }}\\n\\n              </div>\\n\\n            {{/if}}\\n\\n          </div>\\n\\n        {{/if}}\\n\\n        {{#if this.hasRandom}}\\n\\n          {{#ui-button class=\\\"flex-shrink mb1\\\" onClick=(action \\\"openRandom\\\")}}\\n\\n            {{t \\\"components.areaView.random\\\"}}\\n\\n          {{/ui-button}}\\n\\n        {{/if}}\\n\\n      </div>\\n\\n    {{/if}}\\n\\n    {{#if (and this.isPaginated (not this.categoryId))}}\\n\\n      {{component\\n        (concat \\\"area-view/\\\" this.model.template)\\n        contents=this.groupedSortedContents\\n      }}\\n\\n      {{#if (gt this.totalPages 1)}}\\n        {{x-pagination\\n          class=\\\"justify-center\\\"\\n          routed=false\\n          page=this.pageNumber\\n          showFirstLast=false\\n          totalPages=this.totalPages\\n          onChange=(action \\\"handlePaginationChange\\\")\\n        }}\\n      {{/if}}\\n\\n    {{else}}\\n\\n      {{#entity-categorizer entity=this.model as |obj|}}\\n\\n        {{#if (or (not this.categoryId) (eq obj.category.id this.categoryId))}}\\n\\n          {{#if obj.category}}\\n            <h2 class=\\\"text-primary mt2 mb1\\\">{{obj.category.name}}</h2>\\n          {{/if}}\\n\\n          {{component\\n            (concat \\\"area-view/\\\" this.model.template)\\n            contents=obj.entities\\n            hideEditions=this.hideEditions\\n          }}\\n\\n        {{/if}}\\n\\n      {{/entity-categorizer}}\\n\\n    {{/if}}\\n\\n  {{/unless}}\\n\\n{{/if}}', { moduleName: 'babel/components/area-view/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport urlHelper from 'babel/utils/urls';\n\nexport default class AttachLinkModalComponent extends Component {\n  @service intl;\n  @service store;\n  @service session;\n  @service snackbar;\n\n  file = null;\n\n  constructor() {\n    super(...arguments);\n    this.file = this.store.createRecord('file', {\n      user: this.session.user,\n      type: 'external',\n      externalType: 'link',\n    });\n  }\n\n  @action\n  async saveLink() {\n    try {\n      const host = new URL(this.file.externalUrl)?.host;\n      const url = this.file.externalUrl;\n\n      if (host === 'docs.google.com') {\n        this.file.externalType = 'google-docs';\n      }\n      if (\n        host.includes('sharepoint.com') ||\n        host.includes('onedrive.com') ||\n        host.includes('teams.microsoft.com')\n      ) {\n        this.file.externalType = 'office365';\n      }\n      if (\n        url.includes('youtube.com/watch') ||\n        url.includes('youtu.be') ||\n        url.includes('youtube.com/embed')\n      ) {\n        this.file.externalType = 'youtube';\n        this.file.externalUrl = this._youtubeEmbedUrl(url);\n      }\n      if (host.includes('vimeo.com')) {\n        this.file.externalType = 'vimeo';\n        this.file.externalUrl = this._vimeoEmbedUrl(url);\n      }\n    } catch (e) {\n      // console.log(e);\n    }\n\n    if (this.file.externalUrl) {\n      this.file.externalUrl = urlHelper.addHttp(this.file.externalUrl);\n    }\n\n    if (this.file.validate()) {\n      return this.file\n        .save()\n        .then(() => {\n          this.args.onChoose?.(this.file);\n          this.args.onClose?.();\n        })\n        .catch(() => {\n          this.snackbar.enqueue(\n            this.intl.t('components.attachLinkModal.saveFailed'),\n            {\n              variant: 'error',\n              dismissible: false,\n              autoDismiss: true,\n            }\n          );\n        });\n    }\n  }\n\n  _youtubeEmbedUrl(url) {\n    let embed_url = url.replace(\n      /youtube.com\\/watch\\?v=|youtu.be\\//g,\n      'youtube.com/embed/'\n    );\n\n    embed_url += '?autoplay=0&fs=1&iv_load_policy=3&rel=0&modestbranding=0';\n\n    return embed_url;\n  }\n\n  _vimeoEmbedUrl(url) {\n    if (url.contains('player.vimeo.com')) return;\n\n    const vimeoPatterns = [\n      /vimeo\\.com\\/[0-9]+/,\n      /vimeo\\.com\\/channels\\/[\\w]+\\/[0-9]+/,\n      /vimeo\\.com\\/groups\\/[\\w]+\\/videos\\/[0-9]+/,\n    ];\n\n    // Check if the URL matches any of the Vimeo patterns\n    const isVimeo = vimeoPatterns.some((pattern) => pattern.test(url));\n\n    if (isVimeo) {\n      // Add \"player.\" prefix to the video URL to be able to embed it\n      url = url.replace(/(https?:\\/\\/)(www\\.)?/, '$1player.');\n    }\n\n    return url;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XModal\\n  @onClose={{@onClose}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @locked={{true}}\\n  @title={{t \\\"components.attachLinkModal.modalHeader\\\"}}\\n  as |modal|>\\n\\n  <modal.header/>\\n\\n  <UiFormFor\\n    @validate={{true}}\\n    @object={{this.file}}\\n    @onSubmit={{this.saveLink}}\\n    as |form|>\\n\\n    <modal.content class=\\\"p1\\\">\\n\\n      <form.label @key=\\\"name\\\" @content={{t \\\"components.attachLinkModal.name.label\\\"}}/>\\n\\n      <form.input\\n        @key=\\\"name\\\"\\n        @autofocus=\\\"true\\\"\\n        @placeholder={{t \\\"components.attachLinkModal.name.placeholder\\\"}}\\n      />\\n\\n      <form.label @key=\\\"externalUrl\\\" @content={{t \\\"components.attachLinkModal.link.label\\\"}} class=\\\"mt1\\\"/>\\n\\n      <form.input\\n        class=\\\"mb1\\\"\\n        @key=\\\"externalUrl\\\"\\n        @placeholder={{t \\\"components.attachLinkModal.link.placeholder\\\"}}\\n      />\\n\\n    </modal.content>\\n\\n    <modal.footer class=\\\"p1\\\">\\n      <div class=\\\"flex-right\\\">\\n        <UiButton\\n          class=\\\"nr1 text-color-default\\\"\\n          @variant=\\\"link\\\"\\n          @onClick={{@onClose}}\\n        >\\n          {{t \\\"components.attachLinkModal.actions.cancel\\\"}}\\n        </UiButton>\\n        <form.submit @variant=\\\"default\\\">\\n          {{t \\\"components.attachLinkModal.actions.attach\\\"}}\\n        </form.submit>\\n      </div>\\n\\n    </modal.footer>\\n\\n  </UiFormFor>\\n\\n</XModal>\\n', { moduleName: 'babel/components/attach-link-modal/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @downloadable}}\\n  {{#let (generate-id \\\"download-button\\\") as |id|}}\\n    <a\\n      href={{@file.url}}\\n      id={{id}}\\n      class=\\\"flex\\\"\\n      download={{@file.name}}\\n      target=\\\"_blank\\\"\\n      rel=\\\"noopener noreferrer\\\"\\n    >\\n      <DcIcon @name=\\\"cloud-download\\\" />\\n    </a>\\n  {{/let}}\\n{{else if @file.externalUrl}}\\n  <UiButton @appearance=\\\"none\\\" class=\\\"\\\" @onClick={{@onOpenExternalLink}}>\\n    <DcIcon @name=\\\"external\\\" />\\n  </UiButton>\\n{{/if}}\\n\\n{{#if (and @removeable (not @sortable))}}\\n  {{#let (generate-id \\\"remove-attachment-button\\\") as |id|}}\\n    <UiButton\\n      id={{id}}\\n      class=\\\"attachment-remove flex\\\"\\n      @appearance=\\\"none\\\"\\n      @ariaLabel={{t \\\"components.attachmentPreview.item.removeButtonLabel\\\"}}\\n      @onClick={{@onRemove}}\\n    >\\n      <DcIcon @name=\\\"remove-circle\\\" />\\n    </UiButton>\\n\\n    <XTooltip @for={{id}}>\\n      {{t \\\"components.attachmentPreview.item.removeButtonLabel\\\"}}\\n    </XTooltip>\\n  {{/let}}\\n{{/if}}', { moduleName: 'babel/components/attachment-preview/base/actions/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"attachment-previewer-item-thumbnail\\\">\\n  {{yield to=\\\"thumbnail\\\"}}\\n</div>\\n<div class=\\\"attachment-previewer-item-name ui-link ui-link--link--default\\\">\\n  {{yield to=\\\"name\\\"}}\\n</div>', { moduleName: 'babel/components/attachment-preview/base/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"attachment-previewer-item justify-space-between\\\" ...attributes>\\n  <div class=\\\"flex flex-center\\\">\\n    {{yield to=\\\"item\\\"}}\\n  </div>\\n  <div class=\\\"attachment-actions {{unless @session.user.isTeacher \\'pl2\\'}}\\\">\\n    {{yield to=\\\"actions\\\"}}\\n  </div>\\n</div>', { moduleName: 'babel/components/attachment-preview/base/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\n/*\n  @file (object)\n  @entity (object)\n  @removeable (boolean)\n  @onRemoveEntity (function)\n  @onRemoveFile (function)\n  @allowedBooks (array)\n*/\n\nexport default class AttachmentPreviewItemComponent extends Component {\n  @service session;\n\n  @tracked externalLinkDialogIsOpen = false;\n\n  get downloadable() {\n    if (this.args.entity?.constructor.modelName === 'entity') return false;\n\n    return !['external'].includes(this.args.file?.type);\n  }\n\n  @action\n  handleRemove() {\n    if (this.args.entity?.constructor?.modelName === 'entity') {\n      this.args.onRemoveEntity?.(this.args.entity);\n    } else {\n      this.args.onRemoveFile?.(this.args.file);\n    }\n  }\n\n  @action\n  handleExternalLink() {\n    if (['google-docs', 'office365'].includes(this.args.file.externalType)) {\n      window.open(this.args.file.externalUrl, '_blank');\n    } else {\n      this.externalLinkDialogIsOpen = true;\n    }\n  }\n}\n","import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class AttachmentPreviewExternalComponent extends Component {\n  @tracked externalLinkDialogIsOpen = false;\n\n  get iconName() {\n    let type;\n    switch (this.args.file?.type) {\n      case 'video':\n        return 'play-square';\n      case 'audio':\n        return 'audio';\n      case 'external':\n        type = this.args.file?.externalType;\n        if (type === 'google-docs') {\n          return 'google';\n        }\n        if (type === 'office365') {\n          return 'office';\n        }\n        if (type === 'youtube' || type === 'vimeo') {\n          return 'play-square';\n        }\n        return 'link';\n      default:\n        return 'content';\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<AttachmentPreview::base::item>\\n  <:thumbnail>\\n    <UiButton\\n      @appearance=\\\"none\\\"\\n      class=\\\"attachment-previewer-item-preview\\\"\\n      @onClick={{@onOpenExternalLink}}\\n    >\\n      <DcIcon @name={{this.iconName}} @size=\\\"sm\\\" />\\n    </UiButton>\\n  </:thumbnail>\\n\\n  <:name>\\n    <UiButton\\n      @appearance=\\\"none\\\"\\n      class=\\\"attachment-previwer-item-fixed\\\"\\n      @onClick={{@onOpenExternalLink}}\\n    >\\n      {{@file.name}}\\n    </UiButton>\\n  </:name>\\n</AttachmentPreview::base::item>', { moduleName: 'babel/components/attachment-preview/item/external/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<AttachmentPreview::base::item>\\n  <:thumbnail>\\n    <a\\n      href={{@file.url}}\\n      class=\\\"attachment-previewer-item-preview\\\"\\n      download={{@file.name}}\\n      target=\\\"_blank\\\"\\n      rel=\\\"noopener noreferrer\\\"\\n    >\\n      {{#if (eq @file.type \\\"audio\\\")}}\\n        <DcIcon @name=\\\"audio\\\" @size=\\\"sm\\\" />\\n      {{else}}\\n        <DcIcon @name=\\\"content\\\" @size=\\\"sm\\\" />\\n      {{/if}}\\n    </a>\\n  </:thumbnail>\\n\\n  <:name>\\n    <a\\n      class=\\\"attachment-previwer-item-fixed\\\"\\n      href={{@file.url}}\\n      download={{@file.name}}\\n      target=\\\"_blank\\\"\\n      rel=\\\"noopener noreferrer\\\"\\n    >\\n      {{@file.name}}\\n    </a>\\n  </:name>\\n</AttachmentPreview::base::item>', { moduleName: 'babel/components/attachment-preview/item/generic/template.hbs' });\n","import { action } from '@ember/object';\nimport EmberObject from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class AttachmentPreviewImageComponent extends Component {\n  @tracked imageViewerIsOpen = false;\n\n  get imageObj() {\n    return EmberObject.create({\n      source: this.args.file?.url,\n    });\n  }\n\n  @action\n  closeImageViewer() {\n    this.imageViewerIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<AttachmentPreview::base::item>\\n  <:thumbnail>\\n    <XImage\\n      class=\\\"attachment-previewer-item-preview\\\"\\n      @source={{@file.source}}\\n      @cover={{true}}\\n      @onClick={{fn (mut this.imageViewerIsOpen) true}}\\n    />\\n\\n    {{#if this.imageViewerIsOpen}}\\n      <XImageViewer\\n        @image={{this.imageObj}}\\n        @onClose={{this.closeImageViewer}}\\n      />\\n    {{/if}}\\n  </:thumbnail>\\n\\n  <:name>\\n    <UiButton\\n      @appearance=\\\"none\\\"\\n      class=\\\"attachment-previwer-item-fixed\\\"\\n      @onClick={{fn (mut this.imageViewerIsOpen) true}}\\n    >\\n      {{@file.name}}\\n    </UiButton>\\n  </:name>\\n</AttachmentPreview::base::item>', { moduleName: 'babel/components/attachment-preview/item/image/template.hbs' });\n","import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport imageSource from 'compton/utils/image-source';\nimport { load } from 'ember-async-data';\nimport { all } from 'rsvp';\n\nexport default class AttachmentPreviewInternalComponent extends Component {\n  /**\n   * allowedBooks (array)\n   * entity (object)\n   */\n\n  get imageUrl() {\n    const entity = this.args.entity;\n\n    if (entity) {\n      if (entity.type === 'books' && entity.coverImage?.imageUrl) {\n        return imageSource(entity.coverImage?.imageUrl, {\n          preset: 'thumbnail',\n        });\n      } else if (entity.featured_image) {\n        return imageSource(entity.featured_image, { preset: 'thumbnail' });\n      } else if (entity.coverImage?.imageUrl) {\n        return imageSource(entity.coverImage.imageUrl, { preset: 'thumbnail' });\n      } else if (entity.defaultImage) {\n        return entity.defaultImage;\n      }\n    }\n\n    return null;\n  }\n\n  @cached\n  get isValidProxy() {\n    const promise = all([this.args.entity.book, this.args.allowedBooks]).then(\n      ([book, allowedBooks]) =>\n        allowedBooks?.map((obj) => obj.id)?.includes(book?.id)\n    );\n\n    return load(promise, this);\n  }\n\n  get isValid() {\n    return this.isValidProxy.isResolved ? this.isValidProxy.value : false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isValid}}\\n  <AttachmentPreview::base::item>\\n    <:thumbnail>\\n      <EntityLink\\n        class=\\\"attachment-previewer-item-preview\\\"\\n        @entity={{@entity}}\\n        data-test-shortcut\\n      >\\n        {{#if this.imageUrl}}\\n          <img\\n            class=\\\"attachment-previewer-item-preview\\\"\\n            alt=\\\"\\\"\\n            role=\\\"none\\\"\\n            src={{this.imageUrl}}\\n          />\\n        {{else}}\\n          <EntityIcon @entity={{@entity}} @size=\\\"xs\\\" />\\n        {{/if}}\\n      </EntityLink>\\n    </:thumbnail>\\n    <:name>\\n      <EntityLink\\n        class=\\\"attachment-previwer-item-fixed\\\"\\n        @entity={{@entity}}\\n        data-test-shortcut\\n      >\\n        {{@entity.title}}\\n      </EntityLink>\\n    </:name>\\n  </AttachmentPreview::base::item>\\n{{else}}\\n  <AttachmentPreview::base::item>\\n    <:name>\\n      <XAlert class=\\\"p05\\\" @variant=\\\"error\\\">\\n        {{t\\n          \\\"components.missionContent.customContentList.item.invalidAlertMessage\\\"\\n        }}\\n      </XAlert>\\n    </:name>\\n  </AttachmentPreview::base::item>\\n{{/if}}\\n', { moduleName: 'babel/components/attachment-preview/item/internal/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div ...attributes>\\n  <AttachmentPreview::Base @session={{this.session}}>\\n    <:item>\\n      {{#if (eq @entity.constructor.modelName \\\"entity\\\")}}\\n        <AttachmentPreview::Item::Internal\\n          @entity={{@entity}}\\n          @allowedBooks={{@allowedBooks}}\\n        />\\n      {{else if (eq @file.type \\\"image\\\")}}\\n        <AttachmentPreview::Item::Image @file={{@file}} />\\n      {{else if (eq @file.type \\\"video\\\")}}\\n        <AttachmentPreview::Item::Video @file={{@file}} />\\n      {{else if\\n        (or (eq @file.externalType \\\"youtube\\\") (eq @file.externalType \\\"vimeo\\\"))\\n      }}\\n        <AttachmentPreview::Item::VideoExternal\\n          @file={{@file}}\\n          @onOpenExternalLink={{this.handleExternalLink}}\\n        />\\n      {{else if (eq @file.type \\\"external\\\")}}\\n        <AttachmentPreview::Item::External\\n          @file={{@file}}\\n          @onOpenExternalLink={{this.handleExternalLink}}\\n        />\\n      {{else}}\\n        <AttachmentPreview::Item::Generic @file={{@file}} />\\n      {{/if}}\\n    </:item>\\n\\n    <:actions>\\n      <AttachmentPreview::Base::Actions\\n        @entity={{@entity}}\\n        @file={{@file}}\\n        @removeable={{@removeable}}\\n        @sortable={{@sortable}}\\n        @downloadable={{this.downloadable}}\\n        @onRemove={{this.handleRemove}}\\n        @onDownload={{@onDownload}}\\n        @onOpenExternalLink={{this.handleExternalLink}}\\n      />\\n\\n      {{yield}}\\n    </:actions>\\n  </AttachmentPreview::Base>\\n\\n  {{#if this.externalLinkDialogIsOpen}}\\n    <UserExternalLinkDialog\\n      @url={{@file.externalUrl}}\\n      @onClose={{fn (mut this.externalLinkDialogIsOpen) false}}\\n    />\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/attachment-preview/item/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class AttachmentPreviewVideoExternalComponent extends Component {\n  @tracked mediaViewerIsOpen = false;\n\n  @action\n  closeMediaViewer() {\n    this.mediaViewerIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<AttachmentPreview::base::item>\\n  <:thumbnail>\\n    <UiButton\\n      class=\\\"attachment-previewer-item-preview\\\"\\n      @appearance=\\\"none\\\"\\n      @variant=\\\"link\\\"\\n      @onClick={{fn (mut this.mediaViewerIsOpen) true}}\\n    >\\n      <DcIcon @name=\\\"play-square\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </:thumbnail>\\n\\n  <:name>\\n    <UiButton\\n      @appearance=\\\"none\\\"\\n      class=\\\"attachment-previwer-item-fixed\\\"\\n      @onClick={{fn (mut this.mediaViewerIsOpen) true}}\\n    >\\n      {{@file.name}}\\n    </UiButton>\\n  </:name>\\n</AttachmentPreview::base::item>\\n\\n{{#if this.mediaViewerIsOpen}}\\n  <XModal\\n    @onClose={{this.closeMediaViewer}}\\n    @size={{hash width=\\\"large\\\" height=\\\"auto\\\"}}\\n    @title={{@file.name}}\\n    as |modal|\\n  >\\n    <modal.header />\\n\\n    <modal.content>\\n      <div>\\n        <XEmbed @source={{@file.externalUrl}} @aspectRatio=\\\"56.25\\\" />\\n      </div>\\n    </modal.content>\\n  </XModal>\\n{{/if}}', { moduleName: 'babel/components/attachment-preview/item/video-external/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class AttachmentPreviewVideoComponent extends Component {\n  @tracked mediaViewerIsOpen = false;\n\n  @action\n  closeMediaViewer() {\n    this.mediaViewerIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<AttachmentPreview::base::item>\\n  <:thumbnail>\\n    <UiButton\\n      class=\\\"attachment-previewer-item-preview\\\"\\n      @appearance=\\\"none\\\"\\n      @variant=\\\"link\\\"\\n      @onClick={{fn (mut this.mediaViewerIsOpen) true}}\\n    >\\n      <DcIcon @name=\\\"play-square\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </:thumbnail>\\n\\n  <:name>\\n    <UiButton\\n      @appearance=\\\"none\\\"\\n      class=\\\"attachment-previwer-item-fixed\\\"\\n      @onClick={{fn (mut this.mediaViewerIsOpen) true}}\\n    >\\n      {{@file.name}}\\n    </UiButton>\\n  </:name>\\n</AttachmentPreview::base::item>\\n\\n{{#if this.mediaViewerIsOpen}}\\n  <XModal\\n    @onClose={{this.closeMediaViewer}}\\n    @size={{hash width=\\\"large\\\" height=\\\"auto\\\"}}\\n    @title={{@file.name}}\\n    as |modal|\\n  >\\n    <modal.header />\\n\\n    <modal.content>\\n      <XVideo @source={{@file.url}} />\\n    </modal.content>\\n  </XModal>\\n{{/if}}', { moduleName: 'babel/components/attachment-preview/item/video/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"attachment-previewer\\\" ...attributes>\\n  {{#each @entities key=\\\"id\\\" as |entity|}}\\n    <AttachmentPreview::Item\\n      @entity={{entity}}\\n      @removeable={{@removeable}}\\n      @onRemoveEntity={{@onRemoveEntity}}\\n      @allowedBooks={{@allowedBooks}}\\n    />\\n  {{/each}}\\n\\n  {{#each @files key=\\\"id\\\" as |file|}}\\n    <AttachmentPreview::Item\\n      @file={{file}}\\n      @removeable={{@removeable}}\\n      @onRemoveFile={{@onRemoveFile}}\\n    />\\n  {{/each}}\\n</div>', { moduleName: 'babel/components/attachment-preview/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.content}}\\n  <XAlert\\n    @dismissable={{true}}\\n    @onDismiss={{this.onDismiss}}\\n    class=\\\"mb2\\\"\\n    data-test-book-announcement\\n  >\\n    <ContentPresenter @isContainer={{false}} class=\\\"ml0\\\">\\n      <TbRenderInline @value={{this.content}} />\\n    </ContentPresenter>\\n  </XAlert>\\n{{/if}}\", {\"contents\":\"{{#if this.content}}\\n  <XAlert\\n    @dismissable={{true}}\\n    @onDismiss={{this.onDismiss}}\\n    class=\\\"mb2\\\"\\n    data-test-book-announcement\\n  >\\n    <ContentPresenter @isContainer={{false}} class=\\\"ml0\\\">\\n      <TbRenderInline @value={{this.content}} />\\n    </ContentPresenter>\\n  </XAlert>\\n{{/if}}\",\"moduleName\":\"babel/components/book-announcement/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/book-announcement/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport sanitizeHtml from 'ember-cli-sanitize-html';\nimport { reject, resolve } from 'rsvp';\n\nexport default class BookAnnouncementComponent extends Component {\n  /**\n   * Arguments:\n   * id (string)\n   * announcement (string)\n   * updated (number)\n   */\n\n  constructor() {\n    super(...arguments);\n    this.setClosedAnnouncements();\n  }\n\n  @service session;\n\n  @tracked closedAnnouncements;\n\n  get announcementClosed() {\n    const id = this.args.id;\n    const updated = this.args.updated;\n\n    return this.closedAnnouncements.find(\n      (x) => x?.id === id && x?.time > updated\n    )\n      ? true\n      : false;\n  }\n\n  get content() {\n    if (this.announcementClosed) return false;\n\n    const announcement = this.args.announcement ?? '';\n    const textContent = sanitizeHtml(announcement, { allowedTags: [] });\n\n    if (textContent.replace(/\\s/g, '').length > 0) return announcement;\n\n    return false;\n  }\n\n  setClosedAnnouncements() {\n    this.closedAnnouncements =\n      this.session.user?.metadata?.closed_announcements || [];\n  }\n\n  @action onDismiss() {\n    const id = this.args.id;\n    const time = new Date().getTime();\n    const user = this.session.user;\n    const metadata = user?.metadata || {};\n\n    if (!metadata.closed_announcements) metadata.closed_announcements = [];\n\n    metadata.closed_announcements.removeObjects(\n      metadata.closed_announcements.filterBy('id', id)\n    );\n\n    metadata.closed_announcements.addObject({ id, time });\n\n    this.setClosedAnnouncements();\n\n    return resolve(user.roles)\n      .then((roles) => {\n        if (roles?.findBy('client_id', 'ARCH')) {\n          // We don't persist that the announcement was closed\n          // for Arch users. See DINO-714.\n          return resolve();\n        }\n\n        return reject();\n      })\n      .catch(() => {\n        // Either roles could not be resolved or the user does\n        // not have Arch access. We should persist that the\n        // user closed the announcement.\n        return user.save();\n      });\n  }\n}\n","import Component from '@glimmer/component';\n\nexport default class BookBrowserComponent extends Component {\n  get rangeClassName() {\n    if (this.args.range) {\n      return `book-browser--range-${this.args.range}`;\n    } else {\n      return `book-browser--range-medium`;\n    }\n  }\n}\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\nimport appendQueryParams from 'babel/utils/append-query-params';\n\nexport default class BookBrowserItemComponent extends Component {\n  @service contextHelper;\n\n  get isChecked() {\n    const selectedBookIds = this.args.selectedBooks?.mapBy('id');\n    return selectedBookIds?.includes(this.args.book.id);\n  }\n\n  set isChecked(selected) {\n    if (selected) {\n      this.args.onSelect?.(this.args.book);\n    } else {\n      this.args.onDeselect?.(this.args.book);\n    }\n  }\n\n  get isExternal() {\n    return (\n      this.args.book?.type === 'books_external' ||\n      this.args.book?.type === 'books_junior' ||\n      this.args.book?.type === 'books_pdf'\n    );\n  }\n\n  get isJunior() {\n    return this.args.book?.type === 'books_junior';\n  }\n\n  get isDigitalbok() {\n    return this.args.book?.type === 'books_pdf';\n  }\n\n  get imageURL() {\n    return (\n      this.args.book?.get('coverImage.imageURL') ||\n      this.args.book?.get('image.imageURL')\n    );\n  }\n\n  get linkTarget() {\n    return this.isExternal ? '_blank' : '_self';\n  }\n\n  get linkIcon() {\n    return this.isExternal ? 'external' : null;\n  }\n\n  get href() {\n    let target;\n\n    switch (this.args.book?.type) {\n      case 'books_external':\n        target = this.args.book?.body?.external_url;\n        break;\n      case 'books_pdf':\n        target = `${config.digitalbokUrl}/books/${this.args.book?.id}`;\n        break;\n      case 'books_junior':\n      default:\n        target = `${config.juniorUrl}/books/${this.args.book?.id}`;\n        break;\n    }\n\n    const params = {};\n\n    if (\n      (this.isJunior || this.isDigitalbok) &&\n      this.contextHelper?.activeCourse?.id\n    ) {\n      params.courseId = this.contextHelper.activeCourse.id;\n    }\n\n    if (this.args.product?.id) {\n      params.statisticsIsbn = this.args.product?.id;\n    }\n\n    return appendQueryParams(target, params);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"book-browser-item\\\">\\n  {{#if this.isExternal}}\\n    <a\\n      href={{this.href}}\\n      target={{this.linkTarget}}\\n      class=\\\"book-browser-link block\\\"\\n    >\\n      <ImageCard\\n        @image={{image-source this.imageURL max=true w=640 h=480}}\\n        @title={{@book.title}}\\n        @icon={{this.linkIcon}}\\n        @imageSize=\\\"contain\\\"\\n      />\\n    </a>\\n  {{else}}\\n    <UiLink\\n      @route=\\\"master.books\\\"\\n      @model={{@book.id}}\\n      @variant=\\\"inherit\\\"\\n      class=\\\"book-browser-link block\\\"\\n      data-test-book-browser-item-link\\n      data-info={{@book.id}}\\n    >\\n      <ImageCard\\n        @image={{image-source this.imageURL max=true w=640 h=480}}\\n        @title={{@book.title}}\\n        @imageSize=\\\"contain\\\"\\n      />\\n    </UiLink>\\n  {{/if}}\\n\\n  {{#if @selectable}}\\n    <XSwitch class=\\\"nt1\\\" @checked={{this.isChecked}}>\\n      {{t \\\"components.bookBrowser.checkboxLabel\\\"}}\\n    </XSwitch>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/book-browser/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"book-browser {{this.rangeClassName}}\\\" ...attributes>\\n  {{#each @books as |book|}}\\n    <BookBrowser::item\\n      @book={{book}}\\n      @product={{@product}}\\n      @selectedBooks={{@selectedBooks}}\\n      @selectable={{@selectable}}\\n      @onSelect={{@onSelect}}\\n      @onDeselect={{@onDeselect}}\\n    />\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/book-browser/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<PageHeader @model={{@model}} class=\\\"text-color-inverted mb2\\\">\\n  {{#if @model.body.use_logo}}\\n    <div class=\\\"position-relative flex flex-center justify-center\\\">\\n      <XImage\\n        @source={{image-source @model.logo.imageUrl preserve-transparency=true}}\\n        @color=\\\"transparent\\\"\\n        class=\\\"content-logo\\\"\\n        data-test-content-logo\\n      />\\n    </div>\\n  {{else}}\\n    <h1 class=\\\"content-title mb2\\\" data-test-content-title>\\n      {{@model.title}}\\n    </h1>\\n  {{/if}}\\n</PageHeader>', { moduleName: 'babel/components/book-header/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"grid\\\">\\n  {{#each @entities as |entityGroup|}}\\n    {{#let entityGroup.entity as |entity|}}\\n      <div class=\\\"book-view-grid-item col-sm-6 col-md-4 col-3 mb2\\\">\\n        <EntityLink\\n          class=\\\"block text-color bradius\\\"\\n          @entity={{entity}}\\n          data-test-book-view-area-link\\n          data-info={{entity.id}}\\n        >\\n          <ImageCard\\n            @image={{image-source entity.featuredImage preset=\\\"small\\\"}}\\n            @index={{unless entity.hideSortNumbers entity.sort}}\\n            @backgroundColor={{entity.image.backgroundColor}}\\n            @title={{entity.title}}\\n            @materialType={{entity.selectedMaterial.content.type}}\\n          >\\n            <:subtitle>\\n              {{#if entity.subtitle}}\\n                <span class=\\\"nt1 text-small text-base\\\">\\n                  {{entity.subtitle}}\\n                </span>\\n              {{/if}}\\n            </:subtitle>\\n          </ImageCard>\\n        </EntityLink>\\n      </div>\\n    {{/let}}\\n  {{/each}}\\n</div>', { moduleName: 'babel/components/book-view/grid/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"mb2\\\">\\n  {{#each @entities as |entityGroup|}}\\n    {{#let entityGroup.entity as |entity|}}\\n      <div class=\\\"flex flex-row flex-justify bb1\\\">\\n        <div class=\\\"flex py1\\\">\\n          {{#unless entity.hideSortNumbers}}\\n            <div class=\\\"flex flex-start mx1\\\">\\n              <IndexCircle @content={{entity.sort}} @style=\\\"grey\\\" />\\n            </div>\\n          {{/unless}}\\n\\n          <div class=\\\"flex flex-stretch\\\">\\n            <EntityLink\\n              class=\\\"text-tertiary {{if entity.subtitle \\'block\\'}}\\\"\\n              @entity={{entity}}\\n            >\\n              {{entity.title}}\\n              {{#if entity.subtitle}}\\n                <div class=\\\"nt1 text-small text-base\\\">\\n                  {{entity.subtitle}}\\n                </div>\\n              {{/if}}\\n            </EntityLink>\\n          </div>\\n        </div>\\n\\n        {{#if\\n          (or\\n            (eq entity.selectedMaterial.content.type \\\"links\\\")\\n            (eq entity.selectedMaterial.content.type \\\"attachments\\\")\\n          )\\n        }}\\n          <div class=\\\"flex flex-center\\\">\\n            <EntityLink class=\\\"text-tertiary\\\" @entity={{entity}}>\\n              {{#if (eq entity.selectedMaterial.content.type \\\"links\\\")}}\\n                <DcIcon @name=\\\"external\\\" class=\\\"text-color-default n1\\\" />\\n              {{else if (eq entity.selectedMaterial.content.type \\\"attachments\\\")}}\\n                <DcIcon @name=\\\"cloud-download\\\" class=\\\"text-color-default n1\\\" />\\n              {{/if}}\\n            </EntityLink>\\n          </div>\\n        {{/if}}\\n      </div>\\n    {{/let}}\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/book-view/list/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<EntityCategorizer @entity={{@model}} as |obj|>\\n  {{#if obj.category}}\\n    <h2 class=\\\"text-primary mt2 mb1\\\">{{obj.category.name}}</h2>\\n  {{/if}}\\n  {{#if (eq @model.template \\\"list\\\")}}\\n    <BookView::List @entities={{obj.entities}} />\\n  {{else}}\\n    <BookView::Grid @entities={{obj.entities}} />\\n  {{/if}}\\n</EntityCategorizer>\\n', { moduleName: 'babel/components/book-view/template.hbs' });\n","import { action } from '@ember/object';\nimport { cancel, later, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { customCanvasKeys } from '@naturochkultur/detroit/utils/fabric';\nimport { createSpeechSynthesizer } from '@naturochkultur/detroit/utils/polly';\nimport config from 'babel/config/environment';\nimport { resolve } from 'rsvp';\n\nconst SAVE_DELAY = 1000;\nconst SAVE_STATUS_RESET_DELAY = 3000;\n\nexport default class MaterialViewerCanvas extends Component {\n  /**\n   * Arguments:\n   * material (object)\n   * editor (object)\n   * user (object)\n   */\n\n  @service ajax;\n\n  @service confirmManager;\n\n  @service session;\n\n  @service store;\n\n  @tracked element;\n\n  @tracked isFullscreen;\n\n  @tracked confirm;\n\n  @tracked isLoading = true;\n\n  @tracked savingState = null;\n\n  @tracked saveTimeout;\n\n  @tracked canvasState;\n\n  @tracked json = new Promise((resolve) => resolve);\n\n  @tracked changingUser = false;\n\n  @cached\n  get synthesizeSpeech() {\n    return createSpeechSynthesizer({\n      request: (url, auth, options) => this.ajax.request(url, auth, options),\n      apiBaseUrl: config.endpoint,\n    });\n  }\n\n  get classNames() {\n    const classes = ['canvas-presentor'];\n\n    if (this.isFullscreen) {\n      classes.push('canvas-presentor-fullscreen');\n    }\n\n    return classes.join(' ');\n  }\n\n  get isFullscreenEnabled() {\n    return Boolean(\n      document.fullscreenElement || document.webkitFullscreenElement\n    );\n  }\n\n  @action\n  async changeUser() {\n    this.changingUser = true;\n\n    await this.setCanvasState();\n\n    this.changingUser = false;\n  }\n\n  @action\n  toggleFullscreen() {\n    if (!this.isFullscreenEnabled) {\n      this.isFullscreen = true;\n      this.element.requestFullscreen\n        ? this.element.requestFullscreen()\n        : this.element.webkitRequestFullscreen?.();\n    } else {\n      this.isFullscreen = false;\n      document.exitFullscreen\n        ? document.exitFullscreen()\n        : document.webkitExitFullscreen?.();\n    }\n  }\n\n  @action\n  setElementAndCanvasState(elem) {\n    this.setElement(elem);\n    this.setCanvasState();\n  }\n\n  @action\n  handleConfirmActivated() {\n    if (this.isFullscreen) {\n      scheduleOnce('afterRender', this, this.moveModalToElement);\n    }\n  }\n\n  @action\n  handleConfirmReset() {\n    if (this.confirm) {\n      if (this.element.contains(this.confirm)) {\n        this.element.removeChild(this.confirm);\n      } else {\n        this.confirm = null;\n      }\n    }\n  }\n\n  @action\n  async handleSave(canvas) {\n    cancel(this.saveTimeout);\n    this.saveTimeout = later(this, this.performSave, canvas, SAVE_DELAY);\n  }\n\n  async performSave(canvas) {\n    const stateUser = await resolve(this.canvasState.user);\n\n    if (stateUser.id !== this.session.user.id) return;\n\n    const json = canvas.toJSON(customCanvasKeys.map((item) => item.name));\n\n    if (JSON.stringify(json) === this.canvasState.json) return;\n\n    this.savingState = 'saving';\n\n    this.canvasState.setJSON(json);\n\n    await this.canvasState.save();\n\n    this.savingState = 'saved';\n\n    later(this, this.resetSaveState, SAVE_STATUS_RESET_DELAY);\n  }\n\n  resetSaveState() {\n    if (this.savingState === 'saved') {\n      this.savingState = null;\n    }\n  }\n\n  onFullScreenChange() {\n    this.isFullscreen = this.isFullscreenEnabled;\n  }\n\n  moveModalToElement() {\n    const confirm = document.getElementById(this.confirmManager.id);\n\n    if (confirm) {\n      this.confirm = confirm;\n      this.element.appendChild(confirm);\n    }\n  }\n\n  setElement(elem) {\n    elem.addEventListener(\n      'fullscreenchange',\n      this.onFullScreenChange.bind(this)\n    );\n\n    elem.addEventListener(\n      'webkitfullscreenchange',\n      this.onFullScreenChange.bind(this)\n    );\n\n    this.element = elem;\n  }\n\n  async setCanvasState() {\n    this.isLoading = true;\n    this.canvasState = null;\n\n    let states, state;\n\n    try {\n      let user_id = this.session.user.id;\n\n      if (this.args.user) {\n        const user = await resolve(this.args.user);\n        user_id = user.id;\n      }\n\n      states = await this.store.query('canvas-state', {\n        user_id,\n        material_id: this.args.material.id,\n        editor_id: this.args.editor?.id ?? null,\n      });\n\n      if (states?.length > 0) state = states[0];\n    } catch (err) {\n      // do nothing\n    }\n\n    if (!state) {\n      state = this.store.createRecord('canvas-state', {\n        material: this.args.material,\n        editor: this.args.editor,\n        user: this.session.user,\n      });\n\n      state.setJSON(this.args.material?.metadata?.json);\n    }\n\n    this.canvasState = state;\n    this.json = state.json;\n    this.isLoading = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class={{this.classNames}}\\n  {{did-insert this.setElementAndCanvasState}}\\n  {{did-update this.changeUser @user}}\\n>\\n  {{#if this.changingUser}}\\n    <DcLoader />\\n  {{else}}\\n    <DcCanvasPresentor\\n      @material={{@material}}\\n      @json={{this.json}}\\n      @isLoading={{this.isLoading}}\\n      @isFullscreen={{this.isFullscreen}}\\n      @toggleFullscreen={{this.toggleFullscreen}}\\n      @onConfirmActivated={{this.handleConfirmActivated}}\\n      @onConfirmReset={{this.handleConfirmReset}}\\n      @onSave={{this.handleSave}}\\n      @savingState={{this.savingState}}\\n      @synthesizeSpeech={{this.synthesizeSpeech}}\\n    />\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/canvas-presentor-wrapper/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CarouselResultComponent extends Component {\n  /**\n   * Arguments:\n   * interactive (object)\n   * onCollectionClose (function)\n   * onCreateNewCarouselAttempt (function)\n   * onNewCarouselAttemptCreated (function)\n   */\n\n  @service intl;\n\n  @service assignmentEvents;\n\n  get image() {\n    if (this.args.interactive?.isCompleted) {\n      return '/assets/images/collection/completed.svg';\n    }\n\n    return '/assets/images/collection/ended.svg';\n  }\n\n  get message() {\n    if (this.args.interactive?.isCompleted) {\n      return this.intl.t('components.carouselResult.completed');\n    }\n\n    return this.intl.t('components.carouselResult.result', {\n      numCorrect: this.args.interactive?.numCorrectAttemptAnswers,\n      numTotal: this.args.interactive?.numAttemptExercises,\n    });\n  }\n\n  get infoText() {\n    if (\n      !this.args.interactive?.isCompleted &&\n      this.args.interactive?.numAttemptExercises !==\n        this.args.interactive?.numExercises\n    ) {\n      return this.intl.t('components.carouselResult.tryAgainInfo', {\n        numCorrect: this.args.interactive?.numCorrectAnswers,\n        numTotal: this.args.interactive?.numExercises,\n      });\n    }\n\n    return null;\n  }\n\n  get hasRedoButton() {\n    return this.args.interactive?.isCompleted ? true : false;\n  }\n\n  get hasCloseButton() {\n    if (!this.args.onCollectionClose) return false;\n    return this.args.interactive?.isCompleted ? true : false;\n  }\n\n  get hasTryAgainButton() {\n    return !this.args.interactive?.isCompleted ? true : false;\n  }\n\n  @action handleCarouselResultRedo() {\n    this.args.onCreateNewCarouselAttempt?.();\n\n    return this.assignmentEvents\n      .newCarouselAttempt(this.args.interactive, true)\n      .then(() => this.args.onNewCarouselAttemptCreated?.());\n  }\n\n  @action handleCarouselResultTryAgain() {\n    return this.assignmentEvents.newCarouselAttempt(this.args.interactive);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"carousel-result\\\">\\n  <div class=\\\"carousel-result-content\\\">\\n    {{! template-lint-disable require-iframe-title }}\\n    <iframe\\n      src={{this.image}}\\n      class=\\\"carousel-result-image\\\"\\n      data-test-carousel-result-image\\n    />\\n\\n    <div class=\\\"text-secondary\\\" data-test-carousel-result-message>\\n      {{this.message}}\\n    </div>\\n\\n    {{#if this.infoText}}\\n      <div class=\\\"nt1 text-small\\\" data-test-info-text>\\n        {{this.infoText}}\\n      </div>\\n    {{/if}}\\n\\n    <div class=\\\"flex mt1\\\">\\n      {{#if this.hasRedoButton}}\\n        <UiButton\\n          @onClick={{this.handleCarouselResultRedo}}\\n          class=\\\"nx1\\\"\\n          data-test-carousel-result-redo-button\\n        >\\n          {{t \\\"components.carouselResult.redo\\\"}}\\n        </UiButton>\\n      {{/if}}\\n\\n      {{#if this.hasCloseButton}}\\n        <UiButton\\n          @onClick={{@onCollectionClose}}\\n          class=\\\"nx1\\\"\\n          data-test-carousel-result-close-button\\n        >\\n          {{t \\\"components.carouselResult.close\\\"}}\\n        </UiButton>\\n      {{/if}}\\n\\n      {{#if this.hasTryAgainButton}}\\n        <UiButton\\n          @onClick={{this.handleCarouselResultTryAgain}}\\n          class=\\\"nx1\\\"\\n          data-test-carousel-result-try-again-button\\n        >\\n          {{t \\\"components.carouselResult.tryAgain\\\"}}\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>', { moduleName: 'babel/components/carousel-result/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"chapter-navigation\\\"\\n  {{did-insert this.didInsert}}\\n  {{will-destroy this.handleWillDestroy}}\\n>\\n  <div class=\\\"chapter-navigation-prev\\\">\\n    <UiButton\\n      @appearance=\\\"circle\\\"\\n      @flat={{true}}\\n      class=\\\"chapter-navigation-button n1\\\"\\n      @disabled={{not @hasPreviousSection}}\\n      @onClick={{this.goToPrevious}}\\n    >\\n      <DcIcon @name=\\\"small-left\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n\\n  <UiButton\\n    @variant=\\\"default\\\"\\n    @shape=\\\"rounded\\\"\\n    id=\\\"chapter-navigation-index-btn\\\"\\n    class=\\\"chapter-navigation-index-button {{if (eq @currentSections.length 0) \\\"justify-center\\\" }}\\\"\\n    @size=\\\"default\\\"\\n    @active={{this.isShowingIndex}}\\n    @onClick={{this.openIndex}}\\n    data-test-chapter-navigation-index-btn\\n  >\\n    <div class=\\\"flex flex-center\\\">\\n      <DcIcon @name=\\\"menu\\\" />\\n      {{#unless (eq @currentSections.length 0)}}\\n        <span class=\\\"chapter-navigation-index\\\">\\n          <span translate=\\\"no\\\">{{~this.currentSectionNumber}}</span>\\n          <span>{{t \\\"components.chapterNavigation.ofIndex\\\"}}</span>\\n          <span translate=\\\"no\\\">{{@currentSections.length~}}</span>\\n        </span>\\n      {{/unless}}\\n    </div>\\n  </UiButton>\\n\\n  {{#if this.isShowingIndex}}\\n    <XPopup\\n      @title={{t \\\"components.chapterNavigation.tableOfContents\\\"}}\\n      @for=\\\"chapter-navigation-index-btn\\\"\\n      @onClose={{this.closeIndex}}\\n      @minWidth={{460}}\\n      @opacity={{0}}\\n      @placement=\\\"top\\\"\\n      @switchToDialogOnSmallBreakpoint={{not this.isPrint}}\\n    >\\n      <TableOfContents\\n        @activeCategory={{@activeCategory}}\\n        @activeSubHeading={{this.activeSubHeading}}\\n        @sections={{@sections}}\\n        @collections={{@collections}}\\n        @wordlists={{@wordlists}}\\n        @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n        @closeIndex={{this.closeIndex}}\\n        @goToSection={{@goToSection}}\\n        @isInteractive={{@isInteractive}}\\n        class=\\\"mb1\\\"\\n      />\\n    </XPopup>\\n  {{/if}}\\n\\n  <div class=\\\"chapter-navigation-next\\\">\\n    <UiButton\\n      @appearance=\\\"circle\\\"\\n      @disabled={{not @hasNextSection}}\\n      @flat={{true}}\\n      class=\\\"chapter-navigation-button n1\\\"\\n      @onClick={{this.goToNext}}\\n    >\\n      <DcIcon @name=\\\"small-right\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"chapter-navigation\\\"\\n  {{did-insert this.didInsert}}\\n  {{will-destroy this.handleWillDestroy}}\\n>\\n  <div class=\\\"chapter-navigation-prev\\\">\\n    <UiButton\\n      @appearance=\\\"circle\\\"\\n      @flat={{true}}\\n      class=\\\"chapter-navigation-button n1\\\"\\n      @disabled={{not @hasPreviousSection}}\\n      @onClick={{this.goToPrevious}}\\n    >\\n      <DcIcon @name=\\\"small-left\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n\\n  <UiButton\\n    @variant=\\\"default\\\"\\n    @shape=\\\"rounded\\\"\\n    id=\\\"chapter-navigation-index-btn\\\"\\n    class=\\\"chapter-navigation-index-button {{if (eq @currentSections.length 0) \\\"justify-center\\\" }}\\\"\\n    @size=\\\"default\\\"\\n    @active={{this.isShowingIndex}}\\n    @onClick={{this.openIndex}}\\n    data-test-chapter-navigation-index-btn\\n  >\\n    <div class=\\\"flex flex-center\\\">\\n      <DcIcon @name=\\\"menu\\\" />\\n      {{#unless (eq @currentSections.length 0)}}\\n        <span class=\\\"chapter-navigation-index\\\">\\n          <span translate=\\\"no\\\">{{~this.currentSectionNumber}}</span>\\n          <span>{{t \\\"components.chapterNavigation.ofIndex\\\"}}</span>\\n          <span translate=\\\"no\\\">{{@currentSections.length~}}</span>\\n        </span>\\n      {{/unless}}\\n    </div>\\n  </UiButton>\\n\\n  {{#if this.isShowingIndex}}\\n    <XPopup\\n      @title={{t \\\"components.chapterNavigation.tableOfContents\\\"}}\\n      @for=\\\"chapter-navigation-index-btn\\\"\\n      @onClose={{this.closeIndex}}\\n      @minWidth={{460}}\\n      @opacity={{0}}\\n      @placement=\\\"top\\\"\\n      @switchToDialogOnSmallBreakpoint={{not this.isPrint}}\\n    >\\n      <TableOfContents\\n        @activeCategory={{@activeCategory}}\\n        @activeSubHeading={{this.activeSubHeading}}\\n        @sections={{@sections}}\\n        @collections={{@collections}}\\n        @wordlists={{@wordlists}}\\n        @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n        @closeIndex={{this.closeIndex}}\\n        @goToSection={{@goToSection}}\\n        @isInteractive={{@isInteractive}}\\n        class=\\\"mb1\\\"\\n      />\\n    </XPopup>\\n  {{/if}}\\n\\n  <div class=\\\"chapter-navigation-next\\\">\\n    <UiButton\\n      @appearance=\\\"circle\\\"\\n      @disabled={{not @hasNextSection}}\\n      @flat={{true}}\\n      class=\\\"chapter-navigation-button n1\\\"\\n      @onClick={{this.goToNext}}\\n    >\\n      <DcIcon @name=\\\"small-right\\\" @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/chapter-navigation/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/chapter-navigation/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ChapterNavigationComponent extends Component {\n  /**\n   * Arguments:\n   * activeSection\n   * restrictedSections\n   * restrictedCollections\n   * currentSections\n   * wordlists\n   * activeCategory\n   * categories\n   */\n\n  @tracked isShowingIndex = false;\n\n  @tracked activeSubHeading = null;\n\n  @tracked isPrint = false;\n\n  get currentIndex() {\n    return this.args.currentSections?.indexOf(this.args.activeSection);\n  }\n\n  get currentSectionNumber() {\n    // If first section is removed during mission customize,\n    // currentSectionNumber will be 0, in that case fallback to 1\n    return this.currentIndex + 1 || 1;\n  }\n\n  @action\n  goToPrevious() {\n    const previousSection = this.args.currentSections?.get(\n      this.currentIndex - 1\n    );\n    if (previousSection) {\n      this.args.goToSection?.(previousSection.id);\n    }\n  }\n\n  @action\n  goToNext() {\n    const nextSection = this.args.currentSections?.get(this.currentIndex + 1);\n    if (nextSection) {\n      this.args.goToSection?.(nextSection.id);\n    }\n  }\n\n  @action\n  openIndex() {\n    this.isShowingIndex = true;\n  }\n\n  @action\n  closeIndex() {\n    this.isShowingIndex = false;\n  }\n\n  @action\n  didInsert() {\n    window.addEventListener('beforeprint', this.beforePrint.bind(this));\n    window.addEventListener('afterprint', this.afterPrint.bind(this));\n  }\n\n  @action\n  handleWillDestroy() {\n    window.removeEventListener('beforeprint', this.beforePrint);\n    window.removeEventListener('afterprint', this.afterPrint);\n  }\n\n  beforePrint() {\n    this.isPrint = true;\n  }\n\n  afterPrint() {\n    this.isPrint = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ReadingResolve @readingId={{@section.body.reading_id}} as |readingUrl|>\\n  <ContentPresenter @isContainer={{false}}>\\n    {{#if (or @hasMultipleSections @heading)}}\\n      <div class=\\\"section-heading\\\">\\n        {{~#unless @section.hideSectionSortNumbers~}}\\n          {{~#if @hasMultipleSections~}}\\n            <div class=\\\"entity-thumbnail-position\\\">\\n              <EntityThumbnail\\n                class=\\\"entity-thumbnail-reset\\\"\\n                @model={{@section}}\\n                @index={{increment @index}}\\n              />\\n            </div>\\n          {{~/if~}}\\n        {{~/unless~}}\\n\\n        {{#if @heading}}\\n          <h2\\n            class=\\\"section-title\\\"\\n            data-id={{@section.document_id}}\\n            data-reading={{readingUrl}}\\n            data-reading-loading={{not readingUrl}}\\n          >\\n\\n            {{~@heading~}}\\n          </h2>\\n        {{/if}}\\n      </div>\\n    {{/if}}\\n\\n    <TbRender @content={{@section.contenteditor}} />\\n  </ContentPresenter>\\n</ReadingResolve>', { moduleName: 'babel/components/chapter-section/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  ...attributes\\n  data-test-choose-modal\\n  @title={{@title}}\\n  @size={{hash width=this.width height=\\\"large\\\"}}\\n  @closeOnRouteChange={{true}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  @onClose={{this.onClose}}\\n  as |modal|\\n>\\n\\n  <modal.header data-test-choose-modal-header />\\n\\n  <modal.content data-test-choose-modal-content class=\\\"p1\\\">\\n\\n    {{yield}}\\n\\n  </modal.content>\\n\\n  <modal.footer data-test-choose-modal-footer class=\\\"flex-justify p1\\\">\\n\\n    <UiButton\\n      data-test-choose-modal-delete-button\\n      class=\\\"mr1 text-color-error\\\"\\n      disabled={{eq this.count 0}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{this.onDelete}}\\n    >\\n\\n      {{t \\\"components.chooseModal.deleteButtonLabel\\\" count=this.count}}\\n\\n    </UiButton>\\n\\n    <div class=\\\"flex\\\">\\n\\n      <UiButton\\n        data-test-choose-modal-cancel-button\\n        class=\\\"mr1\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.onClose}}\\n      >\\n\\n        {{t \\\"components.chooseModal.cancelButtonLabel\\\"}}\\n\\n      </UiButton>\\n\\n      <UiButton\\n        data-test-choose-modal-choose-button\\n        disabled={{eq this.count 0}}\\n        @onClick={{this.handleChooseButtonClick}}\\n      >\\n\\n        {{t \\\"components.chooseModal.chooseButtonLabel\\\" count=this.count}}\\n\\n      </UiButton>\\n\\n    </div>\\n  </modal.footer>\\n\\n</XModal>\", {\"contents\":\"<XModal\\n  ...attributes\\n  data-test-choose-modal\\n  @title={{@title}}\\n  @size={{hash width=this.width height=\\\"large\\\"}}\\n  @closeOnRouteChange={{true}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  @onClose={{this.onClose}}\\n  as |modal|\\n>\\n\\n  <modal.header data-test-choose-modal-header />\\n\\n  <modal.content data-test-choose-modal-content class=\\\"p1\\\">\\n\\n    {{yield}}\\n\\n  </modal.content>\\n\\n  <modal.footer data-test-choose-modal-footer class=\\\"flex-justify p1\\\">\\n\\n    <UiButton\\n      data-test-choose-modal-delete-button\\n      class=\\\"mr1 text-color-error\\\"\\n      disabled={{eq this.count 0}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{this.onDelete}}\\n    >\\n\\n      {{t \\\"components.chooseModal.deleteButtonLabel\\\" count=this.count}}\\n\\n    </UiButton>\\n\\n    <div class=\\\"flex\\\">\\n\\n      <UiButton\\n        data-test-choose-modal-cancel-button\\n        class=\\\"mr1\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.onClose}}\\n      >\\n\\n        {{t \\\"components.chooseModal.cancelButtonLabel\\\"}}\\n\\n      </UiButton>\\n\\n      <UiButton\\n        data-test-choose-modal-choose-button\\n        disabled={{eq this.count 0}}\\n        @onClick={{this.handleChooseButtonClick}}\\n      >\\n\\n        {{t \\\"components.chooseModal.chooseButtonLabel\\\" count=this.count}}\\n\\n      </UiButton>\\n\\n    </div>\\n  </modal.footer>\\n\\n</XModal>\",\"moduleName\":\"babel/components/choose-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/choose-modal/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\n// export interface ChooseModalComponentArgs {\n//   title: string;\n//   count?: number;\n//   width: 'small' | 'medium' | 'large';\n//   onChoose(): Promise<void>;\n//   onClose(): void\n// }\n\nexport default class ChooseModalComponent extends Component {\n  get count() {\n    const count = this.args.count ?? 0;\n\n    assert(\n      `The @count arg passed to <ChooseModal> must be a number. Got ${typeof count}`,\n      typeof count === 'number'\n    );\n\n    return count;\n  }\n\n  get width() {\n    const width = this.args.width ?? 'medium';\n\n    assert(\n      \"The @width arg passed to <ChooseModal> is not valid. Valid values are 'small', 'medium' and 'large'.\",\n      ['small', 'medium', 'large'].includes(width)\n    );\n\n    return width;\n  }\n\n  get onChoose() {\n    const onChoose = this.args.onChoose;\n\n    assert(\n      `The @onChoose arg passed to <ChooseModal> must be a function. Got ${typeof onChoose}`,\n      typeof onChoose === 'function'\n    );\n\n    return onChoose;\n  }\n\n  get onDelete() {\n    const onDelete = this.args.onDelete;\n\n    assert(\n      `The @onDelete arg passed to <ChooseModal> must be a function. Got ${typeof onDelete}`,\n      typeof onDelete === 'function'\n    );\n\n    return onDelete;\n  }\n\n  get onClose() {\n    const onClose = this.args.onClose;\n\n    assert(\n      `The @onClose arg passed to <ChooseModal> must be a function. Got ${typeof onClose}`,\n      typeof onClose === 'function'\n    );\n\n    return onClose;\n  }\n\n  @action\n  async handleChooseButtonClick() {\n    try {\n      await this.onChoose();\n    } finally {\n      this.onClose();\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class CollectionAudioComponent extends Component {\n  /**\n   * Arguments:\n   * audioSource (string)\n   */\n\n  @storageFor('collection-sound') collectionSoundStore;\n\n  get showTip() {\n    return this.collectionSoundStore.get('showTip');\n  }\n\n  @action hideTip() {\n    this.collectionSoundStore.set('showTip', false);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAudio\\n  class=\\\"collection-audio\\\"\\n  @onPlayButtonClick={{this.hideTip}}\\n  @source={{@audioSource}}\\n  @canSpeedUp={{@canSpeedUp}}\\n  @canSlowDown={{@canSlowDown}}\\n  as |audio|\\n>\\n  {{#if this.showTip}}\\n    <XDismissibleTooltip @for={{audio.buttonId}} @onDismiss={{this.hideTip}}>\\n      {{t \\\"components.collectionAudio.audioToolTip\\\"}}\\n    </XDismissibleTooltip>\\n  {{/if}}\\n</XAudio>', { moduleName: 'babel/components/collection-audio/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"collection-view-editor\\\">\\n  <ContentPresenter>\\n    <TbRender @content={{@editor}} />\\n  </ContentPresenter>\\n</div>\\n', { moduleName: 'babel/components/collection-editor/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class CollectionExerciseIndexComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * activeExercise (object)\n   * answers (object)\n   * showStatus (bool)\n   * showNumAnswers (bool)\n   * useOriginalAnswer (bool)\n   * onExerciseChange (function)\n   * routed (bool)\n   */\n\n  get showTitles() {\n    const collection = this.args.collection;\n\n    if (collection?.isTeacherCollection) return true;\n\n    const type = collection?.type;\n\n    if (type === 'sections') {\n      return true;\n    }\n\n    if (collection?.isDiagnosis || collection?.isFlow) {\n      return false;\n    }\n\n    return true;\n  }\n\n  get indexTypeClass() {\n    if (!this.showTitles) {\n      return 'exercise-index-compact';\n    }\n\n    return 'exercise-index-lengthy';\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport {\n  getAnswersForExercise,\n  getLatestVersion,\n  getOriginalAnswer,\n} from 'babel/utils/get-answer';\n\nexport default class CollectionExerciseIndexItemComponent extends Component {\n  /**\n   * Arguments:\n   * exercise (object)\n   * active (bool)\n   * index (number)\n   * answers (object)\n   * showTitle (bool)\n   * showStatus (bool)\n   * useOriginalAnswer (bool)\n   * showNumAnswers (bool)\n   * onExerciseChange (function)\n   * routed (bool)\n   */\n\n  get title() {\n    let title = this.args.exercise?.title;\n\n    if (!this.args.exercise.hideAssignmentSortNumbers) {\n      title = `${this.args.index}. ${title}`;\n    }\n\n    return title;\n  }\n\n  get exerciseAnswers() {\n    return getAnswersForExercise(this.args.exercise, this.args.answers);\n  }\n\n  get answer() {\n    return this.args.useOriginalAnswer\n      ? getOriginalAnswer(this.args.exercise, this.exerciseAnswers)\n      : getLatestVersion(this.args.exercise, this.exerciseAnswers);\n  }\n\n  get numAnswers() {\n    return (\n      this.exerciseAnswers\n        ?.map((answer) => answer.belongsTo('user').id())\n        ?.filter((userId, idx, arr) => userId && arr.indexOf(userId) === idx)\n        ?.length || 0\n    );\n  }\n\n  @action\n  handleClick(evt) {\n    evt.preventDefault();\n    this.args.onExerciseChange?.(this.args.index);\n  }\n}\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CollectionExerciseIndexItemLinkComponent extends Component {\n  /**\n   * exercise (object)\n   * onClick (function)\n   * routed (bool)\n   */\n\n  @service contextHelper;\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~#if @routed~}}\\n  <UiLink\\n    @route=\\\"nodes\\\"\\n    @model={{@exercise.id}}\\n    @query={{hash content=this.contextHelper.activeContent.id}}\\n    class=\\\"exercise-item-link\\\"\\n    {{on \\\"click\\\" @onClick}}\\n  >\\n    {{~yield~}}\\n  </UiLink>\\n{{~else~}}\\n  <a href=\\\"#\\\" class=\\\"exercise-item-link\\\" {{on \\\"click\\\" @onClick}}>\\n    {{~yield~}}\\n  </a>\\n{{~/if~}}\\n', { moduleName: 'babel/components/collection-exercise-index/item/link/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<li class=\\\"exercise-item{{if @active \\' exercise-item-active\\'}}\\\">\\n  <CollectionExerciseIndex::Item::Link\\n    @exercise={{@exercise}}\\n    @onClick={{this.handleClick}}\\n    @routed={{@routed}}\\n  >\\n    <div class=\\\"flex flex-center\\\">\\n      {{~#if (or @showStatus @showTitle)}}\\n        {{~#if @showStatus~}}\\n          <AnswerStatusIcon\\n            @status={{or this.answer.computedStatus \\\"not-started\\\"}}\\n            class=\\\"exercise-item-status-icon\\\"\\n          />\\n        {{~/if}}\\n\\n        {{~#if @showTitle~}}\\n          <span\\n            class=\\\"exercise-item-title text-color-default\\\"\\n            data-test-exercise-item-title\\n          >\\n            {{~html-entities this.title~}}\\n          </span>\\n        {{~/if}}\\n      {{~else~}}\\n        <span class=\\\"exercise-item-index\\\">\\n          {{@index}}\\n        </span>\\n      {{~/if~}}\\n\\n      {{#if @showNumAnswers}}\\n        <XBadge\\n          class=\\\"num-answers-badge nl1\\\"\\n          @id={{concat \\\"num-answers-\\\" @exercise.id}}\\n          @variant=\\\"flat\\\"\\n          @size={{if (or @showStatus @showTitle) \\\"small\\\" \\\"xsmall\\\"}}\\n        >\\n          {{this.numAnswers}}\\n        </XBadge>\\n\\n        <XTooltip @for={{concat \\\"num-answers-\\\" @exercise.id}}>\\n          {{t \\\"components.collectionExerciseIndex.item.numAnswers\\\"}}\\n        </XTooltip>\\n      {{/if}}\\n    </div>\\n\\n    {{#if @exercise.isTeacherAssignment}}\\n      {{#unless @exercise.isPublished}}\\n        <XBadge class=\\\"ml1\\\" @size=\\\"small\\\">\\n          {{t \\\"components.collectionExerciseIndex.item.draftBadgeLabel\\\"}}\\n        </XBadge>\\n      {{/unless}}\\n    {{/if}}\\n  </CollectionExerciseIndex::Item::Link>\\n</li>', { moduleName: 'babel/components/collection-exercise-index/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class={{concat \\\"collection-exercise-index collection-\\\" this.indexTypeClass}}\\n  ...attributes\\n  {{collection-index @collection}}\\n>\\n  <ul>\\n    <EntityCategorizer\\n      @entity={{@collection}}\\n      @validEntities={{@exercises}}\\n      as |categoryGroup|\\n    >\\n      {{#if categoryGroup.category}}\\n        <li class=\\\"text-bold mb1 mt2\\\">\\n          {{categoryGroup.category.name}}\\n        </li>\\n      {{/if}}\\n      <li class={{concat this.indexTypeClass \\\"-wrapper\\\"}}>\\n        <ul class={{this.indexTypeClass}}>\\n          {{#if @collection.isTeacherCollection}}\\n            {{#each @exercises key=\\\"id\\\" as |entity index|}}\\n              <CollectionExerciseIndex::Item\\n                @exercise={{entity}}\\n                @active={{eq entity.id @activeExercise.id}}\\n                @index={{increment index}}\\n                @answers={{@answers}}\\n                @showTitle={{this.showTitles}}\\n                @showStatus={{@showStatus}}\\n                @showNumAnswers={{@showNumAnswers}}\\n                @useOriginalAnswer={{@useOriginalAnswer}}\\n                @onExerciseChange={{@onExerciseChange}}\\n                @routed={{@routed}}\\n              />\\n            {{/each}}\\n          {{else}}\\n            {{#each categoryGroup.entities key=\\\"id\\\" as |entityObj|}}\\n              <CollectionExerciseIndex::Item\\n                @exercise={{entityObj.entity}}\\n                @active={{eq entityObj.entity.id @activeExercise.id}}\\n                @index={{entityObj.globalIndex}}\\n                @answers={{@answers}}\\n                @showTitle={{this.showTitles}}\\n                @showStatus={{@showStatus}}\\n                @showNumAnswers={{@showNumAnswers}}\\n                @useOriginalAnswer={{@useOriginalAnswer}}\\n                @onExerciseChange={{@onExerciseChange}}\\n                @routed={{@routed}}\\n              />\\n            {{/each}}\\n          {{/if}}\\n        </ul>\\n      </li>\\n    </EntityCategorizer>\\n  </ul>\\n</div>\\n', { moduleName: 'babel/components/collection-exercise-index/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CollectionListItemCarouselComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * currentExercise (object)\n   * interactive (object)\n   * answers (array)\n   * onOpenCollection (function)\n   */\n\n  @service router;\n\n  baseClass = 'collection-list-item';\n\n  get linked() {\n    if (this.args.onOpenCollection && this.args.currentExercise) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get classNames() {\n    const classes = [this.baseClass];\n\n    classes.push(`${this.baseClass}-carousel`);\n\n    return classes.join(' ');\n  }\n\n  get showBagde() {\n    return this.args.interactive?.ended;\n  }\n\n  get canContinue() {\n    return (\n      this.args.interactive?.isStarted && !this.args.interactive?.isCompleted\n    );\n  }\n\n  get badgeVariant() {\n    return this.args.interactive?.score === this.args.interactive?.numExercises\n      ? 'success'\n      : 'default';\n  }\n\n  @action async handleOpenCollection(e) {\n    e?.preventDefault();\n\n    return this.args.onOpenCollection?.(\n      this.args.collection,\n      this.args.currentExercise\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classNames}} ...attributes>\\n  <div class=\\\"collection-list-item-header\\\">\\n    <div class=\\\"flex flex-center\\\">\\n      <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n      {{#let\\n        (component \\\"ui-link\\\" route=\\\"nodes\\\" model=@collection.id)\\n        as |LinkComponent|\\n      }}\\n\\n        <div class=\\\"flex-auto\\\">\\n          <LinkComponent\\n            @appearance=\\\"link\\\"\\n            class=\\\"text-ui\\\"\\n            {{on \\\"click\\\" this.handleOpenCollection}}\\n          >\\n            {{@collection.title}}\\n          </LinkComponent>\\n\\n          <div class=\\\"text-small\\\">\\n            {{t\\n              \\\"components.collectionListItem.numExercises\\\"\\n              count=@exercises.length\\n            }}\\n          </div>\\n        </div>\\n\\n        {{#if this.showBagde}}\\n          <div class=\\\"flex-shrink ml1\\\">\\n            <XBadge\\n              @size=\\\"small\\\"\\n              @variant={{this.badgeVariant}}\\n              data-test-collection-list-item-carousel-badge\\n            >\\n              {{t\\n                \\\"components.collectionListItem.carousel.result\\\"\\n                score=@interactive.numCorrectAnswers\\n                scoreMax=@interactive.numExercises\\n              }}\\n            </XBadge>\\n          </div>\\n        {{/if}}\\n\\n        {{#if this.canContinue}}\\n          <UiButton\\n            class=\\\"collection-list-item-continue-button\\\"\\n            @onClick={{this.handleOpenCollection}}\\n            data-test-collection-list-item-carousel-continue-button\\n          >\\n            {{t \\\"components.collectionListItem.carousel.continue\\\"}}\\n          </UiButton>\\n        {{/if}}\\n\\n        <CollectionOptions @collection={{@collection}} class=\\\"ml1\\\" />\\n\\n        {{#if this.linked}}\\n          <LinkComponent\\n            class=\\\"collection-list-item-carousel-link-backdrop\\\"\\n            {{on \\\"click\\\" this.handleOpenCollection}}\\n          />\\n        {{/if}}\\n\\n      {{/let}}\\n    </div>\\n  </div>\\n</div>', { moduleName: 'babel/components/collection-list-item/carousel/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CollectionListItemComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * onOpenExercise (function)\n   * startExpanded (bool)\n   * onOpenCollection (function)\n   * active (bool)\n   */\n\n  @service assignmentEvents;\n\n  @service missionMode;\n\n  @tracked collection = this.args.collection;\n\n  @cached get interactiveProxy() {\n    const promise = this.assignmentEvents.getOrCreateInteractiveForCollection(\n      this.collection\n    );\n\n    return load(promise, this);\n  }\n\n  get interactive() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.interactive\n      : null;\n  }\n\n  get currentExercise() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeExercise\n      : null;\n  }\n\n  get answers() {\n    return this.interactive?.answers || [];\n  }\n\n  @cached get exercisesProxy() {\n    const promise = resolve(this.collection?.children)\n      .then((children) => this.missionMode.allowedEntities(children))\n      .then((exercises) => {\n        if (this.collection?.isTeacherCollection) {\n          exercises = exercises.sortBy('title');\n        }\n\n        return exercises;\n      });\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : [];\n  }\n\n  @action resetCollection() {\n    this.collection = this.args.collection;\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { getNumCorrectAnswers } from 'babel/utils/assignments';\n\nexport default class CollectionListItemDiagnosisComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * interactive (object)\n   * answers (array)\n   */\n\n  @service router;\n\n  baseClass = 'collection-list-item';\n\n  get classNames() {\n    const classes = [this.baseClass];\n\n    classes.push(`${this.baseClass}-diagnosis`);\n\n    return classes.join(' ');\n  }\n\n  get attemptsLeft() {\n    const latestAttempt = this.args.interactive?.attempt || 0;\n\n    return Math.max(this.args.collection.allowedAttempts - latestAttempt, 0);\n  }\n\n  get canContinue() {\n    return this.args.interactive?.isActive;\n  }\n\n  get showLatestResult() {\n    return this.args.interactive ? true : false;\n  }\n\n  get score() {\n    return getNumCorrectAnswers(this.args.answers);\n  }\n\n  get badgeVariant() {\n    return this.score >= this.args.collection?.pointsRequired\n      ? 'success'\n      : 'default';\n  }\n\n  @action handleOpenCollection(e) {\n    e?.preventDefault();\n    e?.stopPropagation();\n    e?.stopImmediatePropagation();\n\n    return this.router.transitionTo(\n      'master.interactives.diagnoses.index',\n      this.args.collection.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classNames}} ...attributes>\\n  <div class=\\\"collection-list-item-header\\\">\\n    <div class=\\\"flex flex-center\\\">\\n      <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n      {{#let\\n        (component \\\"ui-link\\\" route=\\\"nodes\\\" model=@collection.id)\\n        as |LinkComponent|\\n      }}\\n\\n        <div class=\\\"flex-auto\\\">\\n          <LinkComponent\\n            @appearance=\\\"link\\\"\\n            class=\\\"text-ui\\\"\\n            data-test-collection-list-item-diagnosis-link\\n            {{on \\\"click\\\" this.handleOpenCollection}}\\n          >\\n            {{@collection.title}}\\n          </LinkComponent>\\n\\n          <div class=\\\"text-small\\\">\\n            {{t\\n              \\\"components.collectionListItem.diagnosisInfo\\\"\\n              count=@exercises.length\\n              time=@collection.timeAllowed\\n              attempts=this.attemptsLeft\\n            }}\\n          </div>\\n        </div>\\n\\n        <CollectionOptions @collection={{@collection}} class=\\\"ml1\\\" />\\n\\n        {{#if this.canContinue}}\\n          <UiButton\\n            class=\\\"collection-list-item-continue-button\\\"\\n            @onClick={{this.handleOpenCollection}}\\n          >\\n            {{t \\\"components.collectionListItem.diagnosis.continue\\\"}}\\n          </UiButton>\\n        {{else if this.showLatestResult}}\\n          <div class=\\\"flex-shrink ml1\\\">\\n            <XBadge @size=\\\"small\\\" @variant={{this.badgeVariant}}>\\n              {{t\\n                \\\"components.collectionListItem.diagnosis.result\\\"\\n                score=this.score\\n                scoreMax=@exercises.length\\n              }}\\n            </XBadge>\\n          </div>\\n        {{/if}}\\n\\n        <LinkComponent\\n          class=\\\"collection-list-item-diagnosis-link-backdrop\\\"\\n          {{on \\\"click\\\" this.handleOpenCollection}}\\n        />\\n\\n      {{/let}}\\n\\n    </div>\\n  </div>\\n</div>', { moduleName: 'babel/components/collection-list-item/diagnosis/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class CollectionListItemStandardComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * currentExercise (object)\n   * answers (array)\n   * onOpenExercise (function)\n   * startExpanded (bool)\n   * onOpenCollection (function)\n   * resetCollection (function)\n   */\n\n  @service contextHelper;\n\n  @tracked expanded = this.args.startExpanded ? true : false;\n\n  baseClass = 'collection-list-item';\n\n  get linked() {\n    if (this.args.onOpenCollection && this.args.currentExercise) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get classNames() {\n    const classes = [this.baseClass];\n\n    classes.push(`${this.baseClass}-standard`);\n\n    return classes.join(' ');\n  }\n\n  @action\n  openExercise(index) {\n    const exercise = this.args.exercises.objectAt(index - 1);\n    if (exercise) return this.args.onOpenExercise?.(exercise);\n  }\n\n  @action\n  handleOpenCollection(e) {\n    e?.preventDefault();\n    e?.stopPropagation();\n\n    return this.args.onOpenCollection?.(\n      this.args.collection,\n      this.args.currentExercise\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (gt @exercises.length 1)}}\\n  <XAccordion\\n    @expanded={{this.expanded}}\\n    class={{this.classNames}}\\n    ...attributes\\n    as |Accordion|\\n  >\\n    <Accordion.header\\n      @isClickable={{false}}\\n      class=\\\"collection-list-item-header\\\"\\n      data-test-collection-list-item-accordion-header\\n    >\\n      {{#let\\n        (component\\n          \\\"ui-link\\\"\\n          route=\\\"nodes\\\"\\n          model=@currentExercise.id\\n          query=(hash content=this.contextHelper.activeContent.id)\\n        )\\n        as |LinkComponent|\\n      }}\\n        <div class=\\\"flex flex-center\\\">\\n          <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n          <div class=\\\"flex-auto\\\" data-test-collection-list-item-title>\\n            {{#if this.linked}}\\n              <LinkComponent\\n                class=\\\"text-ui\\\"\\n                {{on \\\"click\\\" this.handleOpenCollection}}\\n                data-info={{@collection.id}}\\n              >\\n                {{@collection.title}}\\n              </LinkComponent>\\n            {{else}}\\n              <div class=\\\"text-ui\\\">\\n                {{@collection.title}}\\n              </div>\\n            {{/if}}\\n\\n            <div class=\\\"text-small\\\">\\n              {{t\\n                \\\"components.collectionListItem.numExercises\\\"\\n                count=@exercises.length\\n              }}\\n            </div>\\n          </div>\\n\\n          <CollectionOptions\\n            @collection={{@collection}}\\n            @resetCollection={{@resetCollection}}\\n            class=\\\"flex-shrink ml1 nr1\\\"\\n          />\\n        </div>\\n        {{#if this.linked}}\\n          <LinkComponent\\n            class=\\\"collection-list-item-standard-link-backdrop\\\"\\n            {{on \\\"click\\\" this.handleOpenCollection}}\\n            data-info={{@collection.id}}\\n          />\\n        {{/if}}\\n      {{/let}}\\n    </Accordion.header>\\n\\n    <Accordion.content class=\\\"p0 nt1 mb1\\\">\\n      <CollectionExerciseIndex\\n        @collection={{@collection}}\\n        @exercises={{@exercises}}\\n        @answers={{@answers}}\\n        @showStatus={{true}}\\n        @onExerciseChange={{this.openExercise}}\\n        @routed={{@routed}}\\n      />\\n    </Accordion.content>\\n  </XAccordion>\\n{{else}}\\n  <div class=\\\"collection-list-item\\\">\\n    <div class=\\\"collection-list-item-header\\\">\\n      {{#let\\n        (component\\n          \\\"ui-link\\\"\\n          route=\\\"nodes\\\"\\n          model=@currentExercise.id\\n          query=(hash content=this.contextHelper.activeContent.id)\\n        )\\n        as |LinkComponent|\\n      }}\\n        <div class=\\\"flex flex-center\\\">\\n          <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n          <div class=\\\"flex-auto\\\" data-test-collection-list-item-title>\\n            {{#if this.linked}}\\n              <LinkComponent\\n                class=\\\"text-ui\\\"\\n                {{on \\\"click\\\" this.handleOpenCollection}}\\n                data-info={{@collection.id}}\\n              >\\n                {{@collection.title}}\\n              </LinkComponent>\\n            {{else}}\\n              <div class=\\\"text-ui\\\">\\n                {{@collection.title}}\\n              </div>\\n            {{/if}}\\n          </div>\\n\\n          <CollectionOptions\\n            @collection={{@collection}}\\n            @resetCollection={{@resetCollection}}\\n            class=\\\"flex-shrink ml1\\\"\\n          />\\n        </div>\\n        {{#if this.linked}}\\n          <LinkComponent\\n            class=\\\"collection-list-item-standard-link-backdrop\\\"\\n            {{on \\\"click\\\" this.handleOpenCollection}}\\n            data-info={{@collection.id}}\\n          />\\n        {{/if}}\\n      {{/let}}\\n    </div>\\n  </div>\\n{{/if}}', { moduleName: 'babel/components/collection-list-item/standard/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (not (or @collection.isDeleted (eq this.exercises.length 0)))}}\\n  {{#if @collection.isDiagnosis}}\\n    <CollectionListItem::Diagnosis\\n      @collection={{@collection}}\\n      @exercises={{this.exercises}}\\n      @interactive={{this.interactive}}\\n      @answers={{this.answers}}\\n      class={{if @active \\\"collection-list-item--active\\\"}}\\n    />\\n  {{else if @collection.isCarousel}}\\n    <CollectionListItem::Carousel\\n      @collection={{@collection}}\\n      @exercises={{this.exercises}}\\n      @currentExercise={{this.currentExercise}}\\n      @interactive={{this.interactive}}\\n      @answers={{this.answers}}\\n      @onOpenCollection={{@onOpenCollection}}\\n      class={{if @active \\\"collection-list-item--active\\\"}}\\n    />\\n  {{else}}\\n    <CollectionListItem::Standard\\n      @collection={{@collection}}\\n      @exercises={{this.exercises}}\\n      @currentExercise={{this.currentExercise}}\\n      @answers={{this.answers}}\\n      @onOpenExercise={{@onOpenExercise}}\\n      @startExpanded={{@startExpanded}}\\n      @onOpenCollection={{@onOpenCollection}}\\n      @resetCollection={{this.resetCollection}}\\n      @routed={{@routed}}\\n      class={{if @active \\\"collection-list-item--active\\\"}}\\n    />\\n  {{/if}}\\n{{/if}}', { moduleName: 'babel/components/collection-list-item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @collections}}\\n\\n  {{#each @collections as |collection index|}}\\n\\n    {{#unless (eq index 0)}}\\n\\n      <div class=\\\"collection-list-divider\\\"></div>\\n\\n    {{/unless}}\\n\\n    <CollectionListItem\\n      @collection={{collection}}\\n      @onOpenExercise={{@onOpenExercise}}\\n      @startExpanded={{or (eq collection.template \\\"standard\\\") collection.isTeacherCollection}}\\n      @onOpenCollection={{this.handleOpenCollection}}\\n    />\\n\\n  {{/each}}\\n\\n{{/if}}\\n\", {\"contents\":\"{{#if @collections}}\\n\\n  {{#each @collections as |collection index|}}\\n\\n    {{#unless (eq index 0)}}\\n\\n      <div class=\\\"collection-list-divider\\\"></div>\\n\\n    {{/unless}}\\n\\n    <CollectionListItem\\n      @collection={{collection}}\\n      @onOpenExercise={{@onOpenExercise}}\\n      @startExpanded={{or (eq collection.template \\\"standard\\\") collection.isTeacherCollection}}\\n      @onOpenCollection={{this.handleOpenCollection}}\\n    />\\n\\n  {{/each}}\\n\\n{{/if}}\\n\",\"moduleName\":\"babel/components/collection-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/collection-list/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CollectionListComponent extends Component {\n  /**\n   * Arguments:\n   * collections (array)\n   */\n\n  @service router;\n\n  @action handleOpenCollection(collection, exercise) {\n    return this.router.transitionTo(\n      'master.contents.assignments.show',\n      exercise.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class={{this.classNames}} ...attributes>\\n  <UiButton\\n    @appearance={{this.appearance}}\\n    @onClick={{this.toggleModal}}\\n  >\\n    <DcIcon\\n      @name={{this.icon}}\\n      class={{if (not-eq this.appearance \\\"bulb\\\") \\\"n1\\\"}}\\n    />\\n  </UiButton>\\n</div>\\n\", {\"contents\":\"<div class={{this.classNames}} ...attributes>\\n  <UiButton\\n    @appearance={{this.appearance}}\\n    @onClick={{this.toggleModal}}\\n  >\\n    <DcIcon\\n      @name={{this.icon}}\\n      class={{if (not-eq this.appearance \\\"bulb\\\") \\\"n1\\\"}}\\n    />\\n  </UiButton>\\n</div>\\n\",\"moduleName\":\"babel/components/collection-modal-toggler/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/collection-modal-toggler/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class CollectionModalTogglerComponent extends Component {\n  /**\n   * Arguments:\n   * appearance (string)\n   * isModalOpen (bool)\n   * closeModal (function)\n   * openModal (function)\n   */\n\n  get classNames() {\n    const classNames = [\n      'collection-modal-toggler',\n      'flex',\n      'flex-center',\n      'justify-center',\n    ];\n\n    if (this.args.isModalOpen) {\n      classNames.push('collection-modal-open');\n    } else {\n      classNames.push('collection-modal-closed');\n    }\n\n    return classNames.join(' ');\n  }\n\n  get icon() {\n    return this.args.isModalOpen ? 'simple-remove' : 'expand';\n  }\n\n  get appearance() {\n    return this.args.appearance || 'bulb';\n  }\n\n  @action toggleModal() {\n    if (this.args.isModalOpen) {\n      this.args.closeModal?.();\n      document.body.classList.remove('collection-modal--open');\n    } else {\n      this.args.openModal?.();\n      document.body.classList.add('collection-modal--open');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @isModalOpen}}\\n  <XModal\\n    @onClose={{@closeModal}}\\n    @size={{hash width=\\\"xlarge\\\" height=\\\"xlarge\\\"}}\\n    @title={{t \\\"components.collectionModal.assignments\\\"}}\\n    as |Modal|\\n  >\\n    <Modal.header />\\n\\n    <Modal.content class=\\\"collection-modal\\\">\\n      {{yield}}\\n    </Modal.content>\\n  </XModal>\\n{{else}}\\n  {{yield}}\\n{{/if}}', { moduleName: 'babel/components/collection-modal/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport generateId from 'compton/utils/generate-id';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CollectionOptionsComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * title (string)\n   * hasIndex (boolean)\n   * resetCollection (function)\n   */\n\n  @service session;\n\n  @service contextHelper;\n\n  @service confirmManager;\n\n  @service intl;\n\n  @service assignmentEvents;\n\n  @service missionMode;\n\n  @tracked popoverOpen = false;\n\n  @tracked shareDialogOpen = false;\n\n  @tracked previewModalOpen = false;\n\n  @tracked showKey = true;\n\n  get hasOptions() {\n    if (this.session.user?.isTeacher) return true;\n    return false;\n  }\n\n  get isClickable() {\n    if (this.args.hasIndex) return true;\n    if (this.hasOptions) return true;\n    return false;\n  }\n\n  get buttonId() {\n    return generateId();\n  }\n\n  get link() {\n    const host = window.location.origin;\n    const collection = this.args.collection;\n\n    if (!collection.isTeacherCollection) {\n      return `${host}/nodes/${collection.id}`;\n    }\n\n    let url = `${host}/nodes/${collection.children.firstObject.id}`;\n\n    if (this.contextHelper.inContent) {\n      url += `?content=${this.contextHelper.activeContent.id}`;\n    }\n\n    return url;\n  }\n\n  @cached\n  get exercisesProxy() {\n    const promise = resolve(this.args.collection?.children)\n      .then((children) => this.missionMode.allowedEntities(children))\n\n      .then((exercises) => {\n        if (this.args.collection?.isTeacherCollection) {\n          exercises = exercises.sortBy('title');\n        }\n\n        return exercises;\n      });\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : [];\n  }\n\n  @cached\n  get answersProxy() {\n    const promise = resolve(\n      this.assignmentEvents.getAnswersForExercises(this.exercises, false)\n    );\n\n    return load(promise, this);\n  }\n\n  get answers() {\n    return this.answersProxy.isResolved ? this.answersProxy.value : null;\n  }\n\n  get notStarted() {\n    if (!this.answers) return true;\n\n    return this.answers?.every((answer) => {\n      return answer.status === 'not-started';\n    });\n  }\n\n  get showAuditKey() {\n    const showAuditKey = this.exercises.any((exercise) => {\n      if (exercise.body?.exercise?.assignments?.firstObject?.settings?.solution)\n        return true;\n      if (['assignments', 'studies'].includes(exercise?.type)) {\n        return false;\n      }\n      return true;\n    });\n\n    return showAuditKey;\n  }\n\n  @action\n  handleClick(e) {\n    e.preventDefault();\n    e.stopImmediatePropagation();\n\n    this.popoverOpen = true;\n  }\n\n  @action\n  handleClose() {\n    this.popoverOpen = false;\n  }\n\n  @action\n  openShareDialog() {\n    this.shareDialogOpen = true;\n    this.popoverOpen = false;\n  }\n\n  @action\n  closeShareDialog() {\n    this.shareDialogOpen = false;\n  }\n\n  @action\n  resetAnswers() {\n    this.popoverOpen = false;\n\n    return this.confirmManager\n      .confirm(\n        this.intl.t('components.collectionOptions.reset', {\n          collection: this.args.collection.title,\n        })\n      )\n      .then(() => this._clearAnswers())\n      .catch(() => {});\n  }\n\n  async _clearAnswers() {\n    const collection = this.args.collection;\n\n    // make sure children is resolved so this.exercises has the correct value\n    await collection.children;\n\n    const answers = await this.assignmentEvents.getAnswersForExercises(\n      this.exercises,\n      false\n    );\n\n    const { interactive } =\n      await this.assignmentEvents.getOrCreateInteractiveForCollection(\n        collection\n      );\n\n    await all(\n      answers.map(async (answer) => {\n        let teacherAssignment, exercise;\n\n        if (answer.type === 'teacher_assignment') {\n          // For teacher assignments we need to locate the correct generated\n          // entity for the teacher assignment and use that as exercise when\n          // reseting the answer.\n          teacherAssignment = await answer.teacherAssignment;\n          exercise = this.exercises.find(\n            (exercise) =>\n              exercise.belongsTo('teacherAssignment').id() ===\n              teacherAssignment.id\n          );\n        } else {\n          exercise = await answer.entity;\n        }\n\n        await this.assignmentEvents.resetAnswer(answer, exercise);\n      })\n    );\n\n    // Reset interactive to initial state\n    interactive.currentExercise = this.exercises[0];\n    interactive.ended = null;\n    interactive.correctExercises = [];\n\n    if (!interactive.isSaving && !collection.isTeacherCollection) {\n      // interactives cannot be saved for teacher collections since\n      // there is no actual collection entity to connect them to.\n      interactive.save();\n    }\n\n    this.args.resetCollection?.();\n  }\n\n  @action\n  openPreviewModal() {\n    this.previewModalOpen = true;\n    this.popoverOpen = false;\n  }\n\n  @action\n  closePreviewModal() {\n    this.previewModalOpen = false;\n  }\n}\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CollectionOptionsPreviewComponent extends Component {\n  @service assignmentEvents;\n\n  @cached get answerProxy() {\n    const promise = resolve(\n      this.assignmentEvents.getOrCreateAnswerForExercise(this.args.exercise, [])\n    );\n\n    return load(promise, this);\n  }\n\n  get answer() {\n    return this.answerProxy.isResolved ? this.answerProxy.value : null;\n  }\n\n  get index() {\n    return this.args.index + 1;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.answer}}\\n  <ExerciseView\\n    class=\\\"audit-exercise m1\\\"\\n    @index={{this.index}}\\n    @exercise={{@exercise}}\\n    @disabled={{true}}\\n    @hideMeta={{true}}\\n    @canStartConversation={{false}}\\n    @answer={{this.answer}}\\n    @emptyAnswer={{false}}\\n    @showKey={{@showKey}}\\n    @preview={{true}}\\n    as |ExerciseComponent|\\n  >\\n    {{yield (hash ExerciseTarget=ExerciseComponent.target)}}\\n  </ExerciseView>\\n{{/if}}', { moduleName: 'babel/components/collection-options/preview/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isClickable}}\\n  <div class=\\\"collection-options\\\" ...attributes>\\n    <UiButton\\n      class=\\\"collection-options-button\\\"\\n      @appearance=\\\"none\\\"\\n      @onClick={{this.handleClick}}\\n      @id={{this.buttonId}}\\n      data-test-collection-options-button\\n    >\\n      {{#if @title}}\\n        <span class=\\\"text-color-default\\\" data-test-collection-options-title>\\n          {{@title}}\\n        </span>\\n      {{else}}\\n        <DcIcon\\n          @name=\\\"menu-dots\\\"\\n          class=\\\"collection-options-button-icon n1\\\"\\n          data-test-collection-options-icon\\n        />\\n      {{/if}}\\n    </UiButton>\\n\\n    {{#if this.popoverOpen}}\\n      <XPopup\\n        @for={{this.buttonId}}\\n        @onClose={{this.handleClose}}\\n        @opacity={{0}}\\n        @switchToDialogOnSmallBreakpoint={{false}}\\n      >\\n        {{#if this.hasOptions}}\\n          <div\\n            class=\\\"collection-options-popup\\\"\\n            data-test-collection-options-popup\\n          >\\n            <UiButton\\n              @appearance=\\\"link\\\"\\n              @width=\\\"expand\\\"\\n              @onClick={{this.openPreviewModal}}\\n              data-test-collection-options-preview-button\\n            >\\n              <div class=\\\"flex flex-center ny1\\\">\\n                <DcIcon @name=\\\"preview\\\" class=\\\"nr1\\\" />\\n                {{t \\\"components.collectionOptions.preview\\\"}}\\n              </div>\\n            </UiButton>\\n\\n            <UiButton\\n              @appearance=\\\"link\\\"\\n              @width=\\\"expand\\\"\\n              @onClick={{this.openShareDialog}}\\n              data-test-collection-options-share-button\\n            >\\n              <div class=\\\"flex flex-center ny1\\\">\\n                <DcIcon @name=\\\"share\\\" class=\\\"nr1\\\" />\\n                {{t \\\"components.collectionOptions.share\\\"}}\\n              </div>\\n            </UiButton>\\n          </div>\\n\\n          {{#if (not (or @collection.isDiagnosis @collection.isCarousel))}}\\n            <div class=\\\"divider ml1 mr1\\\"></div>\\n\\n            <div class=\\\"collection-options-popup\\\">\\n              <UiButton\\n                @appearance=\\\"link\\\"\\n                @width=\\\"expand\\\"\\n                @onClick={{this.resetAnswers}}\\n                @variant=\\\"error\\\"\\n                @disabled={{this.notStarted}}\\n                data-test-collection-options-clear-button\\n              >\\n                <div class=\\\"flex flex-center ny1\\\">\\n                  <DcIcon @name=\\\"eraser\\\" class=\\\"nr1\\\" />\\n                  {{t \\\"components.collectionOptions.clear\\\"}}\\n                </div>\\n              </UiButton>\\n            </div>\\n          {{/if}}\\n\\n          {{#if @hasIndex}}\\n            <div class=\\\"divider ml1 mr1\\\"></div>\\n          {{/if}}\\n        {{/if}}\\n\\n        {{yield to=\\\"index\\\"}}\\n      </XPopup>\\n    {{/if}}\\n\\n    {{#if this.shareDialogOpen}}\\n      <ShareLinkModal\\n        @entity={{@collection}}\\n        @link={{this.link}}\\n        @onClose={{this.closeShareDialog}}\\n        data-test-collection-options-share-dialog\\n      />\\n    {{/if}}\\n\\n    {{#if this.previewModalOpen}}\\n      <XModal\\n        class=\\\"collection-options-preview-modal\\\"\\n        @onClose={{this.closePreviewModal}}\\n        @title={{t \\\"components.collectionOptions.preview\\\"}}\\n        @size=\\\"xlarge\\\"\\n        data-test-collection-options-preview-modal\\n        as |modal|\\n      >\\n        <modal.header />\\n\\n        <modal.content class=\\\"p1\\\">\\n          {{#if this.showAuditKey}}\\n            <XSwitch\\n              @content={{t \\\"components.collectionOptions.showKey\\\"}}\\n              class=\\\"collection-options-exercise-answer-switch\\\"\\n              @checked={{this.showKey}}\\n            />\\n          {{/if}}\\n          {{#each this.exercises as |exercise index|}}\\n            <div\\n              class=\\\"collection-options-exercise flex flex-column flex-center\\\"\\n            >\\n              <CollectionOptions::Preview\\n                @index={{index}}\\n                @collection={{@collection}}\\n                @exercise={{exercise}}\\n                @showKey={{this.showKey}}\\n              />\\n            </div>\\n            <hr class=\\\"collection-options-divider\\\" />\\n          {{/each}}\\n        </modal.content>\\n      </XModal>\\n    {{/if}}\\n  </div>\\n{{else if @title}}\\n  <div class=\\\"text-ui\\\" data-test-collection-options-only-title>\\n    {{@title}}\\n  </div>\\n{{/if}}', { moduleName: 'babel/components/collection-options/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class CollectionSummaryComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * answers (array)\n   * onExerciseChange (function)\n   * onCollectionClose (function)\n   */\n\n  get image() {\n    return '/assets/images/collection/summary.svg';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"collection-summary\\\">\\n  <div class=\\\"collection-summary-content\\\">\\n    {{! template-lint-disable require-iframe-title }}\\n    <iframe\\n      src={{this.image}}\\n      class=\\\"collection-summary-image\\\"\\n      data-test-collection-summary-image\\n    />\\n\\n    <div class=\\\"text-secondary\\\" data-test-collection-summary-title>\\n      {{t \\\"components.collectionSummary.title\\\"}}\\n    </div>\\n\\n    <CollectionExerciseIndex\\n      class=\\\"collection-summary-exercises mt1\\\"\\n      @collection={{@collection}}\\n      @exercises={{@exercises}}\\n      @answers={{@answers}}\\n      @showStatus={{true}}\\n      @onExerciseChange={{@onExerciseChange}}\\n      @routed={{true}}\\n    />\\n\\n    <UiButton\\n      @onClick={{@onCollectionClose}}\\n      class=\\\"nx1 mt1\\\"\\n      data-test-collection-summary-button\\n    >\\n      {{t \\\"components.collectionSummary.close\\\"}}\\n    </UiButton>\\n  </div>\\n</div>', { moduleName: 'babel/components/collection-summary/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CollectionTopbarComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * title (string)\n   * exercises (array)\n   * activeExercise (object)\n   * onExerciseChange (function)\n   * hasPagination (bool)\n   */\n\n  @service media;\n\n  get activePage() {\n    const index = this.args.exercises?.indexOf(this.args.activeExercise);\n\n    if (index >= 0) {\n      return index + 1;\n    }\n\n    return 1;\n  }\n\n  get numExercises() {\n    return this.args.exercises?.length;\n  }\n\n  get hasPagination() {\n    return this.args.hasPagination && this.numExercises >= 2;\n  }\n\n  get hasPopupIndex() {\n    return this.hasPagination;\n  }\n\n  @action handleIndexGoTo(index) {\n    this.args.onExerciseChange?.(index);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"collection-topbar\\\">\\n  {{yield (hash Left=(component \\\"x-empty\\\"))}}\\n\\n  <EntityProgress\\n    @model={{@collection}}\\n    @animated={{true}}\\n    @inCollectionView={{true}}\\n    class=\\\"flex-shrink mr1\\\"\\n  />\\n\\n  <div class=\\\"flex-auto\\\">\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      @title={{@title}}\\n      @hasIndex={{this.hasPopupIndex}}\\n    >\\n      <:index>\\n        {{#if this.hasPopupIndex}}\\n          <div class=\\\"collection-popup-index\\\">\\n            {{yield (hash Index=(component \\\"x-empty\\\"))}}\\n          </div>\\n        {{/if}}\\n      </:index>\\n    </CollectionOptions>\\n\\n    {{#if (and this.numExercises (gt this.numExercises 1))}}\\n      <div class=\\\"text-small text-muted\\\">\\n        {{t\\n          \\\"components.collectionTopbar.step\\\"\\n          number=this.activePage\\n          total=this.numExercises\\n        }}\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.hasPagination}}\\n    <XPagination\\n      class=\\\"flex-shrink\\\"\\n      @routed={{false}}\\n      @jumpTo={{false}}\\n      @page={{this.activePage}}\\n      @totalPages={{this.numExercises}}\\n      @showFirstLast={{false}}\\n      @firstLabel={{t \\\"components.collectionTopbar.pagination.firstPage\\\"}}\\n      @nextLabel={{t \\\"components.collectionTopbar.pagination.nextPage\\\"}}\\n      @prevLabel={{t \\\"components.collectionTopbar.pagination.prevPage\\\"}}\\n      @lastLabel={{t \\\"components.collectionTopbar.pagination.lastPage\\\"}}\\n      @onChange={{@onExerciseChange}}\\n      @buttonAppearance=\\\"circle\\\"\\n      data-test-collection-topbar-pagination\\n    />\\n  {{/if}}\\n\\n  {{yield (hash Right=(component \\\"x-empty\\\"))}}\\n</div>', { moduleName: 'babel/components/collection-topbar/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { getScrollParent } from 'compton/utils/dom';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CollectionViewComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * activeExercise (object)\n   * answers (array)\n   * activeAnswer (object)\n   * shortCode (string)\n   * editor (object)\n   * openExercise (function)\n   * disabled (bool)\n   * onCollectionClose (function)\n   * digilarRecordedSpeechEnabled (boolean)\n   * iltRecordedSpeechEnabled (boolean)\n   * isShowingResultsForCarousel (boolean)\n   */\n\n  constructor() {\n    super(...arguments);\n    this.resizeObserver = new ResizeObserver(this.handleResize);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n\n    this.toggleCollectionSummary?.(false);\n    this.resizeObserver.unobserve(this.element);\n    this.resizeObserver.unobserve(this.scrollParent);\n  }\n\n  @service assignmentEvents;\n\n  @service media;\n\n  @service missionMode;\n\n  @service showResponse;\n\n  @tracked element;\n\n  @tracked scrollParent;\n\n  @tracked elementWidth;\n\n  @tracked resizeObserver;\n\n  @tracked showKey = false;\n\n  @tracked showSuggestion = false;\n\n  @tracked isCreatingNewCarouselAttempt = false;\n\n  @tracked showCollectionSummary = false;\n\n  @cached\n  get interactiveProxy() {\n    const promise = this.assignmentEvents\n      .getOrCreateInteractiveForCollection(\n        this.args.collection,\n        this.args.activeExercise\n      )\n      .then(({ interactive }) => interactive);\n\n    return load(promise, this);\n  }\n\n  get interactive() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value\n      : null;\n  }\n\n  @cached\n  get exercisesProxy() {\n    let promise;\n\n    if (this.args.collection?.isCarousel && this.interactive) {\n      promise = this.assignmentEvents.carouselAttemptExercises(\n        this.interactive\n      );\n    } else {\n      promise = resolve(this.args.exercises);\n    }\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : [];\n  }\n\n  get showCarouselResult() {\n    return this.args.collection?.isCarousel && this.interactive?.ended;\n  }\n\n  get isVisible() {\n    if (this.args.isShowingResultsForCarousel) return true;\n\n    return (\n      this.missionMode.entityIsAllowed(this.args.collection) &&\n      this.exercises?.length > 0\n    );\n  }\n\n  get hasPagination() {\n    return !(this.args.collection?.isCarousel || this.showCollectionSummary);\n  }\n\n  get disabled() {\n    if (this.args.collection?.isCarousel) {\n      if (\n        !['not-started', 'started', 'incomplete'].includes(\n          this.args.activeAnswer?.status\n        )\n      ) {\n        return true;\n      }\n    }\n\n    return this.args.disabled;\n  }\n\n  get audioSource() {\n    return this.args.collection?.audio?.meta?.attachment_url;\n  }\n\n  get hasEditor() {\n    return this.args.editor?.components?.length > 0 ? true : false;\n  }\n\n  get stacked() {\n    if (!this.args.collection) return true;\n    if (this.args.collection?.isCarousel) return true;\n    if (this.elementWidth < 992) return true;\n    return false;\n  }\n\n  get inNarrowSpace() {\n    if (this.elementWidth <= 520) return true;\n    return false;\n  }\n\n  get hasAudio() {\n    return !this.disabled && this.audioSource;\n  }\n\n  get speakerContentInfo() {\n    return {\n      contentTitle: this.args.activeExercise?.title,\n      shortCode: this.args.shortCode,\n      digilarRecordedSpeechEnabled: this.args.digilarRecordedSpeechEnabled,\n      iltRecordedSpeechEnabled: this.args.iltRecordedSpeechEnabled,\n    };\n  }\n\n  get exerciseIndex() {\n    return this.exercises?.indexOf(this.args.activeExercise) + 1;\n  }\n\n  get classes() {\n    const classes = ['collection-view'];\n\n    if (this.stacked) classes.push('collection-view-stacked');\n    if (this.inNarrowSpace) classes.push('collection-view-narrow');\n\n    return classes.join(' ');\n  }\n\n  @action\n  toggleCollectionSummary(val) {\n    if (typeof val === 'boolean') this.showCollectionSummary = val;\n    else this.showCollectionSummary = !this.showCollectionSummary;\n  }\n\n  @action\n  handleCreateNewCarouselAttempt() {\n    this.isCreatingNewCarouselAttempt = true;\n  }\n\n  @action\n  handleNewCarouselAttemptCreated() {\n    this.isCreatingNewCarouselAttempt = false;\n  }\n\n  @action\n  changedCollection() {\n    this.showKey = false;\n    this.showSuggestion = false;\n  }\n\n  @action\n  toggleKey(val) {\n    if (val === true || val === false) this.showKey = val;\n    else this.showKey = !this.showKey;\n  }\n\n  @action\n  toggleSuggestion(val) {\n    if (val === true || val === false) this.showSuggestion = val;\n    else this.showSuggestion = !this.showSuggestion;\n  }\n\n  @action\n  setElement(element) {\n    this.element = element;\n    this.scrollParent = getScrollParent(element);\n\n    this.resizeObserver.observe(this.element);\n    this.resizeObserver.observe(this.scrollParent);\n\n    this.handleResize();\n  }\n\n  @action\n  nextExercise() {\n    this.showResponse.reset();\n\n    if (this.args.collection?.isCarousel) {\n      this.showKey = false;\n      this.showSuggestion = false;\n\n      return this.assignmentEvents.carouselOpenNextExercise(this.interactive);\n    }\n\n    return this.changeExercise(this.exerciseIndex + 1);\n  }\n\n  @action\n  async handleExerciseBottombarNextExercise() {\n    const nextExercise = this.exercises?.objectAt(this.exerciseIndex);\n\n    if (nextExercise) {\n      this.assignmentEvents.focusExercise(nextExercise);\n    }\n\n    return this.nextExercise();\n  }\n\n  @action\n  async changeExercise(page) {\n    if (this.showCollectionSummary) {\n      this.toggleCollectionSummary?.(false);\n    }\n\n    const exercise = this.exercises?.objectAt(page - 1);\n\n    if (!exercise) return;\n\n    this.showKey = false;\n    this.showSuggestion = false;\n\n    await this.args.openExercise(exercise.id);\n\n    this.scrollParent.scrollTo({ top: 0 });\n\n    return exercise;\n  }\n\n  @action\n  handleResize() {\n    if (!this.element) return;\n\n    const { top: elementTop, width: elementWidth } =\n      this.element.getBoundingClientRect();\n\n    if (this.elementWidth !== elementWidth) {\n      this.elementWidth = elementWidth;\n    }\n\n    let collectionViewTop = 0;\n\n    if (this.scrollParent === document.body) {\n      collectionViewTop = elementTop + document.documentElement.scrollTop;\n    } else {\n      collectionViewTop = elementTop + this.scrollParent?.scrollTop;\n    }\n\n    if (this.scrollParent === document.body) {\n      this.element.style.setProperty(\n        '--collection-view-top',\n        `${elementTop}px`\n      );\n    } else {\n      this.element.style.setProperty(\n        '--collection-view-top',\n        `${collectionViewTop}px`\n      );\n    }\n\n    this.element.style.setProperty(\n      '--collection-view-index-offset-top',\n      `${collectionViewTop}px`\n    );\n\n    if (!this.scrollParent) return;\n\n    const { bottom: scrollParentBottom, top: scrollParentTop } =\n      this.scrollParent.getBoundingClientRect();\n\n    this.element.style.setProperty(\n      '--collection-scroll-parent-top',\n      `${scrollParentTop}px`\n    );\n\n    if (this.scrollParent.tagName.toLowerCase() !== 'body') {\n      const marginBottom = window.innerHeight - scrollParentBottom;\n\n      this.element.style.setProperty(\n        '--collection-scroll-parent-bottom',\n        `${marginBottom}px`\n      );\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let\\n  (component (if @withoutSpeaker \\\"x-empty\\\" \\\"speaker-context\\\"))\\n  as |SpeakerContext|\\n}}\\n  <SpeakerContext\\n    @contentType=\\\"practice\\\"\\n    @focus={{false}}\\n    @exercise={{@activeExercise}}\\n    @contentInfo={{this.speakerContentInfo}}\\n  >\\n    {{#if this.isVisible}}\\n      <div\\n        class={{this.classes}}\\n        ...attributes\\n        {{did-insert this.setElement}}\\n        {{did-update this.changedCollection @collection}}\\n        {{on-resize this.handleResize}}\\n      >\\n        {{#if (and this.hasEditor (not this.stacked))}}\\n          <CollectionEditor @editor={{@editor}} />\\n        {{/if}}\\n\\n        <div class=\\\"collection-view-content\\\">\\n          {{#if this.isCreatingNewCarouselAttempt}}\\n            <DcLoader class=\\\"my6\\\" />\\n          {{else}}\\n            {{#if @collection}}\\n              <CollectionView::Top\\n                @collection={{@collection}}\\n                @exercises={{this.exercises}}\\n                @activeExercise={{@activeExercise}}\\n                @answers={{@answers}}\\n                @audioSource={{this.audioSource}}\\n                @canSpeedUpAudio={{@collection.audio.metadata.can_speed_up}}\\n                @canSlowDownAudio={{@collection.audio.metadata.can_slow_down}}\\n                @onExerciseChange={{this.changeExercise}}\\n                @hasSidebar={{this.hasSidebar}}\\n                @hasAudio={{this.hasAudio}}\\n                @hasPagination={{this.hasPagination}}\\n                as |CollectionViewTop|\\n              >\\n                {{yield (hash TopbarLeft=CollectionViewTop.TopbarLeft)}}\\n                {{yield (hash TopbarRight=CollectionViewTop.TopbarRight)}}\\n              </CollectionView::Top>\\n            {{/if}}\\n\\n            {{#if (and this.hasEditor this.stacked)}}\\n              <CollectionEditor @editor={{@editor}} />\\n            {{/if}}\\n\\n            <div class=\\\"collection-view-body\\\">\\n              {{#if this.showCarouselResult}}\\n                <CarouselResult\\n                  @interactive={{this.interactive}}\\n                  @onCollectionClose={{@onCollectionClose}}\\n                  @onCreateNewCarouselAttempt={{this.handleCreateNewCarouselAttempt}}\\n                  @onNewCarouselAttemptCreated={{this.handleNewCarouselAttemptCreated}}\\n                />\\n              {{else if this.showCollectionSummary}}\\n                <CollectionSummary\\n                  @collection={{@collection}}\\n                  @exercises={{this.exercises}}\\n                  @answers={{@answers}}\\n                  @onExerciseChange={{this.changeExercise}}\\n                  @onCollectionClose={{or\\n                    @onCollectionClose\\n                    this.toggleCollectionSummary\\n                  }}\\n                />\\n              {{else}}\\n                <ExerciseView\\n                  @withinContent={{@withinContent}}\\n                  @exercise={{@activeExercise}}\\n                  @index={{this.exerciseIndex}}\\n                  @answer={{@activeAnswer}}\\n                  @disabled={{or\\n                    this.disabled\\n                    (not @activeAnswer)\\n                    (not @collection)\\n                  }}\\n                  @onExerciseChange={{this.changeExercise}}\\n                  @showKey={{this.showKey}}\\n                  @toggleKey={{this.toggleKey}}\\n                  @showSuggestion={{this.showSuggestion}}\\n                  @toggleSuggestion={{this.toggleSuggestion}}\\n                  @closeModal={{@closeModal}}\\n                  as |ExerciseComponent|\\n                >\\n                  {{yield\\n                    (hash\\n                      ExerciseTopbar=ExerciseComponent.topbar\\n                      ExerciseTarget=(unless @isShowingResultsForCarousel ExerciseComponent.target)\\n                    )\\n                  }}\\n\\n                  <ExerciseComponent.bottombar>\\n                    <ExerciseBottombar\\n                      @collection={{@collection}}\\n                      @interactive={{this.interactive}}\\n                      @disabled={{or this.disabled (not @collection)}}\\n                      @activeExercise={{@activeExercise}}\\n                      @exercises={{this.exercises}}\\n                      @showKey={{this.showKey}}\\n                      @toggleKey={{this.toggleKey}}\\n                      @nextExercise={{this.handleExerciseBottombarNextExercise}}\\n                      @resetAnswer={{ExerciseComponent.resetAnswer}}\\n                      @submitAnswer={{ExerciseComponent.submitAnswer}}\\n                      @status={{ExerciseComponent.status}}\\n                      @toggleSuggestion={{this.toggleSuggestion}}\\n                      @toggleCollectionSummary={{this.toggleCollectionSummary}}\\n                      @answers={{@answers}}\\n                      @toggleKeyboard={{ExerciseComponent.toggleKeyboard}}\\n                      @showKeyboard={{ExerciseComponent.showKeyboard}}\\n                    />\\n                  </ExerciseComponent.bottombar>\\n                </ExerciseView>\\n              {{/if}}\\n            </div>\\n\\n            {{yield (hash Bottom=(component \\\"x-empty\\\"))}}\\n          {{/if}}\\n        </div>\\n      </div>\\n    {{/if}}\\n  </SpeakerContext>\\n{{/let}}', { moduleName: 'babel/components/collection-view/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CollectionViewTopComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * activeExercise (object)\n   * answers (array)\n   * audioSource (string)\n   * onExerciseChange (function)\n   * hasSidebar (bool)\n   * hasAudio (bool)\n   * hasPagination (bool)\n   */\n\n  @service intl;\n\n  @cached\n  get ownerProxy() {\n    return load(resolve(this.args.collection.owner), this);\n  }\n\n  get owner() {\n    return this.ownerProxy.isResolved ? this.ownerProxy.value : null;\n  }\n\n  get title() {\n    if (this.owner) return this.owner.showname;\n\n    const collection = this.args.collection;\n\n    if (collection.type === 'collections') return collection.title;\n\n    return this.intl.t(`components.collectionView.top.practice`);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let\\n  (component\\n    \\\"collection-exercise-index\\\"\\n    template=@collection.template\\n    collection=@collection\\n    exercises=@exercises\\n    activeExercise=@activeExercise\\n    onExerciseChange=@onExerciseChange\\n    answers=@answers\\n    showStatus=true\\n  )\\n  as |Index|\\n}}\\n  <CollectionTopbar\\n    @collection={{@collection}}\\n    @title={{this.title}}\\n    @exercises={{@exercises}}\\n    @activeExercise={{@activeExercise}}\\n    @onExerciseChange={{@onExerciseChange}}\\n    @hasSidebar={{@hasSidebar}}\\n    @hasPagination={{@hasPagination}}\\n    as |Topbar|\\n  >\\n    {{yield (hash TopbarLeft=Topbar.Left)}}\\n    <Topbar.Index>\\n      <Index />\\n    </Topbar.Index>\\n    {{yield (hash TopbarRight=Topbar.Right)}}\\n  </CollectionTopbar>\\n\\n  {{#if @hasAudio}}\\n    <CollectionAudio\\n      @audioSource={{@audioSource}}\\n      @canSpeedUp={{@canSpeedUpAudio}}\\n      @canSlowDown={{@canSlowDownAudio}}\\n    />\\n  {{/if}}\\n{{/let}}', { moduleName: 'babel/components/collection-view/top/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nexport default class ContentChapterComponent extends Component {\n  @tracked showContentSummary = false;\n\n  @action handleDone() {\n    this.showContentSummary = true;\n  }\n\n  get showDoneButton() {\n    return !this.showContentSummary && this.args.showDoneButton;\n  }\n\n  get showSummary() {\n    return this.showContentSummary && !this.args.hasNextSection;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<section class=\\\"content-chapter\\\">\\n  <article class=\\\"content-chapter-content\\\">\\n    {{#if @sections}}\\n      <SpeakerContext\\n        @contentType=\\\"chapter\\\"\\n        @focus={{true}}\\n        @sections={{@sections}}\\n        @section={{@activeSection}}\\n        @contentInfo={{@speakerContentInfo}}\\n        @nextSection={{@onNextSection}}\\n      >\\n        {{#if\\n          (or\\n            (eq @settings.mode \\\"scroll\\\")\\n            (eq @activeSection @sections.firstObject)\\n          )\\n        }}\\n          <ContentsChapterHero\\n            @activeSection={{@activeSection}}\\n            @content={{@content}}\\n          />\\n        {{/if}}\\n\\n        <div class=\\\"content-chapter-content-container container-md px1\\\">\\n          {{#if (eq @settings.mode \\\"scroll\\\")}}\\n            <Master::ContentsChapterScroll\\n              @activeSection={{@activeSection}}\\n              @sections={{@sections}}\\n              @activeExercise={{@activeExercise}}\\n              @editor={{@editor}}\\n              @openExercise={{@openExercise}}\\n              @answers={{@answers}}\\n              @activeAnswer={{@activeAnswer}}\\n              @shortCode={{@content.body.shortcode}}\\n              @exercises={{@exercises}}\\n              @exerciseId={{@exerciseId}}\\n              @content={{@content}}\\n            />\\n          {{else if (eq @settings.mode \\\"step\\\")}}\\n            <ContentsChapterStep\\n              @section={{@activeSection}}\\n              @sections={{@sections}}\\n              @activeExercise={{@activeExercise}}\\n              @editor={{@editor}}\\n              @openExercise={{@openExercise}}\\n              @answers={{@answers}}\\n              @activeAnswer={{@activeAnswer}}\\n              @shortCode={{@content.body.shortcode}}\\n              @exercises={{@exercises}}\\n              @exerciseId={{@exerciseId}}\\n              @content={{@content}}\\n            />\\n          {{/if}}\\n\\n          {{#if @sections.lastObject.body.reading_buddy_activated}}\\n            <ReadingBuddy\\n              class=\\\"mx-1\\\"\\n              @resetOnPageChange={{false}}\\n              @page={{@sections.lastObject.body.reading_buddy_page}}\\n              @endpoint={{@content.body.reading_buddy_url}}\\n            />\\n          {{/if}}\\n        </div>\\n        {{#if (eq @settings.mode \\\"step\\\")}}\\n          <div class=\\\"container-md\\\">\\n            <ContentPaginationSummary\\n              class=\\\"content-chapter-pagination-summary\\\"\\n              @collections={{@collections}}\\n              @content={{@content}}\\n              @wordlists={{@wordlists}}\\n              @horizontal={{true}}\\n              @simplified={{false}}\\n              @showNextButton={{@hasNextSection}}\\n              @showBackButton={{@hasPreviousSection}}\\n              @showDoneButton={{this.showDoneButton}}\\n              @showSummary={{this.showSummary}}\\n              @summaryMode=\\\"list\\\"\\n              @activeCategory={{@activeCategory}}\\n              @onNextSection={{@onNextSection}}\\n              @onPreviousSection={{@onPreviousSection}}\\n              @onDone={{this.handleDone}}\\n              @nextMissionContent={{@nextMissionContent}}\\n              @routeToSection={{@routeToSection}}\\n            />\\n          </div>\\n        {{/if}}\\n        {{#if (eq @settings.mode \\\"scroll\\\")}}\\n          <div class=\\\"container-md\\\">\\n            <ContentPaginationSummary\\n              class=\\\"content-chapter-pagination-summary\\\"\\n              @collections={{@collections}}\\n              @content={{@content}}\\n              @wordlists={{@wordlists}}\\n              @horizontal={{true}}\\n              @simplified={{false}}\\n              @showNextButton={{false}}\\n              @showBackButton={{false}}\\n              @showDoneButton={{this.showDoneButton}}\\n              @showSummary={{this.showContentSummary}}\\n              @summaryMode=\\\"list\\\"\\n              @activeCategory={{@activeCategory}}\\n              @onNextSection={{@onNextSection}}\\n              @onPreviousSection={{@onPreviousSection}}\\n              @onDone={{this.handleDone}}\\n              @nextMissionContent={{@nextMissionContent}}\\n              @routeToSection={{@routeToSection}}\\n            />\\n          </div>\\n        {{/if}}\\n\\n        {{#if (eq @settings.mode \\\"scroll\\\")}}\\n          {{! template-lint-disable no-inline-styles }}\\n          <div style=\\\"height: 70vh\\\" />\\n          {{! template-lint-enable no-inline-styles }}\\n        {{/if}}\\n\\n        {{#if (eq @settings.mode \\\"step\\\")}}\\n          {{! template-lint-disable no-inline-styles }}\\n          <div style=\\\"height: 30vh\\\" />\\n          {{! template-lint-enable no-inline-styles }}\\n        {{/if}}\\n      </SpeakerContext>\\n    {{else}}\\n      {{#x-alert class=\\\"m4\\\"}}\\n        {{t \\\"components.contentChapter.contentIsHidden\\\"}}\\n      {{/x-alert}}\\n    {{/if}}\\n  </article>\\n\\n  {{yield}}\\n</section>', { moduleName: 'babel/components/content-chapter/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { scrollTo, waitForScrollEnd } from 'babel/utils/chapter-viewport';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class ContentExercises extends Component {\n  @service assignmentEvents;\n\n  @service contextHelper;\n\n  @service router;\n\n  @service missionMode;\n\n  @tracked currentExerciseId;\n\n  @cached\n  get exercisesProxy() {\n    const promise = resolve(this.args.section?.children).then((children) =>\n      this.missionMode.allowedEntities(children)\n    );\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : null;\n  }\n\n  get allExerciseIds() {\n    return this.exercises ? this.exercises.map((exercise) => exercise.id) : [];\n  }\n\n  @cached\n  get interactiveProxy() {\n    return load(this._interactivePromise(), this);\n  }\n\n  get answers() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.interactive?.answers\n      : [];\n  }\n\n  get activeExercise() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeExercise\n      : null;\n  }\n\n  get activeAnswer() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeAnswer\n      : null;\n  }\n\n  @action\n  async openExercise(exercise) {\n    this.router.replaceWith({ queryParams: { exercise: null } });\n    this.currentExerciseId = exercise;\n    // awaiting the promise here reduces flashing when switching exercise,\n    // as the data will already be loaded when the promise resolves\n    // but it will also cause a race condition causing the progress and sometimes\n    // the submitted answer to act strange, therefore disabled\n    // await this._interactivePromise();\n  }\n\n  @action\n  async handleUpdate(element, [exerciseId]) {\n    if (element && this.allExerciseIds.includes(exerciseId)) {\n      await waitForScrollEnd();\n      await scrollTo(element);\n    }\n  }\n\n  _interactivePromise() {\n    let activeExercise;\n\n    if (this.args.exerciseId) {\n      activeExercise = this.exercises?.findBy('id', this.args.exerciseId);\n    } else if (this.currentExerciseId) {\n      activeExercise = this.exercises?.findBy('id', this.currentExerciseId);\n    }\n\n    return this.assignmentEvents\n      .getOrCreateInteractiveForCollection(this.args.section, activeExercise)\n      .then((data) => {\n        if (\n          data.activeExercise &&\n          this.contextHelper.activeSection &&\n          this.args.section &&\n          this.contextHelper.activeSection.id === this.args.section.id\n        ) {\n          this.contextHelper.setActive('activeExercise', data.activeExercise);\n        }\n\n        return data;\n      });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.exercises.length}}\\n  <CollectionView\\n    @withinContent={{true}}\\n    @collection={{@section}}\\n    @exerciseId={{@exerciseId}}\\n    @exercises={{this.exercises}}\\n    @activeExercise={{this.activeExercise}}\\n    @answers={{this.answers}}\\n    @activeAnswer={{this.activeAnswer}}\\n    @openExercise={{this.openExercise}}\\n    @shortCode={{@shortCode}}\\n    @withoutSpeaker={{true}}\\n    class=\\\"mb2\\\"\\n    {{did-update this.handleUpdate @exerciseId}}\\n    {{did-insert this.handleUpdate @exerciseId}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/content-exercises/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"content-list-summary\\\" ...attributes>\\n  <div class=\\\"text-primary\\\">\\n    {{t \\\"components.contentSummary.header\\\"}}\\n  </div>\\n  <div class=\\\"nt1\\\">\\n    {{t \\\"components.contentSummary.ingress\\\"}}\\n  </div>\\n\\n  <div class=\\\"content-list-summary-inner\\\">\\n\\n    <TableOfContentsList\\n      @categorizedCollections={{this.categorizedCollections}}\\n      @wordlists={{this.categorizedWordlists}}\\n      @activeCategory={{@category}}\\n      @goToSection={{@routeToSection}}\\n      @isInteractive={{false}}\\n      @routeOnSubHeadingClick={{false}}\\n      @routed={{this.routed}}\\n    />\\n\\n  </div>\\n\\n</div>\", {\"contents\":\"<div class=\\\"content-list-summary\\\" ...attributes>\\n  <div class=\\\"text-primary\\\">\\n    {{t \\\"components.contentSummary.header\\\"}}\\n  </div>\\n  <div class=\\\"nt1\\\">\\n    {{t \\\"components.contentSummary.ingress\\\"}}\\n  </div>\\n\\n  <div class=\\\"content-list-summary-inner\\\">\\n\\n    <TableOfContentsList\\n      @categorizedCollections={{this.categorizedCollections}}\\n      @wordlists={{this.categorizedWordlists}}\\n      @activeCategory={{@category}}\\n      @goToSection={{@routeToSection}}\\n      @isInteractive={{false}}\\n      @routeOnSubHeadingClick={{false}}\\n      @routed={{this.routed}}\\n    />\\n\\n  </div>\\n\\n</div>\",\"moduleName\":\"babel/components/content-list-summary/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/content-list-summary/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ContentListSummaryComponent extends Component {\n  @service session;\n\n  @tracked _category;\n\n  get routed() {\n    return this.args.routed ?? true;\n  }\n\n  get categorizedWordlists() {\n    if (!this.args.wordlists) {\n      return null;\n    }\n    return this.args.wordlists?.filter((wordlist) => {\n      if (!wordlist?.category) {\n        return true;\n      }\n      if (wordlist?.category?.id === this.category?.id) {\n        return true;\n      }\n      return false;\n    });\n  }\n\n  get category() {\n    return this._category || this.args.activeCategory;\n  }\n\n  get categorizedCollections() {\n    if (!this.args.collections) {\n      return null;\n    }\n    let filteredCollections = this.args.collections?.filter((collection) => {\n      if (collection?.category?.id === this.category?.id) {\n        return true;\n      }\n      if (collection.isTeacherCollection) {\n        return true;\n      }\n      return false;\n    });\n    filteredCollections = filteredCollections.reject((collection) =>\n      collection.get('children').isEvery('isPublished', false)\n    );\n\n    const sorted = filteredCollections.sort((a, b) => {\n      if (a.isTeacherCollection) {\n        if (b.isTeacherCollection) {\n          if (a.title) {\n            if (b.title) {\n              return a.title.localeCompare(b.title);\n            } else {\n              return 1;\n            }\n          } else {\n            return -1;\n          }\n        } else {\n          return -1;\n        }\n      } else {\n        if (b.isTeacherCollection) {\n          return 1;\n        } else {\n          return a.sort > b.sort ? 1 : -1;\n        }\n      }\n    });\n\n    if (this.session?.user?.isStudent) {\n      return sorted.rejectBy('userId', this.session?.user?.id);\n    }\n\n    return sorted;\n  }\n\n  @action\n  setCategory(value) {\n    this._category = value;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"content-meta\\\" ...attributes>\\n  {{#if @taxonomy}}\\n\\n    {{#if (and @taxonomy.category (gt @taxonomy.parent.categories.length 1))}}\\n\\n      {{#let (generate-id \\\"content-category\\\") as |id|}}\\n\\n        <div id={{id}} class=\\\"text-muted text-small flex flex-center mr1\\\">\\n\\n          {{#if (eq @taxonomy.type (or \\\"sections\\\" \\\"glossaries\\\" \\\"collections\\\"))}}\\n            <DcIcon @name=\\\"single-copies\\\" class=\\\"nr1\\\" />\\n\\n            <XTooltip @for={{id}}>\\n              {{t \\\"components.contentMeta.editionTooltip\\\"}}\\n            </XTooltip>\\n\\n          {{/if}}\\n\\n          {{@taxonomy.category.name}}\\n\\n        </div>\\n\\n      {{/let}}\\n\\n    {{/if}}\\n\\n  {{/if}}\\n\\n  {{#if (or @badge @type)}}\\n\\n    {{#let (generate-id \\\"content-type\\\") as |id|}}\\n\\n      <div id={{id}} class=\\\"text-muted text-small flex flex-center mr1\\\">\\n\\n        <DcIcon @size=\\\"xs\\\" class=\\\"badge-icon badge-icon--{{@type}}\\\" />\\n        <div class=\\\"nl1\\\">{{or\\n            @badge\\n            (t (concat \\\"components.contentMeta.types.\\\" @type))\\n          }}</div>\\n\\n      </div>\\n\\n      <XTooltip @for={{id}}>\\n        {{t \\\"components.contentMeta.typeTooltip\\\"}}\\n      </XTooltip>\\n\\n    {{/let}}\\n\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/content-meta/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport imageSource from 'compton/utils/image-source';\n\nexport default class ContentMissionNextComponent extends Component {\n  /**\n   * Arguments:\n   * nextMissionContent (object)\n   */\n\n  @service contextHelper;\n  @service missionDispatcher;\n  @service router;\n\n  imageWidth = 132;\n  imageHeight = 132;\n\n  @tracked element = null;\n  @tracked elementWidth = null;\n\n  get image() {\n    return this.args.nextMissionContent?.entity?.get('image');\n  }\n\n  get imageSource() {\n    const url = this.image?.imageUrl;\n\n    if (!url) {\n      return null;\n    }\n\n    const settings = {\n      width: this.imageWidth,\n      height: this.imageHeight,\n      embed: true,\n    };\n\n    if (this.image?.metadata?.focus_point) {\n      settings.x = this.image.metadata.focus_point.x;\n      settings.y = this.image.metadata.focus_point.y;\n    }\n\n    return imageSource(url, settings);\n  }\n\n  get backgroundColor() {\n    return this.image?.backgroundColor;\n  }\n\n  get responsiveClass() {\n    return this.elementWidth > 480 ? 'content-mission-next--wide' : null;\n  }\n\n  @action setElement(element) {\n    this.element = element;\n    this.handleResize();\n  }\n\n  @action handleResize() {\n    if (!this.element) return;\n\n    const { width: elementWidth } = this.element.getBoundingClientRect();\n    if (this.elementWidth !== elementWidth) {\n      this.elementWidth = elementWidth;\n    }\n  }\n\n  @action goToNextContent() {\n    if (!this.args.nextMissionContent) {\n      return;\n    }\n\n    return this.missionDispatcher.open(\n      this.contextHelper.activeMission,\n      this.args.nextMissionContent,\n      this.contextHelper.closeUrl\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"content-mission-next {{this.responsiveClass}}\\\"\\n  {{on-resize this.handleResize}}\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <div>\\n    <div class=\\\"text-ui text-separator nb1\\\">\\n      {{t \\\"components.contentMissionNext.nextContentLabel\\\"}}\\n    </div>\\n    <div class=\\\"flex flex-center\\\">\\n      {{#if this.imageSource}}\\n        <div class=\\\"content-mission-next-image mr1\\\">\\n          <XImage\\n            @width={{this.imageWidth}}\\n            @height={{this.imageHeight}}\\n            @source={{this.imageSource}}\\n            @color={{this.backgroundColor}}\\n          />\\n        </div>\\n      {{/if}}\\n\\n      <div class=\\\"text-quarternary mr1\\\">\\n        {{@nextMissionContent.entity.title}}\\n      </div>\\n    </div>\\n  </div>\\n  <div class=\\\"content-mission-next-button-wrapper flex justify-center\\\">\\n    <UiButton\\n      class=\\\"content-mission-next-button justify-center\\\"\\n      @variant=\\\"default\\\"\\n      @size=\\\"large\\\"\\n      @width=\\\"expand\\\"\\n      @shape=\\\"rounded\\\"\\n      @onClick={{this.goToNextContent}}\\n    >\\n      <div\\n        class=\\\"flex flex-row flex-center justify-center content-mission-next-button-inner mx1\\\"\\n      >\\n        <span>\\n          {{t \\\"components.contentMissionNext.proceedButton\\\"}}\\n        </span>\\n        <DcIcon @name=\\\"tail-right\\\" class=\\\"ml1\\\" />\\n      </div>\\n    </UiButton>\\n  </div>\\n</div>', { moduleName: 'babel/components/content-mission-next/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ContentPaginatinSummaryComponent extends Component {\n  @service entityInspector;\n\n  get summaryMode() {\n    return this.args.summaryMode ?? 'grid';\n  }\n\n  get showContentMissionNextButton() {\n    if (!this.args.nextMissionContent) return false;\n    return (\n      (!this.args.showNextButton && !this.args.showDoneButton) ||\n      this.args.showSummary\n    );\n  }\n\n  @action\n  handleOpenProductInformation() {\n    if (!this.args.content) {\n      return;\n    }\n\n    this.entityInspector.openModal(this.args.content);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"content-pagination-summary\\\" ...attributes>\\n  <ContentPagination\\n    class=\\\"justify-center mb1\\\"\\n    @horizontal={{@horizontal}}\\n    @simplified={{@simplified}}\\n    @showNextButton={{@showNextButton}}\\n    @showBackButton={{@showBackButton}}\\n    @showDoneButton={{@showDoneButton}}\\n    @onNextSection={{@onNextSection}}\\n    @onPreviousSection={{@onPreviousSection}}\\n    @onDone={{@onDone}}\\n  />\\n  {{#if (or @showSummary this.showContentMissionNextButton)}}\\n    <div class=\\\"content-pagination-summary-reveal\\\">\\n      {{#if @showSummary}}\\n        {{#if (eq this.summaryMode \\\"list\\\")}}\\n          <ContentListSummary\\n            class=\\\"mb1\\\"\\n            @collections={{@collections}}\\n            @wordlists={{@wordlists}}\\n            @activeCategory={{@activeCategory}}\\n            @routeToSection={{@routeToSection}}\\n            @routed={{false}}\\n          />\\n        {{else}}\\n          <ContentSummary\\n            class=\\\"mb1\\\"\\n            @collections={{@collections}}\\n            @wordlists={{@wordlists}}\\n          />\\n        {{/if}}\\n      {{/if}}\\n\\n      {{#if this.showContentMissionNextButton}}\\n        <ContentMissionNext\\n          @nextMissionContent={{@nextMissionContent}}\\n        />\\n      {{/if}}\\n    </div>\\n  {{/if}}\\n\\n  {{#if @content}}\\n    <hr class=\\\"divider mt2\\\" />\\n\\n    <button\\n      type=\\\"button\\\"\\n      class=\\\"content-pagination-summary-product-information-link\\\"\\n      {{on \\\"click\\\" this.handleOpenProductInformation}}\\n    >\\n      <DcIcon @name=\\\"copyright\\\" />\\n      {{t \\\"components.contentPaginationSummary.productInformation\\\"}}\\n    </button>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/content-pagination-summary/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class ContentPaginationComponent extends Component {\n  get classNames() {\n    const classNames = [];\n    if (this.args.horizontal === true) {\n      classNames.push('content-pagination-horizontal');\n    } else {\n      classNames.push('content-pagination-vertical');\n    }\n    return classNames.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"content-pagination {{this.classNames}}\\\" ...attributes>\\n  {{#if @showNextButton}}\\n    <div class=\\\"content-pagination-item content-pagination-next\\\">\\n      <UiButton\\n        class=\\\"flex-shrink\\\"\\n        @shape=\\\"rounded\\\"\\n        @appearance=\\\"button\\\"\\n        @variant=\\\"default\\\"\\n        @flat={{@simplified}}\\n        @width=\\\"medium\\\"\\n        @size=\\\"large\\\"\\n        @onClick={{@onNextSection}}\\n      >\\n        <div class=\\\"flex flex-center px1-sm\\\">\\n          <span>{{t \\\"components.contentPagination.nextPage\\\"}}</span>\\n          <DcIcon @name=\\\"tail-right\\\" class=\\\"ml1\\\"/>\\n        </div>\\n      </UiButton>\\n    </div>\\n  {{/if}}\\n  {{#if @showDoneButton}}\\n    <div class=\\\"content-pagination-item content-pagination-done\\\">\\n      <UiButton\\n        class=\\\"flex-shrink\\\"\\n        @shape=\\\"rounded\\\"\\n        @variant=\\\"default\\\"\\n        @width=\\\"medium\\\"\\n        @size=\\\"large\\\"\\n        @onClick={{@onDone}}\\n      >\\n        <div class=\\\"flex flex-center px1-sm\\\">\\n          <span>{{t \\\"components.contentPagination.done\\\"}}</span>\\n        </div>\\n      </UiButton>\\n    </div>\\n  {{/if}}\\n  {{#if @showBackButton}}\\n    <div class=\\\"content-pagination-item content-pagination-previous\\\">\\n      <UiButton\\n        class=\\\"flex-shrink\\\"\\n        @shape=\\\"rounded\\\"\\n        @appearance=\\\"button\\\"\\n        @flat={{true}}\\n        @variant=\\\"default\\\"\\n        @width=\\\"medium\\\"\\n        @size=\\\"large\\\"\\n        @onClick={{@onPreviousSection}}\\n      >\\n        <div class=\\\"flex flex-row flex-center px1-sm\\\">\\n          \\n          <DcIcon @name=\\\"tail-left\\\" class=\\\"mr1\\\"/>\\n          <span>{{t \\\"components.contentPagination.back\\\"}}</span>\\n        </div>\\n      </UiButton>\\n    </div>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/content-pagination/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { trackPlaySettingEvent } from 'babel/utils/matomo-events';\nimport DigilarLanguageUtil from 'babel/utils/speaker/DigilarLanguageUtil';\nimport DigilarSpeakerConfig from 'babel/utils/speaker/DigilarSpeakerConfig';\nimport { storageFor } from 'ember-local-storage';\nimport { WebPageTranslationDetector } from 'speaker';\n\nconst TextHighlightingOptions = {\n  NONE: 'none',\n  WORDS_ONLY: 'words',\n  SENTENCES_ONLY: 'sentences',\n  EVERYTHING: 'everything',\n};\n\nconst DEFAULT_LANGUAGE = 'sv';\n\nexport default class ContentSpeakerSettingsComponent extends Component {\n  /**\n   * model (object)\n   * onShowSpeakerInfo (bool)\n   */\n\n  @service intl;\n\n  @service speaker;\n\n  @service languages;\n\n  @storageFor('play-settings') settings;\n\n  speechSpeedOptions = null;\n\n  speechSpeedValue = null;\n\n  defaultSpeechSpeed = 2; // Default to \"Standard\" when disabled\n\n  constructor() {\n    super(...arguments);\n\n    this.digilarSpeakerConfig = new DigilarSpeakerConfig({\n      getContextData: () => {\n        return {};\n      },\n      getSpeakerSettings: () => this.settings,\n    });\n\n    this.markings = [\n      {\n        label: this.intl.t(\n          'components.contentPlaysettings.markings.wordsAndSentences'\n        ),\n        value: TextHighlightingOptions.EVERYTHING,\n      },\n      {\n        label: this.intl.t('components.contentPlaysettings.markings.onlyWords'),\n        value: TextHighlightingOptions.WORDS_ONLY,\n      },\n      {\n        label: this.intl.t(\n          'components.contentPlaysettings.markings.onlySentences'\n        ),\n        value: TextHighlightingOptions.SENTENCES_ONLY,\n      },\n      {\n        label: this.intl.t('components.contentPlaysettings.markings.none'),\n        value: TextHighlightingOptions.NONE,\n      },\n    ];\n\n    this.speechSpeedOptions = [\n      {\n        label: this.intl.t(\n          'components.contentPlaysettings.speechSpeed.verySlow'\n        ),\n        value: 0,\n      },\n      {\n        label: this.intl.t('components.contentPlaysettings.speechSpeed.slow'),\n        value: 1,\n      },\n      {\n        label: this.intl.t(\n          'components.contentPlaysettings.speechSpeed.standard'\n        ),\n        value: 2,\n      },\n      {\n        label: this.intl.t('components.contentPlaysettings.speechSpeed.fast'),\n        value: 3,\n      },\n    ];\n\n    this.speechSpeedValue = this.settings.get('speechSpeed') + 1;\n  }\n\n  get speechSpeedDisabled() {\n    return !this.speaker.speechSpeedSettingHasEffectForActiveSpeaker;\n  }\n\n  get selectedMarking() {\n    let highlighting = this.settings.get('highlighting');\n    let highlightingOption = TextHighlightingOptions.NONE;\n\n    if (highlighting.words && highlighting.sentences) {\n      highlightingOption = TextHighlightingOptions.EVERYTHING;\n    } else if (highlighting.words) {\n      highlightingOption = TextHighlightingOptions.WORDS_ONLY;\n    } else if (highlighting.sentences) {\n      highlightingOption = TextHighlightingOptions.SENTENCES_ONLY;\n    }\n\n    return highlightingOption;\n  }\n\n  set selectedMarking(markingType) {\n    let highlighting = {\n      words: [\n        TextHighlightingOptions.EVERYTHING,\n        TextHighlightingOptions.WORDS_ONLY,\n      ].includes(markingType),\n      sentences: [\n        TextHighlightingOptions.EVERYTHING,\n        TextHighlightingOptions.SENTENCES_ONLY,\n      ].includes(markingType),\n    };\n    trackPlaySettingEvent('Ändra markering för talsyntes', markingType);\n    this.settings.set('highlighting', highlighting);\n  }\n\n  /*\n   * The voices to choose from depend on the language param\n   */\n  get voices() {\n    let currentLanguage = this._currentLanguage();\n\n    let voices = [];\n\n    voices = this.digilarSpeakerConfig\n      .supportedVoices(currentLanguage)\n      .map((voice) => {\n        return {\n          label: voice.label,\n          value: voice.id,\n        };\n      });\n\n    voices.sort((v1, v2) => {\n      return v1.label.localeCompare(v2.label);\n    });\n\n    return voices;\n  }\n\n  set voices(voice) {\n    let language = this._currentLanguage();\n    if (language) {\n      let voices = this.settings.get('voices');\n\n      // Note! Must set voices property to a completely new object, or else observers listening to changes won't fire\n      voices = {\n        ...voices,\n        [language]: voice,\n      };\n\n      this.settings.set('voices', voices);\n    }\n  }\n\n  /**\n   * Get the selected voice for current language.\n   * If user has selected a voice for the given language (through action setVoice), use that voice. Otherwise, use configured default voice for that language.\n   */\n  get selectedVoice() {\n    let currentLanguage = this._currentLanguage();\n\n    let selectedVoice = this.settings.get('voices', [currentLanguage]);\n\n    if (\n      !selectedVoice ||\n      !this.digilarSpeakerConfig.isValidVoice(currentLanguage, selectedVoice)\n    ) {\n      // Fall back to default voice if no voice, or an invalid voice, has been selected\n      selectedVoice = this.digilarSpeakerConfig.preferredVoice(currentLanguage);\n    }\n\n    return selectedVoice;\n  }\n\n  set selectedVoice(voice) {\n    let language = this._currentLanguage();\n    if (language) {\n      let voices = this.settings.get('voices');\n\n      // Note! Must set voices property to a completely new object, or else observers listening to changes won't fire\n      voices = {\n        ...voices,\n        [language]: voice,\n      };\n\n      trackPlaySettingEvent('Ändra röst för talsyntes', voice);\n      this.settings.set('voices', voices);\n    }\n  }\n\n  get isTranslated() {\n    return WebPageTranslationDetector.isTranslated();\n  }\n\n  /**\n   * Update the selected voice for current language in local storage, to make it the pre-selected voice for content of that language\n   */\n\n  @action\n  setFollowText(followText) {\n    trackPlaySettingEvent('Ändra beteende - Textmedföljning');\n    this.settings.set('followText', followText);\n  }\n  @action\n  setPreferSpeechSynthesis(preferSpeechSynthesis) {\n    trackPlaySettingEvent('Ändra beteende - Alltid talsyntes');\n    this.settings.set('preferSpeechSynthesis', preferSpeechSynthesis);\n  }\n  @action\n  setSpeechSpeed(speed) {\n    this.speechSpeedValue = speed - 1;\n    trackPlaySettingEvent(\n      'Ändra rösthastighet',\n      undefined,\n      this.speechSpeedValue\n    );\n    this.settings.set('speechSpeed', this.speechSpeedValue);\n  }\n\n  @action\n  showSpeakerInfo() {\n    trackPlaySettingEvent('Visa instruktioner');\n    // Call injected action function\n    this.args.onShowSpeakerInfo();\n  }\n\n  _currentLanguage() {\n    return this.isTranslated\n      ? WebPageTranslationDetector.detectLanguage()\n      : DigilarLanguageUtil.parseLanguage(\n          this.languages.contentLanguage || DEFAULT_LANGUAGE\n        );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"c-content-playsettings\\\" ...attributes>\\n  <XAlert class=\\\"mb1\\\">\\n    <UiButton\\n      id=\\\"show-speaker-info\\\"\\n      class=\\\"flex justify-center\\\"\\n      @appearance=\\\"link\\\"\\n      @onClick={{this.showSpeakerInfo}}\\n    >\\n      <DcIcon @name=\\\"info-circle\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.contentPlaysettings.showSpeakerInfo\\\"}}\\n    </UiButton>\\n  </XAlert>\\n\\n  <UiLabel>\\n    {{t \\\"components.contentPlaysettings.behavior\\\"}}\\n  </UiLabel>\\n\\n  <XCheckbox\\n    class=\\\"behaviour-check\\\"\\n    @onChange={{this.setPreferSpeechSynthesis}}\\n    @checked={{this.settings.preferSpeechSynthesis}}\\n  >\\n    {{t \\\"components.contentPlaysettings.alwaysSpeechSynthesis\\\"}}\\n  </XCheckbox>\\n\\n  <XCheckbox\\n    class=\\\"behaviour-check\\\"\\n    @onChange={{this.setFollowText}}\\n    @checked={{this.settings.followText}}\\n  >\\n    {{t \\\"components.contentPlaysettings.stickWithText\\\"}}\\n  </XCheckbox>\\n\\n  <UiLabel class=\\\"mt1\\\">\\n    {{t \\\"components.contentPlaysettings.speed\\\"}}\\n  </UiLabel>\\n\\n  {{#if this.speechSpeedDisabled}}\\n    <div class=\\\"nb1 text-color-error\\\">\\n      {{t \\\"components.contentPlaysettings.speechSpeedDisabled\\\"}}\\n    </div>\\n  {{/if}}\\n\\n  <DcRange\\n    class=\\\"mb1\\\"\\n    @value={{this.speechSpeedValue}}\\n    @min={{0}}\\n    @max={{3}}\\n    @default={{2}}\\n    @onChange={{this.setSpeechSpeed}}\\n    @labelStart={{t \\\"components.contentPlaysettings.speechSpeed.slow\\\"}}\\n    @labelEnd={{t \\\"components.contentPlaysettings.speechSpeed.fast\\\"}}\\n  />\\n\\n  <XTooltip @for={{\\\"speechRangeDefaultMarker\\\"}}>\\n    {{t \\\"components.contentPlaysettings.speechSpeed.standard\\\"}}\\n  </XTooltip>\\n\\n  <UiLabel>\\n    {{t \\\"components.contentPlaysettings.marking\\\"}}\\n  </UiLabel>\\n\\n  <XSelect\\n    @class=\\\"mb1\\\"\\n    @stretch={{true}}\\n    @items={{this.markings}}\\n    @value={{this.selectedMarking}}\\n  />\\n\\n  {{#if (gt this.voices.length 1)}}\\n    <UiLabel>\\n      {{t \\\"components.contentPlaysettings.voice\\\"}}\\n    </UiLabel>\\n\\n    <XSelect\\n      @stretch={{true}}\\n      @items={{this.voices}}\\n      @value={{this.selectedVoice}}\\n      @disabled={{this.isTranslated}}\\n    />\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/content-playsettings/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  textformats={{this.settings.textformats}}\\n  textsize={{this.textSize}}\\n  textonly={{this.settings.textonly}}\\n  style={{this.settings.style}}\\n  lineheight={{this.settings.lineHeight}}\\n  class=\\\"content-presenter{{if this.isContainer \\\" content-presenter-container\\\"}} {{this.settings.fontfamily}}\\\"\\n  ...attributes>\\n  {{yield}}\\n</div>\\n\", {\"contents\":\"<div\\n  textformats={{this.settings.textformats}}\\n  textsize={{this.textSize}}\\n  textonly={{this.settings.textonly}}\\n  style={{this.settings.style}}\\n  lineheight={{this.settings.lineHeight}}\\n  class=\\\"content-presenter{{if this.isContainer \\\" content-presenter-container\\\"}} {{this.settings.fontfamily}}\\\"\\n  ...attributes>\\n  {{yield}}\\n</div>\\n\",\"moduleName\":\"babel/components/content-presenter/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/content-presenter/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ContentPresenter extends Component {\n  @service contextHelper;\n\n  @storageFor('read-setting') settings;\n\n  get textSize() {\n    const adaptUiFor = this.contextHelper.activeBook?.adaptUiFor;\n    const saved = this.settings.get('textsize');\n\n    if (adaptUiFor === 1 || saved === '3') {\n      return '3';\n    }\n\n    return '2';\n  }\n\n  get isContainer() {\n    if (this.args.isContainer === false) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { storageFor } from 'ember-local-storage';\nimport { resolve } from 'rsvp';\n\nexport default class ContentSheetComponent extends Component {\n  /**\n   * Arguments:\n   * activeSection\n   * content\n   * sections\n   * speakerContentInfo\n   * answers\n   * exercises\n   * activeExercise\n   * activeAnswer\n   * settings\n   * video\n   * collections\n   * wordlists\n   * activeCategory\n   * restrictedCollections\n   * restrictedSections\n   * previousSection\n   * nextSection\n   * routeToSection\n   */\n\n  @service router;\n\n  @service contextHelper;\n\n  @service missionMode;\n\n  @service store;\n\n  @storageFor('read-setting') readSettings;\n\n  get hasNextSection() {\n    return !(\n      this.args.sections?.indexOf(this.args.activeSection) >=\n      this.args.sections?.length - 1\n    );\n  }\n\n  @cached get customContentProxy() {\n    return load(\n      resolve(this.contextHelper.activeMission?.sortedCustomContents),\n      this\n    );\n  }\n\n  get customContent() {\n    return this.customContentProxy.isResolved\n      ? this.customContentProxy.value\n      : null;\n  }\n\n  get currentCustomContent() {\n    return this.customContent?.find((c) => {\n      return c.entity?.get('id') === this.args.content?.id;\n    });\n  }\n\n  get nextMissionContent() {\n    if (!this.customContent) return null;\n    const index = this.customContent?.indexOf(this.currentCustomContent);\n    return index >= 0 && this.customContent[index + 1];\n  }\n\n  get isWorkspaceOpen() {\n    const currentRouteName = this.router.currentRouteName;\n\n    return (\n      currentRouteName.includes('master.contents.assignments') ||\n      currentRouteName.includes('master.contents.wordlists') ||\n      currentRouteName.includes('master.contents.notes')\n    );\n  }\n\n  get hasPreviousSection() {\n    return this.args.sections?.indexOf(this.args.activeSection) > 0;\n  }\n\n  get showDoneButton() {\n    const mode = this.readSettings.get('mode');\n    let isOnLast = !this.hasNextSection;\n    // Of course we need exception for chapter scroll\n    if (mode === 'scroll' && this.args.content?.template === 'chapter') {\n      isOnLast = true;\n    }\n    return (this.hasAdditionalContent && isOnLast) || this.hasMissionNextButton;\n  }\n\n  get hasMissionNextButton() {\n    return (\n      this.contextHelper.activeMission &&\n      !this.hasNextSection &&\n      this.nextMissionContent\n    );\n  }\n\n  get hasAdditionalContent() {\n    return this.args.collections?.length || this.args.wordlists?.length;\n  }\n\n  get editor() {\n    return this.args.activeSection?.contenteditor?.content;\n  }\n\n  @action openExercise(exercise) {\n    return this.router.replaceWith({ queryParams: { exercise } });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let (component (concat \\\"content-\\\" @template)) as |Component|}}\\n  <Component\\n    @content={{@content}}\\n    @sections={{@sections}}\\n    @activeSection={{@activeSection}}\\n    @speakerContentInfo={{@speakerContentInfo}}\\n    @exerciseId={{@exerciseId}}\\n    @exercises={{@exercises}}\\n    @activeExercise={{@activeExercise}}\\n    @settings={{@settings}}\\n    @video={{@video}}\\n    @collections={{@collections}}\\n    @wordlists={{@wordlists}}\\n    @activeCategory={{@activeCategory}}\\n    @restrictedCollections={{@restrictedCollections}}\\n    @restrictedSections={{@restrictedSections}}\\n    @onPreviousSection={{@onPreviousSection}}\\n    @onNextSection={{@onNextSection}}\\n    @routeToSection={{@routeToSection}}\\n    @cacheNextAndPreviousImage={{@cacheNextAndPreviousImage}}\\n    @hasNextSection={{this.hasNextSection}}\\n    @hasPreviousSection={{this.hasPreviousSection}}\\n    @showDoneButton={{this.showDoneButton}}\\n    @editor={{this.editor}}\\n    @openExercise={{this.openExercise}}\\n    @answers={{@answers}}\\n    @activeAnswer={{@activeAnswer}}\\n    @isWorkspaceOpen={{this.isWorkspaceOpen}}\\n    @nextMissionContent={{this.nextMissionContent}}\\n  >\\n    {{yield}}\\n  </Component>\\n{{/let}}', { moduleName: 'babel/components/content-sheet/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XModal\\n  @title={{t \\\"components.contentSpeakerInfoModal.heading\\\"}}\\n  @onClose={{@onClose}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n>\\n  <div class=\\\"speaker-info p2\\\">\\n    <div class=\\\"grid-layout\\\">\\n      <div class=\\\"grid-cell-3 grid-cell-sm-12\\\">\\n        <img\\n          alt=\\\"\\\"\\n          role=\\\"presentation\\\"\\n          class=\\\"img-responsive mx-auto\\\"\\n          src=\\\"/assets/images/speaker/listen.svg\\\"\\n        />\\n      </div>\\n\\n      <div class=\\\"grid-cell-9 grid-cell-sm-12\\\">\\n        <div class=\\\"text-tertiary nb1\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.clickHeading\\\"}}\\n        </div>\\n        <p class=\\\"paragraph\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.click\\\" htmlSafe=true}}\\n        </p>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"grid-layout mt1\\\">\\n      <div class=\\\"grid-cell-3 grid-cell-sm-12\\\">\\n        <img\\n          alt=\\\"\\\"\\n          role=\\\"presentation\\\"\\n          class=\\\"img-responsive mx-auto\\\"\\n          src=\\\"/assets/images/speaker/keyboard.svg\\\"\\n        />\\n      </div>\\n\\n      <div class=\\\"grid-cell-9 grid-cell-sm-12\\\">\\n        <div class=\\\"text-tertiary nb1\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.keyboardHeading\\\"}}\\n        </div>\\n        <p class=\\\"paragraph\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.keyboard\\\" htmlSafe=true}}\\n        </p>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"grid-layout mt1\\\">\\n      <div class=\\\"grid-cell-3 grid-cell-sm-12\\\">\\n        <img\\n          alt=\\\"\\\"\\n          role=\\\"presentation\\\"\\n          class=\\\"img-responsive mx-auto\\\"\\n          src=\\\"/assets/images/speaker/settings.svg\\\"\\n        />\\n      </div>\\n\\n      <div class=\\\"grid-cell-9 grid-cell-sm-12\\\">\\n        <div class=\\\"text-tertiary nb1\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.customizeHeading\\\"}}\\n        </div>\\n        <p class=\\\"paragraph\\\">\\n          {{t \\\"components.contentSpeakerInfoModal.customize\\\" htmlSafe=true}}\\n        </p>\\n      </div>\\n    </div>\\n\\n    <UiButton @size=\\\"large\\\" class=\\\"mx-auto block mt2\\\" @onClick={{@onClose}}>\\n      {{t \\\"components.contentSpeakerInfoModal.confirm\\\"}}\\n    </UiButton>\\n  </div>\\n</XModal>', { moduleName: 'babel/components/content-speaker-info-modal/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ContentStoryComponent extends Component {\n  @service speaker;\n\n  @tracked showStoryModal =\n    !this.args.isWorkspaceOpen &&\n    !this.speaker?.active &&\n    !document.querySelector('body.entity-inspector--open');\n\n  get isSection() {\n    return this.args.activeSection?.type === 'sections';\n  }\n\n  @action\n  handleOnCloseModal() {\n    this.showStoryModal = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.showStoryModal}}\\n  <StoryModal @onClose={{this.handleOnCloseModal}} />\\n{{else}}\\n\\n  <section class=\\\"content-story flex story-content\\\">\\n\\n    <div class=\\\"flex-auto\\\">\\n\\n      <SpeakerContext\\n        @contentType=\\\"story\\\"\\n        @focus={{true}}\\n        @sections={{@sections}}\\n        @section={{@activeSection}}\\n        @contentInfo={{@speakerContentInfo}}\\n        @nextSection={{@onNextSection}}\\n      >\\n\\n        <ContentsStory\\n          @content={{@content}}\\n          @wordlists={{@wordlists}}\\n          @collections={{@collections}}\\n          @model={{@activeSection}}\\n          @exercises={{@exercises}}\\n          @activeExercise={{@activeExercise}}\\n          @onNextSection={{@onNextSection}}\\n          @onPreviousSection={{@onPreviousSection}}\\n          @hasPreviousSection={{@hasPreviousSection}}\\n          @cacheNextAndPreviousImage={{@cacheNextAndPreviousImage}}\\n          @hasNextSection={{@hasNextSection}}\\n          @showDoneButton={{@showDoneButton}}\\n          @editor={{@editor}}\\n          @openExercise={{@openExercise}}\\n          @answers={{@answers}}\\n          @activeAnswer={{@activeAnswer}}\\n          @isSection={{this.isSection}}\\n          @nextMissionContent={{@nextMissionContent}}\\n          @exerciseId={{@exerciseId}}\\n          @sections={{@sections}}\\n        />\\n\\n      </SpeakerContext>\\n\\n    </div>\\n\\n    {{yield}}\\n\\n  </section>\\n{{/if}}', { moduleName: 'babel/components/content-story/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { isWorkspaceCollectionActive } from 'babel/utils/is-workspace-collection-active';\nimport { load } from 'ember-async-data';\nimport { all } from 'rsvp';\n\nexport default class ContentSummaryComponent extends Component {\n  @service router;\n\n  @service assignmentEvents;\n\n  @tracked isSummaryOpen = false;\n\n  @cached get collectionItemsProxy() {\n    const collections = this.args.collections || [];\n\n    const promise = all(\n      collections.map(async (collection) => {\n        const classNames = ['content-summary-grid-item'];\n\n        if (isWorkspaceCollectionActive(this.router, collection)) {\n          classNames.push('content-summary-grid-item--active');\n        }\n\n        const classes = classNames.join(' ');\n\n        const interactive =\n          await this.assignmentEvents.getOrCreateInteractiveForCollection(\n            collection\n          );\n\n        return {\n          collection,\n          classes,\n          activeExercise: interactive?.activeExercise,\n        };\n      })\n    );\n\n    return load(promise, this);\n  }\n\n  get collectionItems() {\n    return this.collectionItemsProxy.isResolved\n      ? this.collectionItemsProxy.value\n      : null;\n  }\n\n  @action handleDone() {\n    this.isSummaryOpen = true;\n  }\n}\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\n\nexport default class ContentSummaryItemComponent extends Component {\n  @service missionMode;\n\n  @cached\n  get numAssignmentsProxy() {\n    const promise = this.missionMode\n      .allowedEntities(this.args.model?.children)\n      .then((allowed) => allowed?.length || 0);\n\n    return load(promise, this);\n  }\n\n  get numAssignments() {\n    return this.numAssignmentsProxy.isResolved\n      ? this.numAssignmentsProxy.value\n      : 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<EntityThumbnail\\n  class=\\\"content-summary-grid-item-thumbnail\\\"\\n  @type={{@type}}\\n  @model={{@model}}\\n  @avatarUser={{@user}}\\n/>\\n<div class=\\\"content-summary-grid-item-title\\\">\\n  {{#if (eq @type \\\"collections\\\")}}\\n    {{@title}} ({{this.numAssignments}})\\n  {{else}}\\n    {{@title}}\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/content-summary/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (or @wordlists.length @collections.length)}}\\n  <div class=\\\"content-summary\\\" ...attributes>\\n    <div class=\\\"text-primary\\\">{{t \\\"components.contentSummary.header\\\"}}</div>\\n    <div class=\\\"nt1\\\">{{t \\\"components.contentSummary.ingress\\\"}}</div>\\n    <div class=\\\"content-summary-wrapper\\\">\\n      <div class=\\\"content-summary-grid\\\">\\n        {{#each this.collectionItems as |item|}}\\n          <UiLink\\n            @route=\\\"master.contents.assignments.show\\\"\\n            @model={{item.activeExercise.id}}\\n            class={{item.classes}}>\\n            <ContentSummary::Item\\n              @type=\\\"collections\\\"\\n              @model={{item.collection}}\\n              @title={{item.collection.title}}\\n            />\\n          </UiLink>\\n        {{/each}}\\n        {{#each @wordlists as |wordlist|}}\\n          <UiLink\\n            @route=\\\"master.contents.wordlists.show\\\"\\n            @model={{wordlist}}\\n            @activeClass=\\\"content-summary-grid-item--active\\\"\\n            class=\\\"content-summary-grid-item\\\">\\n            <ContentSummary::Item\\n              @type=\\\"glossaries\\\"\\n              @user={{wordlist.user}}\\n              @title={{wordlist.titleWithFallback}}\\n            />\\n          </UiLink>\\n        {{/each}}\\n      </div>\\n    </div>\\n  </div>\\n{{/if}}\\n', { moduleName: 'babel/components/content-summary/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\nimport { storageFor } from 'ember-local-storage';\n\nconst ASSIGNMENTS_ROUTE = 'master.contents.assignments';\nconst WORDLISTS_ROUTE = 'master.contents.wordlists';\nconst NOTES_ROUTE = 'master.contents.notes';\n\nexport default class ContentTopbarComponent extends Component {\n  /**\n   * Arguments:\n   * content (object|array)\n   * collections (array)\n   * model (object)\n   * template (string)\n   * hideWorkflow (bool)\n   * hidePlaySettings (bool)\n   * hideReadSettings (bool)\n   */\n\n  @storageFor('read-setting') readSettings;\n\n  @service router;\n\n  @service session;\n\n  get routeOnSubHeadingClick() {\n    return !(\n      this.args.template === 'chapter' &&\n      this.readSettings.get('mode') === 'scroll'\n    );\n  }\n\n  get hasNextSection() {\n    return !(\n      this.args.sections?.indexOf(this.args.activeSection) >=\n      this.args.sections?.length - 1\n    );\n  }\n\n  get hasPreviousSection() {\n    return this.args.sections?.indexOf(this.args.activeSection) > 0;\n  }\n\n  get shouldDisplayAssignments() {\n    const user = this.session.user;\n\n    if (user?.isTeacher) {\n      return true;\n    }\n\n    return this.args.collections?.length > 0;\n  }\n\n  get assignmentsButtonIsActive() {\n    return this.router.currentRouteName?.startsWith(ASSIGNMENTS_ROUTE);\n  }\n\n  get wordlistsButtonIsActive() {\n    return this.router.currentRouteName?.startsWith(WORDLISTS_ROUTE);\n  }\n\n  get notesButtonIsActive() {\n    return this.router.currentRouteName?.startsWith(NOTES_ROUTE);\n  }\n\n  @action\n  openAssignments() {\n    return this.router.transitionTo(`${ASSIGNMENTS_ROUTE}.index`);\n  }\n\n  @action\n  openWordlists() {\n    trackWordlistEvent('Öppna ordlistor');\n    return this.router.transitionTo(`${WORDLISTS_ROUTE}.index`);\n  }\n\n  @action\n  openNotes() {\n    return this.router.transitionTo(`${NOTES_ROUTE}.index`);\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport generateId from 'compton/utils/generate-id';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ContentTopbarSettingsComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * speakerProvider (object)\n   * hidePlaySettings (bool)\n   * hideReadSettings (bool)\n   * template (string)\n   */\n\n  @storageFor('read-setting') settings;\n\n  @service session;\n\n  @service speaker;\n\n  @service colorTheme;\n\n  @tracked speakerInfoModalForced = false;\n\n  @tracked isShowingReadSettings = false;\n\n  @tracked isCategoryPopupOpen = false;\n\n  @tracked activePane =\n    this.speaker.active && !this.args.speakerProvider.disabled\n      ? 'playSettings'\n      : 'readSettings';\n\n  constructor() {\n    super(...arguments);\n\n    this.colorTheme.changeTheme(this.settings.get('theme'));\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.colorTheme.removeTheme();\n  }\n\n  get hasPlaySettings() {\n    return !this.args.hidePlaySettings && !this.args.speakerProvider.disabled;\n  }\n\n  get speakerButtonClass() {\n    const classes = [\n      'content-topbar-option',\n      'topbar-option-icon',\n      'content-topbar-button',\n    ];\n\n    if (this.speaker.active && !this.args.speakerProvider.disabled) {\n      classes.push('speaker--activated');\n    } else {\n      classes.push('speaker--deactivated');\n    }\n\n    return classes.join(' ');\n  }\n\n  get speakerButtonId() {\n    return generateId('toggle-speaker');\n  }\n\n  get showSpeakerInfoModal() {\n    const isSpeakerActive = !!this.speaker?.active;\n    const hasSeenSpeakerInfo =\n      !!this.session.user?.metadata?.has_seen_speaker_info;\n\n    const autoShow = isSpeakerActive && !hasSeenSpeakerInfo;\n    const forceShow = this.speakerInfoModalForced;\n\n    return autoShow || forceShow;\n  }\n\n  get settingsButtonClass() {\n    const classes = ['content-topbar-option', 'content-topbar-button', 'mr1'];\n\n    if (this.isShowingReadSettings) {\n      classes.push('settings--activated');\n    }\n\n    return classes.join(' ');\n  }\n\n  @action toggleSpeakerActive() {\n    // Set value in service\n    this.speaker.toggleSpeakerActive();\n  }\n\n  @action closeSpeakerInfoModal() {\n    // Reset the 'force show' flag in case the modal was opened manually from the settings menu\n    this.speakerInfoModalForced = false;\n\n    // Save to db to prevent modal from being auto-shown again\n    const user = this.session.user;\n\n    if (!user) return;\n    if (!user.metadata) user.metadata = {};\n\n    user.metadata.has_seen_speaker_info = true;\n\n    user.save();\n  }\n\n  @action forceShowSpeakerInfoModal() {\n    this.speakerInfoModalForced = true;\n  }\n\n  @action toggleReadSettings() {\n    this.isShowingReadSettings = !this.isShowingReadSettings;\n  }\n\n  @action handleSettingsChange(setting) {\n    if (setting == 'readRuler' || setting == 'focus') {\n      this.isShowingReadSettings = false;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"content-topbar-settings\\\">\\n\\n  {{#if (gt @categories.length 1)}}\\n\\n    {{#let (generate-id) as |id|}}\\n\\n      <UiButton\\n        id={{id}}\\n        class={{class\\n          \\\"content-topbar-option\\\"\\n          \\\"content-topbar-button\\\"\\n          \\\"mr1\\\"\\n          (if this.isCategoryPopupOpen \\\"text-versions--activated\\\")\\n        }}\\n        data-test-category-popup-button\\n        @appearance=\\\"link\\\"\\n        @onClick={{set this \\\"isCategoryPopupOpen\\\" true}}\\n      >\\n        <span class=\\\"flex-inline flex-auto flex-center flex-column\\\">\\n          <DcIcon @name=\\\"versions\\\" class=\\\"topbar-option-icon\\\" />\\n\\n          <span class=\\\"content-topbar-button-label\\\">\\n            {{~@activeCategory.name~}}\\n            <span class=\\\"content-topbar-button-triangle\\\"></span>\\n          </span>\\n        </span>\\n      </UiButton>\\n\\n      {{#if this.isCategoryPopupOpen}}\\n\\n        <XPopup\\n          @for={{id}}\\n          @minWidth={{320}}\\n          @alignment=\\\"start\\\"\\n          @switchToDialogOnSmallBreakpoint={{false}}\\n          @onClose={{set this \\\"isCategoryPopupOpen\\\" false}}\\n          ...attributes\\n        >\\n\\n          <div class=\\\"p1\\\">\\n            <div class=\\\"text-bold nb1\\\">\\n              {{t \\\"components.contentTopbar.settings.textVersions\\\"}}\\n            </div>\\n\\n            <SelectList as |list|>\\n\\n              {{#each @categories as |category|}}\\n                <list.Item\\n                  @selected={{eq @activeCategory.id category.id}}\\n                  @onSelect={{fn @onCategoryChange category}}\\n                >\\n                  {{category.name}}\\n                </list.Item>\\n              {{/each}}\\n\\n            </SelectList>\\n          </div>\\n\\n        </XPopup>\\n      {{/if}}\\n\\n    {{/let}}\\n\\n  {{/if}}\\n\\n  {{#unless @hideReadSettings}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      class={{this.settingsButtonClass}}\\n      @onClick={{this.toggleReadSettings}}\\n      id=\\\"toggle-readsettings\\\"\\n      data-test-toggle-readsettings-button\\n    >\\n      <span class=\\\"flex-inline flex-auto flex-center flex-column\\\">\\n        <DcIcon\\n          @name=\\\"preferences\\\"\\n          class=\\\"topbar-option-icon\\\"\\n        />\\n        <span class=\\\"content-topbar-button-label\\\">\\n          {{~t \\\"components.contentTopbar.settings.customize\\\"~}}\\n          <span class=\\\"content-topbar-button-triangle\\\"></span>\\n        </span>\\n      </span>\\n    </UiButton>\\n\\n    {{#if this.isShowingReadSettings}}\\n      <XPopup\\n        @for=\\\"toggle-readsettings\\\"\\n        @title={{t \\\"components.contentTopbar.settings.customize\\\"}}\\n        @alignment=\\\"start\\\"\\n        @minWidth={{280}}\\n        @onClose={{this.toggleReadSettings}}\\n      >\\n        <XTab\\n          @value={{this.activePane}}\\n          @indented={{true}}\\n          data-test-readsettings-popup-tab\\n          as |Tab|\\n        >\\n          <Tab.pane\\n            @value=\\\"readSettings\\\"\\n            @label={{t \\\"components.contentTopbar.settings.presentation\\\"}}\\n          >\\n            <ReadSettings\\n              class={{unless this.hasPlaySettings \\\"p1\\\" \\\"px1 pb1\\\"}}\\n              @model={{@model}}\\n              @template={{@template}}\\n              @onChange={{this.handleSettingsChange}}\\n            />\\n          </Tab.pane>\\n\\n          {{#if this.hasPlaySettings}}\\n            <Tab.pane\\n              @value=\\\"playSettings\\\"\\n              @label={{t \\\"components.contentTopbar.settings.reading\\\"}}\\n            >\\n              <ContentPlaysettings\\n                class=\\\"px1 pb1\\\"\\n                @model={{@model}}\\n                @onShowSpeakerInfo={{this.forceShowSpeakerInfoModal}}\\n              />\\n            </Tab.pane>\\n          {{/if}}\\n        </XTab>\\n      </XPopup>\\n    {{/if}}\\n  {{/unless}}\\n\\n  {{#unless @hidePlaySettings}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @onClick={{this.toggleSpeakerActive}}\\n      @disabled={{@speakerProvider.disabled}}\\n      class={{this.speakerButtonClass}}\\n      data-test-toggle-speaker-button\\n    >\\n      <span\\n        class=\\\"flex-inline flex-auto flex-center flex-column\\\"\\n        id={{this.speakerButtonId}}\\n      >\\n        <SpeakerProvider::Icon @provider={{@speakerProvider.provider}} />\\n        <span class=\\\"content-topbar-button-label\\\">\\n          {{t \\\"components.contentTopbar.settings.listen\\\"}}\\n        </span>\\n      </span>\\n\\n      {{#if @speakerProvider.disabled}}\\n        <XTooltip @for={{this.speakerButtonId}}>\\n          {{t \\\"components.contentTopbar.settings.speakerToggleButtonTooltip\\\"}}\\n        </XTooltip>\\n      {{/if}}\\n    </UiButton>\\n\\n    {{#if this.showSpeakerInfoModal}}\\n      <ContentSpeakerInfoModal @onClose={{this.closeSpeakerInfoModal}} />\\n    {{/if}}\\n  {{/unless}}\\n</div>', { moduleName: 'babel/components/content-topbar/settings/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"content-topbar\\\" ...attributes>\\n  <SpeakerProvider @content={{@model.parent}} as |speakerProvider|>\\n    <ContentTopbar::Settings\\n      @model={{@model}}\\n      @speakerProvider={{speakerProvider}}\\n      @hidePlaySettings={{@hidePlaySettings}}\\n      @hideReadSettings={{@hideReadSettings}}\\n      @categories={{@categories}}\\n      @activeCategory={{@activeCategory}}\\n      @template={{@template}}\\n      @onCategoryChange={{@onCategoryChange}}\\n    />\\n  </SpeakerProvider>\\n\\n  <div class=\\\"chapter-navigation-container\\\">\\n    {{#unless @hideNavigation}}\\n      <ChapterNavigation\\n        @class=\\\"flex\\\"\\n        @activeSection={{@activeSection}}\\n        @activeCategory={{@activeCategory}}\\n        @currentSections={{@sections}}\\n        @sections={{@restrictedSections}}\\n        @collections={{@restrictedCollections}}\\n        @wordlists={{@wordlists}}\\n        @categories={{@categories}}\\n        @goToSection={{@routeToSection}}\\n        @routeOnSubHeadingClick={{this.routeOnSubHeadingClick}}\\n        @hasNextSection={{this.hasNextSection}}\\n        @hasPreviousSection={{this.hasPreviousSection}}\\n        @isInteractive={{@isInteractive}}\\n      />\\n    {{/unless}}\\n  </div>\\n\\n  <div class=\\\"content-topbar-options\\\">\\n    <!-- Yield in toolbar option (used by diagnosis)-->\\n    {{yield}}\\n\\n    {{#unless @hideWorkflow}}\\n      {{#if this.shouldDisplayAssignments}}\\n        <UiButton\\n          @variant=\\\"inherit\\\"\\n          class=\\\"mr1 content-topbar-option content-topbar-button\\\"\\n          @appearance=\\\"link\\\"\\n          @onClick={{this.openAssignments}}\\n          @active={{this.assignmentsButtonIsActive}}\\n          data-content-topbar-button-assignments\\n        >\\n          <span class=\\\"flex-inline flex-auto flex-center flex-column\\\">\\n            <DcIcon @name=\\\"assignments\\\" class=\\\"topbar-option-icon\\\" />\\n            <span class=\\\"content-topbar-button-label\\\">\\n              {{t \\\"components.contentTopbar.exercises\\\"}}\\n            </span>\\n          </span>\\n        </UiButton>\\n      {{/if}}\\n\\n      <UiButton\\n        @variant=\\\"inherit\\\"\\n        class=\\\"mr1 content-topbar-option content-topbar-button\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.openWordlists}}\\n        @active={{this.wordlistsButtonIsActive}}\\n        data-content-topbar-button-glossaries\\n      >\\n        <span class=\\\"flex-inline flex-auto flex-center flex-column\\\">\\n          <DcIcon @name=\\\"glossaries\\\" class=\\\"topbar-option-icon\\\" />\\n          <span class=\\\"content-topbar-button-label\\\">\\n            {{t \\\"components.contentTopbar.wordlists\\\"}}\\n          </span>\\n        </span>\\n      </UiButton>\\n\\n      <UiButton\\n        @variant=\\\"inherit\\\"\\n        class=\\\"content-topbar-option content-topbar-button\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.openNotes}}\\n        @active={{this.notesButtonIsActive}}\\n      >\\n        <span class=\\\"flex-inline flex-auto flex-center flex-column\\\">\\n          <DcIcon @name=\\\"notes\\\" class=\\\"topbar-option-icon\\\" />\\n          <span class=\\\"content-topbar-button-label\\\">\\n            {{t \\\"components.contentTopbar.notes\\\"}}\\n          </span>\\n        </span>\\n      </UiButton>\\n    {{/unless}}\\n  </div>\\n</div>', { moduleName: 'babel/components/content-topbar/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<section class=\\\"content-workflow flex workflow-content\\\">\\n\\n  <div class=\\\"flex-auto\\\">\\n\\n    <SpeakerContext\\n      @contentType=\\\"workflow\\\"\\n      @focus={{true}}\\n      @sections={{@sections}}\\n      @section={{@activeSection}}\\n      @contentInfo={{@speakerContentInfo}}\\n    >\\n\\n      <Master::ContentsWorkflow\\n        @content={{@content}}\\n        @model={{@activeSection}}\\n        @exerciseId={{@exerciseId}}\\n        @exercises={{@exercises}}\\n        @activeExercise={{@activeExercise}}\\n        @collections={{@collections}}\\n        @wordlists={{@wordlists}}\\n        @sections={{@sections}}\\n        @gotoSection={{@routeToSection}}\\n        @hasNextSection={{@hasNextSection}}\\n        @hasPreviousSection={{@hasPreviousSection}}\\n        @onNextSection={{@onNextSection}}\\n        @onPreviousSection={{@onPreviousSection}}\\n        @showDoneButton={{@showDoneButton}}\\n        @editor={{@editor}}\\n        @openExercise={{@openExercise}}\\n        @answers={{@answers}}\\n        @activeAnswer={{@activeAnswer}}\\n        @nextMissionContent={{@nextMissionContent}}\\n      />\\n\\n    </SpeakerContext>\\n\\n  </div>\\n\\n  {{yield}}\\n\\n</section>\\n', { moduleName: 'babel/components/content-workflow/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['c-content-preamble'],\n\n  // EXTERNAL\n\n  value: null,\n\n  excerptBreakpoint: 120,\n\n  template: null,\n\n  // INTERNAL\n\n  showMoreButton: false,\n\n  showFullText: false,\n\n  hideFullText: false,\n\n  // BINDINGS\n\n  classNameBindings: [\n    'showFullText:show-full-text',\n    'hideFullText:hide-full-text'\n  ],\n\n  // HOOKS\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    if (this.get('template') !== 'cover') {\n      let height = this.element.offsetHeight;\n\n      this.element.style.setProperty(\n        '--break',\n        `${this.get('excerptBreakpoint')}px`\n      );\n\n      if (height > this.get('excerptBreakpoint')) {\n        this.set('showMoreButton', true);\n        this.set('hideFullText', true);\n      }\n    }\n  },\n\n  // ACTIONS\n\n  actions: {\n    toggleText() {\n      this.toggleProperty('showFullText');\n      this.toggleProperty('hideFullText');\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.value}}\\n\\n  <div class=\\\"preamble-content\\\">\\n    <ContentPresenter class=\\\"mb1 ml0\\\">\\n      <TbRenderInline @value={{this.value}} />\\n    </ContentPresenter>\\n  </div>\\n\\n  {{#if this.showMoreButton}}\\n    <button\\n      aria-label=\\\"Toggle preamble\\\"\\n      class=\\\"preamble-toggle flex flex-center justify-center\\n        {{if this.showFullText \\'up\\' \\'down\\'}}\\\"\\n      {{action \\\"toggleText\\\"}}\\n    >\\n      <DcIcon @name=\\\"small-down\\\" />\\n    </button>\\n  {{/if}}\\n\\n{{/if}}', { moduleName: 'babel/components/content/c-preamble/template.hbs' });\n","import Component from '@glimmer/component';\nimport Part from 'babel/utils/part';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ContentsChapterHeroComponent extends Component {\n  /**\n   * Arguments:\n   * activeSection (object)\n   * content (object)\n   */\n\n  @storageFor('read-setting') settings;\n\n  part = new Part();\n\n  get showPlaceholder() {\n    return this.settings.get('onlytext') && !this.part.mediaForced;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @content.video}}\\n  <header\\n    class=\\\"contents-chapter-hero\\n      {{if @content.body.hide_heading \\'contents-chapter-hero--hide-heading\\'}}\\\"\\n  >\\n    <div class=\\\"hero-video-wrapper\\\">\\n      {{#if this.showPlaceholder}}\\n        <TbRender::Placeholder @part={{this.part}} />\\n      {{else}}\\n        <VideoPlayer\\n          @source={{@content.video.meta.attachment_url}}\\n          @posterUrl={{@content.video.meta.image_url}}\\n          @name={{@content.video.name}}\\n          @type={{@content.video.type}}\\n          @subtitles={{@content.video.metadata.subtitles}}\\n          class=\\\"hero-video\\\"\\n        />\\n      {{/if}}\\n    </div>\\n  </header>\\n{{/if}}', { moduleName: 'babel/components/contents-chapter-hero/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\n\nexport default class ContentsChapterScrollComponent extends Component {\n  /**\n   * Arguments:\n   * section (object)\n   * sections (array)\n   * activeExercise (object)\n   * editor (object)\n   * openExercise (function)\n   * answers (array)\n   * activeAnswer (object)\n   */\n\n  @service('footnotes') footnotesService;\n\n  constructor() {\n    super(...arguments);\n\n    this.footnotesService.createIndexContext(this.args.sections);\n  }\n\n  @cached get sectionProxy() {\n    return load(this.args.section, this);\n  }\n\n  get heading() {\n    const section = this.sectionProxy.isResolved\n      ? this.sectionProxy.value\n      : null;\n\n    if (section?.body?.hide_heading) return null;\n\n    return section ? section.heading : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"contents-chapter-step\\\" ...attributes>\\n  {{#if (eq @section.type \\\"sections\\\")}}\\n    <ChapterSection\\n      @section={{@section}}\\n      @heading={{this.heading}}\\n    />\\n    <ContentExercises\\n      @section={{@section}}\\n      @openExercise={{@openExercise}}\\n      @exerciseId={{@exerciseId}}\\n    />\\n  {{else if (eq @section.type \\\"collections\\\")}}\\n    <CollectionView\\n      @collection={{@section}}\\n      @exercises={{@section.children}}\\n      @activeExercise={{@activeExercise}}\\n      @answers={{@answers}}\\n      @activeAnswer={{@activeAnswer}}\\n      @shortCode={{@section.book.body.shortcode}}\\n      @digilarRecordedSpeechEnabled={{@content.body.recorded_speech_activated}}\\n      @editor={{@editor}}\\n      @openExercise={{@openExercise}}\\n    />\\n  {{/if}}\\n\\n  {{#if @section.footnotes}}\\n    <FootnoteList class=\\\"mt4\\\" @footnotes={{@section.footnotes}} />\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/contents-chapter-step/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ContentsStoryComponent extends Component {\n  @tracked showContentSummary = false;\n\n  @tracked showStoryModal = true;\n\n  @action handleDone() {\n    this.showContentSummary = true;\n  }\n\n  @action handleOnCloseModal() {\n    this.showStoryModal = false;\n  }\n\n  get showSummary() {\n    return this.showContentSummary && !this.args.hasNextSection;\n  }\n\n  get showDoneButton() {\n    return !this.showContentSummary && this.args.showDoneButton;\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ContentsStorySection extends Component {\n  constructor() {\n    super(...arguments);\n    this.speaker.set('storyCinemaMode', this.cinema);\n    this.footnotesService.createIndexContext(this.args.sections);\n\n    this.resizeObserver = new ResizeObserver(this.handleResize);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.resizeObserver.unobserve(this.element);\n  }\n\n  @storageFor('read-setting') settings;\n\n  @service('footnotes') footnotesService;\n\n  @service speaker;\n\n  @tracked elementWidth;\n\n  @tracked resizeObserver;\n\n  @tracked showContentSummary = false;\n\n  @tracked imageElement;\n\n  imageSize = 'xl';\n\n  @action\n  handleDone() {\n    this.showContentSummary = true;\n  }\n\n  @action\n  handleResize() {\n    if (!this.element) return;\n\n    const { width: elementWidth } = this.element.getBoundingClientRect();\n\n    if (this.elementWidth !== elementWidth) {\n      this.elementWidth = elementWidth;\n    }\n  }\n\n  @action\n  handleImageFinally() {\n    this.args.cacheNextAndPreviousImage(this.imageSize);\n    this.imageElement.classList.add('story-section-image-fade-in');\n  }\n\n  @action\n  resetOpacity() {\n    if (!this.#isImageLoaded(this.imageElement?.querySelector('img'))) {\n      this.imageElement.classList.remove('story-section-image-fade-in');\n    }\n  }\n\n  #isImageLoaded(image) {\n    return image?.complete && image?.naturalHeight !== 0;\n  }\n\n  @action\n  setElement(element) {\n    this.element = element;\n    this.resizeObserver.observe(this.element);\n    this.handleResize();\n  }\n\n  @action\n  setImageElement(element) {\n    this.imageElement = element;\n  }\n\n  @action\n  toggleOnlyImage() {\n    const value = !this.settings.get('onlyImage');\n    this.settings.set('onlyImage', value);\n    this.speaker.set('storyCinemaMode', value);\n  }\n\n  get responsiveClass() {\n    if (this.elementWidth > 1600) {\n      return 'story-section--xl';\n    } else if (this.elementWidth > 1200) {\n      return 'story-section--large';\n    } else if (this.elementWidth > 992) {\n      return 'story-section--medium';\n    } else {\n      return null;\n    }\n  }\n\n  get showSummary() {\n    return this.showContentSummary && !this.args.hasNextSection;\n  }\n\n  get showDoneButton() {\n    return !this.showContentSummary && this.args.showDoneButton;\n  }\n\n  get expandedImage() {\n    return (\n      !!this.args.model?.image?.metadata?.keep_proportions &&\n      !this.settings.get('onlyImage')\n    );\n  }\n\n  get cinema() {\n    return this.settings.get('onlyImage');\n  }\n\n  get classNames() {\n    if (this.cinema) {\n      return 'story-section--cinema';\n    } else {\n      return '';\n    }\n  }\n\n  get backgroundColor() {\n    return this.args.model?.image?.backgroundColor;\n  }\n\n  get image() {\n    return this.args.model?.image?.imageURL || this.args.model?.featuredImage;\n  }\n\n  get styleString() {\n    let url = `url(${this.image})`;\n    return `--bg-color: ${this.backgroundColor}; --url: ${url};`;\n  }\n\n  @cached\n  get modelProxy() {\n    return load(this.args.model, this);\n  }\n\n  get title() {\n    const model = this.modelProxy.isResolved ? this.modelProxy.value : null;\n\n    if (model?.body?.hide_heading) return null;\n\n    return model ? model.title : null;\n  }\n\n  get hasExercises() {\n    return this.args.model.children.length > 0;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"story-section-wrapper\\n    {{this.classNames}}\\n    {{this.responsiveClass}}\\n    {{if this.expandedImage \\'story-section-expanded-image\\'}}\\\"\\n  {{did-insert this.setElement}}\\n  {{on-resize this.handleResize}}\\n>\\n  <div class=\\\"story-section {{this.responsiveClass}}\\\" ...attributes>\\n\\n    {{#let @model.image as |image|}}\\n      {{#if image}}\\n\\n        <figure class=\\\"story-section-image-container {{this.responsiveClass}}\\\">\\n\\n          <div\\n            class=\\\"story-section-image\\\"\\n            style={{this.styleString}}\\n            {{did-insert this.setImageElement}}\\n            {{did-update this.resetOpacity image}}\\n          >\\n\\n            <XImage\\n              @source={{image-source image.imageUrl size=this.imageSize}}\\n              @width={{image.imageWidth}}\\n              @height={{image.imageHeight}}\\n              @color={{image.imageColor}}\\n              @mimetype={{image.imageMimetype}}\\n              @onFinally={{this.handleImageFinally}}\\n              @id=\\\"content-story-image\\\"\\n              @alt={{image.metadata.alt_text}}\\n            />\\n\\n          </div>\\n\\n          {{#if this.settings.onlyImage}}\\n            <UiButton\\n              @appearance=\\\"link\\\"\\n              @onClick={{this.toggleOnlyImage}}\\n              class=\\\"mt1\\\"\\n            >\\n              {{t \\\"components.contentsStory.showText\\\"}}\\n            </UiButton>\\n          {{/if}}\\n\\n          {{! Note! Speaker controls are added to the DOM by the speaker-context component when needed. }}\\n\\n        </figure>\\n\\n      {{/if}}\\n    {{/let}}\\n\\n    <article\\n      class=\\\"story-section-content\\n        {{this.responsiveClass}}\\n        {{if this.cinema \\'story-section-content--hidden\\' \\'\\'}}\\\"\\n    >\\n      <div class=\\\"story-section-hide-text-wrapper container-md\\\">\\n        {{#unless this.settings.onlyImage}}\\n          <UiButton\\n            @appearance=\\\"link\\\"\\n            @onClick={{this.toggleOnlyImage}}\\n            class=\\\"nb1\\\"\\n          >\\n            {{t \\\"components.contentsStory.hideText\\\"}}\\n          </UiButton>\\n        {{/unless}}\\n      </div>\\n      <div class=\\\"story-section-content-text-block\\\">\\n        <ContentPresenter class=\\\"story-section-content-scroller\\\">\\n\\n          {{#if this.title}}\\n            <ReadingResolve\\n              @readingId={{@model.body.reading_id}}\\n              as |readingUrl|\\n            >\\n              <h2\\n                class=\\\"story-section-title\\\"\\n                data-id={{@model.document_id}}\\n                data-reading={{readingUrl}}\\n                data-reading-loading={{not readingUrl}}\\n              >\\n                {{~this.title~}}\\n              </h2>\\n            </ReadingResolve>\\n          {{/if}}\\n\\n          <TbRender @content={{@model.contenteditor}} />\\n\\n          {{#if @model.footnotes}}\\n            <FootnoteList class=\\\"mt2\\\" @footnotes={{@model.footnotes}} />\\n          {{/if}}\\n\\n        </ContentPresenter>\\n      </div>\\n\\n      {{#if this.hasExercises}}\\n        <div class=\\\"collection-margin-fix\\\">\\n          <ContentExercises\\n            @section={{@model}}\\n            @exerciseId={{@exerciseId}}\\n          />\\n        </div>\\n      {{/if}}\\n\\n      <ContentPaginationSummary\\n        class=\\\"content-pagination-summary-container\\\"\\n        @collections={{@collections}}\\n        @content={{@content}}\\n        @wordlists={{@wordlists}}\\n        @horizontal={{true}}\\n        @simplified={{false}}\\n        @showNextButton={{@hasNextSection}}\\n        @showBackButton={{@hasPreviousSection}}\\n        @showDoneButton={{@showDoneButton}}\\n        @showSummary={{@showSummary}}\\n        @onNextSection={{@onNextSection}}\\n        @onPreviousSection={{@onPreviousSection}}\\n        @onDone={{@onDone}}\\n        @nextMissionContent={{@nextMissionContent}}\\n      />\\n\\n    </article>\\n  </div>\\n</div>', { moduleName: 'babel/components/contents-story/section/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"contents-story\\\">\\n  {{#if @isSection}}\\n    <ContentsStory::Section\\n      @content={{@content}}\\n      @model={{@model}}\\n      @collections={{@collections}}\\n      @wordlists={{@wordlists}}\\n      @onNextSection={{@onNextSection}}\\n      @onPreviousSection={{@onPreviousSection}}\\n      @hasNextSection={{@hasNextSection}}\\n      @hasPreviousSection={{@hasPreviousSection}}\\n      @cacheNextAndPreviousImage={{@cacheNextAndPreviousImage}}\\n      @showDoneButton={{this.showDoneButton}}\\n      @hasAdditionalContent={{@hasAdditionalContent}}\\n      @showSummary={{this.showSummary}}\\n      @onDone={{this.handleDone}}\\n      @nextMissionContent={{@nextMissionContent}}\\n      @exerciseId={{@exerciseId}}\\n      @sections={{@sections}}\\n    />\\n  {{else}}\\n    <CollectionView\\n      @wihinContent={{true}}\\n      @collection={{@model}}\\n      @exercises={{@exercises}}\\n      @activeExercise={{@activeExercise}}\\n      @answers={{@answers}}\\n      @activeAnswer={{@activeAnswer}}\\n      @shortCode={{@model.book.body.shortcode}}\\n      @editor={{@editor}}\\n      @openExercise={{@openExercise}}\\n      @digilarRecordedSpeechEnabled={{@content.body.recorded_speech_activated}}\\n      as |CollectionViewYield|\\n    >\\n      <CollectionViewYield.Bottom>\\n        <ContentPaginationSummary\\n          class=\\\"contents-story-collection-pagination\\\"\\n          @collections={{@collections}}\\n          @content={{@content}}\\n          @wordlists={{@wordlists}}\\n          @horizontal={{true}}\\n          @simplified={{true}}\\n          @showNextButton={{@hasNextSection}}\\n          @showBackButton={{@hasPreviousSection}}\\n          @showDoneButton={{this.showDoneButton}}\\n          @showSummary={{this.showSummary}}\\n          @onNextSection={{@onNextSection}}\\n          @onPreviousSection={{@onPreviousSection}}\\n          @onDone={{this.handleDone}}\\n          @nextMissionContent={{@nextMissionContent}}\\n        />\\n      </CollectionViewYield.Bottom>\\n\\n    </CollectionView>\\n  {{/if}}\\n\\n</div>', { moduleName: 'babel/components/contents-story/template.hbs' });\n","import { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { all } from 'rsvp';\n\nexport default class ContextSelectComponent extends Component {\n  @service contextHelper;\n  @service courseContext;\n  @service productContext;\n  @service router;\n  @service intl;\n\n  @tracked courses = [];\n\n  @tracked products = [];\n\n  get showCourses() {\n    return !this.contextHelper.inCourse && this.courses?.length > 1;\n  }\n\n  get showProducts() {\n    return (\n      !this.contextHelper.inCourse &&\n      !this.contextHelper.inProduct &&\n      this.products?.length > 1\n    );\n  }\n\n  get showModal() {\n    return (\n      this.showCourses || (this.showProducts && !this.contextHelper.inCourse)\n    );\n  }\n\n  get courseProxy() {\n    const courses = this.courses || A();\n\n    return all(\n      courses?.map((course) =>\n        course\n          .get('products')\n          ?.then((products) =>\n            all([products.getEach('image'), products.getEach('cover')])\n          )\n          .then(() => course)\n      )\n    );\n  }\n\n  get modalHeader() {\n    if (this.showCourses) {\n      return this.intl.t(\n        'components.contextSelect.selectCourseContext.heading'\n      );\n    } else {\n      return this.intl.t(\n        'components.contextSelect.selectProductContext.heading'\n      );\n    }\n  }\n\n  @action async fetchCoursesAndProducts() {\n    if (this.contextHelper.inCourse) return;\n\n    if (this.args.book) {\n      this.courses = await this.courseContext.fetchCoursesForBook(\n        this.args.book,\n        this.args.isTeacher\n      );\n    } else if (this.args.product) {\n      this.courses = await this.courseContext.fetchCoursesForProduct(\n        this.args.product\n      );\n    }\n\n    if (this.courses.length === 1) {\n      return this.courseContext.setCurrentCourse(this.courses[0]);\n    }\n\n    if (this.showCourses || this.contextHelper.inProduct) return;\n\n    this.products = this.productContext.getAvailableProducts(this.args.book);\n\n    if (this.products.length === 1) {\n      return this.productContext.setActiveProduct(this.products[0]);\n    }\n  }\n\n  @action onClose() {\n    return this.router.transitionTo('master.index');\n  }\n\n  @action selectCourse(course, evt) {\n    evt.preventDefault();\n\n    if (this.args.onSelectCourse) {\n      return this.args\n        .onSelectCourse?.(course)\n        .then(() => this.courseContext.setCurrentCourse(course));\n    } else {\n      return this.courseContext.setCurrentCourse(course);\n    }\n  }\n\n  @action selectProduct(product, evt) {\n    evt.preventDefault();\n\n    this.productContext.setActiveProduct(product);\n    this.args.onSelectProduct?.(product);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<p class=\\\"mb1\\\">\\n  {{t \\\"components.contextSelect.selectCourseContext.info\\\"}}\\n</p>\\n\\n<div class=\\\"grid\\\">\\n  {{#each @courses as |course|}}\\n    {{#let (course-display-name course) as |displayName|}}\\n      <a\\n        href=\\\"#\\\"\\n        class=\\\"col-sm-6 col-4\\\"\\n        {{on \\\"click\\\" (fn @onSelectCourse course)}}\\n      >\\n        <ImageCard\\n          @image={{if\\n            course.coverImage\\n            course.coverImage\\n            \\\"/assets/images/defaults/course.svg\\\"\\n          }}\\n          @title={{displayName.title}}\\n        >\\n          <:subtitle>\\n            {{#if displayName.subtitle}}\\n              <span class=\\\"nt1 text-small\\\">\\n                ({{displayName.subtitle}})\\n              </span>\\n            {{/if}}\\n          </:subtitle>\\n        </ImageCard>\\n      </a>\\n    {{/let}}\\n  {{/each}}\\n</div>', { moduleName: 'babel/components/context-select/courses/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<p class=\\\"mb1\\\">{{t \\\"components.contextSelect.selectProductContext.info\\\"}}</p>\\n\\n<div class=\\\"grid\\\">\\n  {{#each @products as |product|}}\\n    <a\\n      href=\\\"#\\\"\\n      class=\\\"col-sm-6 col-4\\\"\\n      {{on \\\"click\\\" (fn @onSelectProduct product)}}\\n    >\\n      <ImageCard\\n        @image={{image-source product.cover.imageURL max=true w=640 h=480}}\\n        @title={{product.title}}\\n      />\\n    </a>\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/context-select/products/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAwait @value={{this.fetchCoursesAndProducts}}>\\n\\n  <XAwait @value={{this.courseProxy}} as |courses|>\\n\\n    {{#if this.showModal}}\\n      <XModal\\n        @onClose={{this.onClose}}\\n        @size={{hash width=\\\"medium\\\" height=\\\"auto\\\"}}\\n        @title={{this.modalHeader}}\\n        @locked={{true}}\\n        @closeButton={{false}}\\n        as |modal|>\\n\\n        <modal.header/>\\n\\n        <modal.content class=\\\"px1 pt1\\\">\\n\\n          {{#if this.showCourses}}\\n            <ContextSelect::Courses\\n              @courses={{courses}}\\n              @onSelectCourse={{this.selectCourse}}\\n            />\\n          {{else if (and this.products this.showProducts)}}\\n            <ContextSelect::Products\\n              @products={{this.products}}\\n              @onSelectProduct={{this.selectProduct}}\\n            />\\n          {{/if}}\\n\\n        </modal.content>\\n\\n      </XModal>\\n    {{/if}}\\n\\n  </XAwait>\\n\\n</XAwait>\\n', { moduleName: 'babel/components/context-select/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { trackContentEvent } from 'babel/utils/matomo-events';\nimport imageSource from 'compton/utils/image-source';\nimport DS from 'ember-data';\n\nconst { PromiseObject } = DS;\n\nfunction createPromiseObject(promise) {\n  return PromiseObject.create({ promise });\n}\n\nexport default Component.extend({\n  classNames: ['continue-content'],\n\n  store: service(),\n\n  continueVisited: null,\n\n  continueVisitedEntity: null,\n\n  imageSrc: null,\n\n  actions: {},\n\n  type: readOnly('continueVisited.attributes.type'),\n\n  linkedEntity: computed(\n    'entity',\n    'parent',\n    'assignment',\n    'wordlist',\n    'type',\n    function () {\n      const { entity, assignment, wordlist } = this.getProperties(\n        'entity',\n        'parent',\n        'assignment',\n        'wordlist',\n        'type'\n      );\n\n      if (assignment) {\n        return assignment;\n      } else if (wordlist) {\n        return wordlist;\n      }\n      return entity;\n    }\n  ),\n\n  entity: computed('continueVisited', function () {\n    const entityId = this.get('continueVisited.attributes.entity_id');\n\n    if (entityId) {\n      return createPromiseObject(\n        this.get('store').findRecord('entity', entityId)\n      );\n    }\n    return null;\n  }),\n\n  parent: computed('continueVisited', function () {\n    const parentId = this.get('continueVisited.attributes.parent_id');\n\n    if (parentId) {\n      return createPromiseObject(\n        this.get('store').findRecord('entity', parentId)\n      );\n    }\n    return null;\n  }),\n\n  assignment: computed('continueVisited', function () {\n    const assignmentId = this.get('continueVisited.attributes.assignment_id');\n\n    if (assignmentId) {\n      return createPromiseObject(\n        this.get('store').findRecord('entity', assignmentId)\n      );\n    }\n    return null;\n  }),\n\n  wordlist: computed('continueVisited', function () {\n    const wordlistId = this.get('continueVisited.attributes.wordlist_id');\n\n    if (wordlistId) {\n      return createPromiseObject(\n        this.get('store').findRecord('entity', wordlistId)\n      );\n    }\n    return null;\n  }),\n\n  section: computed('continueVisited', function () {\n    const sectionId = this.get('continueVisited.attributes.section_id');\n\n    if (sectionId) {\n      return createPromiseObject(\n        this.get('store').findRecord('entity', sectionId)\n      );\n    }\n    return null;\n  }),\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n\n    if (this.get('continueVisited')) {\n      const imageId = this.get('continueVisited').attributes.image;\n      if (imageId) {\n        this.get('store')\n          .findRecord('material', imageId)\n          .then((image) => {\n            if (!this.get('isDestroying') || !this.get('isDestroyed')) {\n              this.set(\n                'imageSrc',\n                imageSource(image.imageUrl, {\n                  embed: true,\n                  w: 96,\n                  h: 96,\n                })\n              );\n            }\n          });\n      } else {\n        this.set(\n          'imageSrc',\n          imageSource(\n            this._getDefaultImage(\n              this.get('continueVisited').attributes.default_image_name\n            ).path,\n            {\n              embed: true,\n              w: 96,\n              h: 96,\n            }\n          )\n        );\n      }\n    }\n  },\n\n  trackClick: function () {\n    trackContentEvent('Fortsätt');\n  },\n\n  imageThumbnail: computed('imageUrl', function () {\n    const image = this.get('imageSrc');\n\n    return image && htmlSafe(`background-image: url(${image})`);\n  }),\n\n  _getDefaultImage(type) {\n    const DEFAULT_IMAGES = [\n      { type: 'archives', path: '/assets/images/defaults/archives.svg' },\n      { type: 'areas', path: '/assets/images/defaults/areas.svg' },\n      {\n        type: 'contents-chapter',\n        path: '/assets/images/defaults/contents-chapter.svg',\n      },\n      {\n        type: 'contents-story',\n        path: '/assets/images/defaults/contents-story.svg',\n      },\n      {\n        type: 'contents-workflow',\n        path: '/assets/images/defaults/contents-workflow.svg',\n      },\n      {\n        type: 'interactives',\n        path: '/assets/images/defaults/interactives.svg',\n      },\n      {\n        type: 'image-missing',\n        path: '/assets/images/defaults/image-missing.svg',\n      },\n    ];\n\n    return (\n      DEFAULT_IMAGES.findBy('type', type) || {\n        path: '/assets/images/defaults/image-missing.svg',\n      }\n    );\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (and this.linkedEntity.isFulfilled this.entity.isFulfilled)}}\\n  <EntityLink\\n    class=\\\"block\\\"\\n    @entity={{this.linkedEntity}}\\n    @section={{if (or this.assignment this.wordlist) this.entity this.section}}\\n    {{on \\\"click\\\" this.trackClick}}\\n    variant=\\\"inherit\\\"\\n  >\\n    <div class=\\\"flex continue-wrapper\\\">\\n      {{#if this.imageSrc}}\\n        {{! template-lint-disable no-inline-styles }}\\n        <div\\n          class=\\\"continue-wrapper--thumbnail\\\"\\n          style={{this.imageThumbnail}}\\n        ></div>\\n        {{! template-lint-enable no-inline-styles }}\\n      {{/if}}\\n\\n      <div class=\\\"continue-wrapper--title flex flex-center\\\">\\n        <div\\n          class=\\\"text-quarternary\\\"\\n        >{{this.continueVisited.attributes.title}}</div>\\n      </div>\\n\\n      <div\\n        class=\\\"continue-wrapper--arrow flex flex-center justify-flex-end flex-auto ml1\\\"\\n      >\\n        {{#if (eq this.entity.selectedMaterial.type \\\"links\\\")}}\\n          <DcIcon @name=\\\"external\\\" class=\\\"mr1\\\" />\\n        {{else if (eq this.entity.selectedMaterial.type \\\"attachments\\\")}}\\n          <DcIcon @name=\\\"cloud-download\\\" class=\\\"mr1\\\" />\\n        {{/if}}\\n        <DcIcon @name=\\\"tail-right\\\" @size=\\\"sm\\\" class=\\\"ml1\\\" />\\n      </div>\\n    </div>\\n  </EntityLink>\\n{{/if}}\\n', { moduleName: 'babel/components/continue-content/template.hbs' });\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\n\nexport default Component.extend({\n  cookieConsent: service(),\n\n  router: service(),\n\n  showMessage: true,\n\n  init() {\n    this._super(...arguments);\n\n    if (this.get('router').get('currentRouteName') === 'nodes') {\n      this.set('showMessage', false);\n    } else {\n      this.set('showMessage', true);\n    }\n  },\n\n  actions: {\n    acceptCookies() {\n      this.cookieConsent.accept();\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (and this.showMessage (not this.cookieConsent.accepted))}}\\n\\n  {{#x-modal\\n    fillOnSmallBreakpoint=false\\n    locked=true\\n    size=(hash width=\\\"small\\\" height=\\\"auto\\\")\\n    as |modal|\\n  }}\\n\\n    {{#modal.content class=\\\"p2 text-center\\\"}}\\n\\n      <div class=\\\"text-secondary mb1\\\">\\n        {{t \\\"components.cookieMessage.title\\\"}}\\n      </div>\\n\\n      <div class=\\\"mb1\\\">{{t \\\"components.cookieMessage.info\\\"}}</div>\\n\\n      <div class=\\\"mb2\\\">\\n        <a\\n          href=\\\"https://www.nok.se/juridisk-information/Kakor-cookies/\\\"\\n          target=\\\"_blank\\\"\\n          class=\\\"ui-link ui-link--link--default no-outline\\\"\\n        >{{t \\\"components.cookieMessage.about\\\"}}</a>\\n      </div>\\n\\n      <div class=\\\"text-center\\\">\\n\\n        {{#ui-button variant=\\\"error\\\" onClick=(action \\\"acceptCookies\\\")}}\\n\\n          {{t \\\"components.cookieMessage.accept\\\"}}\\n\\n        {{/ui-button}}\\n\\n      </div>\\n\\n    {{/modal.content}}\\n\\n  {{/x-modal}}\\n\\n{{/if}}', { moduleName: 'babel/components/cookie-message/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"flex flex-center\\\" ...attributes>\\n  <DcIcon @name=\\\"countdown\\\" class=\\\"nr1\\\" />\\n  <div class=\\\"text-ui countdown-timer\\\">{{this.timer}}\\n    {{t \\\"components.countdownTimer.minutesShort\\\"}}</div>\\n</div>\", {\"contents\":\"<div class=\\\"flex flex-center\\\" ...attributes>\\n  <DcIcon @name=\\\"countdown\\\" class=\\\"nr1\\\" />\\n  <div class=\\\"text-ui countdown-timer\\\">{{this.timer}}\\n    {{t \\\"components.countdownTimer.minutesShort\\\"}}</div>\\n</div>\",\"moduleName\":\"babel/components/countdown-timer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/countdown-timer/index.hbs\"}});\nimport { later } from '@ember/runloop';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nexport default class CountdownTimerComponent extends Component {\n  /**\n   * Arguments:\n   * from (date)\n   * minutes (number)\n   * onFinish (function)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    const minutes = Number(this.args.minutes);\n    const start = this._getTime(this.args.from);\n\n    this.stop = start + minutes * 60;\n    this.secondsLeft = stop - start;\n\n    if (config.environment !== 'test') {\n      later(this, this._step, this.interval);\n    }\n  }\n\n  @tracked secondsLeft = 0;\n\n  @tracked stop = null;\n\n  interval = 100;\n\n  get timer() {\n    const minutes = Math.floor(this.secondsLeft / 60);\n    const seconds = (this.secondsLeft % 60).toString().padStart(2, '0');\n\n    return `${minutes}:${seconds}`;\n  }\n\n  _getTime(time) {\n    const t = time && new Date(time);\n\n    return t instanceof Date && !isNaN(t.valueOf())\n      ? Math.floor(t.getTime() / 1000)\n      : Math.floor(new Date().getTime() / 1000);\n  }\n\n  _step() {\n    this.secondsLeft = this.stop - this._getTime();\n\n    if (this.secondsLeft > 0) {\n      later(this, this._step, this.interval);\n    } else {\n      this.args.onFinish?.();\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport { throttle } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CourseAdaptSettingsComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   */\n\n  @service intl;\n\n  @service ajax;\n\n  @cached\n  get settingProxy() {\n    const promise = resolve(this.args.course).then((course) => course.setting);\n\n    return load(promise, this);\n  }\n\n  get setting() {\n    return this.settingProxy.isResolved ? this.settingProxy.value : null;\n  }\n\n  @tracked viewExternalProducts = false;\n\n  get overviewSortSetting() {\n    let settings = ['shortcuts', 'missions'];\n\n    return settings.map((setting) => {\n      const label = this.intl.t(\n        `components.courseAdaptSettings.sort.${setting}`\n      );\n      return { label: label, value: setting };\n    });\n  }\n\n  get hideDiagnosis() {\n    return !this.setting?.showDiagnosis;\n  }\n\n  get hideKey() {\n    return !this.setting?.showKey;\n  }\n\n  get externalProducts() {\n    return this.args.course.books.filter((book) =>\n      ['books_external', 'books_junior', 'books_pdf'].includes(book.type)\n    );\n  }\n\n  @action\n  setDiagnosis(val) {\n    if (!this.setting) return;\n    this.setting.showDiagnosis = !val;\n    this.setting.save();\n  }\n\n  @action\n  setKey(val) {\n    if (!this.setting) return;\n    this.setting.showKey = !val;\n    this.setting.save();\n  }\n\n  @action\n  saveSettings() {\n    throttle(() => this.setting.save(), 1000, false);\n  }\n\n  @action\n  handleImageUpload(file) {\n    return this.ajax\n      .request(`${config.endpoint}/api/v1/meta/settings/upload-url`, true, {\n        type: 'POST',\n        data: {\n          id: this.args.course.id,\n          name: this.args.course.name,\n          contentType: file.type,\n        },\n      })\n      .then((response) => {\n        return this.ajax\n          .request(response.url, false, {\n            type: 'PUT',\n            contentType: file.type,\n            processData: false,\n            data: file,\n          })\n          .then(() => {\n            this.args.course.set('imageUploaded', true);\n            return this.args.course.save();\n          })\n          .then(() => {\n            return this.setting.save();\n          });\n      });\n  }\n\n  @action\n  removeImage() {\n    this.args.course.set('imageUploaded', false);\n    return this.args.course.save();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-column\\\">\\n  {{#if (and @course.hasExternalBooks @course.hasInternalBooks)}}\\n    <div class=\\\"external-internal-message flex p1 nt1\\\">\\n      {{t \\\"components.courseAdaptSettings.hasInternalAndExternalProducts\\\"}}\\n      <div>\\n        {{#let (generate-id \\\"view-books\\\") as |id|}}\\n          <UiButton\\n            id={{id}}\\n            @appearance=\\\"link\\\"\\n            @onClick={{set this \\\"viewExternalProducts\\\" true}}\\n          >\\n            {{t \\\"components.courseAdaptSettings.showProducts\\\"}}\\n          </UiButton>\\n          {{#if this.viewExternalProducts}}\\n            <XPopup\\n              @opacity={{0}}\\n              @for={{id}}\\n              @onClose={{set this \\\"viewExternalProducts\\\" false}}\\n            >\\n              <div class=\\\"p1 text-bold\\\">\\n                {{#each this.externalProducts as |book|}}\\n                  <div class=\\\"n1\\\">\\n                    {{book.title}}\\n                  </div>\\n                {{/each}}\\n              </div>\\n            </XPopup>\\n          {{/if}}\\n        {{/let}}\\n      </div>\\n    </div>\\n  {{/if}}\\n  <UiLabel class=\\\"mt1\\\">\\n    {{t \\\"components.courseAdaptSettings.coverImage\\\"}}\\n  </UiLabel>\\n  <div class=\\\"flex flex-center\\\">\\n    <XUploadButton @variant=\\\"link\\\" @onChange={{this.handleImageUpload}}>\\n      <div class=\\\"course-adapt-settings-image-container\\\">\\n        {{#if @course.coverImage}}\\n          <XImage\\n            @source={{image-source @course.coverImage}}\\n            width=\\\"210px\\\"\\n            height=\\\"90px\\\"\\n          />\\n        {{else}}\\n          <DcIcon @name=\\\"image\\\" />\\n        {{/if}}\\n      </div>\\n    </XUploadButton>\\n\\n    <XUploadButton\\n      class=\\\"nl1 p1 text-color-default\\\"\\n      @variant=\\\"link\\\"\\n      @onChange={{this.handleImageUpload}}\\n    >\\n      {{#if @course.coverImage}}\\n        {{t \\\"components.courseAdaptSettings.changeImageButtonText\\\"}}\\n      {{else}}\\n        {{t \\\"components.courseAdaptSettings.chooseImageButtonText\\\"}}\\n      {{/if}}\\n    </XUploadButton>\\n\\n    {{#if @course.imageUploaded}}\\n      <UiButton\\n        class=\\\"nl1 p1 text-color-error\\\"\\n        @variant=\\\"link\\\"\\n        @onClick={{this.removeImage}}\\n      >\\n        {{t \\\"components.courseAdaptSettings.removeImageButtonText\\\"}}\\n      </UiButton>\\n    {{/if}}\\n  </div>\\n\\n  {{#if @course.hasInternalBooks}}\\n    <div class=\\\"mt1\\\">\\n      <UiLabel>\\n        {{t \\\"components.courseAdaptSettings.overviewSortSetting\\\"}}\\n      </UiLabel>\\n\\n      <UiRadioButtonGroup\\n        @groupValue={{@course.overviewDisplayFirst}}\\n        @options={{this.overviewSortSetting}}\\n        @stretch={{true}}\\n        @onChange={{this.saveSettings}}\\n      />\\n    </div>\\n\\n    <div class=\\\"flex flex-column mt1\\\">\\n      <UiLabel class=\\\"flex-shrink\\\">\\n        {{t \\\"components.courseAdaptSettings.hideLabel\\\"}}\\n      </UiLabel>\\n\\n      <XCheckbox\\n        @checked={{this.hideKey}}\\n        @onChange={{this.setKey}}\\n        @disabled={{@course.setting.isSaving}}\\n        @twoWay={{false}}\\n      >\\n        {{t \\\"components.courseAdaptSettings.hideKey\\\"}}\\n      </XCheckbox>\\n\\n      <XCheckbox\\n        class=\\\"nt1\\\"\\n        @checked={{this.hideDiagnosis}}\\n        @onChange={{this.setDiagnosis}}\\n        @disabled={{@course.setting.isSaving}}\\n        @twoWay={{false}}\\n      >\\n        <:default>\\n          {{t \\\"components.courseAdaptSettings.hideDiagnosis\\\"}}\\n        </:default>\\n        <:subLabel>\\n          {{t \\\"components.courseAdaptSettings.hideDiagnosisSubLabel\\\"}}\\n        </:subLabel>\\n      </XCheckbox>\\n    </div>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/course-adapt-settings/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-audit-index-card-component\\\" ...attributes {{on \\\"click\\\" this.handleClick}}>\\n  {{#let (component (if @disabled \\\"x-empty\\\" \\\"ui-link\\\")) as |Component|}}\\n    <Component\\n      @route={{@target}}\\n      @query={{@queryParams}}\\n      class=\\\"flex flex-stretch\\\"\\n      @appearance=\\\"none\\\"\\n    >\\n      <DcCard class=\\\"course-audit-index-card\\\" @effects={{not @disabled}}>\\n        <div class=\\\"course-audit-index-card-image-wrap\\\">\\n          <img src={{@image}} class=\\\"mr1\\\" alt=\\\"\\\" role=\\\"presentation\\\" />\\n\\n          {{#if @notification}}\\n            <XBadge @size=\\\"small\\\">{{@notification}}</XBadge>\\n          {{/if}}\\n        </div>\\n\\n        <div class=\\\"course-audit-index-card-text-wrap\\\">\\n          <div\\n            class=\\\"text-secondary mb1\\n              {{if @disabled 'text-muted' 'text-color-default'}}\\\"\\n          >\\n            {{~@title~}}\\n          </div>\\n\\n          <div class=\\\"mb2\\\">{{@description}}</div>\\n\\n          {{#if @disabled}}\\n            <div class=\\\"text-ui text-muted\\\">{{@disabledText}}</div>\\n          {{/if}}\\n        </div>\\n      </DcCard>\\n    </Component>\\n  {{/let}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"course-audit-index-card-component\\\" ...attributes {{on \\\"click\\\" this.handleClick}}>\\n  {{#let (component (if @disabled \\\"x-empty\\\" \\\"ui-link\\\")) as |Component|}}\\n    <Component\\n      @route={{@target}}\\n      @query={{@queryParams}}\\n      class=\\\"flex flex-stretch\\\"\\n      @appearance=\\\"none\\\"\\n    >\\n      <DcCard class=\\\"course-audit-index-card\\\" @effects={{not @disabled}}>\\n        <div class=\\\"course-audit-index-card-image-wrap\\\">\\n          <img src={{@image}} class=\\\"mr1\\\" alt=\\\"\\\" role=\\\"presentation\\\" />\\n\\n          {{#if @notification}}\\n            <XBadge @size=\\\"small\\\">{{@notification}}</XBadge>\\n          {{/if}}\\n        </div>\\n\\n        <div class=\\\"course-audit-index-card-text-wrap\\\">\\n          <div\\n            class=\\\"text-secondary mb1\\n              {{if @disabled 'text-muted' 'text-color-default'}}\\\"\\n          >\\n            {{~@title~}}\\n          </div>\\n\\n          <div class=\\\"mb2\\\">{{@description}}</div>\\n\\n          {{#if @disabled}}\\n            <div class=\\\"text-ui text-muted\\\">{{@disabledText}}</div>\\n          {{/if}}\\n        </div>\\n      </DcCard>\\n    </Component>\\n  {{/let}}\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit-index-card/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit-index-card/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class CourseAuditIndexCardComponent extends Component {\n  @action\n  handleClick(event) {\n    if (this.args.disabled) {\n      return;\n    }\n    const target = event?.target;\n    const anchor =\n      target?.closest?.('a') || target?.parentElement?.closest?.('a');\n    if (anchor) {\n      this.args.onClick?.();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-audit-bottombar\\\">\\n  {{#if @versions}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @variant=\\\"inherit\\\"\\n      @id=\\\"versions-btn\\\"\\n      class=\\\"pt1 pb1 pl1\\\"\\n      @onClick={{fn (mut this.popoverOpen) true}}\\n    >\\n      <div class=\\\"flex flex-column\\\">\\n        <div class=\\\"flex flex-center\\\">\\n          <AnswerStatusIcon\\n            @status={{@selectedVersion.computedStatus}}\\n            class=\\\"nr1\\\"\\n          />\\n\\n          <span class=\\\"text-small text-bold\\\">\\n            {{t\\n              (concat\\n                \\\"components.courseAudit.bottombar.status.\\\"\\n                (camelize this.status)\\n              )\\n            }}\\n          </span>\\n        </div>\\n\\n        <div class=\\\"text-small text-color-default text-base ml2\\\">\\n          {{t\\n            \\\"components.courseAudit.bottombar.version\\\"\\n            version=(or @selectedVersion.version @versions.length)\\n          }}\\n        </div>\\n      </div>\\n    </UiButton>\\n\\n    {{#if this.popoverOpen}}\\n      <XPopup\\n        @title=\\\"Versioner\\\"\\n        @for=\\\"versions-btn\\\"\\n        @onClose={{fn (mut this.popoverOpen) false}}\\n        @placement=\\\"top\\\"\\n      >\\n        <CourseAudit::VersionPopup\\n          @versions={{@versions}}\\n          @selectedVersion={{@selectedVersion}}\\n          @changeVersion={{this.changeVersion}}\\n        />\\n      </XPopup>\\n    {{/if}}\\n  {{else}}\\n    <div class=\\\"flex flex-center p1\\\">\\n      <AnswerStatusIcon\\n        @status={{@selectedVersion.computedStatus}}\\n        class=\\\"nr1\\\"\\n      />\\n\\n      <span class=\\\"text-small text-bold {{this.status}}-text\\\">\\n        {{t\\n          (concat\\n            \\\"components.courseAudit.bottombar.status.\\\" (camelize this.status)\\n          )\\n        }}\\n      </span>\\n    </div>\\n  {{/if}}\\n\\n  <div class=\\\"flex\\\">\\n    {{#if this.showAuditKey}}\\n      {{#let (generate-id \\\"key-button\\\") as |keyButtonId|}}\\n        <div class=\\\"flex flex-center p1 br1\\\">\\n          <UiButton\\n            @id={{keyButtonId}}\\n            @appearance=\\\"link\\\"\\n            class={{concat\\n              \\\"bottombar-button-key\\\"\\n              (if @showKey \\\" bottombar-button-key--active\\\")\\n            }}\\n            @onClick={{@toggleKey}}\\n          >\\n            <DcIcon @name=\\\"key\\\" />\\n          </UiButton>\\n\\n          <XTooltip @for={{keyButtonId}}>\\n            {{this.keyLabel}}\\n          </XTooltip>\\n        </div>\\n      {{/let}}\\n    {{/if}}\\n\\n    <div class=\\\"audit-bottombar-actions py1 px1\\\">\\n      {{#if @showNextButton}}\\n        <UiButton\\n          @variant=\\\"alternative\\\"\\n          @appearance=\\\"button\\\"\\n          class=\\\"flex flex-center\\\"\\n          @onClick={{fn this.setStatus @selectedVersion.status}}\\n        >\\n          <div class=\\\"text-small text-bold\\\">\\n            {{t \\\"components.courseAudit.bottombar.edit\\\"}}\\n          </div>\\n        </UiButton>\\n\\n        <UiButton\\n          @appearance=\\\"button\\\"\\n          class=\\\"flex flex-center\\\"\\n          @onClick={{this.handleNextStudentClick}}\\n        >\\n          <div class=\\\"text-small text-bold nr1\\\">\\n            {{t \\\"components.courseAudit.bottombar.nextStudent\\\"}}\\n          </div>\\n\\n          <DcIcon @name=\\\"tail-right\\\" />\\n        </UiButton>\\n      {{else}}\\n        {{#each this.teacherResponses as |response|}}\\n          <UiButton\\n            @variant={{if\\n              (eq response.status this.status)\\n              response.variant\\n              \\\"alternative\\\"\\n            }}\\n            @appearance=\\\"button\\\"\\n            class=\\\"flex flex-center\\\"\\n            @disabled={{not this.teacherCanRespond}}\\n            @onClick={{fn this.setStatus response.status}}\\n          >\\n            <AnswerStatusIcon\\n              @status={{response.status}}\\n              class={{if (eq response.status this.status) \\\"status-icon--white\\\"}}\\n            />\\n            <div\\n              class=\\\"hide-lg nl1 text-small\\n                {{if (not-eq response.status this.status) 'text-color-default'}}\\n                text-bold\\\"\\n            >\\n              {{t\\n                (concat\\n                  \\\"components.courseAudit.bottombar.status.\\\"\\n                  (camelize response.status)\\n                )\\n              }}\\n            </div>\\n          </UiButton>\\n        {{/each}}\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\\n\", {\"contents\":\"<div class=\\\"course-audit-bottombar\\\">\\n  {{#if @versions}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @variant=\\\"inherit\\\"\\n      @id=\\\"versions-btn\\\"\\n      class=\\\"pt1 pb1 pl1\\\"\\n      @onClick={{fn (mut this.popoverOpen) true}}\\n    >\\n      <div class=\\\"flex flex-column\\\">\\n        <div class=\\\"flex flex-center\\\">\\n          <AnswerStatusIcon\\n            @status={{@selectedVersion.computedStatus}}\\n            class=\\\"nr1\\\"\\n          />\\n\\n          <span class=\\\"text-small text-bold\\\">\\n            {{t\\n              (concat\\n                \\\"components.courseAudit.bottombar.status.\\\"\\n                (camelize this.status)\\n              )\\n            }}\\n          </span>\\n        </div>\\n\\n        <div class=\\\"text-small text-color-default text-base ml2\\\">\\n          {{t\\n            \\\"components.courseAudit.bottombar.version\\\"\\n            version=(or @selectedVersion.version @versions.length)\\n          }}\\n        </div>\\n      </div>\\n    </UiButton>\\n\\n    {{#if this.popoverOpen}}\\n      <XPopup\\n        @title=\\\"Versioner\\\"\\n        @for=\\\"versions-btn\\\"\\n        @onClose={{fn (mut this.popoverOpen) false}}\\n        @placement=\\\"top\\\"\\n      >\\n        <CourseAudit::VersionPopup\\n          @versions={{@versions}}\\n          @selectedVersion={{@selectedVersion}}\\n          @changeVersion={{this.changeVersion}}\\n        />\\n      </XPopup>\\n    {{/if}}\\n  {{else}}\\n    <div class=\\\"flex flex-center p1\\\">\\n      <AnswerStatusIcon\\n        @status={{@selectedVersion.computedStatus}}\\n        class=\\\"nr1\\\"\\n      />\\n\\n      <span class=\\\"text-small text-bold {{this.status}}-text\\\">\\n        {{t\\n          (concat\\n            \\\"components.courseAudit.bottombar.status.\\\" (camelize this.status)\\n          )\\n        }}\\n      </span>\\n    </div>\\n  {{/if}}\\n\\n  <div class=\\\"flex\\\">\\n    {{#if this.showAuditKey}}\\n      {{#let (generate-id \\\"key-button\\\") as |keyButtonId|}}\\n        <div class=\\\"flex flex-center p1 br1\\\">\\n          <UiButton\\n            @id={{keyButtonId}}\\n            @appearance=\\\"link\\\"\\n            class={{concat\\n              \\\"bottombar-button-key\\\"\\n              (if @showKey \\\" bottombar-button-key--active\\\")\\n            }}\\n            @onClick={{@toggleKey}}\\n          >\\n            <DcIcon @name=\\\"key\\\" />\\n          </UiButton>\\n\\n          <XTooltip @for={{keyButtonId}}>\\n            {{this.keyLabel}}\\n          </XTooltip>\\n        </div>\\n      {{/let}}\\n    {{/if}}\\n\\n    <div class=\\\"audit-bottombar-actions py1 px1\\\">\\n      {{#if @showNextButton}}\\n        <UiButton\\n          @variant=\\\"alternative\\\"\\n          @appearance=\\\"button\\\"\\n          class=\\\"flex flex-center\\\"\\n          @onClick={{fn this.setStatus @selectedVersion.status}}\\n        >\\n          <div class=\\\"text-small text-bold\\\">\\n            {{t \\\"components.courseAudit.bottombar.edit\\\"}}\\n          </div>\\n        </UiButton>\\n\\n        <UiButton\\n          @appearance=\\\"button\\\"\\n          class=\\\"flex flex-center\\\"\\n          @onClick={{this.handleNextStudentClick}}\\n        >\\n          <div class=\\\"text-small text-bold nr1\\\">\\n            {{t \\\"components.courseAudit.bottombar.nextStudent\\\"}}\\n          </div>\\n\\n          <DcIcon @name=\\\"tail-right\\\" />\\n        </UiButton>\\n      {{else}}\\n        {{#each this.teacherResponses as |response|}}\\n          <UiButton\\n            @variant={{if\\n              (eq response.status this.status)\\n              response.variant\\n              \\\"alternative\\\"\\n            }}\\n            @appearance=\\\"button\\\"\\n            class=\\\"flex flex-center\\\"\\n            @disabled={{not this.teacherCanRespond}}\\n            @onClick={{fn this.setStatus response.status}}\\n          >\\n            <AnswerStatusIcon\\n              @status={{response.status}}\\n              class={{if (eq response.status this.status) \\\"status-icon--white\\\"}}\\n            />\\n            <div\\n              class=\\\"hide-lg nl1 text-small\\n                {{if (not-eq response.status this.status) 'text-color-default'}}\\n                text-bold\\\"\\n            >\\n              {{t\\n                (concat\\n                  \\\"components.courseAudit.bottombar.status.\\\"\\n                  (camelize response.status)\\n                )\\n              }}\\n            </div>\\n          </UiButton>\\n        {{/each}}\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/bottombar/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/bottombar/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { all } from 'rsvp';\n\nconst STATUS_LABELS = Object.freeze({\n  'teacher-correct': 'Mål uppnått',\n  'teacher-wrong': 'Mål ej uppnått',\n  audited: 'Granskad',\n});\n\nexport default class CourseAuditBottombarComponent extends Component {\n  /**\n   * Arguments:\n   * versions (array)\n   * selectedVersion (object)\n   * exercise (object)\n   * toggleKey (function)\n   * showKey (bool)\n   * changeVersion (function)\n   * showNextButton (bool)\n   * changeToNextStudent (function)\n   */\n\n  @service intl;\n\n  @tracked popoverOpen = false;\n\n  get teacherResponses() {\n    return [\n      { status: 'teacher-wrong', variant: 'error' },\n      { status: 'teacher-correct', variant: 'success' },\n      { status: 'audited', variant: 'default' },\n    ];\n  }\n\n  get hasAuditKey() {\n    const exercise = this.args.exercise;\n\n    if (exercise?.isTeacherAssignment) {\n      return false;\n    }\n\n    return exercise?.body?.exercise?.assignments?.find((assignment) => {\n      if (exercise.type === 'assignments' && assignment.template === 'matrix') {\n        return assignment?.content?.objects?.find((item) =>\n          item?.alternatives?.find(\n            (alternative) => alternative.value && alternative.value !== ''\n          )\n        );\n      }\n\n      return (\n        assignment?.settings?.solution ||\n        assignment?.content?.objects?.find((item) => item?.alternatives)\n      );\n    })\n      ? true\n      : false;\n  }\n\n  get showAuditKey() {\n    // Dont show if its teacher corrected and no solution exists.\n    if (\n      ['assignments', 'studies'].includes(this.args.exercise?.type) &&\n      !this.hasAuditKey\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  get keyLabel() {\n    const type = this.args.exercise?.type;\n    if (this.args.showKey) {\n      if (type === 'exercises') {\n        return this.intl.t('components.courseAudit.bottombar.hideKeyTooltip');\n      } else {\n        return this.intl.t(\n          'components.courseAudit.bottombar.hideSolutionTooltip'\n        );\n      }\n    } else {\n      if (type === 'exercises') {\n        return this.intl.t('components.courseAudit.bottombar.keyTooltip');\n      } else {\n        return this.intl.t('components.courseAudit.bottombar.solutionTooltip');\n      }\n    }\n  }\n\n  get status() {\n    return this.args.selectedVersion?.computedStatus || 'not-started';\n  }\n\n  get teacherCanRespond() {\n    const exercise = this.args.exercise;\n\n    if (\n      !['assignments', 'studies'].includes(exercise?.type) &&\n      !exercise?.isTeacherAssignment\n    ) {\n      return false;\n    }\n\n    if (['not-started', 'started'].includes(this.status)) {\n      return false;\n    }\n\n    const versions = this.args.versions;\n\n    if (!versions) return false;\n\n    return versions.find(\n      (item) => item.version > this.args.selectedVersion?.version\n    )\n      ? false\n      : true;\n  }\n\n  @action\n  async setStatus(status) {\n    if (!this.teacherCanRespond) {\n      return;\n    }\n\n    const selectedVersion = this.args.selectedVersion;\n    const isUndoStatusChange = selectedVersion.status === status;\n    const statusLabel = STATUS_LABELS[status];\n\n    if (statusLabel && !isUndoStatusChange) {\n      trackAuditEvent('Bedömning', statusLabel);\n    }\n\n    const originalAnswer = await selectedVersion.originalAnswer;\n    const newStatus = selectedVersion.status === status ? 'turned-in' : status;\n    const answersToUpdate = [selectedVersion];\n\n    if (originalAnswer && originalAnswer.status === selectedVersion.status) {\n      answersToUpdate.push(originalAnswer);\n    }\n\n    await all(\n      answersToUpdate.map(async (answer) => {\n        const currStatus = answer.status;\n        const reloaded = await answer.reload();\n\n        if (reloaded.status !== currStatus) return;\n\n        reloaded.status = newStatus;\n        await reloaded.save();\n      })\n    );\n  }\n\n  @action\n  changeVersion(version) {\n    this.popoverOpen = false;\n    this.args.changeVersion?.(version);\n  }\n\n  @action\n  handleNextStudentClick() {\n    trackAuditEvent('Nästa elev');\n\n    this.args.changeToNextStudent?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"course-audit-collection-exercise\\\"\\n  {{did-update this.setVersion this.versions}}\\n  ...attributes\\n>\\n  <ExerciseView\\n    class=\\\"audit-exercise pb1\\\"\\n    @index={{this.index}}\\n    @exercise={{@exercise}}\\n    @answer={{this.selectedVersion}}\\n    @canToggleQuestion={{true}}\\n    @hideQuestion={{@hideQuestion}}\\n    @toggleQuestion={{@toggleQuestion}}\\n    @emptyAnswer={{not @answer}}\\n    @disabled={{true}}\\n    @hideMeta={{true}}\\n    @canStartConversation={{true}}\\n    @showKey={{@showKey}}\\n    @toggleKey={{@toggleKey}}\\n    @answerUser={{@answerUser}}\\n    as |ExerciseComponent|\\n  >\\n    <ExerciseComponent.topbar>\\n      <ExerciseTopbar\\n        @target={{ExerciseComponent.target}}\\n        @user={{@answerUser}}\\n        @openInNewTab={{@openInNewTab}}\\n      />\\n      {{#unless this.selectedVersion}}\\n        <XAlert class=\\\"mt1 mx1\\\">\\n          {{t \\\"components.courseAudit.collection.exercise.noAnswers\\\"}}\\n        </XAlert>\\n      {{/unless}}\\n    </ExerciseComponent.topbar>\\n\\n    <ExerciseComponent.bottombar>\\n      <CourseAudit::Bottombar\\n        @versions={{this.versions}}\\n        @selectedVersion={{this.selectedVersion}}\\n        @changeVersion={{this.changeVersion}}\\n        @exercise={{@exercise}}\\n        @showKey={{@showKey}}\\n        @toggleKey={{@toggleKey}}\\n        @showNextButton={{this.showNextButton}}\\n        @changeToNextStudent={{@changeToNextStudent}}\\n      />\\n    </ExerciseComponent.bottombar>\\n  </ExerciseView>\\n</div>\\n\", {\"contents\":\"<div\\n  class=\\\"course-audit-collection-exercise\\\"\\n  {{did-update this.setVersion this.versions}}\\n  ...attributes\\n>\\n  <ExerciseView\\n    class=\\\"audit-exercise pb1\\\"\\n    @index={{this.index}}\\n    @exercise={{@exercise}}\\n    @answer={{this.selectedVersion}}\\n    @canToggleQuestion={{true}}\\n    @hideQuestion={{@hideQuestion}}\\n    @toggleQuestion={{@toggleQuestion}}\\n    @emptyAnswer={{not @answer}}\\n    @disabled={{true}}\\n    @hideMeta={{true}}\\n    @canStartConversation={{true}}\\n    @showKey={{@showKey}}\\n    @toggleKey={{@toggleKey}}\\n    @answerUser={{@answerUser}}\\n    as |ExerciseComponent|\\n  >\\n    <ExerciseComponent.topbar>\\n      <ExerciseTopbar\\n        @target={{ExerciseComponent.target}}\\n        @user={{@answerUser}}\\n        @openInNewTab={{@openInNewTab}}\\n      />\\n      {{#unless this.selectedVersion}}\\n        <XAlert class=\\\"mt1 mx1\\\">\\n          {{t \\\"components.courseAudit.collection.exercise.noAnswers\\\"}}\\n        </XAlert>\\n      {{/unless}}\\n    </ExerciseComponent.topbar>\\n\\n    <ExerciseComponent.bottombar>\\n      <CourseAudit::Bottombar\\n        @versions={{this.versions}}\\n        @selectedVersion={{this.selectedVersion}}\\n        @changeVersion={{this.changeVersion}}\\n        @exercise={{@exercise}}\\n        @showKey={{@showKey}}\\n        @toggleKey={{@toggleKey}}\\n        @showNextButton={{this.showNextButton}}\\n        @changeToNextStudent={{@changeToNextStudent}}\\n      />\\n    </ExerciseComponent.bottombar>\\n  </ExerciseView>\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/collection/exercise/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/collection/exercise/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CourseAuditCollectionExerciseComponent extends Component {\n  /**\n   * Arguments:\n   * exercise (object)\n   * answerUser (object)\n   * answer (object)\n   * mode (string)\n   * hasNextButton (bool)\n   * changeStudent (function)\n   * exercises (array)\n   * hideQuestion (bool)\n   * toggleQuestion (function)\n   * showKey (bool)\n   * toggleKey (function)\n   * changeToNextStudent (function)\n   */\n\n  @service session;\n\n  @tracked selectedVersion;\n\n  get index() {\n    return this.args.exercises.indexOf(this.args.exercise) + 1;\n  }\n\n  @cached get originalAnswerProxy() {\n    let promise;\n\n    const answer = this.args.answer;\n\n    if (!answer) {\n      promise = resolve();\n    } else if (answer.belongsTo('originalAnswer').id() === null) {\n      promise = resolve(answer);\n    } else {\n      promise = resolve(answer.originalAnswer);\n    }\n\n    return load(promise, this);\n  }\n\n  get originalAnswer() {\n    return this.originalAnswerProxy.isResolved\n      ? this.originalAnswerProxy.value\n      : null;\n  }\n\n  @cached get versionsProxy() {\n    let promise;\n\n    if (this.originalAnswer) {\n      promise = resolve(this.originalAnswer.versions);\n    }\n\n    return load(promise, this);\n  }\n\n  get versions() {\n    const originalAnswer = this.originalAnswer;\n    const answer = this.args.answer;\n\n    if (originalAnswer) {\n      let versions = this.versionsProxy.isResolved\n        ? this.versionsProxy.value\n        : null;\n\n      if (versions) {\n        versions = versions.slice().sortBy('version').reverse();\n\n        if (answer.id !== originalAnswer.id) {\n          if (\n            versions.indexOf(answer) === -1 &&\n            answer.originalAnswer.id === originalAnswer.id\n          ) {\n            versions.unshift(answer);\n            originalAnswer.hasMany('versions').reload();\n          }\n\n          if (originalAnswer.status === 'started') {\n            versions.unshift(originalAnswer);\n          }\n        }\n\n        return versions;\n      }\n\n      return [answer];\n    }\n\n    return null;\n  }\n\n  get showNextButton() {\n    if (this.args.mode === 'inbox' && this.args.hasNextButton) {\n      const status = this.selectedVersion?.status;\n      const teacherStatuses = ['teacher-correct', 'teacher-wrong', 'audited'];\n\n      if (teacherStatuses.indexOf(status) !== -1) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  @action setVersion() {\n    this.args.toggleKey?.(false);\n\n    const versions = this.versions;\n    const answer = this.args.answer;\n\n    if (!versions?.includes(answer) && versions?.length > 0) {\n      this.selectedVersion = versions.objectAt(0);\n    } else if (\n      this.args.mode === 'inbox-single' &&\n      versions?.length > 0 &&\n      versions?.firstObject?.status === 'started'\n    ) {\n      this.selectedVersion = versions.objectAt(0);\n    } else {\n      this.selectedVersion = answer;\n    }\n  }\n\n  @action changeVersion(version) {\n    this.args.toggleKey?.(false);\n    this.selectedVersion = version;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-audit-collection\\\">\\n  <XTab\\n    class={{if\\n      this.singleViewMode\\n      \\\"course-audit-tab course-audit-tab--inbox\\\"\\n      \\\"course-audit-tab\\\"\\n    }}\\n    @value={{this.mode}}\\n    @onChange={{this.handleModeChange}}\\n    as |modeTab|\\n  >\\n    {{#if (eq this.mode \\\"inbox\\\")}}\\n      <modeTab.pane @value=\\\"inbox\\\">\\n        <div class=\\\"audit-tab audit-tab--inbox\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n            />\\n          </div>\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @showStatus={{true}}\\n            @answers={{this.exerciseAnswers}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n    {{else if (or (eq this.mode \\\"inbox-single\\\") (eq this.mode \\\"comments\\\"))}}\\n      <modeTab.pane @value={{this.mode}}>\\n        <CourseAudit::Collection::Exercise\\n          class=\\\"audit-exercise-container\\\"\\n          @exercise={{this.exercise}}\\n          @answerUser={{this.answerUser}}\\n          @answer={{this.answer}}\\n          @mode={{this.mode}}\\n          @hasNextButton={{this.hasNextButton}}\\n          @changeStudent={{this.changeToNextStudent}}\\n          @exercises={{this.exercises}}\\n          @hideQuestion={{this.hideQuestion}}\\n          @toggleQuestion={{this.toggleQuestion}}\\n          @showKey={{this.showKey}}\\n          @toggleKey={{this.toggleKey}}\\n          @changeToNextStudent={{this.changeToNextStudent}}\\n          @openInNewTab={{@openInNewTab}}\\n        />\\n      </modeTab.pane>\\n    {{else}}\\n      <modeTab.pane\\n        @value=\\\"assignments\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"assignments\\\"\\n          label=(t \\\"components.courseAudit.collection.assignments\\\")\\n        }}\\n      >\\n        <div class=\\\"audit-tab\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.exerciseOptions}}\\n              @value={{this.selectedExercise}}\\n              @stretch={{true}}\\n              @onChange={{this.selectExercise}}\\n              class=\\\"mr1\\\"\\n            />\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n            />\\n          </div>\\n\\n          <CollectionExerciseIndex\\n            class=\\\"audit-assignments\\\"\\n            @collection={{@collection}}\\n            @exercises={{this.exercises}}\\n            @activeExercise={{this.exercise}}\\n            @onExerciseChange={{this.changeExercise}}\\n            @answers={{@answers}}\\n            @showStatus={{false}}\\n            @showNumAnswers={{true}}\\n            @useOriginalAnswer={{false}}\\n            @routed={{false}}\\n          />\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @showStatus={{true}}\\n            @answers={{this.exerciseAnswers}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n\\n      <modeTab.pane\\n        @value=\\\"students\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"account\\\"\\n          label=(t \\\"components.courseAudit.collection.students\\\")\\n        }}\\n      >\\n        <div class=\\\"audit-tab\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n              class=\\\"mr1\\\"\\n            />\\n\\n            <XSelect\\n              @items={{this.exerciseOptions}}\\n              @value={{this.selectedExercise}}\\n              @stretch={{true}}\\n              @onChange={{this.selectExercise}}\\n              class=\\\"mr1\\\"\\n            />\\n          </div>\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @answers={{@answers}}\\n            @showNumAnswers={{true}}\\n          />\\n\\n          <CollectionExerciseIndex\\n            class=\\\"audit-assignments\\\"\\n            @collection={{@collection}}\\n            @exercises={{this.exercises}}\\n            @activeExercise={{this.exercise}}\\n            @onExerciseChange={{this.changeExercise}}\\n            @answers={{this.studentsAnswers}}\\n            @useOriginalAnswer={{false}}\\n            @showStatus={{true}}\\n            @routed={{false}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n\\n      <modeTab.pane\\n        @value=\\\"compare\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"ranking\\\"\\n          label=(t \\\"components.courseAudit.collection.compare\\\")\\n        }}\\n      >\\n        <div class=\\\"course-audit-compare pt1\\\">\\n          <div class=\\\"audit-compare-students p1\\\">\\n            {{#each this.studentAnswers as |studentAnswer|}}\\n              <div class=\\\"audit-compare-student-name text-quarternary nb1\\\">\\n                {{~studentAnswer.student.showname~}}\\n              </div>\\n\\n              <div class=\\\"mb1 audit-compare-row\\\">\\n                {{#each studentAnswer.exercises as |exerciseAnswer|}}\\n                  <UiButton\\n                    @variant=\\\"alternative\\\"\\n                    @onClick={{fn\\n                      this.openAnswer\\n                      exerciseAnswer.exercise\\n                      studentAnswer.student\\n                    }}\\n                    class={{concat\\n                      \\\"flex-shrink\\\"\\n                      (if\\n                        (not-eq\\n                          exerciseAnswer.index studentAnswer.exercises.length\\n                        )\\n                        \\\" mr1\\\"\\n                      )\\n                    }}\\n                  >\\n                    {{exerciseAnswer.index}}\\n\\n                    <AnswerStatusIcon\\n                      @status={{or\\n                        exerciseAnswer.answer.computedStatus\\n                        \\\"not-started\\\"\\n                      }}\\n                      class=\\\"nl1\\\"\\n                    />\\n                  </UiButton>\\n                {{/each}}\\n              </div>\\n            {{/each}}\\n          </div>\\n        </div>\\n      </modeTab.pane>\\n    {{/if}}\\n  </XTab>\\n</div>\\n\", {\"contents\":\"<div class=\\\"course-audit-collection\\\">\\n  <XTab\\n    class={{if\\n      this.singleViewMode\\n      \\\"course-audit-tab course-audit-tab--inbox\\\"\\n      \\\"course-audit-tab\\\"\\n    }}\\n    @value={{this.mode}}\\n    @onChange={{this.handleModeChange}}\\n    as |modeTab|\\n  >\\n    {{#if (eq this.mode \\\"inbox\\\")}}\\n      <modeTab.pane @value=\\\"inbox\\\">\\n        <div class=\\\"audit-tab audit-tab--inbox\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n            />\\n          </div>\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @showStatus={{true}}\\n            @answers={{this.exerciseAnswers}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n    {{else if (or (eq this.mode \\\"inbox-single\\\") (eq this.mode \\\"comments\\\"))}}\\n      <modeTab.pane @value={{this.mode}}>\\n        <CourseAudit::Collection::Exercise\\n          class=\\\"audit-exercise-container\\\"\\n          @exercise={{this.exercise}}\\n          @answerUser={{this.answerUser}}\\n          @answer={{this.answer}}\\n          @mode={{this.mode}}\\n          @hasNextButton={{this.hasNextButton}}\\n          @changeStudent={{this.changeToNextStudent}}\\n          @exercises={{this.exercises}}\\n          @hideQuestion={{this.hideQuestion}}\\n          @toggleQuestion={{this.toggleQuestion}}\\n          @showKey={{this.showKey}}\\n          @toggleKey={{this.toggleKey}}\\n          @changeToNextStudent={{this.changeToNextStudent}}\\n          @openInNewTab={{@openInNewTab}}\\n        />\\n      </modeTab.pane>\\n    {{else}}\\n      <modeTab.pane\\n        @value=\\\"assignments\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"assignments\\\"\\n          label=(t \\\"components.courseAudit.collection.assignments\\\")\\n        }}\\n      >\\n        <div class=\\\"audit-tab\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.exerciseOptions}}\\n              @value={{this.selectedExercise}}\\n              @stretch={{true}}\\n              @onChange={{this.selectExercise}}\\n              class=\\\"mr1\\\"\\n            />\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n            />\\n          </div>\\n\\n          <CollectionExerciseIndex\\n            class=\\\"audit-assignments\\\"\\n            @collection={{@collection}}\\n            @exercises={{this.exercises}}\\n            @activeExercise={{this.exercise}}\\n            @onExerciseChange={{this.changeExercise}}\\n            @answers={{@answers}}\\n            @showStatus={{false}}\\n            @showNumAnswers={{true}}\\n            @useOriginalAnswer={{false}}\\n            @routed={{false}}\\n          />\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @showStatus={{true}}\\n            @answers={{this.exerciseAnswers}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n\\n      <modeTab.pane\\n        @value=\\\"students\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"account\\\"\\n          label=(t \\\"components.courseAudit.collection.students\\\")\\n        }}\\n      >\\n        <div class=\\\"audit-tab\\\">\\n          <div class=\\\"audit-selects\\\">\\n            <XSelect\\n              @items={{this.studentOptions}}\\n              @value={{this.student}}\\n              @stretch={{true}}\\n              class=\\\"mr1\\\"\\n            />\\n\\n            <XSelect\\n              @items={{this.exerciseOptions}}\\n              @value={{this.selectedExercise}}\\n              @stretch={{true}}\\n              @onChange={{this.selectExercise}}\\n              class=\\\"mr1\\\"\\n            />\\n          </div>\\n\\n          <CourseAudit::StudentList\\n            @selectedAnswerId={{@selectedAnswerId}}\\n            @student={{this.student}}\\n            class=\\\"audit-students\\\"\\n            @exercise={{this.exercise}}\\n            @students={{this.students}}\\n            @goTo={{this.changeStudent}}\\n            @answers={{@answers}}\\n            @showNumAnswers={{true}}\\n          />\\n\\n          <CollectionExerciseIndex\\n            class=\\\"audit-assignments\\\"\\n            @collection={{@collection}}\\n            @exercises={{this.exercises}}\\n            @activeExercise={{this.exercise}}\\n            @onExerciseChange={{this.changeExercise}}\\n            @answers={{this.studentsAnswers}}\\n            @useOriginalAnswer={{false}}\\n            @showStatus={{true}}\\n            @routed={{false}}\\n          />\\n\\n          <CourseAudit::Collection::Exercise\\n            class=\\\"audit-exercise-container\\\"\\n            @exercise={{this.exercise}}\\n            @answerUser={{this.answerUser}}\\n            @answer={{this.answer}}\\n            @mode={{this.mode}}\\n            @hasNextButton={{this.hasNextButton}}\\n            @changeStudent={{this.changeToNextStudent}}\\n            @exercises={{this.exercises}}\\n            @hideQuestion={{this.hideQuestion}}\\n            @toggleQuestion={{this.toggleQuestion}}\\n            @showKey={{this.showKey}}\\n            @toggleKey={{this.toggleKey}}\\n            @changeToNextStudent={{this.changeToNextStudent}}\\n            @openInNewTab={{@openInNewTab}}\\n          />\\n        </div>\\n      </modeTab.pane>\\n\\n      <modeTab.pane\\n        @value=\\\"compare\\\"\\n        @label={{component\\n          \\\"course-audit/collection/tab\\\"\\n          icon=\\\"ranking\\\"\\n          label=(t \\\"components.courseAudit.collection.compare\\\")\\n        }}\\n      >\\n        <div class=\\\"course-audit-compare pt1\\\">\\n          <div class=\\\"audit-compare-students p1\\\">\\n            {{#each this.studentAnswers as |studentAnswer|}}\\n              <div class=\\\"audit-compare-student-name text-quarternary nb1\\\">\\n                {{~studentAnswer.student.showname~}}\\n              </div>\\n\\n              <div class=\\\"mb1 audit-compare-row\\\">\\n                {{#each studentAnswer.exercises as |exerciseAnswer|}}\\n                  <UiButton\\n                    @variant=\\\"alternative\\\"\\n                    @onClick={{fn\\n                      this.openAnswer\\n                      exerciseAnswer.exercise\\n                      studentAnswer.student\\n                    }}\\n                    class={{concat\\n                      \\\"flex-shrink\\\"\\n                      (if\\n                        (not-eq\\n                          exerciseAnswer.index studentAnswer.exercises.length\\n                        )\\n                        \\\" mr1\\\"\\n                      )\\n                    }}\\n                  >\\n                    {{exerciseAnswer.index}}\\n\\n                    <AnswerStatusIcon\\n                      @status={{or\\n                        exerciseAnswer.answer.computedStatus\\n                        \\\"not-started\\\"\\n                      }}\\n                      class=\\\"nl1\\\"\\n                    />\\n                  </UiButton>\\n                {{/each}}\\n              </div>\\n            {{/each}}\\n          </div>\\n        </div>\\n      </modeTab.pane>\\n    {{/if}}\\n  </XTab>\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/collection/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/collection/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { entityIsAllowedInCustomContent } from 'babel/utils/entity-is-allowed-in-custom-content';\nimport {\n  getAnswersForExercise,\n  getLatestVersion,\n} from 'babel/utils/get-answer';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { flatten } from 'compton/utils/array';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nconst COLLECTION_TAB_LABELS = Object.freeze({\n  assignments: 'Uppgifter',\n  students: 'Elever',\n  compare: 'Jämför',\n});\n\nexport default class CourseAuditCollectionComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * customContent (object)\n   * exercise (object)\n   * selectedStudent (object)\n   * groups (array)\n   * students (array)\n   * answers (array)\n   * includedEntities (array)\n   * allUsers (bool)\n   * mode (string)\n   */\n\n  @service store;\n\n  @tracked exercise = this.args.exercise;\n\n  @tracked selectedExercise = this.exercise?.id;\n\n  @tracked selectedStudent = null;\n\n  @tracked mode = this.args.mode;\n\n  @tracked hiddenQuestions = [];\n\n  @tracked showKey = false;\n\n  get student() {\n    return (\n      this.selectedStudent ||\n      this.args.selectedStudent ||\n      this.students?.firstObject?.id\n    );\n  }\n\n  get hideQuestion() {\n    if (this.hiddenQuestions.includes(this.exercise.id)) return true;\n    return false;\n  }\n\n  @cached\n  get answerUsersProxy() {\n    let promise = resolve();\n\n    if (this.args.answers) {\n      promise = all(\n        this.args.answers.map((x) => resolve(x.user).then((user) => user.id))\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get answerUsers() {\n    return this.answerUsersProxy.isResolved ? this.answerUsersProxy.value : [];\n  }\n\n  get answerUser() {\n    const studentId = this.student;\n\n    if (studentId) {\n      return this.store.peekRecord('user', studentId);\n    }\n\n    return null;\n  }\n\n  get exercises() {\n    const collection = this.args.collection;\n    const includedEntities = this.args.includedEntities;\n\n    let entities = collection?.children;\n\n    if (!collection || !entities) return null;\n\n    if (collection.isTeacherCollection) {\n      const customContent = this.args.customContent;\n\n      entities = entities.filter(\n        (assignment) =>\n          assignment.isPublished &&\n          entityIsAllowedInCustomContent(assignment, customContent)\n      );\n    } else if (\n      !collection.isCarousel &&\n      !collection.isDiagnosis &&\n      includedEntities\n    ) {\n      entities = entities.filter((entity) => includedEntities.includes(entity));\n    }\n\n    return entities;\n  }\n\n  get exerciseOptions() {\n    return this.exercises?.map((x) => ({\n      label: x.title,\n      value: x.id,\n    }));\n  }\n\n  get singleViewMode() {\n    const mode = this.mode;\n\n    if (mode === 'inbox' || mode === 'inbox-single' || mode === 'comments') {\n      return true;\n    }\n\n    return false;\n  }\n\n  @cached\n  get teacherAssignmentProxy() {\n    let promise = resolve();\n\n    if (this.exercise?.isTeacherAssignment) {\n      promise = resolve(this.exercise.teacherAssignment);\n    }\n\n    return load(promise, this);\n  }\n\n  get teacherAssignment() {\n    return this.teacherAssignmentProxy.isResolved\n      ? this.teacherAssignmentProxy.value\n      : null;\n  }\n\n  @cached\n  get exerciseAnswersProxy() {\n    let promise = resolve();\n\n    if (this.exercise) {\n      const isTeacherAssignment = this.exercise.isTeacherAssignment;\n      const teacherAssignmentId = this.teacherAssignment?.id;\n      const entityId = this.exercise.id;\n      const answers = this.args.answers || [];\n\n      promise = all(\n        answers.map((answer) => {\n          if (isTeacherAssignment) {\n            return resolve(answer.teacherAssignment).then(\n              (teacherAssignment) => {\n                if (teacherAssignment.id === teacherAssignmentId) {\n                  return resolve(answer);\n                } else {\n                  return resolve();\n                }\n              }\n            );\n          } else if (answer.node_id === entityId) {\n            return resolve(answer);\n          } else {\n            return resolve();\n          }\n        })\n      ).then((answers) => answers.filter((x) => x));\n    }\n\n    return load(promise, this);\n  }\n\n  get exerciseAnswers() {\n    return this.exerciseAnswersProxy.isResolved\n      ? this.exerciseAnswersProxy.value\n      : null;\n  }\n\n  @cached\n  get studentsAnswersProxy() {\n    const studentId = this.student;\n\n    let promise = resolve();\n\n    if (studentId && this.args.answers) {\n      promise = all(\n        this.args.answers.map((answer) => {\n          return resolve(answer.user).then((user) => {\n            if (user.id === studentId) {\n              return resolve(answer);\n            }\n\n            return resolve();\n          });\n        })\n      ).then((answers) => answers.filter((x) => x));\n    }\n\n    return load(promise, this);\n  }\n\n  get studentsAnswers() {\n    return this.studentsAnswersProxy.isResolved\n      ? this.studentsAnswersProxy.value\n      : null;\n  }\n\n  @cached\n  get answer() {\n    // A data bug lets students end up with duplicate answer chains for the\n    // same exercise; when the caller points at a specific answer, open that\n    // chain instead of resolving one by version number.\n    const selectedAnswerId = this.args.selectedAnswerId;\n\n    if (selectedAnswerId) {\n      const answersForExercise = getAnswersForExercise(\n        this.exercise,\n        this.studentsAnswers\n      );\n\n      const selected = answersForExercise?.find(\n        (answer) => answer.id === selectedAnswerId\n      );\n\n      if (selected) {\n        return selected;\n      }\n    }\n\n    return getLatestVersion(this.exercise, this.studentsAnswers);\n  }\n\n  @cached\n  get studentsProxy() {\n    let promise = resolve();\n\n    if (this.args.students) {\n      promise = resolve(this.args.students)\n        .then((students) => {\n          const list = Array.isArray(students)\n            ? students\n            : students?.toArray?.() || [];\n\n          return list\n            .filter((student) => student?.role === 'student')\n            .sort((left, right) =>\n              (left?.showname || '').localeCompare(right?.showname || '')\n            );\n        })\n        .catch(() => []);\n    } else if (this.args.groups) {\n      const answerUsers = this.answerUsers;\n\n      promise = all(this.args.groups.map((group) => resolve(group.users)))\n        .then((users) =>\n          flatten(users.invoke('toArray'))\n            .uniq()\n            .filter(\n              (x) =>\n                x.role === 'student' &&\n                (this.args.allUsers || answerUsers.includes(x.id))\n            )\n            .sortBy('showname')\n        )\n        .catch(() => []);\n    }\n\n    return load(promise, this);\n  }\n\n  get students() {\n    if (this.studentsProxy.isResolved) {\n      return this.studentsProxy.value || [];\n    }\n\n    if (this.studentsProxy.isRejected) {\n      return [];\n    }\n\n    return null;\n  }\n\n  get studentOptions() {\n    return (this.students || []).map((student) => ({\n      label: student.showname,\n      value: student.id,\n    }));\n  }\n\n  @cached\n  get studentAnswers() {\n    const studentAnswers = [];\n\n    const students = this.students;\n    const answers = this.args.answers;\n    const exercises = this.exercises;\n\n    students?.forEach((student) => {\n      const studentId = student.id;\n      const studentsExercises = [];\n      const studentsAnswers = answers.filter(\n        (answer) => answer?.belongsTo('user')?.id() === studentId\n      );\n\n      exercises.forEach((exercise) => {\n        let answer = getLatestVersion(exercise, studentsAnswers);\n\n        if (!answer) {\n          answer = {\n            status: 'not-started',\n          };\n        }\n\n        studentsExercises.push({\n          index: studentsExercises.length + 1,\n          exercise,\n          answer,\n        });\n      });\n\n      studentAnswers.push({\n        student,\n        exercises: studentsExercises,\n      });\n    });\n\n    return studentAnswers;\n  }\n\n  get nextStudent() {\n    const student = this.student;\n    const students = this.studentOptions\n      .filter((x) => x.disabled !== true)\n      .map((x) => x.value);\n\n    if (student) {\n      const index = students.indexOf(student) + 1;\n\n      if (index !== 0 && students.length > index) {\n        return students[index];\n      }\n    }\n\n    return null;\n  }\n\n  get hasNextButton() {\n    return this.mode === 'inbox' && this.nextStudent !== null;\n  }\n\n  @action\n  toggleKey(val) {\n    if (val === true || val === false) this.showKey = val;\n    else this.showKey = !this.showKey;\n  }\n\n  @action\n  toggleQuestion() {\n    if (this.hiddenQuestions.includes(this.exercise.id)) {\n      this.hiddenQuestions.removeObject(this.exercise.id);\n    } else {\n      this.hiddenQuestions.addObject(this.exercise.id);\n    }\n  }\n\n  @action\n  selectExercise(id) {\n    this.showKey = false;\n    this.exercise = this.exercises?.filter((x) => x.id === id)?.[0];\n    this.selectedExercise = this.exercise?.id;\n  }\n\n  @action\n  handleModeChange(mode) {\n    this.mode = mode;\n\n    const tabLabel = COLLECTION_TAB_LABELS[mode];\n\n    if (tabLabel) {\n      trackAuditEvent('Rättningsläge - Flik', tabLabel);\n    }\n  }\n\n  @action\n  changeExercise(index) {\n    this.showKey = false;\n    this.exercise = this.exercises?.objectAt(index - 1);\n  }\n\n  @action\n  changeStudent(student) {\n    this.showKey = false;\n    this.selectedStudent = typeof student === 'string' ? student : student.id;\n  }\n\n  @action\n  changeToNextStudent() {\n    this.showKey = false;\n    this.selectedStudent =\n      typeof this.nextStudent === 'string'\n        ? this.nextStudent\n        : this.nextStudent.id;\n  }\n\n  @action\n  openAnswer(exercise, student) {\n    this.showKey = false;\n    this.exercise = exercise;\n    this.selectedStudent = student.id;\n    this.mode = 'assignments';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"flex flex-center text-color\\\">\\n  <DcIcon @name={{@icon}} class=\\\"nr1\\\"/>\\n  {{@label}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"flex flex-center text-color\\\">\\n  <DcIcon @name={{@icon}} class=\\\"nr1\\\"/>\\n  {{@label}}\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/collection/tab/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/collection/tab/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-comments mt1\\\" {{did-update this._getComments @students}}>\\n  {{#if this.isLoading}}\\n    <DcLoader class=\\\"mt2\\\" />\\n  {{else}}\\n    {{#if this.comments}}\\n      {{#each this.comments as |comment|}}\\n        <UiButton\\n          @appearance=\\\"none\\\"\\n          @onClick={{fn @onClick comment.answer.entity comment.answer}}\\n          @width=\\\"expand\\\"\\n          class=\\\"course-comment flex p1 bb1\\\"\\n        >\\n          <XAwait @value={{comment.answer.user}} as |commentAnswerUser|>\\n            {{#if this.showUserNameAndAvatar}}\\n              <DcAvatar\\n                @user={{commentAnswerUser}}\\n                @size=\\\"large\\\"\\n                class=\\\"flex-shrink mr1\\\"\\n              />\\n            {{/if}}\\n\\n            <div class=\\\"flex-auto\\\">\\n              <div class=\\\"text-quarternary nb1\\\">\\n                {{#if this.showUserNameAndAvatar}}\\n                  {{commentAnswerUser.showname}}\\n                  &ndash;\\n                {{/if}}\\n\\n                {{comment.answer.assignment_title}}\\n              </div>\\n\\n              <div class=\\\"text-muted text-ui\\\">\\n                {{comment.commentedOn}}\\n              </div>\\n            </div>\\n          </XAwait>\\n        </UiButton>\\n      {{/each}}\\n    {{else}}\\n      <XAlert>\\n        {{t \\\"components.courseAudit.comments.noComments\\\"}}\\n      </XAlert>\\n    {{/if}}\\n\\n    {{#if (gt this.comments.meta.totalPages 1)}}\\n      <div class=\\\"flex justify-center mt2\\\">\\n        <XPagination\\n          @routed={{false}}\\n          @page={{this.pageNumber}}\\n          @showFirstLast={{false}}\\n          @totalPages={{this.comments.meta.totalPages}}\\n          @onChange={{this.handlePaginationChange}}\\n        />\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"course-comments mt1\\\" {{did-update this._getComments @students}}>\\n  {{#if this.isLoading}}\\n    <DcLoader class=\\\"mt2\\\" />\\n  {{else}}\\n    {{#if this.comments}}\\n      {{#each this.comments as |comment|}}\\n        <UiButton\\n          @appearance=\\\"none\\\"\\n          @onClick={{fn @onClick comment.answer.entity comment.answer}}\\n          @width=\\\"expand\\\"\\n          class=\\\"course-comment flex p1 bb1\\\"\\n        >\\n          <XAwait @value={{comment.answer.user}} as |commentAnswerUser|>\\n            {{#if this.showUserNameAndAvatar}}\\n              <DcAvatar\\n                @user={{commentAnswerUser}}\\n                @size=\\\"large\\\"\\n                class=\\\"flex-shrink mr1\\\"\\n              />\\n            {{/if}}\\n\\n            <div class=\\\"flex-auto\\\">\\n              <div class=\\\"text-quarternary nb1\\\">\\n                {{#if this.showUserNameAndAvatar}}\\n                  {{commentAnswerUser.showname}}\\n                  &ndash;\\n                {{/if}}\\n\\n                {{comment.answer.assignment_title}}\\n              </div>\\n\\n              <div class=\\\"text-muted text-ui\\\">\\n                {{comment.commentedOn}}\\n              </div>\\n            </div>\\n          </XAwait>\\n        </UiButton>\\n      {{/each}}\\n    {{else}}\\n      <XAlert>\\n        {{t \\\"components.courseAudit.comments.noComments\\\"}}\\n      </XAlert>\\n    {{/if}}\\n\\n    {{#if (gt this.comments.meta.totalPages 1)}}\\n      <div class=\\\"flex justify-center mt2\\\">\\n        <XPagination\\n          @routed={{false}}\\n          @page={{this.pageNumber}}\\n          @showFirstLast={{false}}\\n          @totalPages={{this.comments.meta.totalPages}}\\n          @onChange={{this.handlePaginationChange}}\\n        />\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/course-audit/comments/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/comments/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport moment from 'moment';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditCommentsComponent extends Component {\n  /**\n   * Arguments:\n   * students (array)\n   * books (array)\n   * course (object)\n   * onClick (function)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._getComments();\n  }\n\n  @service intl;\n\n  @service session;\n\n  @service store;\n\n  @tracked pageNumber = 1;\n\n  @tracked comments;\n\n  @tracked isLoading = true;\n\n  limit = 10;\n\n  get showUserNameAndAvatar() {\n    return this.args.students?.length > 1;\n  }\n\n  @action\n  handlePaginationChange(pageNumber) {\n    trackAuditEvent('Kommentarer - Sidnavigering');\n\n    this.pageNumber = pageNumber;\n    this._getComments();\n  }\n\n  @action\n  async _getComments() {\n    this.isLoading = true;\n\n    const students = this.args.students;\n\n    if (!students || students.length === 0) {\n      this.isLoading = false;\n      this.comments = [];\n      return;\n    }\n\n    let comments;\n\n    try {\n      const teachers = await resolve(this.args.course?.teachers).then(\n        (teachers) => teachers.mapBy('id')\n      );\n\n      const book_id = await resolve(this.args.books).then((books) =>\n        books?.map((x) => x.id)\n      );\n\n      comments = await this.store.query('answer-comment', {\n        page: {\n          size: this.limit,\n          number: this.pageNumber,\n        },\n        order: [{ field: 'created', direction: 'DESC' }],\n        filter: { students, teachers, book_id },\n      });\n\n      await all(\n        comments.map((comment) =>\n          resolve(comment.answer).then((answer) => resolve(answer.entity))\n        )\n      );\n    } catch (err) {\n      comments = [];\n    }\n\n    const currUserId = this.session.user?.id;\n\n    this.comments = await all(\n      comments.map(async (comment) => {\n        const dayName = moment(comment.created).format('dddd');\n        const time = moment(comment.created).format('HH:mm');\n\n        const dateString = moment(comment.created).calendar(null, {\n          sameDay: `[${this.intl.t(\n            'components.courseAudit.comments.calendar.todayAtTimeLower',\n            { time }\n          )}]`,\n          lastDay: `[${this.intl.t(\n            'components.courseAudit.comments.calendar.yesterdayAtTimeLower',\n            {\n              time,\n            }\n          )}]`,\n          lastWeek: `[${this.intl.t(\n            'components.courseAudit.comments.calendar.lastWeekAtTimeLower',\n            {\n              time,\n              dayName,\n            }\n          )}]`,\n          sameElse: `YYYY-MM-DD HH:mm`,\n        });\n\n        const commentUser = await resolve(comment.user);\n\n        const userString =\n          commentUser.id === currUserId\n            ? this.intl.t(`components.courseAudit.comments.you`)\n            : commentUser.showname;\n\n        comment.commentedOn = this.intl.t(\n          `components.courseAudit.comments.commentedOn`,\n          {\n            dateString,\n            userString,\n          }\n        );\n\n        return comment;\n      })\n    );\n\n    this.isLoading = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#each this.exerciseResults as |exerciseResult|}}\\n  <div class=\\\"flex hover-highlight\\\">\\n    <a\\n      href=\\\"#\\\"\\n      class=\\\"flex flex-auto flex-center p1\\\"\\n      {{on \\\"click\\\" (fn this.handleClick exerciseResult)}}\\n    >\\n      <AnswerStatusIcon\\n        @status={{exerciseResult.answer.computedStatus}}\\n        class=\\\"nr1\\\"\\n      />\\n\\n      <div class=\\\"text-ui{{if (not-eq exerciseResult.answer.computedStatus \\\"not-started\\\") \\\" text-color-default\\\"}}\\\">\\n        {{#unless exerciseResult.exercise.hideAssignmentSortNumbers}}\\n          {{exerciseResult.exercise.sort}}.\\n        {{/unless}}\\n\\n        {{exerciseResult.exercise.title}}\\n      </div>\\n    </a>\\n  </div>\\n{{/each}}\\n\", {\"contents\":\"{{#each this.exerciseResults as |exerciseResult|}}\\n  <div class=\\\"flex hover-highlight\\\">\\n    <a\\n      href=\\\"#\\\"\\n      class=\\\"flex flex-auto flex-center p1\\\"\\n      {{on \\\"click\\\" (fn this.handleClick exerciseResult)}}\\n    >\\n      <AnswerStatusIcon\\n        @status={{exerciseResult.answer.computedStatus}}\\n        class=\\\"nr1\\\"\\n      />\\n\\n      <div class=\\\"text-ui{{if (not-eq exerciseResult.answer.computedStatus \\\"not-started\\\") \\\" text-color-default\\\"}}\\\">\\n        {{#unless exerciseResult.exercise.hideAssignmentSortNumbers}}\\n          {{exerciseResult.exercise.sort}}.\\n        {{/unless}}\\n\\n        {{exerciseResult.exercise.title}}\\n      </div>\\n    </a>\\n  </div>\\n{{/each}}\\n\",\"moduleName\":\"babel/components/course-audit/diagnosis/exercise/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/diagnosis/exercise/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class CourseAuditDiagnosisExerciseComponent extends Component {\n  /**\n   * Arguments:\n   * exercises (array)\n   * results (array)\n   * openAuditMode (function)\n   */\n\n  get exerciseResults() {\n    const exercises = this.args.exercises;\n    const answers = this.args.results?.answers;\n\n    const exerciseResults = [];\n\n    exercises.forEach((exercise) => {\n      const answer = answers?.find((x) => x.node_id === exercise.id);\n      exerciseResults.push({ exercise, answer });\n    });\n\n    return exerciseResults;\n  }\n\n  @action handleClick(exerciseResult, evt) {\n    evt.preventDefault();\n\n    this.args.openAuditMode?.({\n      collection: exerciseResult.exercise.parent,\n      exercise: exerciseResult.exercise,\n      answers: this.args.results.answers,\n      student: null,\n      mode: 'students',\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.isClass}}\\n  <div class=\\\"text-tertiary mb1 mx1\\\">{{@group.name}}</div>\\n{{/if}}\\n\\n{{#each this.studentResults as |studentResult|}}\\n  <a\\n    href=\\\"#\\\"\\n    class=\\\"grid-layout p1 hover-highlight\\\"\\n    {{on\\n      \\\"click\\\"\\n      (fn\\n        @openAuditMode\\n        (hash\\n          collection=@part\\n          exercise=@part.children.firstObject\\n          answers=this.answers\\n          student=studentResult.student.id\\n          mode=\\\"students\\\"\\n        )\\n      )\\n    }}\\n  >\\n    <div class=\\\"grid-cell-9 grid-cell-sm-12 flex flex-center\\\">\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @variant=\\\"inherit\\\"\\n        @onClick={{fn @openAuditMode (hash\\n          collection=@part\\n          exercise=@part.children.firstObject\\n          answers=this.answers\\n          student=studentResult.student.id\\n          mode=\\\"students\\\")\\n        }}\\n      >\\n        <DcAvatar @size=\\\"x-small\\\" @user={{studentResult.student}} class=\\\"nr1\\\" />\\n        {{studentResult.student.showname}}\\n      </UiButton>\\n    </div>\\n\\n    <div class=\\\"grid-cell-2 grid-cell-sm-6 flex flex-center\\\">\\n      <XBadge @size=\\\"small\\\" class=\\\"flex-right\\\">\\n        {{studentResult.attempts}}\\n      </XBadge>\\n    </div>\\n\\n    {{#if studentResult.result}}\\n      {{#let (if (gte studentResult.result.score studentResult.pointsRequired) \\\"text-color-success\\\" \\\"text-color-error\\\") as |typeClass|}}\\n        <div class=\\\"grid-cell-1 grid-cell-sm-3 flex flex-center text-right text-bold {{typeClass}}\\\">\\n          {{or studentResult.result.score 0}} / {{studentResult.maxScore}}\\n        </div>\\n      {{/let}}\\n    {{else}}\\n      <div class=\\\"grid-cell-1 grid-cell-sm-3 flex flex-center text-right text-bold\\\">-</div>\\n    {{/if}}\\n  </a>\\n{{/each}}\\n\", {\"contents\":\"{{#if this.isClass}}\\n  <div class=\\\"text-tertiary mb1 mx1\\\">{{@group.name}}</div>\\n{{/if}}\\n\\n{{#each this.studentResults as |studentResult|}}\\n  <a\\n    href=\\\"#\\\"\\n    class=\\\"grid-layout p1 hover-highlight\\\"\\n    {{on\\n      \\\"click\\\"\\n      (fn\\n        @openAuditMode\\n        (hash\\n          collection=@part\\n          exercise=@part.children.firstObject\\n          answers=this.answers\\n          student=studentResult.student.id\\n          mode=\\\"students\\\"\\n        )\\n      )\\n    }}\\n  >\\n    <div class=\\\"grid-cell-9 grid-cell-sm-12 flex flex-center\\\">\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @variant=\\\"inherit\\\"\\n        @onClick={{fn @openAuditMode (hash\\n          collection=@part\\n          exercise=@part.children.firstObject\\n          answers=this.answers\\n          student=studentResult.student.id\\n          mode=\\\"students\\\")\\n        }}\\n      >\\n        <DcAvatar @size=\\\"x-small\\\" @user={{studentResult.student}} class=\\\"nr1\\\" />\\n        {{studentResult.student.showname}}\\n      </UiButton>\\n    </div>\\n\\n    <div class=\\\"grid-cell-2 grid-cell-sm-6 flex flex-center\\\">\\n      <XBadge @size=\\\"small\\\" class=\\\"flex-right\\\">\\n        {{studentResult.attempts}}\\n      </XBadge>\\n    </div>\\n\\n    {{#if studentResult.result}}\\n      {{#let (if (gte studentResult.result.score studentResult.pointsRequired) \\\"text-color-success\\\" \\\"text-color-error\\\") as |typeClass|}}\\n        <div class=\\\"grid-cell-1 grid-cell-sm-3 flex flex-center text-right text-bold {{typeClass}}\\\">\\n          {{or studentResult.result.score 0}} / {{studentResult.maxScore}}\\n        </div>\\n      {{/let}}\\n    {{else}}\\n      <div class=\\\"grid-cell-1 grid-cell-sm-3 flex flex-center text-right text-bold\\\">-</div>\\n    {{/if}}\\n  </a>\\n{{/each}}\\n\",\"moduleName\":\"babel/components/course-audit/diagnosis/group/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/diagnosis/group/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditDiagnosisGroupComponent extends Component {\n  /**\n   * Arguments:\n   * group (object)\n   * part (object)\n   * results (array)\n   * openAuditMode (function)\n   */\n\n  @service intl;\n\n  get isClass() {\n    return this.args.group?.type === 'class';\n  }\n\n  get students() {\n    return this.args.group?.users\n      ?.filter((x) => x.role === 'student')\n      ?.sortBy('showname');\n  }\n\n  @cached get resultsByUserProxy() {\n    let promise = resolve();\n\n    if (this.args.results) {\n      promise = all(\n        this.args.results.map((result) =>\n          resolve(result.user).then((user) => ({\n            userId: user.id,\n            result,\n          }))\n        )\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  @cached get allResultsByUserProxy() {\n    let promise = resolve();\n\n    if (this.args.allResults) {\n      promise = resolve(this.args.allResults).then((allResults) => {\n        return allResults.map((result) => {\n          const userId = result.belongsTo('user').id();\n          return {\n            userId,\n            result,\n          };\n        });\n      });\n    }\n\n    return load(promise, this);\n  }\n\n  get studentResults() {\n    const studentResults = [];\n\n    const students = this.students;\n\n    const results = this.resultsByUserProxy.isResolved\n      ? this.resultsByUserProxy.value\n      : null;\n\n    const allResults = this.allResultsByUserProxy.isResolved\n      ? this.allResultsByUserProxy.value\n      : null;\n\n    const part = this.args.part;\n\n    const maxScore = part?.children?.length;\n    const pointsRequired = part?.pointsRequired;\n\n    students?.forEach((student) => {\n      const studentId = student.id;\n      let result = results?.findBy('userId', studentId)?.result;\n\n      let allResultsByUser = allResults?.filterBy('userId', studentId);\n\n      const attempts = allResultsByUser?.length || 0;\n\n      studentResults.push({\n        student,\n        result,\n        attempts: this.intl.t(\n          'components.courseAudit.diagnosis.group.attempts',\n          {\n            num: attempts,\n          }\n        ),\n        maxScore,\n        pointsRequired,\n      });\n    });\n\n    return studentResults;\n  }\n\n  @cached get answers() {\n    const answers = [];\n    const students = this.students;\n    const results = this.resultsByUserProxy.isResolved\n      ? this.resultsByUserProxy.value\n      : null;\n\n    students.forEach((student) => {\n      const studentId = student.id;\n      const studentResults = results?.find((x) => x.userId === studentId);\n\n      if (studentResults) {\n        studentResults.result?.answers?.forEach((answer) => {\n          answers.push(answer);\n        });\n      }\n    });\n\n    return answers;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XAccordion @expanded={{this.expanded}} disabled={{this.disabled}} as |a|>\\n  <a.header @isClickable={{true}} class=\\\"p0\\\">\\n    <div class=\\\"py1 {{if this.disabled 'disabled text-muted'}}\\\">\\n      <div class=\\\"text-heading flex flex-center\\\">\\n        <DcIcon @name=\\\"book\\\" class=\\\"nr1\\\" />\\n        {{@book.title}}\\n      </div>\\n\\n      {{#if this.disabled}}\\n        {{t \\\"components.courseAudit.diagnosis.noDiagnosis\\\"}}\\n      {{/if}}\\n    </div>\\n  </a.header>\\n\\n  <a.content>\\n    {{#if this.isLoading}}\\n      <DcLoader class=\\\"mt2\\\" />\\n    {{else}}\\n      {{#each this.diagnoses as |part|}}\\n        <CourseAudit::Diagnosis::Part\\n          @part={{part}}\\n          @diagnosis={{part.parent}}\\n          @area={{part.parent.parent}}\\n          @selectedStudents={{@selectedStudents}}\\n          @groups={{@groups}}\\n          @openAuditMode={{@openAuditMode}}\\n        />\\n      {{/each}}\\n    {{/if}}\\n  </a.content>\\n</XAccordion>\", {\"contents\":\"<XAccordion @expanded={{this.expanded}} disabled={{this.disabled}} as |a|>\\n  <a.header @isClickable={{true}} class=\\\"p0\\\">\\n    <div class=\\\"py1 {{if this.disabled 'disabled text-muted'}}\\\">\\n      <div class=\\\"text-heading flex flex-center\\\">\\n        <DcIcon @name=\\\"book\\\" class=\\\"nr1\\\" />\\n        {{@book.title}}\\n      </div>\\n\\n      {{#if this.disabled}}\\n        {{t \\\"components.courseAudit.diagnosis.noDiagnosis\\\"}}\\n      {{/if}}\\n    </div>\\n  </a.header>\\n\\n  <a.content>\\n    {{#if this.isLoading}}\\n      <DcLoader class=\\\"mt2\\\" />\\n    {{else}}\\n      {{#each this.diagnoses as |part|}}\\n        <CourseAudit::Diagnosis::Part\\n          @part={{part}}\\n          @diagnosis={{part.parent}}\\n          @area={{part.parent.parent}}\\n          @selectedStudents={{@selectedStudents}}\\n          @groups={{@groups}}\\n          @openAuditMode={{@openAuditMode}}\\n        />\\n      {{/each}}\\n    {{/if}}\\n  </a.content>\\n</XAccordion>\",\"moduleName\":\"babel/components/course-audit/diagnosis/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/diagnosis/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditDiagnosisComponent extends Component {\n  /**\n   * Arguments:\n   * selectedStudents (array)\n   * book (object)\n   * groups (array)\n   * openAuditMode (function)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._getDiagnoses();\n  }\n\n  @service store;\n\n  @tracked isLoading = true;\n\n  @tracked diagnoses;\n\n  @tracked expanded = false;\n\n  get disabled() {\n    return !this.diagnoses || this.diagnoses.length === 0;\n  }\n\n  async _getDiagnoses() {\n    this.isLoading = true;\n\n    let diagnoses = [];\n\n    try {\n      diagnoses = await this.store.query('entity', {\n        book_id: this.args.book?.id,\n        type: 'collections',\n        template: 'diagnosis_part',\n        include: 'children',\n      });\n\n      const promises = [];\n\n      diagnoses.forEach((diagnosis) => {\n        promises.push(\n          resolve(diagnosis.ancestors).catch(() => {\n            if (diagnoses.includes(diagnosis)) diagnosis.invalid = true;\n          })\n        );\n\n        promises.push(\n          resolve(diagnosis.children).catch(() => {\n            if (diagnoses.includes(diagnosis)) diagnosis.invalid = true;\n          })\n        );\n      });\n\n      await all(promises);\n    } catch (err) {\n      // do nothing\n    }\n\n    const sorted = diagnoses\n      .filter((x) => x && x.invalid !== true)\n      .sort((diagnosisA, diagnosisB) => {\n        const areaA = diagnosisA.ancestors.findBy('type', 'areas');\n        const areaB = diagnosisB.ancestors.findBy('type', 'areas');\n\n        if (areaA?.sort < areaB?.sort) return -1;\n        else if (areaB?.sort < areaA?.sort) return 1;\n\n        const interA = diagnosisA.ancestors.findBy('type', 'interactives');\n        const interB = diagnosisB.ancestors.findBy('type', 'interactives');\n\n        if (interA?.sort < interB?.sort) return -1;\n        else if (interB?.sort < interA?.sort) return 1;\n\n        if (diagnosisA.sort < diagnosisB.sort) return -1;\n        if (diagnosisB.sort < diagnosisA.sort) return 1;\n\n        return 0;\n      });\n\n    this.diagnoses = sorted;\n    this.isLoading = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"b1 bradius mb1\\\">\\n  <XAccordion\\n    @expanded={{this.expanded}}\\n    @disabled={{this.disabled}}\\n    {{did-update this._getResults @selectedStudents}}\\n    as |a|\\n  >\\n    <a.header\\n      @isClickable={{true}}\\n      class=\\\"p0 px1{{unless this.expanded ' b0'}}\\\"\\n    >\\n      <div class=\\\"py1 flex flex-wrap flex-center justify-space-between\\\">\\n        <div class=\\\"flex-auto mr1{{unless this.expanded ' text-color'}}\\\">\\n          <div class=\\\"text-tertiary{{if this.disabled ' disabled'}}\\\">\\n            {{@part.title}}\\n          </div>\\n\\n          <div class=\\\"text-separator{{if this.disabled ' disabled'}}\\\">\\n            {{@area.title}}\\n            /\\n            {{@diagnosis.title}}\\n          </div>\\n        </div>\\n\\n        {{#if this.isLoading}}\\n          <div class=\\\"flex flex-center\\\">\\n            <div class=\\\"text-muted\\\">\\n              {{t \\\"components.courseAudit.diagnosis.part.loadingDiagnosis\\\"}}\\n            </div>\\n\\n            <DcLoader @size=\\\"xsmall\\\" class=\\\"flex-shrink nx1\\\" />\\n          </div>\\n        {{else if this.disabled}}\\n          <div class=\\\"text-muted\\\">\\n            {{t \\\"components.courseAudit.diagnosis.part.noAttempts\\\"}}\\n          </div>\\n        {{else}}\\n          <div class=\\\"text-color mr1\\\">\\n            <XSelect\\n              @items={{this.resultOptions}}\\n              @value={{this.selectedResultOption}}\\n            />\\n          </div>\\n        {{/if}}\\n\\n        {{#if (and this.student this.resultsForType)}}\\n          <div class=\\\"text-ui mr1 text-color-{{this.resultColor}}\\\">\\n            {{or this.resultsForType.score 0}}\\n            /\\n            {{@part.children.length}}\\n          </div>\\n\\n          <XPercentageCircle\\n            class=\\\"mr1\\\"\\n            @size=\\\"mini\\\"\\n            @value={{this.resultsForType.score}}\\n            @valueMax={{@part.children.length}}\\n            @showPercent={{true}}\\n            @variant={{this.resultColor}}\\n          />\\n        {{/if}}\\n      </div>\\n    </a.header>\\n\\n    <a.content class=\\\"p1\\\">\\n      {{#if this.expanded}}\\n        {{#if this.student}}\\n          <CourseAudit::Diagnosis::Exercise\\n            @exercises={{@part.children}}\\n            @results={{this.resultsForType}}\\n            @openAuditMode={{@openAuditMode}}\\n          />\\n        {{else}}\\n          {{#each this.sortedGroups as |group|}}\\n            <CourseAudit::Diagnosis::Group\\n              @group={{group}}\\n              @part={{@part}}\\n              @results={{this.resultsForType}}\\n              @openAuditMode={{@openAuditMode}}\\n              @allResults={{this.results}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n</div>\", {\"contents\":\"<div class=\\\"b1 bradius mb1\\\">\\n  <XAccordion\\n    @expanded={{this.expanded}}\\n    @disabled={{this.disabled}}\\n    {{did-update this._getResults @selectedStudents}}\\n    as |a|\\n  >\\n    <a.header\\n      @isClickable={{true}}\\n      class=\\\"p0 px1{{unless this.expanded ' b0'}}\\\"\\n    >\\n      <div class=\\\"py1 flex flex-wrap flex-center justify-space-between\\\">\\n        <div class=\\\"flex-auto mr1{{unless this.expanded ' text-color'}}\\\">\\n          <div class=\\\"text-tertiary{{if this.disabled ' disabled'}}\\\">\\n            {{@part.title}}\\n          </div>\\n\\n          <div class=\\\"text-separator{{if this.disabled ' disabled'}}\\\">\\n            {{@area.title}}\\n            /\\n            {{@diagnosis.title}}\\n          </div>\\n        </div>\\n\\n        {{#if this.isLoading}}\\n          <div class=\\\"flex flex-center\\\">\\n            <div class=\\\"text-muted\\\">\\n              {{t \\\"components.courseAudit.diagnosis.part.loadingDiagnosis\\\"}}\\n            </div>\\n\\n            <DcLoader @size=\\\"xsmall\\\" class=\\\"flex-shrink nx1\\\" />\\n          </div>\\n        {{else if this.disabled}}\\n          <div class=\\\"text-muted\\\">\\n            {{t \\\"components.courseAudit.diagnosis.part.noAttempts\\\"}}\\n          </div>\\n        {{else}}\\n          <div class=\\\"text-color mr1\\\">\\n            <XSelect\\n              @items={{this.resultOptions}}\\n              @value={{this.selectedResultOption}}\\n            />\\n          </div>\\n        {{/if}}\\n\\n        {{#if (and this.student this.resultsForType)}}\\n          <div class=\\\"text-ui mr1 text-color-{{this.resultColor}}\\\">\\n            {{or this.resultsForType.score 0}}\\n            /\\n            {{@part.children.length}}\\n          </div>\\n\\n          <XPercentageCircle\\n            class=\\\"mr1\\\"\\n            @size=\\\"mini\\\"\\n            @value={{this.resultsForType.score}}\\n            @valueMax={{@part.children.length}}\\n            @showPercent={{true}}\\n            @variant={{this.resultColor}}\\n          />\\n        {{/if}}\\n      </div>\\n    </a.header>\\n\\n    <a.content class=\\\"p1\\\">\\n      {{#if this.expanded}}\\n        {{#if this.student}}\\n          <CourseAudit::Diagnosis::Exercise\\n            @exercises={{@part.children}}\\n            @results={{this.resultsForType}}\\n            @openAuditMode={{@openAuditMode}}\\n          />\\n        {{else}}\\n          {{#each this.sortedGroups as |group|}}\\n            <CourseAudit::Diagnosis::Group\\n              @group={{group}}\\n              @part={{@part}}\\n              @results={{this.resultsForType}}\\n              @openAuditMode={{@openAuditMode}}\\n              @allResults={{this.results}}\\n            />\\n          {{/each}}\\n        {{/if}}\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n</div>\",\"moduleName\":\"babel/components/course-audit/diagnosis/part/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/diagnosis/part/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditDiagnosisPartComponent extends Component {\n  /**\n   * Arguments:\n   * part (object)\n   * diagnosis (object)\n   * area (object)\n   * selectedStudents (array)\n   * groups (array)\n   * openAuditMode (function)\n   */\n\n  constructor() {\n    super(...arguments);\n    this._getResults();\n  }\n\n  @service intl;\n\n  @service store;\n\n  @tracked isLoading = true;\n\n  @tracked expanded = false;\n\n  @tracked results;\n\n  @tracked selectedResultOption = 'latest';\n\n  get sortedGroups() {\n    return this.args.groups?.sortBy('name');\n  }\n\n  get disabled() {\n    return !this.results || this.results.length === 0;\n  }\n\n  get student() {\n    const selectedStudents = this.args.selectedStudents;\n\n    if (selectedStudents && selectedStudents.length === 1) {\n      return this.store.peekRecord('user', selectedStudents[0]);\n    }\n\n    return null;\n  }\n\n  @cached get resultOptions() {\n    if (this.student) {\n      if (!this.results) {\n        return null;\n      }\n\n      return this.results.map((x) => {\n        return {\n          label: this.intl.t(\n            'components.courseAudit.diagnosis.part.diagnosisResultTypes.attempt',\n            {\n              attempt: x.attempt,\n            }\n          ),\n          value: x.id,\n        };\n      });\n    }\n\n    return [\n      {\n        label: this.intl.t(\n          'components.courseAudit.diagnosis.part.diagnosisResultTypes.latest'\n        ),\n        value: 'latest',\n      },\n      {\n        label: this.intl.t(\n          'components.courseAudit.diagnosis.part.diagnosisResultTypes.best'\n        ),\n        value: 'best',\n      },\n      {\n        label: this.intl.t(\n          'components.courseAudit.diagnosis.part.diagnosisResultTypes.first'\n        ),\n        value: 'first',\n      },\n    ];\n  }\n\n  @cached get resultsForType() {\n    const selectedResultOption = this.selectedResultOption;\n    const results = this.results;\n\n    if (!results) {\n      return null;\n    }\n\n    let resultsForType;\n\n    if (this.student) {\n      resultsForType = results.filter((x) => x.id === selectedResultOption);\n\n      if (resultsForType.length === 0) {\n        return null;\n      }\n\n      return resultsForType[0];\n    }\n\n    switch (selectedResultOption) {\n      case 'latest':\n        resultsForType = results.sortBy('attempt').reverseObjects();\n        break;\n      case 'best':\n        resultsForType = results.sortBy('score').reverseObjects();\n        break;\n      case 'first':\n        resultsForType = results.sortBy('attempt');\n        break;\n    }\n\n    return resultsForType?.uniqBy('user.id');\n  }\n\n  get resultColor() {\n    return this.resultsForType?.score >= this.args.part?.pointsRequired\n      ? 'success'\n      : 'error';\n  }\n\n  @action async _getResults() {\n    this.isLoading = true;\n\n    const entityId = this.args.part?.id;\n    const selectedStudents = this.args.selectedStudents;\n    const filter = {\n      user_id: selectedStudents?.join(','),\n      node_id: entityId,\n      all: true,\n      type: 'diagnosis_part',\n    };\n    const page = { size: 1000, number: 0 };\n\n    let results = [];\n\n    try {\n      results = await this.store.query('interactive', {\n        page,\n        filter,\n      });\n\n      const promises = [];\n\n      results.forEach((result) => {\n        promises.push(\n          resolve(result.user).catch(() => {\n            if (results.includes(result)) result.invalid = true;\n          })\n        );\n\n        promises.push(\n          resolve(result.answers).catch(() => {\n            if (results.includes(result)) result.invalid = true;\n          })\n        );\n      });\n\n      await all(promises);\n    } catch (err) {\n      // do nothing\n    }\n\n    this.results = results.filter((x) => x.invalid !== true);\n    this.isLoading = false;\n\n    if (this.student && results.length > 0) {\n      const sortedResults = results\n        .sortBy('attempt')\n        .reverseObjects()\n        .uniqBy('user.id');\n\n      if (sortedResults.length > 0) {\n        this.selectedResultOption = sortedResults[0].id;\n      }\n    } else if (\n      !['latest', 'best', 'first'].includes(this.selectedResultOption)\n    ) {\n      this.selectedResultOption = 'latest';\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-audit\\\">\\n  <div class=\\\"text-primary mb1\\\">{{t \\\"components.courseAudit.audit\\\"}}</div>\\n\\n  <XBreadcrumb class=\\\"mb1\\\" as |crumb|>\\n    <crumb.item as |item|>\\n      <item.link @route=\\\"master.courses.show.audit.index\\\">\\n        {{t \\\"components.courseAudit.breadcrumb.index\\\"}}\\n      </item.link>\\n    </crumb.item>\\n\\n    {{#if @mission}}\\n      <crumb.item as |item|>\\n        <item.link @route=\\\"master.courses.show.audit.missions.index\\\">\\n          {{t \\\"components.courseAudit.breadcrumb.missions\\\"}}\\n        </item.link>\\n      </crumb.item>\\n\\n      <crumb.item @active={{true}}>\\n        {{@mission.title}}\\n      </crumb.item>\\n    {{else}}\\n      <crumb.item @active={{true}}>\\n        {{t (concat \\\"components.courseAudit.breadcrumb.\\\" @auditType)}}\\n      </crumb.item>\\n    {{/if}}\\n  </XBreadcrumb>\\n\\n  <div class=\\\"mb1\\\">\\n    <StudentSelect\\n      @value={{@studentSelectValue}}\\n      @missionMode={{eq @auditType \\\"missions\\\"}}\\n      @groups={{@groups}}\\n      @canSelectAll={{not-eq @auditType \\\"log\\\"}}\\n    />\\n  </div>\\n\\n  {{yield\\n    (hash\\n      openAuditMode=this.openAuditMode\\n      onAnswerClick=this.onAnswerClick\\n      selectedStudents=this.selectedStudents\\n    )\\n  }}\\n\\n  {{#if\\n    (and @isAuditing (or this.auditAnswers (eq this.auditAnswers.length 0)))\\n  }}\\n    <XModal\\n      @onClose={{this.closeAuditMode}}\\n      @size={{hash width=\\\"xlarge\\\" height=\\\"xlarge\\\"}}\\n      @title={{this.auditModalTitle}}\\n    >\\n      <CourseAudit::Collection\\n        @collection={{this.auditCollection}}\\n        @customContent={{this.auditCustomContent}}\\n        @exercise={{this.auditExercise}}\\n        @selectedStudent={{this.auditStudent}}\\n        @groups={{@groups}}\\n        @answers={{this.auditAnswers}}\\n        @includedEntities={{this.auditIncludedEntities}}\\n        @allUsers={{or (eq @auditType \\\"missions\\\") (eq @auditType \\\"overview\\\")}}\\n        @mode={{this.auditMode}}\\n      />\\n    </XModal>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"course-audit\\\">\\n  <div class=\\\"text-primary mb1\\\">{{t \\\"components.courseAudit.audit\\\"}}</div>\\n\\n  <XBreadcrumb class=\\\"mb1\\\" as |crumb|>\\n    <crumb.item as |item|>\\n      <item.link @route=\\\"master.courses.show.audit.index\\\">\\n        {{t \\\"components.courseAudit.breadcrumb.index\\\"}}\\n      </item.link>\\n    </crumb.item>\\n\\n    {{#if @mission}}\\n      <crumb.item as |item|>\\n        <item.link @route=\\\"master.courses.show.audit.missions.index\\\">\\n          {{t \\\"components.courseAudit.breadcrumb.missions\\\"}}\\n        </item.link>\\n      </crumb.item>\\n\\n      <crumb.item @active={{true}}>\\n        {{@mission.title}}\\n      </crumb.item>\\n    {{else}}\\n      <crumb.item @active={{true}}>\\n        {{t (concat \\\"components.courseAudit.breadcrumb.\\\" @auditType)}}\\n      </crumb.item>\\n    {{/if}}\\n  </XBreadcrumb>\\n\\n  <div class=\\\"mb1\\\">\\n    <StudentSelect\\n      @value={{@studentSelectValue}}\\n      @missionMode={{eq @auditType \\\"missions\\\"}}\\n      @groups={{@groups}}\\n      @canSelectAll={{not-eq @auditType \\\"log\\\"}}\\n    />\\n  </div>\\n\\n  {{yield\\n    (hash\\n      openAuditMode=this.openAuditMode\\n      onAnswerClick=this.onAnswerClick\\n      selectedStudents=this.selectedStudents\\n    )\\n  }}\\n\\n  {{#if\\n    (and @isAuditing (or this.auditAnswers (eq this.auditAnswers.length 0)))\\n  }}\\n    <XModal\\n      @onClose={{this.closeAuditMode}}\\n      @size={{hash width=\\\"xlarge\\\" height=\\\"xlarge\\\"}}\\n      @title={{this.auditModalTitle}}\\n    >\\n      <CourseAudit::Collection\\n        @collection={{this.auditCollection}}\\n        @customContent={{this.auditCustomContent}}\\n        @exercise={{this.auditExercise}}\\n        @selectedStudent={{this.auditStudent}}\\n        @groups={{@groups}}\\n        @answers={{this.auditAnswers}}\\n        @includedEntities={{this.auditIncludedEntities}}\\n        @allUsers={{or (eq @auditType \\\"missions\\\") (eq @auditType \\\"overview\\\")}}\\n        @mode={{this.auditMode}}\\n      />\\n    </XModal>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/course-audit/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { all, reject, resolve } from 'rsvp';\n\nexport default class CourseAuditComponent extends Component {\n  /**\n   * Arguments:\n   * groups (array)\n   * students (array)\n   * auditType (string)\n   * studentSelectValue (object)\n   * isAuditing (bool)\n   * mission (object)\n   */\n\n  @service intl;\n\n  @service router;\n\n  @service routerScroll;\n\n  @tracked auditCollection;\n\n  @tracked auditCustomContent;\n\n  @tracked auditExercise;\n\n  @tracked auditStudent;\n\n  @tracked auditAnswers;\n\n  @tracked auditMode;\n\n  @tracked auditModalTitle;\n\n  @tracked auditIncludedEntities;\n\n  @cached get selectedStudents() {\n    const groups = this.args.groups;\n    const studentSelectValue = this.args.studentSelectValue;\n\n    if (!studentSelectValue) {\n      return this.args.students;\n    } else {\n      const index = groups.map((x) => x.id).indexOf(studentSelectValue);\n\n      if (index !== -1) {\n        return groups\n          .objectAt(index)\n          ?.users?.filter((x) => x.role === 'student')\n          .map((x) => x.id);\n      }\n    }\n\n    return [studentSelectValue];\n  }\n\n  @action openAuditMode({\n    collection,\n    exercise,\n    answers,\n    student,\n    mode,\n    includedEntities,\n    customContent,\n  }) {\n    trackAuditEvent('Öppna rättningsläge', mode);\n\n    return this._openAuditMode(\n      collection,\n      exercise,\n      answers,\n      student,\n      mode,\n      includedEntities,\n      customContent\n    );\n  }\n\n  @action closeAuditMode() {\n    trackAuditEvent('Stäng rättningsläge');\n\n    this.routerScroll.preserveScrollPosition = true;\n\n    return this.router\n      .transitionTo({\n        queryParams: { 'is-auditing': false },\n      })\n      .then(() => {\n        later(this, '_restoreScroll', 100);\n      });\n  }\n\n  @action onAnswerClick(entity, answer) {\n    return all([resolve(entity), resolve(answer)])\n      .then(([exercise, answer]) => {\n        const promises = [];\n\n        if (!exercise) {\n          promises.push(\n            resolve(answer.teacherAssignment).then((teacherAssignment) => {\n              if (teacherAssignment) {\n                return teacherAssignment.createAsEntity(\n                  teacherAssignment.contents.firstObject\n                );\n              } else {\n                return reject();\n              }\n            })\n          );\n        } else {\n          promises.push(resolve(exercise));\n        }\n\n        if (!answer.length) {\n          promises.push(\n            resolve(answer.versions).then((versions) => {\n              if (versions.length === 0) {\n                return resolve([answer]);\n              } else {\n                return resolve(versions);\n              }\n            })\n          );\n        } else {\n          promises.push(resolve(answer));\n        }\n\n        return all(promises);\n      })\n      .then(([exercise, answers]) => {\n        const mode =\n          this.args.auditType === 'comments'\n            ? 'comments'\n            : this.selectedStudents?.length === 1\n            ? 'inbox-single'\n            : 'inbox';\n\n        return this._openAuditMode(\n          exercise.parent,\n          exercise,\n          answers,\n          null,\n          mode,\n          null,\n          null\n        );\n      })\n      .catch(() => {\n        // do nothing\n      });\n  }\n\n  _openAuditMode(\n    collection,\n    exercise,\n    answers,\n    student,\n    mode,\n    includedEntities,\n    customContent\n  ) {\n    if (student) {\n      this.auditStudent = student;\n    } else if (this.selectedStudents.length === 1) {\n      if (mode === 'students') {\n        mode = 'inbox-single';\n      }\n\n      this.auditStudent = this.selectedStudents.slice().shift();\n    } else {\n      this.auditStudent = null;\n    }\n\n    return all([collection, exercise, answers]).then(\n      ([collection, exercise, answers]) => {\n        switch (this.args.auditType) {\n          case 'overview':\n          case 'missions':\n            this.auditModalTitle = collection.title;\n            break;\n          default:\n            this.auditModalTitle = this.intl.t(\n              `components.courseAudit.modalTitle.${this.args.auditType}`\n            );\n        }\n\n        this.auditCollection = collection;\n        this.auditExercise = exercise;\n        this.auditAnswers = answers || [];\n        this.auditMode = mode;\n        this.auditIncludedEntities = includedEntities;\n        this.auditCustomContent = customContent;\n\n        this.routerScroll.preserveScrollPosition = true;\n\n        return this.router\n          .transitionTo({\n            queryParams: { 'is-auditing': true },\n          })\n          .then(() => {\n            later(this, '_restoreScroll', 100);\n          });\n      }\n    );\n  }\n\n  _restoreScroll() {\n    this.routerScroll.preserveScrollPosition = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"course-audit-standard-entity\\\"\\n  {{did-update this.getAnswers @selectedStudents}}\\n  ...attributes\\n>\\n  <XAccordion @expanded={{this.expanded}} @disabled={{this.disabled}} as |a|>\\n    <a.header\\n      @isClickable={{false}}\\n      @onToggle={{this.toggleAccordion}}\\n      class=\\\"p0\\\"\\n    >\\n      <div class=\\\"course-audit-entity flex flex-center justify-space-between\\\">\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          @variant={{unless this.dimmed \\\"default\\\" \\\"inherit\\\"}}\\n          class={{this.buttonClass}}\\n          @disabled={{this.disabled}}\\n          @onClick={{this.toggleAccordion}}\\n        >\\n          {{#let (generate-id \\\"toggle-accordion\\\") as |id|}}\\n            <div id={{id}} class=\\\"flex flex-center\\\">\\n              {{#if this.icon}}\\n                <DcIcon @name={{this.icon}} class=\\\"nr1\\\" />\\n              {{/if}}\\n\\n              {{this.indexStr}}{{@entity.title}}\\n            </div>\\n\\n            {{#if this.dimmed}}\\n              <XTooltip @for={{id}}>\\n                {{t \\\"components.courseAudit.standard.entity.noAnswers\\\"}}\\n              </XTooltip>\\n            {{/if}}\\n          {{/let}}\\n        </UiButton>\\n\\n        <div class=\\\"flex flex-center\\\">\\n          {{#unless this.dimmed}}\\n            {{#if\\n              (and\\n                this.multipleStudents\\n                (or\\n                  (eq @entity.type \\\"collections\\\") (eq @entity.type \\\"sections\\\")\\n                )\\n                @entity.children\\n              )\\n            }}\\n              <UiButton\\n                @appearance=\\\"link\\\"\\n                class=\\\"mr1\\\"\\n                @onClick={{this.onCompare}}\\n              >\\n                <DcIcon @name=\\\"ranking\\\" class=\\\"nr1\\\" />\\n                <span class=\\\"hide-sm\\\">\\n                  {{t \\\"components.courseAudit.standard.entity.compare\\\"}}\\n                </span>\\n              </UiButton>\\n            {{/if}}\\n          {{/unless}}\\n\\n          {{#if this.isLoading}}\\n            {{t \\\"components.courseAudit.standard.entity.loading\\\"}}\\n            <DcLoader @size=\\\"xsmall\\\" class=\\\"nx1\\\" />\\n          {{/if}}\\n        </div>\\n      </div>\\n    </a.header>\\n\\n    <a.content>\\n      {{#if this.expanded}}\\n        <EntityCategorizer\\n          @entity={{@entity}}\\n          @blacklistedEntityTypes={{array \\\"archives\\\" \\\"glossaries\\\"}}\\n          @validEntities={{this.validEntities}}\\n          as |categoryGroup|\\n        >\\n          {{#if\\n            (and @entity.children (not categoryGroup) (not this.isLoading))\\n          }}\\n            <XAlert class=\\\"flex-expand\\\" @variant=\\\"default\\\">\\n              {{t \\\"components.courseAudit.standard.entity.noAudits\\\"}}\\n            </XAlert>\\n          {{/if}}\\n\\n          {{#if categoryGroup.category}}\\n            <div class=\\\"course-audit-entity-category\\\">\\n              {{categoryGroup.category.name}}\\n            </div>\\n          {{/if}}\\n\\n          {{#each categoryGroup.entities key=\\\"id\\\" as |child index|}}\\n            {{#if\\n              (or (eq @entity.type \\\"collections\\\") (eq @entity.type \\\"sections\\\"))\\n            }}\\n              {{#if this.multipleStudents}}\\n                <CourseAudit::Standard::Exercise\\n                  @entity={{child.entity}}\\n                  @answers={{this.answers}}\\n                  @index={{increment index}}\\n                  @selectedStudents={{@selectedStudents}}\\n                  @openAuditMode={{this.handleAuditModeOpen}}\\n                  class=\\\"ml1\\\"\\n                />\\n              {{else}}\\n                <CourseAudit::Standard::ExerciseSingle\\n                  @entity={{child.entity}}\\n                  @answers={{this.answers}}\\n                  @index={{increment index}}\\n                  @openAuditMode={{this.handleAuditModeOpen}}\\n                  class=\\\"ml1\\\"\\n                />\\n              {{/if}}\\n            {{else if child.entity.isDiagnosis}}\\n              <CourseAudit::Diagnosis::Part\\n                @part={{child.entity}}\\n                @diagnosis={{@entity}}\\n                @area={{@entity.parent}}\\n                @selectedStudents={{@selectedStudents}}\\n                @groups={{@groups}}\\n                @openAuditMode={{this.handleAuditModeOpen}}\\n              />\\n            {{else if (gt child.entity.childrenSum 0)}}\\n              <CourseAudit::Standard::Entity\\n                @entity={{child.entity}}\\n                @index={{unless @entity.hideSortNumbers (if (eq @entity.type \\\"areas\\\") child.index index)}}\\n                @groups={{@groups}}\\n                @increment={{not (eq @entity.type \\\"areas\\\")}}\\n                @selectedStudents={{@selectedStudents}}\\n                @answeredSiblings={{this.answeredChildren}}\\n                @validEntities={{this.validEntities}}\\n                class=\\\"ml1\\\"\\n                @openAuditMode={{this.handleAuditModeOpen}}\\n              />\\n            {{/if}}\\n          {{/each}}\\n        </EntityCategorizer>\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n\\n  {{#if this.teacherAssignmentCollections}}\\n    <div class=\\\"text-tertiary mt1 ml1 nb1\\\">\\n      {{t \\\"components.courseAudit.standard.entity.teacherAssignments\\\"}}\\n    </div>\\n\\n    {{#each this.teacherAssignmentCollections as |collection|}}\\n      <CourseAudit::TeacherAssignments::TeacherCollection\\n        @selectedStudents={{@selectedStudents}}\\n        @collection={{collection}}\\n        @customContent={{@customContent}}\\n        @openAuditMode={{this.handleAuditModeOpen}}\\n      />\\n    {{/each}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"course-audit-standard-entity\\\"\\n  {{did-update this.getAnswers @selectedStudents}}\\n  ...attributes\\n>\\n  <XAccordion @expanded={{this.expanded}} @disabled={{this.disabled}} as |a|>\\n    <a.header\\n      @isClickable={{false}}\\n      @onToggle={{this.toggleAccordion}}\\n      class=\\\"p0\\\"\\n    >\\n      <div class=\\\"course-audit-entity flex flex-center justify-space-between\\\">\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          @variant={{unless this.dimmed \\\"default\\\" \\\"inherit\\\"}}\\n          class={{this.buttonClass}}\\n          @disabled={{this.disabled}}\\n          @onClick={{this.toggleAccordion}}\\n        >\\n          {{#let (generate-id \\\"toggle-accordion\\\") as |id|}}\\n            <div id={{id}} class=\\\"flex flex-center\\\">\\n              {{#if this.icon}}\\n                <DcIcon @name={{this.icon}} class=\\\"nr1\\\" />\\n              {{/if}}\\n\\n              {{this.indexStr}}{{@entity.title}}\\n            </div>\\n\\n            {{#if this.dimmed}}\\n              <XTooltip @for={{id}}>\\n                {{t \\\"components.courseAudit.standard.entity.noAnswers\\\"}}\\n              </XTooltip>\\n            {{/if}}\\n          {{/let}}\\n        </UiButton>\\n\\n        <div class=\\\"flex flex-center\\\">\\n          {{#unless this.dimmed}}\\n            {{#if\\n              (and\\n                this.multipleStudents\\n                (or\\n                  (eq @entity.type \\\"collections\\\") (eq @entity.type \\\"sections\\\")\\n                )\\n                @entity.children\\n              )\\n            }}\\n              <UiButton\\n                @appearance=\\\"link\\\"\\n                class=\\\"mr1\\\"\\n                @onClick={{this.onCompare}}\\n              >\\n                <DcIcon @name=\\\"ranking\\\" class=\\\"nr1\\\" />\\n                <span class=\\\"hide-sm\\\">\\n                  {{t \\\"components.courseAudit.standard.entity.compare\\\"}}\\n                </span>\\n              </UiButton>\\n            {{/if}}\\n          {{/unless}}\\n\\n          {{#if this.isLoading}}\\n            {{t \\\"components.courseAudit.standard.entity.loading\\\"}}\\n            <DcLoader @size=\\\"xsmall\\\" class=\\\"nx1\\\" />\\n          {{/if}}\\n        </div>\\n      </div>\\n    </a.header>\\n\\n    <a.content>\\n      {{#if this.expanded}}\\n        <EntityCategorizer\\n          @entity={{@entity}}\\n          @blacklistedEntityTypes={{array \\\"archives\\\" \\\"glossaries\\\"}}\\n          @validEntities={{this.validEntities}}\\n          as |categoryGroup|\\n        >\\n          {{#if\\n            (and @entity.children (not categoryGroup) (not this.isLoading))\\n          }}\\n            <XAlert class=\\\"flex-expand\\\" @variant=\\\"default\\\">\\n              {{t \\\"components.courseAudit.standard.entity.noAudits\\\"}}\\n            </XAlert>\\n          {{/if}}\\n\\n          {{#if categoryGroup.category}}\\n            <div class=\\\"course-audit-entity-category\\\">\\n              {{categoryGroup.category.name}}\\n            </div>\\n          {{/if}}\\n\\n          {{#each categoryGroup.entities key=\\\"id\\\" as |child index|}}\\n            {{#if\\n              (or (eq @entity.type \\\"collections\\\") (eq @entity.type \\\"sections\\\"))\\n            }}\\n              {{#if this.multipleStudents}}\\n                <CourseAudit::Standard::Exercise\\n                  @entity={{child.entity}}\\n                  @answers={{this.answers}}\\n                  @index={{increment index}}\\n                  @selectedStudents={{@selectedStudents}}\\n                  @openAuditMode={{this.handleAuditModeOpen}}\\n                  class=\\\"ml1\\\"\\n                />\\n              {{else}}\\n                <CourseAudit::Standard::ExerciseSingle\\n                  @entity={{child.entity}}\\n                  @answers={{this.answers}}\\n                  @index={{increment index}}\\n                  @openAuditMode={{this.handleAuditModeOpen}}\\n                  class=\\\"ml1\\\"\\n                />\\n              {{/if}}\\n            {{else if child.entity.isDiagnosis}}\\n              <CourseAudit::Diagnosis::Part\\n                @part={{child.entity}}\\n                @diagnosis={{@entity}}\\n                @area={{@entity.parent}}\\n                @selectedStudents={{@selectedStudents}}\\n                @groups={{@groups}}\\n                @openAuditMode={{this.handleAuditModeOpen}}\\n              />\\n            {{else if (gt child.entity.childrenSum 0)}}\\n              <CourseAudit::Standard::Entity\\n                @entity={{child.entity}}\\n                @index={{unless @entity.hideSortNumbers (if (eq @entity.type \\\"areas\\\") child.index index)}}\\n                @groups={{@groups}}\\n                @increment={{not (eq @entity.type \\\"areas\\\")}}\\n                @selectedStudents={{@selectedStudents}}\\n                @answeredSiblings={{this.answeredChildren}}\\n                @validEntities={{this.validEntities}}\\n                class=\\\"ml1\\\"\\n                @openAuditMode={{this.handleAuditModeOpen}}\\n              />\\n            {{/if}}\\n          {{/each}}\\n        </EntityCategorizer>\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n\\n  {{#if this.teacherAssignmentCollections}}\\n    <div class=\\\"text-tertiary mt1 ml1 nb1\\\">\\n      {{t \\\"components.courseAudit.standard.entity.teacherAssignments\\\"}}\\n    </div>\\n\\n    {{#each this.teacherAssignmentCollections as |collection|}}\\n      <CourseAudit::TeacherAssignments::TeacherCollection\\n        @selectedStudents={{@selectedStudents}}\\n        @collection={{collection}}\\n        @customContent={{@customContent}}\\n        @openAuditMode={{this.handleAuditModeOpen}}\\n      />\\n    {{/each}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/course-audit/standard/entity/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/standard/entity/index.hbs\"}});\nimport { A } from '@ember/array';\nimport { action } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport answerRules from 'babel/rules/answers';\nimport { entityIsAllowedInCustomContent } from 'babel/utils/entity-is-allowed-in-custom-content';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { singularize } from 'ember-inflector';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditStandardEntityComponent extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * rootEntity (object)\n   * index (number)\n   * groups (array)\n   * increment (bool)\n   * selectedStudents (array)\n   * answeredSiblings (array)\n   * validEntities (array)\n   * openAuditMode (function)\n   * customContent (object)\n   * startExpanded (bool)\n   * includedEntities (array)\n   */\n\n  constructor() {\n    super(...arguments);\n    this.getAnswers();\n  }\n\n  @service ajax;\n\n  @service store;\n\n  @tracked validCollectionChildren;\n\n  @tracked answeredChildren;\n\n  @tracked isLoading = false;\n\n  @tracked answers;\n\n  @tracked numAnswers = 0;\n\n  @tracked expanded = this.args.startExpanded && !this.disabled;\n\n  get entity() {\n    return this.args.entity;\n  }\n\n  get rootEntity() {\n    return this.args.rootEntity;\n  }\n\n  @cached\n  get teacherAssignmentCollections() {\n    const customContent = this.args.customContent;\n\n    if (!customContent) return null;\n\n    return (this.entity?.children || A())\n      .filterBy('type', 'collections')\n      .filterBy('isTeacherCollection', true)\n      .filter((collection) => {\n        if (entityIsAllowedInCustomContent(collection, customContent)) {\n          const allowedChildren = collection.children.filter(\n            (assignment) =>\n              assignment.isPublished &&\n              entityIsAllowedInCustomContent(assignment, customContent)\n          );\n\n          if (allowedChildren.length > 0) {\n            return true;\n          }\n        }\n\n        return false;\n      })\n      .sortBy('title');\n  }\n\n  get validEntities() {\n    if (this.args.validEntities) return this.args.validEntities;\n\n    const includedEntities = this.args.includedEntities;\n\n    if (!includedEntities || includedEntities.length === 0) {\n      return null;\n    }\n\n    return includedEntities;\n  }\n\n  get icon() {\n    if (\n      ['books_external', 'books_junior', 'books_pdf'].includes(this.entity.type)\n    ) {\n      return 'book-external';\n    }\n\n    return singularize(this.entity?.type);\n  }\n\n  get noAnswerCheck() {\n    return (\n      this.args.entity &&\n      this.args.rootEntity &&\n      this.args.entity.id === this.args.rootEntity.id\n    );\n  }\n\n  get hasAnswers() {\n    const answeredSiblings = this.args.answeredSiblings;\n    const entityId = this.entity?.id;\n\n    if (answeredSiblings && entityId) {\n      const index = answeredSiblings.map((x) => x.child_id).indexOf(entityId);\n\n      if (index >= 0) {\n        return parseInt(answeredSiblings[index].num_answers) > 0;\n      }\n    }\n\n    return false;\n  }\n\n  get isIncluded() {\n    const answeredSiblings = this.args.answeredSiblings;\n    const entityId = this.entity?.id;\n\n    if (!answeredSiblings || !entityId) {\n      return false;\n    }\n\n    if (answeredSiblings.findIndex((x) => x.child_id === entityId) !== -1) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get indexStr() {\n    const index = this.args.index;\n\n    if (index || index === 0) {\n      if (this.args.increment) {\n        return index + 1 + '. ';\n      }\n\n      return index + '. ';\n    }\n\n    return null;\n  }\n\n  get multipleStudents() {\n    return this.args.selectedStudents?.length > 1;\n  }\n\n  get dimmed() {\n    return !this.numAnswers && !this.hasAnswers && !this.noAnswerCheck;\n  }\n\n  get disabled() {\n    if (this.isLoading) return true;\n\n    if (\n      ['books_external', 'books_junior', 'books_pdf'].includes(this.entity.type)\n    ) {\n      return true;\n    }\n\n    if (this.noAnswerCheck) {\n      const entity = this.entity;\n      const validEntities = this.validEntities;\n\n      if (validEntities && !entity?.isTeacherCollection && !entity.isCarousel) {\n        return (\n          entity?.children.filter((entity) => validEntities.includes(entity))\n            .length === 0\n        );\n      }\n\n      return false;\n    }\n\n    return !this.isIncluded;\n  }\n\n  get buttonClass() {\n    const classNames = ['flex-auto', 'text-heading', 'py1'];\n\n    if (this.disabled) {\n      classNames.push('disabled');\n    } else if (this.dimmed) {\n      classNames.push('text-muted');\n    }\n\n    return classNames.join(' ');\n  }\n\n  @action\n  toggleAccordion() {\n    if (this.disabled) return;\n    this._toggleAccordion();\n  }\n\n  @action\n  onCompare() {\n    trackAuditEvent('Jämför');\n\n    const promises = [];\n\n    if (!this.answers) {\n      promises.push(this._collectionAnswers());\n    }\n\n    return all(promises).then(() =>\n      this.handleAuditModeOpen({\n        collection: this.entity,\n        exercise: this.entity?.children?.firstObject,\n        answers: this.answers,\n        student: null,\n        mode: 'compare',\n      })\n    );\n  }\n\n  @action\n  handleAuditModeOpen(obj) {\n    obj.includedEntities = this.validEntities;\n    obj.customContent = this.args.customContent;\n\n    return this.args.openAuditMode?.(obj);\n  }\n\n  _toggleAccordion() {\n    this.expanded = !this.expanded;\n    this.getAnswers();\n  }\n\n  @action\n  getAnswers() {\n    scheduleOnce('afterRender', this, this._getAnswers);\n  }\n\n  async _getAnswers() {\n    const entity = this.entity;\n\n    this.isLoading = true;\n\n    if (this.expanded) {\n      await this._getAnsweredChildren(entity);\n\n      if (entity?.type === 'collections' || entity?.type === 'sections') {\n        if (this.numAnswers > 0) {\n          await this._collectionAnswers();\n        } else {\n          this.answers = [];\n          this.numAnswers = 0;\n        }\n      }\n    }\n\n    this.isLoading = false;\n  }\n\n  async _collectionAnswers() {\n    const entity = this.entity;\n    const selectedStudents = this.args.selectedStudents;\n    const filter = {\n      user_id: selectedStudents?.join(','),\n      collection_id: entity?.id,\n      type: 'standard',\n      all: true,\n      status: answerRules.startedStatuses,\n    };\n    const page = { size: 1000, number: 0 };\n\n    let answers = [],\n      answersResult;\n\n    try {\n      answersResult = await this.store.query('answer', { page, filter });\n      answers.addObjects(answersResult);\n    } catch (err) {\n      // do nothing\n    }\n\n    const numPages = answersResult?.meta?.totalPages || 0;\n\n    if (numPages > 1) {\n      const promises = [];\n      let i;\n\n      for (i = 2; i <= numPages; i++) {\n        promises.push(\n          this.store.query('answer', {\n            page: { size: page.size, number: i },\n            filter,\n          })\n        );\n      }\n\n      await all(promises)\n        .then((responses) => {\n          responses.forEach((response) => {\n            answers.addObjects(response);\n          });\n        })\n        .catch(() => {\n          // do nothing\n        });\n    }\n\n    const validEntities = this.validEntities;\n    const validEntityIds =\n      validEntities && validEntities.map((entity) => entity.get('id'));\n\n    let validCollectionChildren;\n\n    try {\n      validCollectionChildren = await resolve(entity.children);\n    } catch (err) {\n      // do nothing\n    }\n\n    if (validEntityIds && !entity?.isTeacherCollection && !entity?.isCarousel) {\n      answers = answers.filter((answer) => {\n        return validEntityIds.includes(answer.belongsTo('entity').id());\n      });\n\n      validCollectionChildren = validCollectionChildren?.filter((child) => {\n        return validEntityIds.includes(child.id);\n      });\n    }\n\n    this.validCollectionChildren = validCollectionChildren;\n    this.answers = answers;\n    this.numAnswers = answers.length;\n  }\n\n  async _getAnsweredChildren(entity) {\n    const selectedStudents = this.args.selectedStudents;\n\n    let entities = [];\n\n    if (!entity) {\n      return entities;\n    }\n\n    try {\n      entities = await this.ajax.request(\n        `${config.endpoint}/api/v1/meta/answers/answered-children`,\n        true,\n        {\n          type: 'GET',\n          data: {\n            user_id: selectedStudents?.join(','),\n            entity: entity.id,\n          },\n        }\n      );\n    } catch (err) {\n      // do nothing\n    }\n\n    const validEntityIds = this.validEntities?.mapBy('id');\n\n    if (validEntityIds && !entity?.isTeacherCollection && !entity?.isCarousel) {\n      entities = entities.filter((entity) =>\n        validEntityIds.includes(entity.child_id)\n      );\n    }\n\n    this.numAnswers = entities\n      .map((x) => parseInt(x.num_answers))\n      .reduce((a, b) => a + b, 0);\n\n    this.answeredChildren = entities;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"flex flex-center hover-highlight\\\">\\n  <UiButton\\n    class=\\\"p1 flex-auto\\\"\\n    @appearance=\\\"link\\\"\\n    @variant=\\\"inherit\\\"\\n    @onClick={{fn @openAuditMode (hash\\n      collection=(or @collection @entity.parent)\\n      exercise=@entity\\n      answers=@answers\\n      student=null\\n      mode=\\\"students\\\"\\n    )}}\\n  >\\n    <AnswerStatusIcon @status={{this.status}} class=\\\"nr1\\\" />\\n\\n    <div class=\\\"text-ui{{if (not-eq this.status \\\"not-started\\\") \\\" text-color-default\\\"}}\\\">\\n      {{#unless @entity.hideAssignmentSortNumbers}}\\n        {{or @index @entity.sort}}.\\n      {{/unless}}\\n\\n      {{@entity.title}}\\n    </div>\\n  </UiButton>\\n</div>\\n\", {\"contents\":\"<div class=\\\"flex flex-center hover-highlight\\\">\\n  <UiButton\\n    class=\\\"p1 flex-auto\\\"\\n    @appearance=\\\"link\\\"\\n    @variant=\\\"inherit\\\"\\n    @onClick={{fn @openAuditMode (hash\\n      collection=(or @collection @entity.parent)\\n      exercise=@entity\\n      answers=@answers\\n      student=null\\n      mode=\\\"students\\\"\\n    )}}\\n  >\\n    <AnswerStatusIcon @status={{this.status}} class=\\\"nr1\\\" />\\n\\n    <div class=\\\"text-ui{{if (not-eq this.status \\\"not-started\\\") \\\" text-color-default\\\"}}\\\">\\n      {{#unless @entity.hideAssignmentSortNumbers}}\\n        {{or @index @entity.sort}}.\\n      {{/unless}}\\n\\n      {{@entity.title}}\\n    </div>\\n  </UiButton>\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/standard/exercise-single/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/standard/exercise-single/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { getLatestVersion } from 'babel/utils/get-answer';\n\nexport default class CourseAuditStandardExerciseSingleComponent extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * index (number)\n   * collection (object)\n   * answers (array)\n   * openAuditMode (function)\n   */\n\n  @cached get answer() {\n    return getLatestVersion(this.args.entity, this.args.answers);\n  }\n\n  get status() {\n    return this.answer?.computedStatus || 'not-started';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"flex hover-highlight\\\">\\n  <a\\n    href=\\\"#\\\"\\n    class=\\\"flex flex-auto flex-center p1 text-ui ui-link text-color-default\\\"\\n    {{on \\\"click\\\" this.handleClick}}\\n  >\\n    <div class=\\\"flex-auto\\\">\\n      {{#unless @entity.hideAssignmentSortNumbers}}\\n        {{or @index @entity.sort}}.\\n      {{/unless}}\\n\\n      {{@entity.title}}\\n    </div>\\n\\n    <DcIcon @name=\\\"group\\\" class=\\\"flex-shrink ml1 nr1\\\" />\\n\\n    <div class=\\\"flex-shrink\\\">\\n      {{t\\n        \\\"components.courseAudit.standard.exercise.numAnswered\\\"\\n        count=this.numAnswers\\n        total=this.numSelectedStudents\\n      }}\\n    </div>\\n  </a>\\n</div>\", {\"contents\":\"<div class=\\\"flex hover-highlight\\\">\\n  <a\\n    href=\\\"#\\\"\\n    class=\\\"flex flex-auto flex-center p1 text-ui ui-link text-color-default\\\"\\n    {{on \\\"click\\\" this.handleClick}}\\n  >\\n    <div class=\\\"flex-auto\\\">\\n      {{#unless @entity.hideAssignmentSortNumbers}}\\n        {{or @index @entity.sort}}.\\n      {{/unless}}\\n\\n      {{@entity.title}}\\n    </div>\\n\\n    <DcIcon @name=\\\"group\\\" class=\\\"flex-shrink ml1 nr1\\\" />\\n\\n    <div class=\\\"flex-shrink\\\">\\n      {{t\\n        \\\"components.courseAudit.standard.exercise.numAnswered\\\"\\n        count=this.numAnswers\\n        total=this.numSelectedStudents\\n      }}\\n    </div>\\n  </a>\\n</div>\",\"moduleName\":\"babel/components/course-audit/standard/exercise/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/standard/exercise/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditStandardExerciseComponent extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * collection (object)\n   * index (number)\n   * answers (array)\n   * selectedStudents (array)\n   * openAuditMode (function)\n   */\n\n  get numSelectedStudents() {\n    return this.args.selectedStudents?.length || 0;\n  }\n\n  @cached get numAnswersProxy() {\n    const answers = this.args.answers;\n\n    let promise;\n\n    if (!answers) {\n      promise = resolve(0);\n    } else {\n      const entityId = this.args.entity?.id;\n      const teacherAssignmentId = this.args.entity?.isTeacherAssignment\n        ? this.args.entity?.teacherAssignment?.id\n        : null;\n\n      promise = all(\n        answers.map((answer) =>\n          all([answer.user, answer.teacherAssignment]).then(\n            ([user, teacherAssignment]) =>\n              answer.node_id === entityId ||\n              (teacherAssignmentId &&\n                teacherAssignment?.id === teacherAssignmentId)\n                ? user.id\n                : null\n          )\n        )\n      ).then(\n        (users) =>\n          users.filter((val, idx, self) => val && self.indexOf(val) === idx)\n            .length\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get numAnswers() {\n    return this.numAnswersProxy.isResolved ? this.numAnswersProxy.value : 0;\n  }\n\n  @action handleClick(evt) {\n    evt.preventDefault();\n\n    this.args.openAuditMode?.({\n      collection: this.args.collection || this.args.entity.parent,\n      exercise: this.args.entity,\n      answers: this.args.answers,\n      student: null,\n      mode: 'assignments',\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div ...attributes>\\n  {{#if @students}}\\n    {{#each @students as |student|}}\\n      <CourseAudit::StudentList::Item\\n        @student={{student}}\\n        @isActive={{eq student.id @student}}\\n        @showStatus={{@showStatus}}\\n        @showNumAnswers={{@showNumAnswers}}\\n        @exercise={{@exercise}}\\n        @answers={{@answers}}\\n        @selectedAnswerId={{@selectedAnswerId}}\\n        @goTo={{@goTo}}\\n      />\\n    {{/each}}\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div ...attributes>\\n  {{#if @students}}\\n    {{#each @students as |student|}}\\n      <CourseAudit::StudentList::Item\\n        @student={{student}}\\n        @isActive={{eq student.id @student}}\\n        @showStatus={{@showStatus}}\\n        @showNumAnswers={{@showNumAnswers}}\\n        @exercise={{@exercise}}\\n        @answers={{@answers}}\\n        @selectedAnswerId={{@selectedAnswerId}}\\n        @goTo={{@goTo}}\\n      />\\n    {{/each}}\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/course-audit/student-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/student-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li class={{this.classes}}>\\n  <a href=\\\"#\\\" class=\\\"student-list-item-link\\\" {{on \\\"click\\\" this.handleClick}}>\\n    {{#if (and @showStatus this.status)}}\\n      <AnswerStatusIcon @status={{this.status}} class=\\\"nr1\\\" />\\n    {{/if}}\\n\\n    <span class=\\\"hyphens word-break-all\\\">\\n      {{@student.showname}}\\n    </span>\\n\\n    {{#if @showNumAnswers}}\\n      {{#let (generate-id \\\"num-answers-badge\\\") as |id|}}\\n        <XBadge\\n          @id={{id}}\\n          class=\\\"num-answers-badge nl1\\\"\\n          @variant=\\\"flat\\\"\\n          @size=\\\"small\\\"\\n        >\\n          {{this.numAnswers}}\\n        </XBadge>\\n\\n        <XTooltip @for={{id}}>\\n          {{t \\\"components.courseAudit.studentList.numAnswers\\\"}}\\n        </XTooltip>\\n      {{/let}}\\n    {{/if}}\\n  </a>\\n</li>\", {\"contents\":\"<li class={{this.classes}}>\\n  <a href=\\\"#\\\" class=\\\"student-list-item-link\\\" {{on \\\"click\\\" this.handleClick}}>\\n    {{#if (and @showStatus this.status)}}\\n      <AnswerStatusIcon @status={{this.status}} class=\\\"nr1\\\" />\\n    {{/if}}\\n\\n    <span class=\\\"hyphens word-break-all\\\">\\n      {{@student.showname}}\\n    </span>\\n\\n    {{#if @showNumAnswers}}\\n      {{#let (generate-id \\\"num-answers-badge\\\") as |id|}}\\n        <XBadge\\n          @id={{id}}\\n          class=\\\"num-answers-badge nl1\\\"\\n          @variant=\\\"flat\\\"\\n          @size=\\\"small\\\"\\n        >\\n          {{this.numAnswers}}\\n        </XBadge>\\n\\n        <XTooltip @for={{id}}>\\n          {{t \\\"components.courseAudit.studentList.numAnswers\\\"}}\\n        </XTooltip>\\n      {{/let}}\\n    {{/if}}\\n  </a>\\n</li>\",\"moduleName\":\"babel/components/course-audit/student-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/student-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { getLatestVersion } from 'babel/utils/get-answer';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditStudentListItemComponent extends Component {\n  /**\n   * Arguments:\n   * student (object)\n   * isActive (bool)\n   * showStatus (bool)\n   * showNumAnswers (bool)\n   * exercise (object)\n   * answers (array)\n   * goTo (function)\n   */\n\n  @cached get studentAnswersProxy() {\n    const studentId = this.args.student?.id;\n\n    const promise = resolve(this.args.answers)\n      .then((answers) =>\n        all(\n          answers.map((answer) =>\n            resolve(answer.user).then((user) =>\n              user.id === studentId ? answer : null\n            )\n          )\n        )\n      )\n      .then((answers) => answers.filter((x) => x));\n\n    return load(promise, this);\n  }\n\n  get studentAnswers() {\n    return this.studentAnswersProxy.isResolved\n      ? this.studentAnswersProxy.value\n      : null;\n  }\n\n  @cached get answer() {\n    const studentAnswers = this.studentAnswers;\n\n    // A data bug lets students end up with duplicate answer chains for the\n    // same exercise; when the caller points at a specific answer, show the\n    // status of that chain instead of resolving one by version number.\n    const selectedAnswerId = this.args.selectedAnswerId;\n\n    if (selectedAnswerId && studentAnswers) {\n      const selected = studentAnswers.find(\n        (item) => item.id === selectedAnswerId\n      );\n\n      if (selected) {\n        const chainVersions = studentAnswers\n          .filter(\n            (item) => item.belongsTo('originalAnswer').id() === selected.id\n          )\n          .sort((left, right) => (right.version ?? 0) - (left.version ?? 0));\n\n        return chainVersions[0] ?? selected;\n      }\n    }\n\n    return getLatestVersion(this.args.exercise, studentAnswers);\n  }\n\n  @cached get numAnswers() {\n    const studentAnswers = this.studentAnswers;\n\n    if (studentAnswers) {\n      return studentAnswers\n        .filter((x) => x.status !== 'not-started')\n        .map((x) =>\n          x.node_id ? x.node_id : x.belongsTo('teacherAssignment').id()\n        )\n        .filter((val, idx, self) => self.indexOf(val) === idx).length;\n    }\n\n    return 0;\n  }\n\n  get classes() {\n    const classes = ['student-list-item'];\n\n    if (this.args.isActive) {\n      classes.push('student-list-item--active');\n    }\n\n    return classes.join(' ');\n  }\n\n  get status() {\n    return this.answer?.computedStatus || 'not-started';\n  }\n\n  @action handleClick(evt) {\n    evt.preventDefault();\n    this.args.goTo?.(this.args.student);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XAccordion @expanded={{this.expanded}} @disabled={{this.disabled}} as |a|>\\n  <a.header @isClickable={{true}} class=\\\"p0\\\">\\n    <div class=\\\"py1 {{if this.disabled 'disabled text-muted'}}\\\">\\n      <div class=\\\"text-heading flex flex-center\\\">\\n        <DcIcon @name=\\\"book\\\" class=\\\"nr1\\\" />\\n        {{@book.title}}\\n      </div>\\n\\n      {{#if this.disabled}}\\n        {{t \\\"components.courseAudit.teacherAssignments.noTeacherAssignments\\\"}}\\n      {{/if}}\\n    </div>\\n  </a.header>\\n\\n  <a.content>\\n    {{#each this.teachers as |teacher|}}\\n      <CourseAudit::TeacherAssignments::Teacher\\n        @teacher={{teacher}}\\n        @teacherAssignments={{this.bookTeacherAssignments}}\\n        @selectedStudents={{@selectedStudents}}\\n        @openAuditMode={{@openAuditMode}}\\n      />\\n    {{/each}}\\n  </a.content>\\n</XAccordion>\", {\"contents\":\"<XAccordion @expanded={{this.expanded}} @disabled={{this.disabled}} as |a|>\\n  <a.header @isClickable={{true}} class=\\\"p0\\\">\\n    <div class=\\\"py1 {{if this.disabled 'disabled text-muted'}}\\\">\\n      <div class=\\\"text-heading flex flex-center\\\">\\n        <DcIcon @name=\\\"book\\\" class=\\\"nr1\\\" />\\n        {{@book.title}}\\n      </div>\\n\\n      {{#if this.disabled}}\\n        {{t \\\"components.courseAudit.teacherAssignments.noTeacherAssignments\\\"}}\\n      {{/if}}\\n    </div>\\n  </a.header>\\n\\n  <a.content>\\n    {{#each this.teachers as |teacher|}}\\n      <CourseAudit::TeacherAssignments::Teacher\\n        @teacher={{teacher}}\\n        @teacherAssignments={{this.bookTeacherAssignments}}\\n        @selectedStudents={{@selectedStudents}}\\n        @openAuditMode={{@openAuditMode}}\\n      />\\n    {{/each}}\\n  </a.content>\\n</XAccordion>\",\"moduleName\":\"babel/components/course-audit/teacher-assignments/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/teacher-assignments/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditTeacherAssignmentsComponent extends Component {\n  /**\n   * Arguments:\n   * selectedStudents (array)\n   * book (object)\n   * groups (array)\n   * course (object)\n   * teacherAssignments (array)\n   * openAuditMode (function)\n   */\n\n  @tracked expanded = false;\n\n  @cached get bookTeacherAssignments() {\n    const teacherAssignments = this.args.teacherAssignments;\n    const book = this.args.book;\n\n    if (teacherAssignments && book) {\n      return teacherAssignments.filter(\n        (teacherAssignment) =>\n          teacherAssignment.isPublished &&\n          teacherAssignment.hasBook(book) &&\n          teacherAssignment.contents.length > 0\n      );\n    }\n\n    return null;\n  }\n\n  @cached get teachersProxy() {\n    let promise = resolve();\n\n    if (this.bookTeacherAssignments) {\n      promise = all(\n        this.bookTeacherAssignments.map((assignment) =>\n          resolve(assignment.user)\n        )\n      ).then((teachers) => teachers.uniqBy('id').sortBy('showname'));\n    }\n\n    return load(promise, this);\n  }\n\n  get teachers() {\n    return this.teachersProxy.isResolved ? this.teachersProxy.value : null;\n  }\n\n  get disabled() {\n    return this.bookTeacherAssignments?.length >= 1 ? false : true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.allowedAssignments}}\\n  <XAccordion\\n    class=\\\"ml1\\\"\\n    {{did-insert this.getAnswers}}\\n    {{did-update this.getAnswers @selectedStudents}}\\n    as |a|\\n  >\\n    <a.header @isClickable={{true}} class=\\\"p0\\\">\\n      <div class=\\\"flex flex-center justify-space-between\\\">\\n        <div class=\\\"flex flex-center ny1\\\">\\n          <XAwait @value={{this.teacher}} as |teacher|>\\n            <DcAvatar @size=\\\"large\\\" @user={{teacher}} />\\n\\n            <div\\n              class=\\\"text-heading {{unless this.numAnswers 'text-muted '}}nl1\\\"\\n            >\\n              {{this.teacher.showname}}\\n            </div>\\n          </XAwait>\\n        </div>\\n\\n        {{#if (and this.multipleStudents this.numAnswers)}}\\n          <UiButton\\n            @appearance=\\\"link\\\"\\n            class=\\\"mr1\\\"\\n            @onClick={{this.handleCompareClick}}\\n          >\\n            <DcIcon @name=\\\"ranking\\\" class=\\\"nr1\\\" />\\n            {{t\\n              \\\"components.courseAudit.teacherAssignments.teacherCollection.compare\\\"\\n            }}\\n          </UiButton>\\n        {{/if}}\\n      </div>\\n    </a.header>\\n\\n    <a.content class=\\\"ml1\\\">\\n      {{#if this.isLoading}}\\n        <DcLoader />\\n      {{else}}\\n        {{#each this.allowedAssignments as |assignment index|}}\\n          {{#if assignment.isPublished}}\\n            {{#let (increment index) as |sort|}}\\n              {{#if this.multipleStudents}}\\n                <CourseAudit::Standard::Exercise\\n                  @entity={{assignment}}\\n                  @index={{sort}}\\n                  @collection={{@collection}}\\n                  @answers={{this.answers}}\\n                  @selectedStudents={{@selectedStudents}}\\n                  @openAuditMode={{@openAuditMode}}\\n                />\\n              {{else}}\\n                <CourseAudit::Standard::ExerciseSingle\\n                  @entity={{assignment}}\\n                  @index={{sort}}\\n                  @collection={{@collection}}\\n                  @answers={{this.answers}}\\n                  @openAuditMode={{@openAuditMode}}\\n                />\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        {{/each}}\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n{{/if}}\\n\", {\"contents\":\"{{#if this.allowedAssignments}}\\n  <XAccordion\\n    class=\\\"ml1\\\"\\n    {{did-insert this.getAnswers}}\\n    {{did-update this.getAnswers @selectedStudents}}\\n    as |a|\\n  >\\n    <a.header @isClickable={{true}} class=\\\"p0\\\">\\n      <div class=\\\"flex flex-center justify-space-between\\\">\\n        <div class=\\\"flex flex-center ny1\\\">\\n          <XAwait @value={{this.teacher}} as |teacher|>\\n            <DcAvatar @size=\\\"large\\\" @user={{teacher}} />\\n\\n            <div\\n              class=\\\"text-heading {{unless this.numAnswers 'text-muted '}}nl1\\\"\\n            >\\n              {{this.teacher.showname}}\\n            </div>\\n          </XAwait>\\n        </div>\\n\\n        {{#if (and this.multipleStudents this.numAnswers)}}\\n          <UiButton\\n            @appearance=\\\"link\\\"\\n            class=\\\"mr1\\\"\\n            @onClick={{this.handleCompareClick}}\\n          >\\n            <DcIcon @name=\\\"ranking\\\" class=\\\"nr1\\\" />\\n            {{t\\n              \\\"components.courseAudit.teacherAssignments.teacherCollection.compare\\\"\\n            }}\\n          </UiButton>\\n        {{/if}}\\n      </div>\\n    </a.header>\\n\\n    <a.content class=\\\"ml1\\\">\\n      {{#if this.isLoading}}\\n        <DcLoader />\\n      {{else}}\\n        {{#each this.allowedAssignments as |assignment index|}}\\n          {{#if assignment.isPublished}}\\n            {{#let (increment index) as |sort|}}\\n              {{#if this.multipleStudents}}\\n                <CourseAudit::Standard::Exercise\\n                  @entity={{assignment}}\\n                  @index={{sort}}\\n                  @collection={{@collection}}\\n                  @answers={{this.answers}}\\n                  @selectedStudents={{@selectedStudents}}\\n                  @openAuditMode={{@openAuditMode}}\\n                />\\n              {{else}}\\n                <CourseAudit::Standard::ExerciseSingle\\n                  @entity={{assignment}}\\n                  @index={{sort}}\\n                  @collection={{@collection}}\\n                  @answers={{this.answers}}\\n                  @openAuditMode={{@openAuditMode}}\\n                />\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        {{/each}}\\n      {{/if}}\\n    </a.content>\\n  </XAccordion>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/course-audit/teacher-assignments/teacher-collection/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/teacher-assignments/teacher-collection/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport answerRules from 'babel/rules/answers';\nimport { entityIsAllowedInCustomContent } from 'babel/utils/entity-is-allowed-in-custom-content';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\n\nexport default class CourseAuditTeacherAssignmentsTeacherCollectionComponent extends Component {\n  /**\n   * Arguments:\n   * selectedStudents (array)\n   * collection (object)\n   * customContent (object)\n   * openAuditMode (function)\n   */\n\n  @service store;\n\n  @tracked isLoading = true;\n\n  @tracked answers;\n\n  @tracked numAnswers;\n\n  get teacher() {\n    return this.args.collection?.owner;\n  }\n\n  get allowedAssignments() {\n    const customContent = this.args.customContent;\n\n    return this.args.collection?.children\n      ?.filter((child) => entityIsAllowedInCustomContent(child, customContent))\n      ?.sortBy('title');\n  }\n\n  get multipleStudents() {\n    return this.args.selectedStudents?.length > 1;\n  }\n\n  @action\n  async getAnswers() {\n    this.isLoading = true;\n\n    const selectedStudents = this.args.selectedStudents;\n    const allowedAssignments = this.allowedAssignments;\n\n    if (!selectedStudents || !allowedAssignments) return;\n\n    if (allowedAssignments.length === 0) {\n      this.answers = [];\n      this.numAnswers = 0;\n      this.isLoading = false;\n      return;\n    }\n\n    const page = { size: 1000, number: 0 };\n\n    const filter = {\n      user_id: selectedStudents?.join(','),\n      type: 'teacher_assignment',\n      teacher_assignment_id: allowedAssignments?.map(\n        (x) => x.teacherAssignment.id\n      ),\n      all: true,\n      status: answerRules.startedStatuses,\n    };\n\n    let answers = [];\n\n    try {\n      answers = await this.store.query('answer', {\n        page: page,\n        filter: filter,\n      });\n    } catch (err) {\n      // do nothing\n    }\n\n    this.answers = answers;\n    this.numAnswers = answers.length;\n    this.isLoading = false;\n  }\n\n  @action\n  handleCompareClick() {\n    trackAuditEvent('Jämför', 'Läraruppgift');\n\n    this.args.openAuditMode?.({\n      collection: this.args.collection,\n      exercise: this.allowedAssignments?.firstObject,\n      answers: this.answers,\n      student: null,\n      mode: 'compare',\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<CourseAudit::TeacherAssignments::TeacherCollection\\n  @selectedStudents={{@selectedStudents}}\\n  @collection={{this.collection}}\\n  @openAuditMode={{@openAuditMode}}\\n/>\\n\", {\"contents\":\"<CourseAudit::TeacherAssignments::TeacherCollection\\n  @selectedStudents={{@selectedStudents}}\\n  @collection={{this.collection}}\\n  @openAuditMode={{@openAuditMode}}\\n/>\\n\",\"moduleName\":\"babel/components/course-audit/teacher-assignments/teacher/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/teacher-assignments/teacher/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseAuditTeacherAssignmentsTeacherComponent extends Component {\n  /**\n   * Arguments:\n   * teacher (object)\n   * teacherAssignments (array)\n   * selectedStudents (array)\n   * openAuditMode (function)\n   */\n\n  @cached get teacherProxy() {\n    return load(resolve(this.args.teacher), this);\n  }\n\n  get teacher() {\n    return this.teacherProxy.isResolved ? this.teacherProxy.value : null;\n  }\n\n  @cached get assignmentsProxy() {\n    const teacherId = this.teacher?.id;\n    const teacherAssignments = this.args.teacherAssignments;\n\n    let promise = resolve();\n\n    if (teacherId && teacherAssignments) {\n      promise = all(\n        teacherAssignments.map((teacherAssignment) =>\n          all([teacherAssignment.user, teacherAssignment.contents]).then(\n            ([user, contents]) =>\n              user?.id === teacherId\n                ? teacherAssignment.createAsEntity(contents?.firstObject)\n                : null\n          )\n        )\n      ).then((assignments) => assignments.filter((x) => x));\n    }\n\n    return load(promise, this);\n  }\n\n  get assignments() {\n    return this.assignmentsProxy.isResolved\n      ? this.assignmentsProxy.value\n      : null;\n  }\n\n  get collection() {\n    return {\n      title: this.teacher?.showname,\n      isTeacherCollection: true,\n      children: this.assignments,\n      owner: this.teacher,\n    };\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"popup-versions\\\">\\n  <div class=\\\"text-tertiary hide-sm p1 bb1\\\">\\n    {{t \\\"components.courseAudit.versionPopup.versions\\\"}}\\n  </div>\\n\\n  {{#each @versions as |version|}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @variant=\\\"inherit\\\"\\n      @width=\\\"expand\\\"\\n      @onClick={{fn @changeVersion version}}\\n    >\\n      <div\\n        class=\\\"popup-version{{if\\n            (eq version @selectedVersion)\\n            ' popup-version--selected'\\n          }}\\\"\\n      >\\n        <DcIcon @name=\\\"check\\\" @size=\\\"xs\\\" class=\\\"popup-version-icon\\\" />\\n\\n        <div class=\\\"popup-version-title flex-one\\\">\\n          <div class=\\\"text-bold\\\">\\n            {{t\\n              \\\"components.courseAudit.versionPopup.version\\\"\\n              version=(or version.version @versions.length)\\n            }}\\n          </div>\\n\\n          <div class=\\\"text-small text-base\\\">\\n            {{format-date\\n              version.created\\n              year=\\\"numeric\\\"\\n              month=\\\"numeric\\\"\\n              day=\\\"numeric\\\"\\n              hour=\\\"numeric\\\"\\n              minute=\\\"numeric\\\"\\n              second=\\\"numeric\\\"\\n            }}\\n          </div>\\n        </div>\\n      </div>\\n    </UiButton>\\n  {{/each}}\\n</div>\", {\"contents\":\"<div class=\\\"popup-versions\\\">\\n  <div class=\\\"text-tertiary hide-sm p1 bb1\\\">\\n    {{t \\\"components.courseAudit.versionPopup.versions\\\"}}\\n  </div>\\n\\n  {{#each @versions as |version|}}\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @variant=\\\"inherit\\\"\\n      @width=\\\"expand\\\"\\n      @onClick={{fn @changeVersion version}}\\n    >\\n      <div\\n        class=\\\"popup-version{{if\\n            (eq version @selectedVersion)\\n            ' popup-version--selected'\\n          }}\\\"\\n      >\\n        <DcIcon @name=\\\"check\\\" @size=\\\"xs\\\" class=\\\"popup-version-icon\\\" />\\n\\n        <div class=\\\"popup-version-title flex-one\\\">\\n          <div class=\\\"text-bold\\\">\\n            {{t\\n              \\\"components.courseAudit.versionPopup.version\\\"\\n              version=(or version.version @versions.length)\\n            }}\\n          </div>\\n\\n          <div class=\\\"text-small text-base\\\">\\n            {{format-date\\n              version.created\\n              year=\\\"numeric\\\"\\n              month=\\\"numeric\\\"\\n              day=\\\"numeric\\\"\\n              hour=\\\"numeric\\\"\\n              minute=\\\"numeric\\\"\\n              second=\\\"numeric\\\"\\n            }}\\n          </div>\\n        </div>\\n      </div>\\n    </UiButton>\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/course-audit/version-popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-audit/version-popup/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"course-choose-list\\\" data-test-course-choose-list ...attributes>\\n  {{#each @courses as |course|}}\\n    <CourseChooseList::Item\\n      @course={{course}}\\n      @selectedCourses={{@selectedCourses}}\\n      @onSelect={{@onSelect}}\\n      @onDeselect={{@onDeselect}}\\n    />\\n  {{/each}}\\n</div>\", {\"contents\":\"<div class=\\\"course-choose-list\\\" data-test-course-choose-list ...attributes>\\n  {{#each @courses as |course|}}\\n    <CourseChooseList::Item\\n      @course={{course}}\\n      @selectedCourses={{@selectedCourses}}\\n      @onSelect={{@onSelect}}\\n      @onDeselect={{@onDeselect}}\\n    />\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/course-choose-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-choose-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class=\\\"course-choose-list-item\\\"\\n  data-test-course-choose-list-item\\n  ...attributes\\n>\\n  <XCheckbox\\n    data-test-course-choose-list-item-checkbox\\n    @checked={{this.isSelected}}\\n    @twoWay={{false}}\\n    @onChange={{this.handleCheckboxChange}}\\n  >\\n    {{@course.name}}\\n  </XCheckbox>\\n</label>\", {\"contents\":\"<label\\n  class=\\\"course-choose-list-item\\\"\\n  data-test-course-choose-list-item\\n  ...attributes\\n>\\n  <XCheckbox\\n    data-test-course-choose-list-item-checkbox\\n    @checked={{this.isSelected}}\\n    @twoWay={{false}}\\n    @onChange={{this.handleCheckboxChange}}\\n  >\\n    {{@course.name}}\\n  </XCheckbox>\\n</label>\",\"moduleName\":\"babel/components/course-choose-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-choose-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class CourseChooseListItem extends Component {\n  get isSelected() {\n    return this.args.selectedCourses.includes(this.args.course);\n  }\n\n  @action\n  handleCheckboxChange() {\n    this.#toggle();\n  }\n\n  #toggle() {\n    if (this.isSelected) {\n      this.args.onDeselect(this.args.course);\n    } else {\n      this.args.onSelect(this.args.course);\n    }\n  }\n}\n","import { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\n\nexport default class CourseHeaderComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   */\n\n  get imageStyle() {\n    const url = this.args.course?.coverBackground;\n\n    if (url) {\n      return htmlSafe(`background-image: url(${url});`);\n    }\n\n    return null;\n  }\n\n  get coverClass() {\n    const classes = ['course-header-cover'];\n\n    if (!this.imageStyle) {\n      classes.push('course-header-cover-bgcolor');\n    }\n\n    return classes.join(' ');\n  }\n\n  get effectClass() {\n    const classes = ['course-header-effect'];\n\n    if (!this.imageStyle) {\n      classes.push('course-header-no-effect');\n    }\n\n    return classes.join(' ');\n  }\n\n  get textClass() {\n    const classes = ['flex-auto', 'mb1'];\n\n    if (this.imageStyle) {\n      classes.push('text-color-inverted');\n    }\n\n    return classes.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"course-header\\\">\\n  <div class={{this.coverClass}}>\\n    {{#if this.imageStyle}}\\n      <div\\n        class=\\\"course-header-image-background\\\"\\n        style={{this.imageStyle}}\\n      />\\n    {{/if}}\\n\\n    <div class={{this.effectClass}}>\\n      <div class=\\\"container\\\">\\n        <div class=\\\"course-header-container\\\">\\n          <div class={{this.textClass}}>\\n            <div class=\\\"flex flex-justify flex-wrap\\\">\\n              <div class=\\\"flex flex-center\\\">\\n                <h1 class=\\\"course-header-name text-jumbo\\\">{{@course.name}}</h1>\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n', { moduleName: 'babel/components/course-header/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul class=\\\"course-list\\\" data-test-course-list ...attributes>\\n  {{#each @courses as |course|}}\\n    <CourseList::Item\\n      @course={{course}}\\n      @disabledCourses={{this.disabledCourses}}\\n      @onSelect={{@onSelect}}\\n    />\\n  {{/each}}\\n</ul>\", {\"contents\":\"<ul class=\\\"course-list\\\" data-test-course-list ...attributes>\\n  {{#each @courses as |course|}}\\n    <CourseList::Item\\n      @course={{course}}\\n      @disabledCourses={{this.disabledCourses}}\\n      @onSelect={{@onSelect}}\\n    />\\n  {{/each}}\\n</ul>\",\"moduleName\":\"babel/components/course-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-list/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class CourseList extends Component {\n  get disabledCourses() {\n    return this.args.disabledCourses ?? [];\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li\\n  class=\\\"course-list-item\\\"\\n  data-test-course-list-item\\n  data-disabled={{this.isDisabled}}\\n  ...attributes\\n>\\n  <button\\n    class=\\\"course-list-item-button\\\"\\n    data-test-course-list-item-button\\n    type=\\\"button\\\"\\n    disabled={{this.isDisabled}}\\n    {{on \\\"click\\\" (fn @onSelect @course)}}\\n  >\\n    {{@course.name}}\\n  </button>\\n</li>\", {\"contents\":\"<li\\n  class=\\\"course-list-item\\\"\\n  data-test-course-list-item\\n  data-disabled={{this.isDisabled}}\\n  ...attributes\\n>\\n  <button\\n    class=\\\"course-list-item-button\\\"\\n    data-test-course-list-item-button\\n    type=\\\"button\\\"\\n    disabled={{this.isDisabled}}\\n    {{on \\\"click\\\" (fn @onSelect @course)}}\\n  >\\n    {{@course.name}}\\n  </button>\\n</li>\",\"moduleName\":\"babel/components/course-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-list/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class CourseListItem extends Component {\n  get isDisabled() {\n    return this.args.disabledCourses.includes(this.args.course);\n  }\n}\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CourseMainComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    if (this.missingLicenses.length > 0 && this.licensesReloaded === false) {\n      this.session.refreshUserLicenses().then(() => {\n        this.licensesReloaded = true;\n      });\n    }\n  }\n\n  @service session;\n\n  @service intl;\n\n  @tracked licensesReloaded = false;\n\n  @tracked activeProduct = null;\n\n  @tracked modalOpen = false;\n\n  @cached\n  get schoolProxy() {\n    return load(resolve(this.session.user?.school), this);\n  }\n\n  get school() {\n    return this.schoolProxy.isResolved ? this.schoolProxy.value : null;\n  }\n\n  get missingLicenses() {\n    let missingLicenses = [];\n\n    const licenses = this.session.user?.licenses;\n    const courseProducts = this.args.course?.products;\n\n    if (licenses && courseProducts) {\n      const activeLicenseISBNs = licenses\n        .filter((x) => x.isActive)\n        .map((x) => x.isbn);\n      const licenseISBNs = licenses.map((x) => x.isbn);\n\n      courseProducts.forEach((product) => {\n        if (activeLicenseISBNs.indexOf(product.id) === -1) {\n          const index = licenseISBNs.indexOf(product.id);\n          const license = index !== -1 ? licenses.objectAt(index) : null;\n\n          missingLicenses.push({\n            product: product,\n            license: license,\n          });\n        }\n      });\n    }\n\n    return missingLicenses;\n  }\n\n  get courseHasGroups() {\n    if (this.args.course?.groups?.length > 0) return true;\n    return false;\n  }\n\n  get courseHasBooks() {\n    if (this.args.course?.books?.length > 0) return true;\n    return false;\n  }\n\n  get hasStudents() {\n    return this.args.course?.students?.length > 0;\n  }\n\n  get courseMenuItems() {\n    const menu_items = [\n      'overview',\n      'books',\n      'myResults',\n      'audit',\n      'missions',\n      'settings',\n    ];\n    const menu_teacher_items = ['audit', 'missions', 'settings'];\n\n    const menu_icons = {\n      overview: 'home',\n      books: 'book',\n      missions: 'mission',\n      myResults: 'log',\n      settings: 'settings',\n      audit: 'results',\n    };\n\n    const menu_routes = {\n      overview: 'master.courses.show.index',\n      books: 'master.courses.show.books',\n      missions: 'master.courses.show.missions',\n      myResults: 'master.courses.show.my-results',\n      settings: 'master.courses.show.settings',\n      audit: 'master.courses.show.audit',\n    };\n\n    const require_books = ['myResults', 'audit'];\n\n    let items = [];\n\n    for (let i = 0; i < menu_items.length; i++) {\n      items.addObject({\n        title: this.intl.t('components.courseMain.menu.' + menu_items[i]),\n        icon: menu_icons[menu_items[i]],\n        route: menu_routes[menu_items[i]],\n        disabled:\n          (require_books.includes(menu_items[i]) && !this.courseHasBooks) ||\n          (menu_items[i] === 'audit' && !this.hasStudents),\n        teacherMenuItems: menu_teacher_items.includes(menu_items[i]),\n      });\n    }\n\n    return items;\n  }\n\n  @action\n  saveCourse() {\n    return this.args.course.save();\n  }\n\n  @action\n  restore(course) {\n    course.active = true;\n    return course.save();\n  }\n\n  @action\n  openLicenseModal(product) {\n    this.activeProduct = product;\n    this.modalOpen = true;\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\n\nexport default class CourseMainTeacherLicenseAlert extends Component {\n  @service router;\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get createCourseUrl() {\n    return `${this.skolAdminUrl}/courses/${this.args.course?.id}`;\n  }\n\n  @action\n  openCourseSettings() {\n    window.location.href = this.createCourseUrl;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAlert @variant=\\\"error\\\" ...attributes>\\n  <div class=\\\"license-warning-container\\\">\\n    <div class=\\\"license-warning-message text-ui\\\">\\n      {{#if @userMissingLicenses}}\\n        {{t\\n          \\\"components.courseMain.teacherLicenseAlert.teacherMissingLicense\\\"\\n          courseName=@course.name\\n        }}\\n      {{else}}\\n        {{t\\n          \\\"components.courseMain.teacherLicenseAlert.studentMissingLicense\\\"\\n          courseName=@course.name\\n        }}\\n      {{/if}}\\n    </div>\\n    <div class=\\\"license-warning-actions\\\">\\n      <UiButton @onClick={{this.openCourseSettings}}>\\n        {{t \\\"components.courseMain.teacherLicenseAlert.linkAction\\\"}}\\n      </UiButton>\\n    </div>\\n  </div>\\n</XAlert>', { moduleName: 'babel/components/course-main/teacher-license-alert/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"course-main-component\\\" ...attributes>\\n  <CourseHeader @course={{@course}} />\\n\\n  <div class=\\\"container\\\">\\n    {{#if (or (not @course.active) @course.hasLicenseWarnings)}}\\n      <div class=\\\"mt2\\\">\\n        {{#unless @course.active}}\\n          <XAlert\\n            @variant=\\\"error\\\"\\n            class={{if @course.usersMissingLicenses \\\"nb1\\\"}}\\n          >\\n            <div class=\\\"text-ui flex flex-center justify-space-between\\\">\\n              {{t \\\"components.courseMain.restoreInfo\\\"}}\\n\\n              <UiButton @onClick={{fn this.restore @course}}>\\n                {{t \\\"components.courseMain.restore\\\"}}\\n              </UiButton>\\n            </div>\\n          </XAlert>\\n        {{/unless}}\\n\\n        {{#if @course.hasLicenseWarnings}}\\n          <CourseMain::TeacherLicenseAlert\\n            @course={{@course}}\\n            @userMissingLicenses={{this.missingLicenses}}\\n            @openLicenseModal={{this.openLicenseModal}}\\n          />\\n        {{/if}}\\n      </div>\\n    {{else if this.missingLicenses}}\\n      <div class=\\\"mt2\\\">\\n        <XAlert @variant=\\\"error\\\" class=\\\"text-ui\\\">\\n          {{t \\\"components.courseMain.userLicenseAlert.studentMessage\\\"}}\\n        </XAlert>\\n      </div>\\n    {{/if}}\\n\\n    {{#unless this.missingLicenses}}\\n      <div class=\\\"course-main\\\">\\n        <div class=\\\"flex-shrink mr2-sm\\\">\\n          <PageContentMenu\\n            @buttonLabel={{t \\\"components.courseMain.pages\\\"}}\\n            @items={{this.courseMenuItems}}\\n            @model={{@course}}\\n            @type=\\\"course\\\"\\n          />\\n        </div>\\n\\n        <div class=\\\"flex-auto\\\">\\n          {{yield}}\\n        </div>\\n      </div>\\n    {{/unless}}\\n  </div>\\n</div>', { moduleName: 'babel/components/course-main/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t \\\"components.courseMissionActivateModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\">\\n    <WaitFor @resource={{this.resource @course}} as |model|>\\n      <MissionCollator @missions={{model.missions}} as |missions|>\\n        <MissionList\\n          @missions={{missions}}\\n          @selectedMissions={{this.selectedMissions}}\\n          @onSelect={{this.handleMissionListSelect}}\\n          @onDeselect={{this.handleMissionListDeselect}}\\n        />\\n      </MissionCollator>\\n    </WaitFor>\\n  </modal.content>\\n\\n  <modal.footer class=\\\"justify-flex-end\\\">\\n    <div>\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.courseMissionActivateModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton\\n        @disabled={{lte this.selectedMissions.length 0}}\\n        @onClick={{fn @onActivate this.selectedMissions}}\\n      >\\n        {{t\\n          \\\"components.courseMissionActivateModal.activateButtonLabel\\\"\\n          count=this.selectedMissions.length\\n        }}\\n      </UiButton>\\n    </div>\\n  </modal.footer>\\n</XModal>\", {\"contents\":\"<XModal\\n  @title={{t \\\"components.courseMissionActivateModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\">\\n    <WaitFor @resource={{this.resource @course}} as |model|>\\n      <MissionCollator @missions={{model.missions}} as |missions|>\\n        <MissionList\\n          @missions={{missions}}\\n          @selectedMissions={{this.selectedMissions}}\\n          @onSelect={{this.handleMissionListSelect}}\\n          @onDeselect={{this.handleMissionListDeselect}}\\n        />\\n      </MissionCollator>\\n    </WaitFor>\\n  </modal.content>\\n\\n  <modal.footer class=\\\"justify-flex-end\\\">\\n    <div>\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.courseMissionActivateModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton\\n        @disabled={{lte this.selectedMissions.length 0}}\\n        @onClick={{fn @onActivate this.selectedMissions}}\\n      >\\n        {{t\\n          \\\"components.courseMissionActivateModal.activateButtonLabel\\\"\\n          count=this.selectedMissions.length\\n        }}\\n      </UiButton>\\n    </div>\\n  </modal.footer>\\n</XModal>\",\"moduleName\":\"babel/components/course-mission-activate-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-mission-activate-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport Resource from 'babel/utils/resource';\n\nexport default class MissionActivateModal extends Component {\n  @service store;\n\n  @tracked selectedMissions = [];\n\n  resource = (course) => {\n    return new Resource(async () => {\n      const missions = (\n        await this.store.query('mission', {\n          filter: {\n            course_id: course.id,\n          },\n          order: [\n            {\n              field: 'created',\n              direction: 'DESC',\n            },\n          ],\n        })\n      ).filter((mission) => !mission.isVisible);\n\n      await Promise.all(missions.map((mission) => mission.entities));\n\n      return {\n        missions,\n      };\n    });\n  };\n\n  @action\n  handleMissionListSelect(mission) {\n    this.selectedMissions.addObject(mission);\n  }\n\n  @action\n  handleMissionListDeselect(mission) {\n    this.selectedMissions.removeObject(mission);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t \\\"components.courseMissionCopyFromModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\">\\n    <WaitFor @resource={{this.courseAndSchoolResource}}>\\n      {{#if this.selectedCourse}}\\n        <CourseMissionCopyFromModal::MissionPart\\n          @course={{this.selectedCourse}}\\n          @missionQuery={{this.missionQuery}}\\n          @onSelect={{this.handleMissionListSelect}}\\n          @onDeselect={{this.handleMissionListDeselect}}\\n          @selectedMissions={{this.selectedMissions}}\\n        >\\n          <div class=\\\"flex mb1\\\">\\n            <UiButton\\n              class=\\\"nr1\\\"\\n              @appearance=\\\"link\\\"\\n              @onClick={{this.handleChooseCourseButtonClick}}\\n            >\\n              <DcIcon class=\\\"nr1\\\" @name=\\\"tail-left\\\" />\\n              {{t\\n                \\\"components.courseMissionCopyFromModal.chooseCourseButtonLabel\\\"\\n              }}\\n            </UiButton>\\n\\n            <div class=\\\"course-mission-copy-from-modal-course-title text-bold\\\">\\n              {{this.selectedCourse.name}}\\n            </div>\\n          </div>\\n          {{#if this.errors}}\\n            <div class=\\\"course-mission-copy-from-modal-course-errors\\\">\\n              {{#each this.errors as |error|}}\\n                <p>{{t error}}</p>\\n              {{/each}}\\n            </div>\\n          {{/if}}\\n        </CourseMissionCopyFromModal::MissionPart>\\n      {{else}}\\n        {{#if (gt this.schoolOptions.length 1)}}\\n          <UiLabel>\\n            {{t \\\"components.courseMissionCopyFromModal.selectSchoolLabel\\\"}}\\n          </UiLabel>\\n\\n          <div class=\\\"mb1\\\">\\n            <XSelect\\n              @items={{this.schoolOptions}}\\n              @onChange={{this.handleSchoolSelected}}\\n              @value={{this.selectedSchoolId}}\\n              class=\\\"mb1\\\"\\n            />\\n          </div>\\n        {{/if}}\\n\\n        <p class=\\\"text-bold mb1\\\">\\n          {{t \\\"components.courseMissionCopyFromModal.instructionsMessage\\\"}}\\n        </p>\\n\\n        {{#if this.courses.length}}\\n          <CourseList\\n            @courses={{this.courses}}\\n            @onSelect={{set this \\\"selectedCourse\\\"}}\\n          />\\n        {{else}}\\n          <XAlert>\\n            {{t \\\"components.courseMissionCopyFromModal.noCoursesMessage\\\"}}\\n          </XAlert>\\n        {{/if}}\\n      {{/if}}\\n    </WaitFor>\\n  </modal.content>\\n\\n\\n  {{#if this.selectedCourse}}\\n    <modal.footer class=\\\"justify-flex-end\\\">\\n      <div>\\n        <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n          {{t \\\"components.courseMissionCopyFromModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n\\n        <UiButton\\n          @onClick={{this.handleMissionCopy}}\\n        >\\n          {{t\\n            \\\"components.courseMissionCopyFromModal.copyButtonLabel\\\"\\n            count=this.selectedMissions.length\\n          }}\\n        </UiButton>\\n      </div>\\n    </modal.footer>\\n  {{/if}}\\n</XModal>\", {\"contents\":\"<XModal\\n  @title={{t \\\"components.courseMissionCopyFromModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\">\\n    <WaitFor @resource={{this.courseAndSchoolResource}}>\\n      {{#if this.selectedCourse}}\\n        <CourseMissionCopyFromModal::MissionPart\\n          @course={{this.selectedCourse}}\\n          @missionQuery={{this.missionQuery}}\\n          @onSelect={{this.handleMissionListSelect}}\\n          @onDeselect={{this.handleMissionListDeselect}}\\n          @selectedMissions={{this.selectedMissions}}\\n        >\\n          <div class=\\\"flex mb1\\\">\\n            <UiButton\\n              class=\\\"nr1\\\"\\n              @appearance=\\\"link\\\"\\n              @onClick={{this.handleChooseCourseButtonClick}}\\n            >\\n              <DcIcon class=\\\"nr1\\\" @name=\\\"tail-left\\\" />\\n              {{t\\n                \\\"components.courseMissionCopyFromModal.chooseCourseButtonLabel\\\"\\n              }}\\n            </UiButton>\\n\\n            <div class=\\\"course-mission-copy-from-modal-course-title text-bold\\\">\\n              {{this.selectedCourse.name}}\\n            </div>\\n          </div>\\n          {{#if this.errors}}\\n            <div class=\\\"course-mission-copy-from-modal-course-errors\\\">\\n              {{#each this.errors as |error|}}\\n                <p>{{t error}}</p>\\n              {{/each}}\\n            </div>\\n          {{/if}}\\n        </CourseMissionCopyFromModal::MissionPart>\\n      {{else}}\\n        {{#if (gt this.schoolOptions.length 1)}}\\n          <UiLabel>\\n            {{t \\\"components.courseMissionCopyFromModal.selectSchoolLabel\\\"}}\\n          </UiLabel>\\n\\n          <div class=\\\"mb1\\\">\\n            <XSelect\\n              @items={{this.schoolOptions}}\\n              @onChange={{this.handleSchoolSelected}}\\n              @value={{this.selectedSchoolId}}\\n              class=\\\"mb1\\\"\\n            />\\n          </div>\\n        {{/if}}\\n\\n        <p class=\\\"text-bold mb1\\\">\\n          {{t \\\"components.courseMissionCopyFromModal.instructionsMessage\\\"}}\\n        </p>\\n\\n        {{#if this.courses.length}}\\n          <CourseList\\n            @courses={{this.courses}}\\n            @onSelect={{set this \\\"selectedCourse\\\"}}\\n          />\\n        {{else}}\\n          <XAlert>\\n            {{t \\\"components.courseMissionCopyFromModal.noCoursesMessage\\\"}}\\n          </XAlert>\\n        {{/if}}\\n      {{/if}}\\n    </WaitFor>\\n  </modal.content>\\n\\n\\n  {{#if this.selectedCourse}}\\n    <modal.footer class=\\\"justify-flex-end\\\">\\n      <div>\\n        <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n          {{t \\\"components.courseMissionCopyFromModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n\\n        <UiButton\\n          @onClick={{this.handleMissionCopy}}\\n        >\\n          {{t\\n            \\\"components.courseMissionCopyFromModal.copyButtonLabel\\\"\\n            count=this.selectedMissions.length\\n          }}\\n        </UiButton>\\n      </div>\\n    </modal.footer>\\n  {{/if}}\\n</XModal>\",\"moduleName\":\"babel/components/course-mission-copy-from-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-mission-copy-from-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport fetchSchoolsAndCourses from 'babel/utils/fetch-schools-and-courses';\nimport Resource from 'babel/utils/resource';\n\nexport default class CourseMissionCopyFromModal extends Component {\n  @service store;\n  @service session;\n\n  @tracked schoolOptions = [];\n  @tracked selectedSchoolId = null;\n  @tracked courses = [];\n  @tracked selectedCourse = null;\n  @tracked selectedMissions = [];\n  @tracked errors = [];\n\n  @tracked missionQuery = {\n    page: 1,\n  };\n\n  courseAndSchoolResource = new Resource(this.handleSchoolSelected);\n\n  @action\n  async handleSchoolSelected() {\n    const { schoolOptions, selectedSchoolId, courses } =\n      await fetchSchoolsAndCourses(\n        this.store,\n        this.session.user,\n        this.selectedSchoolId\n      );\n\n    this.schoolOptions = schoolOptions;\n    this.selectedSchoolId = selectedSchoolId;\n    this.courses = courses;\n  }\n\n  @action\n  handleChooseCourseButtonClick() {\n    this.selectedCourse = null;\n    this.selectedMissions = [];\n    this.errors = [];\n  }\n\n  @action\n  handleMissionListSelect(mission) {\n    this.errors = [];\n    this.selectedMissions.addObject(mission);\n  }\n\n  @action\n  handleMissionListDeselect(mission) {\n    this.selectedMissions.removeObject(mission);\n  }\n\n  @action\n  handleMissionCopy() {\n    this.errors = [];\n    if (this.selectedMissions.length > 0) {\n      this.args.onCopy(this.selectedMissions, this.selectedCourse);\n    } else {\n      this.errors.push(\n        'components.courseMissionCopyFromModal.noMissionsSelected'\n      );\n      later(() => {\n        document\n          .querySelector('.course-mission-copy-from-modal-course-title')\n          ?.scrollIntoView({ behavior: 'smooth' });\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<WaitFor @resource={{this.resource}} as |model|>\\n  {{yield model}}\\n  <MissionCollator\\n    @missions={{model.missions}}\\n    @onChange={{this.handleMissionCollatorChange}}\\n    as |missions|>\\n      <MissionList\\n        @missions={{missions}}\\n        @disabledMissions={{model.disabledMissions}}\\n        @selectedMissions={{@selectedMissions}}\\n        @onSelect={{@onSelect}}\\n        @onDeselect={{@onDeselect}}\\n      />\\n  </MissionCollator>\\n</WaitFor>\", {\"contents\":\"<WaitFor @resource={{this.resource}} as |model|>\\n  {{yield model}}\\n  <MissionCollator\\n    @missions={{model.missions}}\\n    @onChange={{this.handleMissionCollatorChange}}\\n    as |missions|>\\n      <MissionList\\n        @missions={{missions}}\\n        @disabledMissions={{model.disabledMissions}}\\n        @selectedMissions={{@selectedMissions}}\\n        @onSelect={{@onSelect}}\\n        @onDeselect={{@onDeselect}}\\n      />\\n  </MissionCollator>\\n</WaitFor>\",\"moduleName\":\"babel/components/course-mission-copy-from-modal/mission-part/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-mission-copy-from-modal/mission-part/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport Resource from 'babel/utils/resource';\n\nexport default class CourseMissionCopyFromModalMissionPart extends Component {\n  @service store;\n  @service session;\n\n  @tracked missionQuery = {\n    page: 1,\n  };\n\n  @cached\n  get resource() {\n    return new Resource(async ({ page, search }) => {\n      const missions = await this.store.query('mission', {\n        filter: {\n          course_id: this.args.course.id,\n        },\n        page: {\n          size: 20,\n          number: page,\n        },\n        search,\n        order: [\n          {\n            field: 'created',\n            direction: 'DESC',\n          },\n        ],\n      });\n\n      return {\n        missions,\n        disabledMissions: [],\n      };\n    }, this.missionQuery);\n  }\n\n  @action\n  async handleMissionCollatorChange(query) {\n    return this.resource.load(query);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t \\\"components.courseMissionCopyToModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\" {{ref (set this \\\"modalContentElement\\\")}}>\\n    <WaitFor @resource={{this.courseAndSchoolResource}}>\\n      {{#if (gt this.schoolOptions.length 1)}}\\n        <UiLabel>\\n          {{t \\\"components.courseMissionCopyToModal.selectSchoolLabel\\\"}}\\n        </UiLabel>\\n\\n        <div class=\\\"mb1\\\">\\n          <XSelect\\n            @items={{this.schoolOptions}}\\n            @onChange={{this.handleSchoolSelected}}\\n            @value={{this.selectedSchoolId}}\\n            class=\\\"mb1\\\"\\n          />\\n        </div>\\n      {{/if}}\\n\\n      <p class=\\\"nb1 text-bold\\\">\\n        {{t \\\"components.courseMissionCopyToModal.instructionsMessage\\\"}}\\n      </p>\\n\\n      {{#if this.isInvalid}}\\n        <div class=\\\"nb1 text-color-error\\\">\\n          {{t \\\"components.courseMissionCopyToModal.validationErrorMessage\\\"}}\\n        </div>\\n      {{/if}}\\n\\n      {{#if this.courses.length}}\\n        <CourseChooseList\\n          @courses={{this.courses}}\\n          @selectedCourses={{this.selectedCourses}}\\n          @onSelect={{this.handleCourseChooseListSelect}}\\n          @onDeselect={{this.handleCourseChooseListDeselect}}\\n        />\\n      {{else}}\\n        <XAlert>\\n          {{t \\\"components.courseMissionCopyToModal.noCoursesMessage\\\"}}\\n        </XAlert>\\n      {{/if}}\\n    </WaitFor>\\n  </modal.content>\\n\\n  <modal.footer class=\\\"justify-flex-end\\\">\\n    <div>\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.courseMissionCopyToModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton @onClick={{this.handleCopyButtonClick}}>\\n        {{t\\n          \\\"components.courseMissionCopyToModal.copyButtonLabel\\\"\\n          count=this.selectedCourses.length\\n        }}\\n      </UiButton>\\n    </div>\\n  </modal.footer>\\n</XModal>\", {\"contents\":\"<XModal\\n  @title={{t \\\"components.courseMissionCopyToModal.title\\\"}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\" {{ref (set this \\\"modalContentElement\\\")}}>\\n    <WaitFor @resource={{this.courseAndSchoolResource}}>\\n      {{#if (gt this.schoolOptions.length 1)}}\\n        <UiLabel>\\n          {{t \\\"components.courseMissionCopyToModal.selectSchoolLabel\\\"}}\\n        </UiLabel>\\n\\n        <div class=\\\"mb1\\\">\\n          <XSelect\\n            @items={{this.schoolOptions}}\\n            @onChange={{this.handleSchoolSelected}}\\n            @value={{this.selectedSchoolId}}\\n            class=\\\"mb1\\\"\\n          />\\n        </div>\\n      {{/if}}\\n\\n      <p class=\\\"nb1 text-bold\\\">\\n        {{t \\\"components.courseMissionCopyToModal.instructionsMessage\\\"}}\\n      </p>\\n\\n      {{#if this.isInvalid}}\\n        <div class=\\\"nb1 text-color-error\\\">\\n          {{t \\\"components.courseMissionCopyToModal.validationErrorMessage\\\"}}\\n        </div>\\n      {{/if}}\\n\\n      {{#if this.courses.length}}\\n        <CourseChooseList\\n          @courses={{this.courses}}\\n          @selectedCourses={{this.selectedCourses}}\\n          @onSelect={{this.handleCourseChooseListSelect}}\\n          @onDeselect={{this.handleCourseChooseListDeselect}}\\n        />\\n      {{else}}\\n        <XAlert>\\n          {{t \\\"components.courseMissionCopyToModal.noCoursesMessage\\\"}}\\n        </XAlert>\\n      {{/if}}\\n    </WaitFor>\\n  </modal.content>\\n\\n  <modal.footer class=\\\"justify-flex-end\\\">\\n    <div>\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.courseMissionCopyToModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton @onClick={{this.handleCopyButtonClick}}>\\n        {{t\\n          \\\"components.courseMissionCopyToModal.copyButtonLabel\\\"\\n          count=this.selectedCourses.length\\n        }}\\n      </UiButton>\\n    </div>\\n  </modal.footer>\\n</XModal>\",\"moduleName\":\"babel/components/course-mission-copy-to-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-mission-copy-to-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport fetchSchoolsAndCourses from 'babel/utils/fetch-schools-and-courses';\nimport Resource from 'babel/utils/resource';\n\nexport default class CourseMissionCopyToModalComponent extends Component {\n  @service session;\n  @service store;\n\n  @tracked schoolOptions = [];\n  @tracked selectedSchoolId = null;\n  @tracked courses = [];\n  @tracked selectedCourses = [];\n  @tracked isInvalid = false;\n\n  modalContentElement = null;\n\n  courseAndSchoolResource = new Resource(this.handleSchoolSelected);\n\n  @action\n  async handleSchoolSelected() {\n    const { schoolOptions, selectedSchoolId, courses } =\n      await fetchSchoolsAndCourses(\n        this.store,\n        this.session.user,\n        this.selectedSchoolId\n      );\n\n    this.schoolOptions = schoolOptions;\n    this.selectedSchoolId = selectedSchoolId;\n    this.courses = courses;\n  }\n\n  @action\n  handleCourseChooseListSelect(course) {\n    this.isInvalid = false;\n    this.selectedCourses.addObject(course);\n  }\n\n  @action\n  handleCourseChooseListDeselect(course) {\n    this.selectedCourses.removeObject(course);\n  }\n\n  @action\n  handleCopyButtonClick() {\n    if (this.selectedCourses.length > 0) {\n      return this.#copy();\n    } else {\n      this.isInvalid = true;\n      this.modalContentElement.scrollTo({ top: 0 });\n    }\n  }\n\n  #copy() {\n    return this.args.onCopy(this.args.mission, this.selectedCourses);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"internal_link\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.internalLink\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"link\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.link\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"file\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.file\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"archive\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.archive\\\"}}\\n    </:label>\\n  </menu.Item>\\n</ActionMenu>\", {\"contents\":\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"internal_link\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.internalLink\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"link\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.link\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"file\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.file\\\"}}\\n    </:label>\\n  </menu.Item>\\n  <menu.Item @value=\\\"archive\\\">\\n    <:label>\\n      {{t \\\"components.courseShortcutActionMenu.archive\\\"}}\\n    </:label>\\n  </menu.Item>\\n</ActionMenu>\",\"moduleName\":\"babel/components/course-shortcut-action-menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/course-shortcut-action-menu/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { trackShortcutEvent } from 'babel/utils/matomo-events';\nimport generateId from 'compton/utils/generate-id';\nimport showFilePicker from 'compton/utils/show-file-picker';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class CourseShortcutsComponent extends Component {\n  @service session;\n  @service intl;\n\n  // PROPERTIES\n\n  @tracked expandedEntities;\n  @tracked entityImportModalIsOpen;\n  @tracked attachLinkModalOpen;\n  @tracked fileChooseModalOpen;\n  @tracked sortable;\n  @tracked sortingShortcuts;\n  @tracked isMoving = false;\n  @tracked selectedItem = null;\n  @tracked saveBtn = null;\n  @tracked isCourseShortcutActionMenuOpen = false;\n\n  originalPositions = null;\n  newPosition = null;\n  shortcutsContainer = false;\n  cursorX = 0;\n  cursorY = 0;\n  elements = [];\n  dragging = null;\n  target = null;\n  direction = null;\n\n  // HOOKS\n\n  constructor() {\n    super(...arguments);\n    this.expandedEntities = [];\n  }\n\n  @cached\n  get settingProxy() {\n    const promise = resolve(this.args.course?.setting);\n    return load(promise, this);\n  }\n\n  get setting() {\n    return this.settingProxy.isResolved ? this.settingProxy.value : null;\n  }\n\n  get firstBook() {\n    return this.args.course.get('books.firstObject');\n  }\n\n  get shortcuts() {\n    const shortcuts = [\n      ...(this.setting?.shortcutFiles?.toArray() || []),\n      ...(this.setting?.shortcuts?.toArray() || []),\n    ];\n\n    // The following fixes diffs between sort array and relation.\n    // It can be removed once the data has been cleaned.\n    const sorted = (this.args.course?.sortedShortcutIds || [])\n      .map((id) => {\n        return shortcuts.find((shortcut) => shortcut.id === id);\n      })\n      .filter((item) => item);\n\n    shortcuts.forEach((item) => {\n      if (!sorted.includes(item)) {\n        sorted.push(item);\n      }\n    });\n\n    return sorted;\n  }\n\n  @action\n  handleCourseShortcutActionMenuSelect(value) {\n    switch (value) {\n      case 'internal_link':\n        this.entityImportModalIsOpen = true;\n        trackShortcutEvent('Produktinnehåll');\n        break;\n      case 'link':\n        this.attachLinkModalOpen = true;\n        trackShortcutEvent('Länk');\n        break;\n      case 'archive':\n        this.fileChooseModalOpen = true;\n        trackShortcutEvent('Mitt arkiv');\n        break;\n      case 'file':\n        this.showFilePicker();\n        trackShortcutEvent('Egen fil');\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  handleEntityImportModal(entities) {\n    this.args.course.sortedShortcutIds =\n      this.args.course?.sortedShortcutIds || [];\n\n    this.args.course?.shortcuts?.addObjects(entities);\n    this.args.course?.sortedShortcutIds?.addObjects(entities.mapBy('id'));\n\n    this.setting?.save();\n  }\n\n  @action\n  deleteShortcutEntity(entity) {\n    this.args.course?.shortcuts?.removeObject(entity);\n    this.args.course?.sortedShortcutIds?.removeObject(entity.id);\n\n    this.setting?.save();\n  }\n\n  @action\n  deleteShortcutFile(entity) {\n    this.setting?.shortcutFiles?.removeObject(entity);\n    this.args.course?.sortedShortcutIds?.removeObject(entity.id);\n\n    this.setting?.save();\n  }\n\n  @action\n  handleFileAttachmentAdd(attachment) {\n    this.args.course.sortedShortcutIds =\n      this.args.course?.sortedShortcutIds || [];\n\n    const file = [].concat(attachment);\n    this.args.course?.sortedShortcutIds?.addObjects(file.mapBy('id'));\n    return resolve(this.setting?.shortcutFiles).then((files) => {\n      files.addObjects(file);\n      if (!this.setting) return;\n      this.setting.shortcutFiles = files;\n      this.setting.save();\n    });\n  }\n\n  @action\n  handleEntityImportModalExpand(entity) {\n    this.expandedEntities.addObject(entity);\n  }\n\n  @action\n  handleEntityImportModalCollapse(entity) {\n    this.expandedEntities.removeObject(entity);\n  }\n\n  @action\n  handleEntityModalToggle() {\n    this.entityImportModalIsOpen = !this.entityImportModalIsOpen;\n  }\n\n  @action\n  handleFileAttachmentClose() {\n    this.fileChooseModalOpen = false;\n  }\n\n  @action\n  handleLinkAttachmentClose() {\n    this.attachLinkModalOpen = false;\n  }\n\n  @action\n  handleAddShortcut() {\n    this.isCourseShortcutActionMenuOpen = true;\n    trackShortcutEvent('Lägg till genväg');\n  }\n\n  @action\n  toggleSort() {\n    if (this.sortable) {\n      trackShortcutEvent('Ordna - Klar');\n      this._deleteEventListener();\n    } else {\n      trackShortcutEvent('Ordna');\n      this.sortingShortcuts = [...this.shortcuts];\n      document.addEventListener('mousemove', this.mousePosition);\n      document.addEventListener('touchmove', this.mousePosition);\n    }\n    this.sortable = !this.sortable;\n  }\n\n  @action\n  selectSort(item) {\n    this.originalPositions = null;\n    this.elements = Array.from(this.shortcutsContainer.children);\n    this.selectedItem = item;\n    document.addEventListener('keydown', this.moveItem);\n  }\n\n  @action\n  moveItem(event) {\n    const currentIndex = this.sortingShortcuts.indexOf(this.selectedItem);\n\n    if (currentIndex !== -1) {\n      if (event.key === 'ArrowLeft' && currentIndex > 0) {\n        [\n          this.sortingShortcuts[currentIndex],\n          this.sortingShortcuts[currentIndex - 1],\n        ] = [\n          this.sortingShortcuts[currentIndex - 1],\n          this.sortingShortcuts[currentIndex],\n        ];\n      } else if (\n        event.key === 'ArrowRight' &&\n        currentIndex < this.sortingShortcuts.length - 1\n      ) {\n        [\n          this.sortingShortcuts[currentIndex],\n          this.sortingShortcuts[currentIndex + 1],\n        ] = [\n          this.sortingShortcuts[currentIndex + 1],\n          this.sortingShortcuts[currentIndex],\n        ];\n      }\n    }\n\n    const keyCode = event.keyCode || event.which;\n    if (keyCode === 9 && this.selectedItem) {\n      event.preventDefault();\n    }\n\n    if (keyCode === 13) {\n      this._resetMovingElements();\n      this.args.course.sortShortcuts(this.sortingShortcuts);\n      this.saveBtn.focus();\n      this.selectedItem = null;\n      event.preventDefault();\n      document.removeEventListener('keydown', this.moveItem);\n    }\n\n    if (keyCode === 27) {\n      this._resetMovingElements();\n      this.sortable = !this.sortable;\n      this.selectedItem = null;\n      event.preventDefault();\n      document.removeEventListener('keydown', this.moveItem);\n    }\n\n    if (!this.selectedItem) return;\n\n    this._calculateNewPositions();\n  }\n\n  showFilePicker() {\n    const onChange = (fileData) => {\n      this.fileUpload(fileData);\n    };\n\n    return showFilePicker({\n      multiple: false,\n      accept: null,\n      capture: null,\n      onChange,\n    });\n  }\n\n  async fileUpload(fileData) {\n    const file = await this.args.onFileUpload(fileData);\n    this.handleFileAttachmentAdd(file);\n  }\n\n  get scope() {\n    return generateId('shortcuts');\n  }\n\n  @action\n  onStart() {\n    this.originalPositions = null;\n  }\n\n  @action\n  droppableAccepts(droppableData, draggableData) {\n    let droppableAccepts =\n      draggableData?.scope && draggableData?.scope === droppableData?.scope;\n\n    if (\n      droppableAccepts &&\n      !(droppableData.index == draggableData.index) &&\n      !this.isMoving\n    ) {\n      this.isMoving = true;\n      this.newPosition = droppableData.index;\n      this.elements = Array.from(this.shortcutsContainer.children);\n\n      const movingObject = this.shortcuts?.objectAt(draggableData.index);\n      const slotObject = this.shortcuts?.objectAt(droppableData.index);\n\n      const indexToRemove = this.sortingShortcuts.findIndex(\n        (item) => item === movingObject\n      );\n\n      const slotIndex = this.sortingShortcuts.findIndex(\n        (item) => item === slotObject\n      );\n\n      this.dragging = this.elements[draggableData.index];\n      this.target = this.elements[droppableData.index];\n\n      if (\n        this.direction == null ||\n        (this.direction === 'up' && slotIndex + 1 == indexToRemove) ||\n        (this.direction === 'down' && slotIndex == indexToRemove + 1)\n      ) {\n        this.isMoving = false;\n        return;\n      }\n\n      this.sortingShortcuts.removeAt(indexToRemove);\n      this.sortingShortcuts.insertAt(slotIndex, movingObject);\n\n      this._calculateNewPositions();\n    }\n\n    return droppableAccepts;\n  }\n\n  @action\n  mousePosition(event) {\n    if (event.type === 'touchmove') {\n      event = event.touches[0];\n    }\n\n    this.cursorX = event.clientX;\n    this.cursorY = event.clientY;\n\n    if (this.target) {\n      const targetRect = this.target.getBoundingClientRect();\n      const draggingRect = this.dragging.getBoundingClientRect();\n\n      if (targetRect.width < draggingRect.width || draggingRect.width > 250) {\n        this.direction = 'ignore';\n        return;\n      }\n\n      const targetCenter = targetRect.left + targetRect.width / 2;\n      const mouseX = this.cursorX - draggingRect.width / 2 + 32;\n\n      if (mouseX > targetCenter) {\n        this.direction = 'up';\n      } else {\n        this.direction = 'down';\n      }\n    }\n  }\n\n  _calculateNewPositions() {\n    let shortcutsContainerWidth = this.shortcutsContainer.offsetWidth;\n\n    let row = 0;\n    let tempWidth = 0;\n\n    if (!this.originalPositions) {\n      this.originalPositions = this.elements.map((child, index) => {\n        tempWidth = tempWidth + child.offsetWidth;\n        if (tempWidth >= shortcutsContainerWidth) {\n          tempWidth = child.offsetWidth;\n          row++;\n        }\n\n        return {\n          object: this.shortcuts[index],\n          width: child.offsetWidth,\n          height: child.offsetHeight,\n          row: row + 1,\n          top: row * child.offsetHeight,\n          left: tempWidth - child.offsetWidth,\n        };\n      });\n    }\n\n    tempWidth = 0;\n    row = 0;\n\n    let newPositions = this.sortingShortcuts.map((shortcut) => {\n      const object = this.originalPositions.find(\n        (item) => item.object === shortcut\n      );\n      tempWidth = tempWidth + object.width;\n      if (tempWidth >= shortcutsContainerWidth) {\n        tempWidth = object.width;\n        row++;\n      }\n\n      return {\n        object: object.object,\n        width: object.width,\n        height: object.height,\n        row: row + 1,\n        top: row * object.height,\n        left: tempWidth - object.width,\n      };\n    });\n\n    this._moveToNewPositions(newPositions);\n  }\n\n  _moveToNewPositions(newPositions) {\n    this.originalPositions.map((originalPosition, index) => {\n      const element = this.elements[index];\n      const newPosition = newPositions.find(\n        (newPosition) => newPosition.object === originalPosition.object\n      );\n\n      const xCoord = newPosition.left - originalPosition.left;\n      const yCoord = newPosition.top - originalPosition.top;\n\n      element.style.transform = `translate(${xCoord}px, ${yCoord}px)`;\n    });\n\n    this.target = null;\n    this.direction = null;\n\n    later(() => {\n      this.isMoving = false;\n\n      const mouseMoveEvent = new MouseEvent('mousemove', {\n        bubbles: true,\n        clientX: this.cursorX,\n        clientY: this.cursorY,\n      });\n\n      document.dispatchEvent(mouseMoveEvent);\n    }, 300);\n  }\n\n  _resetMovingElements() {\n    this.elements.map((child) => {\n      child.style.transition = `transform 0s`;\n      child.style.transform = `translate(0px, 0px)`;\n    });\n  }\n\n  _deleteEventListener() {\n    document.removeEventListener('mousemove', this.mousePosition);\n    document.removeEventListener('touchmove', this.mousePosition);\n  }\n\n  @action\n  onEnd() {\n    this._resetMovingElements();\n    this.args.course.sortShortcuts(this.sortingShortcuts);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"course-shortcuts\\\" ...attributes>\\n  {{#if this.session.user.isTeacher}}\\n    <div class=\\\"flex flex-center mb1\\\">\\n      {{#let (generate-id) as |id|}}\\n        <UiButton\\n          id={{id}}\\n          @appearance=\\\"link\\\"\\n          @onClick={{this.handleAddShortcut}}\\n          @disabled={{this.sortable}}\\n        >\\n          <DcIcon class=\\\"nr1\\\" @name=\\\"simple-add\\\" />\\n          {{t \\\"components.courseShortcuts.addShortcut\\\"}}\\n        </UiButton>\\n\\n        {{#if this.isCourseShortcutActionMenuOpen}}\\n          <CourseShortcutActionMenu\\n            @for={{id}}\\n            @onSelect={{this.handleCourseShortcutActionMenuSelect}}\\n            @onClose={{set this \\\"isCourseShortcutActionMenuOpen\\\" false}}\\n          />\\n        {{/if}}\\n      {{/let}}\\n\\n      {{#if (gt this.shortcuts.length 1)}}\\n        <UiButton\\n          class=\\\"ml1 {{if this.sortable \\'slow-shake\\'}}\\\"\\n          @appearance=\\\"link\\\"\\n          @onClick={{this.toggleSort}}\\n          {{ref (set this \\\"saveBtn\\\")}}\\n        >\\n          {{#if this.sortable}}\\n            {{t \\\"components.courseShortcuts.done\\\"}}\\n            <DcIcon class=\\\"nl1\\\" @name=\\\"check\\\" @size=\\\"xs\\\" />\\n          {{else}}\\n            {{t \\\"components.courseShortcuts.sort\\\"}}\\n          {{/if}}\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  {{/if}}\\n\\n  {{#if this.entityImportModalIsOpen}}\\n    <EntityImportModal\\n      @multiple={{true}}\\n      @entity={{this.firstBook}}\\n      @books={{@course.books}}\\n      @expandedEntities={{this.expandedEntities}}\\n      @disabledEntities={{this.shortcuts}}\\n      @onExpand={{this.handleEntityImportModalExpand}}\\n      @onCollapse={{this.handleEntityImportModalCollapse}}\\n      @onImport={{this.handleEntityImportModal}}\\n      @onClose={{this.handleEntityModalToggle}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.fileChooseModalOpen}}\\n    <FileChooseModal\\n      @disabledFiles={{this.shortcuts}}\\n      @onChoose={{this.handleFileAttachmentAdd}}\\n      @onClose={{this.handleFileAttachmentClose}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.attachLinkModalOpen}}\\n    <AttachLinkModal\\n      @onChoose={{this.handleFileAttachmentAdd}}\\n      @onClose={{this.handleLinkAttachmentClose}}\\n    />\\n  {{/if}}\\n\\n  {{#unless this.shortcuts.length}}\\n    <div class=\\\"text-muted text-small\\\">\\n      {{t \\\"components.courseShortcuts.noShortcuts\\\"}}\\n    </div>\\n  {{/unless}}\\n\\n  <div class=\\\"flex flex-wrap\\\" {{ref (set this \\\"shortcutsContainer\\\")}}>\\n    {{#each this.shortcuts as |entity index|}}\\n      <XDroppable\\n        class={{if this.sortable \\\"shortcut-moving-card\\\"}}\\n        @data={{hash scope=this.scope index=index}}\\n        @accept={{this.droppableAccepts}}\\n        @disabled={{not this.sortable}}\\n        @hasHandle={{this.sortable}}\\n      >\\n        <XDraggable\\n          @data={{hash scope=this.scope index=index}}\\n          @disabled={{not this.sortable}}\\n          @onStart={{this.onStart}}\\n          @onEnd={{this.onEnd}}\\n          as |draggable|\\n        >\\n          <div class=\\\"shortcut-card nb1 nr1\\\">\\n            <AttachmentPreview::Item\\n              class={{if (eq this.selectedItem entity) \\\" item-selected\\\"}}\\n              @entity={{entity}}\\n              @file={{entity}}\\n              @allowedBooks={{@course.allBooks}}\\n              @removeable={{and\\n                (not this.sortable)\\n                this.session.user.isTeacher\\n              }}\\n              @onRemoveFile={{this.deleteShortcutFile}}\\n              @onRemoveEntity={{this.deleteShortcutEntity}}\\n              @sortable={{this.sortable}}\\n              @session={{this.session}}\\n              @deletable={{true}}\\n            >\\n              {{#if this.session.user.isTeacher}}\\n                <draggable.handle\\n                  class={{if\\n                    this.sortable\\n                    \\\"shortcut-handle\\\"\\n                    \\\"shortcut-handle-hide\\\"\\n                  }}\\n                >\\n                  <UiButton\\n                    class=\\\"shortcut-handle-button\\\"\\n                    @appearance=\\\"none\\\"\\n                    @onClick={{fn this.selectSort entity}}\\n                  >\\n                    <DcIcon @name=\\\"drag\\\" />\\n                  </UiButton>\\n                </draggable.handle>\\n              {{/if}}\\n            </AttachmentPreview::Item>\\n          </div>\\n        </XDraggable>\\n      </XDroppable>\\n    {{/each}}\\n  </div>\\n</div>', { moduleName: 'babel/components/course-shortcuts/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { load } from 'ember-async-data';\nimport { all } from 'rsvp';\n\nexport default class CourseUserListComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   */\n\n  @service session;\n\n  @service router;\n\n  @service studentList;\n\n  @tracked activeProduct;\n\n  @tracked activeUser;\n\n  @tracked licenseModalOpen = false;\n\n  get selectableCourse() {\n    return `course.${this.args.course?.id}`;\n  }\n\n  @cached\n  get coursePagesDisabledProxy() {\n    const promise = all([\n      this.session.user?.licenses,\n      this.args.course?.products,\n    ]).then(([userLicenses, courseProducts]) => {\n      const userISBNs = userLicenses\n        .filterBy('isExpired', false)\n        .map((license) => license.isbn);\n      const courseISBNs = courseProducts.map((prod) => prod.id);\n\n      let disabled = false;\n\n      courseISBNs.forEach((isbn) => {\n        if (userISBNs.indexOf(isbn) === -1) {\n          disabled = true;\n        }\n      });\n\n      return disabled;\n    });\n\n    return load(promise, this);\n  }\n\n  get coursePagesDisabled() {\n    return this.coursePagesDisabledProxy.isResolved\n      ? this.coursePagesDisabledProxy.value\n      : true;\n  }\n\n  get users() {\n    return this.args.course?.users ?? [];\n  }\n\n  get teachers() {\n    return this.users.filterBy('role', 'teacher');\n  }\n\n  get students() {\n    return this.users.filterBy('role', 'student').sortBy('showname');\n  }\n\n  get loggedInStudents() {\n    return this.students.filter((x) => x.metadata?.last_login);\n  }\n\n  get notLoggedInStudents() {\n    return this.students.filter((x) => !x.metadata?.last_login);\n  }\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get courseSettingsURL() {\n    return `${this.skolAdminUrl}/courses/${this.args?.course?.id}`;\n  }\n\n  @action\n  openLicenseModal(product, user) {\n    this.activeProduct = product;\n    this.activeUser = user;\n    this.licenseModalOpen = true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XDrawer\\n  @title={{t \\\"components.header.courseUsersDrawer.title\\\"}}\\n  @closeOnRouteChange={{true}}\\n  @onClose={{this.studentList.closeDrawer}}\\n  @position=\\\"right\\\"\\n>\\n  <div class=\\\"course-user-list-drawer\\\">\\n    {{#if @course.hasLicenseWarnings}}\\n      <CourseMain::TeacherLicenseAlert\\n        class=\\\"m1\\\"\\n        @course={{@course}}\\n        @openLicenseModal={{this.openLicenseModal}}\\n      />\\n    {{/if}}\\n\\n    {{#let\\n      (component\\n        \\\"course-user-list/user\\\"\\n        coursePagesDisabled=this.coursePagesDisabled\\n        products=@course.products\\n        openLicenseModal=this.openLicenseModal\\n      )\\n      as |UserComponent|\\n    }}\\n      <div class=\\\"text-tertiary mx1 mt1\\\">\\n        {{t \\\"components.courseUserList.students\\\"}}\\n      </div>\\n\\n      {{#if this.students}}\\n        {{#each this.loggedInStudents as |student|}}\\n          <UserComponent @user={{student}} />\\n        {{/each}}\\n\\n        {{#if this.notLoggedInStudents}}\\n          <div class=\\\"text-separator ml1 mt1 text-muted\\\">\\n            {{t \\\"components.courseUserList.hasNotLoggedIn\\\"}}\\n          </div>\\n\\n          {{#each this.notLoggedInStudents as |student|}}\\n            <UserComponent @user={{student}} />\\n          {{/each}}\\n        {{/if}}\\n      {{else}}\\n        <div class=\\\"flex flex-column p1\\\">\\n          <XAlert @variant=\\\"default\\\">\\n            {{t \\\"components.courseUserList.courseNoUsers\\\"}}\\n\\n            <a\\n              href={{this.courseSettingsURL}}\\n              class=\\\"ui-link ui-link--button--default ui-link--medium ui-link--square text-color-inverted mt1 flex justify-center\\\"\\n            >\\n              {{t \\\"components.courseUserList.courseSettings\\\"}}\\n            </a>\\n          </XAlert>\\n        </div>\\n      {{/if}}\\n    {{/let}}\\n  </div>\\n</XDrawer>', { moduleName: 'babel/components/course-user-list/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nconst actions = {\n  SHOW_LOG: 'show_log',\n  AUDIT_EXERCISES: 'audit_exercises',\n  AUDIT_COMMENTS: 'audit_comments',\n  ADMINISTER_USER: 'administer_user',\n};\n\nexport default class CourseUserListComponent extends Component {\n  /**\n   * Arguments:\n   * user (object)\n   * coursePagesDisabled (bool)\n   * usersMissingLicenses (array)\n   * products (array)\n   * openLicenseModal (function)\n   */\n\n  @service contextHelper;\n\n  @service intl;\n\n  @service router;\n\n  @tracked modalOpen = false;\n\n  @tracked tabValue = null;\n\n  get actionMenuButtonItems() {\n    return [\n      {\n        value: actions.SHOW_LOG,\n        label: this.intl.t('components.courseUserList.user.showLog'),\n        disabled: this.args.coursePagesDisabled,\n      },\n      {\n        value: actions.AUDIT_EXERCISES,\n        label: this.intl.t('components.courseUserList.user.auditExercises'),\n        disabled: this.args.coursePagesDisabled,\n      },\n      {\n        value: actions.AUDIT_COMMENTS,\n        label: this.intl.t('components.courseUserList.user.auditComments'),\n        disabled: this.args.coursePagesDisabled,\n      },\n      {\n        type: 'divider',\n      },\n      {\n        value: actions.ADMINISTER_USER,\n        label: this.intl.t('components.courseUserList.user.administerUser'),\n        description: this.intl.t(\n          'components.courseUserList.user.administerUserDescription'\n        ),\n      },\n    ];\n  }\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  @action\n  onActionMenuButtonChange(value) {\n    switch (value.action) {\n      case actions.SHOW_LOG:\n        this.#routeToAudit('log');\n        break;\n      case actions.AUDIT_EXERCISES:\n        this.#routeToAudit('overview');\n        break;\n      case actions.AUDIT_COMMENTS:\n        this.#routeToAudit('comments');\n        break;\n      case actions.ADMINISTER_USER:\n        window.location.href = `${this.skolAdminUrl}/users/${value.user.id}`;\n        break;\n    }\n  }\n\n  @action\n  close() {\n    return null;\n  }\n\n  #routeToAudit(auditType) {\n    const courseId = this.contextHelper.activeCourse?.id;\n    const userId = this.args.user?.id;\n\n    if (!courseId || !userId) return;\n\n    return this.router.transitionTo(\n      'master.courses.show.audit.' + auditType,\n      courseId,\n      {\n        queryParams: {\n          'selected-student': userId,\n        },\n      }\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-center justify-space-between course-user-list-user\\\">\\n  <UserAvatarAndName @user={{@user}} />\\n\\n  <div class=\\\"flex-shrink ml1\\\">\\n    {{#unless @user.isTeacher}}\\n      {{#let (generate-id \\\"user-menu\\\") as |id|}}\\n        <UiButton\\n          class=\\\"user-menu-button\\\"\\n          @appearance=\\\"circle\\\"\\n          @onClick={{set this \\\"menuOpen\\\" true}}\\n          id={{id}}\\n        >\\n          <DcIcon @name=\\\"menu-dots\\\" />\\n        </UiButton>\\n\\n        {{#if this.menuOpen}}\\n          <ActionMenu\\n            ...attributes\\n            @for={{id}}\\n            @onSelect={{this.onActionMenuButtonChange}}\\n            @onClose={{set this \\\"menuOpen\\\" false}}\\n            class=\\\"course-user-list-user-action-menu\\\"\\n            as |menu|\\n          >\\n            {{#each this.actionMenuButtonItems as |item|}}\\n              {{#if (eq item.type \\\"divider\\\")}}\\n                <menu.Divider />\\n              {{else}}\\n                {{#if item.description}}\\n                  <menu.Item @value={{hash action=item.value user=@user}}>\\n                    <:label>\\n                      {{item.label}}\\n                    </:label>\\n\\n                    <:description>\\n                      {{item.description}}\\n                    </:description>\\n                  </menu.Item>\\n                {{else}}\\n                  <menu.Item @value={{hash action=item.value user=@user}}>\\n                    <:label>\\n                      {{item.label}}\\n                    </:label>\\n                  </menu.Item>\\n                {{/if}}\\n              {{/if}}\\n            {{/each}}\\n          </ActionMenu>\\n        {{/if}}\\n      {{/let}}\\n    {{/unless}}\\n  </div>\\n</div>', { moduleName: 'babel/components/course-user-list/user/template.hbs' });\n","import Component from '@glimmer/component';\nimport imageSource from 'compton/utils/image-source';\n\nexport default class AreaViewCoverCardComponent extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * index (integer)\n   */\n\n  get image() {\n    return this.args.entity?.image;\n  }\n\n  get imageSource() {\n    const url = this.image?.imageUrl || this.args.entity?.featuredImage;\n\n    const settings = {\n      width: 132,\n      height: 132,\n      embed: true,\n    };\n\n    if (this.image?.metadata?.focus_point) {\n      settings.x = this.image.metadata.focus_point.x;\n      settings.y = this.image.metadata.focus_point.y;\n    }\n\n    return imageSource(url, settings);\n  }\n\n  get backgroundColor() {\n    return this.image?.backgroundColor;\n  }\n\n  get imageClass() {\n    const classes = ['cover-card-image'];\n\n    if (!this.image) {\n      classes.push('cover-card-image--fallback');\n    }\n\n    return classes.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DcCard class=\\\"cover-card\\\">\\n  <div class=\\\"flex flex-center\\\">\\n    {{#if @index}}\\n      <div class=\\\"cover-card-index\\\">\\n        {{@index}}\\n      </div>\\n    {{/if}}\\n\\n    <div class={{this.imageClass}}>\\n      <XImage @source={{this.imageSource}} @color={{this.backgroundColor}} />\\n    </div>\\n\\n    <div class=\\\"text-quarternary flex-auto ny1 mr1 text-color-default\\\">\\n      {{@entity.title}}\\n\\n      {{yield to=\\\"subtitle\\\"}}\\n    </div>\\n\\n    <div class=\\\"flex\\\">\\n      {{#if (eq @entity.selectedMaterial.content.type \\\"links\\\")}}\\n        <DcIcon @name=\\\"external\\\" class=\\\"text-color-default cover-card-icon\\\" />\\n      {{else if (eq @entity.selectedMaterial.content.type \\\"attachments\\\")}}\\n        <DcIcon\\n          @name=\\\"cloud-download\\\"\\n          class=\\\"text-color-default cover-card-icon\\\"\\n        />\\n      {{/if}}\\n    </div>\\n  </div>\\n</DcCard>', { moduleName: 'babel/components/cover-card/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t\\n    \\\"components.customContentDetailModal.title\\\"\\n    entityTitle=@customContent.entity.title\\n  }}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  as |modal|\\n>\\n  <UiFormFor\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @object={{@customContent}}\\n    @onSubmit={{fn @onSave @customContent}}\\n    as |form|\\n  >\\n    <modal.header />\\n\\n    <modal.content class=\\\"p1\\\">\\n      <WaitFor @resource={{this.resource}}>\\n        <EntityCustomizer\\n          @entity={{@customContent.entity}}\\n          @expandedEntities={{this.expandedEntities}}\\n          @includedEntities={{@customContent.includedEntities}}\\n          @includedEntitySettings={{@customContent.includedEntitySettings}}\\n          @onExpand={{this.handleEntityCustomizerExpand}}\\n          @onCollapse={{this.handleEntityCustomizerCollapse}}\\n          @onInclude={{this.handleEntityCustomizerInclude}}\\n          @onExclude={{this.handleEntityCustomizerExclude}}\\n        />\\n\\n        {{#if\\n          (or\\n            this.contentTeacherAssignments.length this.contentWordlists.length\\n          )\\n        }}\\n          <div class=\\\"text-tertiary mt1\\\">\\n            {{t \\\"components.customContentDetailModal.teacherMaterial\\\"}}\\n          </div>\\n\\n          <AdditionCustomizer\\n            @teacherAssignments={{this.contentTeacherAssignments}}\\n            @wordlists={{this.contentWordlists}}\\n            @includedTeacherAssignments={{@customContent.includedTeacherAssignments}}\\n            @includedWordlists={{@customContent.includedWordlists}}\\n            @onIncludeTeacherAssignment={{this.handleAdditionCustomizerIncludeTeacherAssignment}}\\n            @onExcludeTeacherAssignment={{this.handleAdditionCustomizerExcludeTeacherAssignment}}\\n            @onIncludeWordlist={{this.handleAdditionCustomizerIncludeWordlist}}\\n            @onExcludeWordlist={{this.handleAdditionCustomizerExcludeWordlist}}\\n          />\\n        {{/if}}\\n      </WaitFor>\\n    </modal.content>\\n\\n    <modal.footer class=\\\"justify-flex-end\\\">\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.customContentDetailModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <form.submit\\n        @disabled={{or\\n          this.resource.isPending\\n          (not @customContent.includedEntities.length)\\n        }}\\n      >\\n        {{t \\\"components.customContentDetailModal.saveButtonLabel\\\"}}\\n      </form.submit>\\n    </modal.footer>\\n  </UiFormFor>\\n</XModal>\", {\"contents\":\"<XModal\\n  @title={{t\\n    \\\"components.customContentDetailModal.title\\\"\\n    entityTitle=@customContent.entity.title\\n  }}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @onClose={{@onClose}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  as |modal|\\n>\\n  <UiFormFor\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @object={{@customContent}}\\n    @onSubmit={{fn @onSave @customContent}}\\n    as |form|\\n  >\\n    <modal.header />\\n\\n    <modal.content class=\\\"p1\\\">\\n      <WaitFor @resource={{this.resource}}>\\n        <EntityCustomizer\\n          @entity={{@customContent.entity}}\\n          @expandedEntities={{this.expandedEntities}}\\n          @includedEntities={{@customContent.includedEntities}}\\n          @includedEntitySettings={{@customContent.includedEntitySettings}}\\n          @onExpand={{this.handleEntityCustomizerExpand}}\\n          @onCollapse={{this.handleEntityCustomizerCollapse}}\\n          @onInclude={{this.handleEntityCustomizerInclude}}\\n          @onExclude={{this.handleEntityCustomizerExclude}}\\n        />\\n\\n        {{#if\\n          (or\\n            this.contentTeacherAssignments.length this.contentWordlists.length\\n          )\\n        }}\\n          <div class=\\\"text-tertiary mt1\\\">\\n            {{t \\\"components.customContentDetailModal.teacherMaterial\\\"}}\\n          </div>\\n\\n          <AdditionCustomizer\\n            @teacherAssignments={{this.contentTeacherAssignments}}\\n            @wordlists={{this.contentWordlists}}\\n            @includedTeacherAssignments={{@customContent.includedTeacherAssignments}}\\n            @includedWordlists={{@customContent.includedWordlists}}\\n            @onIncludeTeacherAssignment={{this.handleAdditionCustomizerIncludeTeacherAssignment}}\\n            @onExcludeTeacherAssignment={{this.handleAdditionCustomizerExcludeTeacherAssignment}}\\n            @onIncludeWordlist={{this.handleAdditionCustomizerIncludeWordlist}}\\n            @onExcludeWordlist={{this.handleAdditionCustomizerExcludeWordlist}}\\n          />\\n        {{/if}}\\n      </WaitFor>\\n    </modal.content>\\n\\n    <modal.footer class=\\\"justify-flex-end\\\">\\n      <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.customContentDetailModal.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <form.submit\\n        @disabled={{or\\n          this.resource.isPending\\n          (not @customContent.includedEntities.length)\\n        }}\\n      >\\n        {{t \\\"components.customContentDetailModal.saveButtonLabel\\\"}}\\n      </form.submit>\\n    </modal.footer>\\n  </UiFormFor>\\n</XModal>\",\"moduleName\":\"babel/components/custom-content-detail-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/custom-content-detail-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport Resource from 'babel/utils/resource';\nimport sortBy from 'babel/utils/sort-by';\n\nexport default class CustomContentDetailModalComponent extends Component {\n  @service contextHelper;\n\n  @tracked expandedEntities = [];\n\n  resource = new Resource(async () => {\n    const { customContent } = this.args;\n\n    if (customContent.populated) {\n      const entity = await customContent.entity;\n      await entity.customizableDescendents;\n    } else {\n      await customContent.populate();\n    }\n\n    await Promise.all([\n      customContent.includedEntities,\n      customContent.includedTeacherAssignments,\n      customContent.includedWordlists,\n    ]);\n  });\n\n  get courseTeacherIds() {\n    return this.contextHelper.activeCourse?.teachers?.mapBy('id') ?? [];\n  }\n\n  get contentTeacherAssignments() {\n    const { teacherAssignments } = this.args;\n\n    if (teacherAssignments) {\n      return sortBy(\n        teacherAssignments.filter(\n          (teacherAssignment) =>\n            teacherAssignment.isPublished &&\n            teacherAssignment.hasContent(this.args.customContent.entity) &&\n            this.courseTeacherIds.includes(teacherAssignment.userId)\n        ),\n        'title_asc'\n      );\n    }\n\n    return [];\n  }\n\n  get contentWordlists() {\n    const { wordlists } = this.args;\n\n    if (wordlists) {\n      return wordlists.filter(\n        (wordlist) =>\n          wordlist.isPublished &&\n          !wordlist.isTransformed &&\n          wordlist.hasContent(this.args.customContent.entity) &&\n          this.courseTeacherIds.includes(wordlist.userId)\n      );\n    }\n\n    return [];\n  }\n\n  @action handleEntityCustomizerExpand(entity) {\n    this.expandedEntities.addObject(entity);\n  }\n\n  @action handleEntityCustomizerCollapse(entity) {\n    this.expandedEntities.removeObject(entity);\n  }\n\n  @action handleEntityCustomizerInclude(entity) {\n    this.args.customContent.includedEntities.addObject(entity);\n  }\n\n  @action handleEntityCustomizerExclude(entity) {\n    this.args.customContent.includedEntities.removeObject(entity);\n  }\n\n  @action handleAdditionCustomizerIncludeTeacherAssignment(teacherAssignment) {\n    this.args.customContent.includedTeacherAssignments.addObject(\n      teacherAssignment\n    );\n  }\n\n  @action handleAdditionCustomizerExcludeTeacherAssignment(teacherAssignment) {\n    this.args.customContent.includedTeacherAssignments.removeObject(\n      teacherAssignment\n    );\n  }\n\n  @action handleAdditionCustomizerIncludeWordlist(wordlist) {\n    this.args.customContent.includedWordlists.addObject(wordlist);\n  }\n\n  @action handleAdditionCustomizerExcludeWordlist(wordlist) {\n    this.args.customContent.includedWordlists.removeObject(wordlist);\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\n\nexport default class DiagnosisDoneComponent extends Component {\n  /**\n   * Arguments:\n   * interactive (object)\n   * collection (object)\n   * exercises (array)\n   * answers (array)\n   * result (object)\n   */\n\n  @service router;\n\n  @service contextHelper;\n\n  get pointsRequired() {\n    return this.args.collection.pointsRequired;\n  }\n\n  get image() {\n    if (this.args.result.score >= this.pointsRequired) {\n      return '/assets/images/collection/completed.svg';\n    }\n\n    return '/assets/images/collection/ended.svg';\n  }\n\n  get items() {\n    return this.args.answers\n      ?.map((answer) => {\n        const exerciseId = answer.belongsTo('entity').id();\n        const exercise = this.args.exercises?.findBy('id', exerciseId);\n\n        return { answer, exercise };\n      })\n      ?.sortBy('exercise.sort');\n  }\n\n  get scoreMax() {\n    return this.args.exercises?.length;\n  }\n\n  #isEmberRoute(url) {\n    const routeInfo = this.router.recognize(url);\n    return routeInfo && routeInfo.name !== 'url-resolve';\n  }\n\n  @action\n  async handleCloseButton() {\n    const collections = (await this.args.interactive.children).filter(\n      ({ type }) => type === 'collections'\n    );\n\n    if (collections.length > 1) {\n      return this.router.transitionTo(\n        'master.interactives',\n        this.args.interactive.id\n      );\n    }\n\n    if (this.contextHelper.inMission) {\n      return this.router.transitionTo(\n        'master.missions',\n        this.contextHelper.activeMission.id\n      );\n    }\n\n    if (this.contextHelper.hasCloseUrl) {\n      if (\n        !config.redirectToVue &&\n        this.#isEmberRoute(this.contextHelper.closeUrl)\n      ) {\n        return this.router.transitionTo(this.contextHelper.closeUrl);\n      }\n      window.location = this.contextHelper.closeUrl;\n      return;\n    }\n\n    const parent = await this.args.interactive.parent;\n    if (parent.type === 'areas') {\n      return this.router.transitionTo('master.areas', parent.id);\n    } else if (parent.type === 'books') {\n      return this.router.transitionTo('master.books', parent.id);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XModal @size={{hash height=\\\"auto\\\" width=\\\"small\\\"}} as |Modal|>\\n  <Modal.content class=\\\"diagnosis-done\\\">\\n    <div class=\\\"pt3 px2 block bb1\\\">\\n      <div class=\\\"text-center\\\">\\n        <div class=\\\"flex flex-center justify-center mt2\\\">\\n          {{! template-lint-disable require-iframe-title }}\\n          <iframe src={{this.image}} class=\\\"result-illustration\\\" />\\n        </div>\\n\\n        <div class=\\\"text-secondary mb1 mt1\\\">\\n          {{t\\n            \\\"components.diagnosisDone.textResult\\\"\\n            correct=@result.score\\n            total=this.scoreMax\\n          }}\\n        </div>\\n\\n        <div class=\\\"mb3\\\">\\n          <UiButton\\n            @click={{this.handleCloseButton}}\\n            @size=\\\"large\\\"\\n            data-test-diagnosis-result-close-button\\n          >\\n            {{t \\\"components.diagnosisDone.close\\\"}}\\n          </UiButton>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"py2 px2 block\\\">\\n      <div class=\\\"flex flex-justify\\\">\\n        <div class=\\\"text-ui\\\">\\n          {{t \\\"components.diagnosisDone.yourAnswers\\\"}}\\n        </div>\\n      </div>\\n\\n      <ul class=\\\"diagnosis-results mt1\\\">\\n        {{#each this.items as |item index|}}\\n          <DiagnosisResultItem\\n            @route=\\\"master.interactives.diagnoses.done.audit\\\"\\n            @collection={{@collection}}\\n            @result={{@result}}\\n            @exercise={{item.exercise}}\\n            @answer={{item.answer}}\\n            @index={{index}}\\n            @showBorder={{false}}\\n            data-test-diagnosis-result-item\\n          />\\n        {{/each}}\\n      </ul>\\n    </div>\\n  </Modal.content>\\n</XModal>', { moduleName: 'babel/components/diagnosis-done/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class DiagnosisIntroComponent extends Component {\n  /**\n   * Arguments:\n   * results (array)\n   * interactive (object)\n   * collection (object)\n   * isTeacher (boolean)\n   * scoreMax (number)\n   */\n\n  @service contextHelper;\n\n  @tracked resultsOpen = false;\n\n  get latestResult() {\n    return this.args.results?.firstObject;\n  }\n\n  get allowedTime() {\n    return this.args.collection?.timeAllowed;\n  }\n\n  get allowedAttempts() {\n    return this.args.collection?.allowedAttempts;\n  }\n\n  get pointsRequired() {\n    return this.args.collection.pointsRequired;\n  }\n\n  get attemptsLeft() {\n    let attemptsLeft = this.allowedAttempts - (this.latestResult?.attempt || 0);\n\n    if (attemptsLeft < 0) {\n      attemptsLeft = 0;\n    }\n\n    return attemptsLeft;\n  }\n\n  get attemptsDone() {\n    let attemptsDone = this.latestResult?.attempt + 1 || 1;\n\n    if (attemptsDone > this.allowedAttempts && !this.args.isTeacher) {\n      attemptsDone = this.allowedAttempts;\n    }\n\n    return attemptsDone;\n  }\n\n  get scoreMax() {\n    return this.args.scoreMax;\n  }\n\n  get disabledInCourse() {\n    if (this.contextHelper.inMission) {\n      return false;\n    }\n    return this.contextHelper.activeCourse?.showDiagnosis === false;\n  }\n\n  get noAttemptsLeft() {\n    return this.attemptsLeft <= 0 || this.scoreMax === 0;\n  }\n\n  get startDisabled() {\n    if (this.args.isTeacher) {\n      return false;\n    }\n\n    if (this.disabledInCourse) {\n      return true;\n    }\n\n    if (this.latestResult && this.latestResult.isActive) {\n      return false;\n    }\n\n    return this.noAttemptsLeft;\n  }\n\n  @action\n  openResults() {\n    this.resultsOpen = true;\n  }\n\n  @action\n  closeResults() {\n    this.resultsOpen = false;\n  }\n\n  @action\n  handleStartButtonClick() {\n    this.args.onStartButtonClick?.(this.latestResult, this.allowedTime);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"diagnosis-intro-results-summary\\\">\\n  {{#each @results as |result|}}\\n    <div class=\\\"flex n1\\\" data-test-result-item>\\n      <div class=\\\"flex flex-auto flex-column pr2\\\">\\n        <UiLink\\n          @route=\\\"master.interactives.diagnoses.done\\\"\\n          @models={{array\\n            @interactive.id\\n            @collection.id\\n            result.id\\n          }}\\n          class=\\\"text-small\\\"\\n        >\\n          {{t\\n            \\\"components.diagnosisIntro.resultsSummary.attemptNumber\\\"\\n            attempt=result.attempt\\n          }}\\n        </UiLink>\\n\\n        <div class=\\\"text-small\\\">\\n          {{datetime result.created}}\\n        </div>\\n      </div>\\n      <div class=\\\"flex flex-shrink flex-center\\\">\\n        <div>\\n          {{#let\\n            (if\\n              (gte result.score @collection.pointsRequired)\\n              \\\"success\\\"\\n              \\\"default\\\"\\n            )\\n            as |resultColor|\\n          }}\\n            <XBadge @size=\\\"small\\\" @variant={{resultColor}}>\\n              {{#if (or result.score (eq result.score 0))}}\\n                {{t\\n                  \\\"components.diagnosisIntro.resultsSummary.result\\\"\\n                  score=result.score\\n                  scoreMax=@scoreMax\\n                }}\\n              {{else}}\\n                {{t \\\"components.diagnosisIntro.resultsSummary.aborted\\\"}}\\n              {{/if}}\\n            </XBadge>\\n          {{/let}}\\n        </div>\\n      </div>\\n    </div>\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/diagnosis-intro/results-summary/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"diagnosis-intro\\\">\\n  <div class=\\\"diagnosis-intro-backdrop\\\">\\n    <div class=\\\"diagnosis-intro-backdrop-content\\\">\\n      <XDialog\\n        @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n        @fillOnSmallBreakpoint={{true}}\\n        @closeButton={{false}}\\n        as |Dialog|\\n      >\\n        <Dialog.content>\\n          <div class=\\\"diagnosis-intro-information\\\">\\n            <div class=\\\"text-secondary text-center mb1\\\" data-test-collection-title>\\n              {{@collection.title}}\\n            </div>\\n\\n            <div class=\\\"mw-md\\\" data-test-collection-preamble>\\n              <TbRenderInline @value={{@collection.body.preamble}} />\\n            </div>\\n\\n            <div class=\\\"diagnosis-intro-information-box my1 text-center\\\">\\n              <div class=\\\"text-ui\\\">\\n                {{t\\n                  \\\"components.diagnosisIntro.info\\\"\\n                  allowedTime=this.allowedTime\\n                  count=this.scoreMax\\n                }}\\n              </div>\\n\\n              <span class=\\\"text-small\\\">\\n                {{t\\n                  \\\"components.diagnosisIntro.pointsRequired\\\"\\n                  required=this.pointsRequired\\n                }}\\n              </span>\\n            </div>\\n          </div>\\n\\n          <div class=\\\"diagnosis-intro-actions\\\">\\n            <div class=\\\"text-center\\\">\\n              {{#if @results.length}}\\n                <div class=\\\"flex\\\" data-test-latest-attempt>\\n                  <UiButton\\n                    @appearance=\\\"link\\\"\\n                    @onClick={{this.openResults}}\\n                    id={{concat \\\"result-\\\" @collection.id}}\\n                  >\\n                    {{t\\n                      \\\"components.diagnosisIntro.showAttempts\\\"\\n                      attempts=@results.length\\n                    }}\\n                  </UiButton>\\n                </div>\\n\\n                {{#if this.resultsOpen}}\\n                  <XPopup\\n                    @for={{concat \\\"result-\\\" @collection.id}}\\n                    @onClose={{this.closeResults}}\\n                    class=\\\"diagnosis-intro-attemps-popover\\\"\\n                  >\\n                    <div class=\\\"p1\\\">\\n                      <DiagnosisIntro::ResultsSummary\\n                        @collection={{@collection}}\\n                        @interactive={{@interactive}}\\n                        @scoreMax={{this.scoreMax}}\\n                        @results={{@results}}\\n                      />\\n                    </div>\\n                  </XPopup>\\n                {{/if}}\\n              {{else}}\\n                <div class=\\\"text-small\\\" data-test-no-results>\\n                  {{t \\\"components.diagnosisIntro.noResult\\\"}}\\n                </div>\\n              {{/if}}\\n            </div>\\n\\n            <UiButton\\n              class=\\\"mt1\\\"\\n              id={{concat \\\"diagnosis-\\\" @collection.id}}\\n              @variant=\\\"default\\\"\\n              @disabled={{this.startDisabled}}\\n              @onClick={{this.handleStartButtonClick}}\\n              data-test-start-button\\n            >\\n              {{t\\n                \\\"components.diagnosisIntro.startButton\\\"\\n                count=this.attemptsDone\\n                total=this.allowedAttempts\\n              }}\\n            </UiButton>\\n    \\n            {{#if this.startDisabled}}\\n              <p class=\\\"text-small text-color-error mt1\\\">\\n                {{#if this.disabledInCourse}}\\n                  {{t \\\"components.diagnosisIntro.diagnosisDisabledInCourse\\\"}}\\n                {{else if this.noAttemptsLeft}}\\n                  {{t \\\"components.diagnosisIntro.noAttemptsLeft\\\"}}\\n                {{/if}}\\n              </p>\\n            {{/if}}\\n\\n            <p class=\\\"text-small text-muted text-center mt1\\\">\\n              {{t \\\"components.diagnosisIntro.startInfo\\\"}}\\n              {{#if @isTeacher}}\\n                <br /><b>{{t \\\"components.diagnosisIntro.teacherAttemptsInfo\\\"}}</b>\\n              {{/if}}\\n            </p>\\n\\n            <UiButton\\n              class=\\\"ny1\\\"\\n              @appearance=\\\"link\\\"\\n              @onClick={{@onCancel}}\\n              data-test-cancel-button\\n            >\\n              {{t \\\"components.diagnosisIntro.cancelButton\\\"}}\\n            </UiButton>\\n          </div>\\n        </Dialog.content>\\n      </XDialog>\\n    </div>\\n  </div>\\n</div>\\n', { moduleName: 'babel/components/diagnosis-intro/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li class=\\\"diagnosis-result-item{{if this.showBorder \\\" diagnosis-result-item--border\\\"}}\\\" ...attributes>\\n  <UiButton\\n    @appearance=\\\"link\\\"\\n    class=\\\"diagnosis-result-item-link flex flex-center\\\"\\n    @onClick={{this.openExercise}}\\n  >\\n    <AnswerStatusIcon @status={{@answer.computedStatus}} class=\\\"mr1\\\" />\\n    {{this.titleToShow}}\\n  </UiButton>\\n</li>\\n\", {\"contents\":\"<li class=\\\"diagnosis-result-item{{if this.showBorder \\\" diagnosis-result-item--border\\\"}}\\\" ...attributes>\\n  <UiButton\\n    @appearance=\\\"link\\\"\\n    class=\\\"diagnosis-result-item-link flex flex-center\\\"\\n    @onClick={{this.openExercise}}\\n  >\\n    <AnswerStatusIcon @status={{@answer.computedStatus}} class=\\\"mr1\\\" />\\n    {{this.titleToShow}}\\n  </UiButton>\\n</li>\\n\",\"moduleName\":\"babel/components/diagnosis-result-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/diagnosis-result-item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { typeOf } from '@ember/utils';\nimport Component from '@glimmer/component';\n\nexport default class DiagnosisResultItemComponent extends Component {\n  /**\n   * Arguments:\n   * showBorder (bool)\n   * index (number)\n   * route (string)\n   * answer (object)\n   * exercise (object)\n   */\n\n  @service router;\n\n  get showBorder() {\n    return this.args.showBorder === false ? false : true;\n  }\n\n  get title() {\n    return this.args.exercise?.title;\n  }\n\n  get titleToShow() {\n    const index =\n      typeOf(this.args.index) === 'number' ? `${this.args.index + 1}. ` : '';\n    const title = this.title ? htmlSafe(this.title) : '';\n\n    if (this.args.exercise.hideAssignmentSortNumbers) {\n      return title;\n    } else {\n      return `${index}${title}`;\n    }\n  }\n\n  @action\n  openExercise() {\n    this.router.transitionTo(this.args.route, {\n      queryParams: {\n        exercise: this.args.exercise.id,\n      },\n    });\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class DiagnosisShowComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * queryExercise (string)\n   * turningIn (bool)\n   * disabled (bool)\n   */\n\n  @service entityContext;\n\n  @service store;\n\n  @service router;\n\n  constructor() {\n    super(...arguments);\n    this.setEntityContext();\n  }\n\n  get activeExercise() {\n    return (\n      this.args.model?.exercises?.findBy('id', this.args.queryExercise) ||\n      this.args.model?.exercises?.firstObject\n    );\n  }\n\n  get activeAnswer() {\n    return this.args.model?.answers?.findBy(\n      'entity.id',\n      this.activeExercise.id\n    );\n  }\n\n  @action openExercise(exercise) {\n    return this.router\n      .transitionTo({ queryParams: { exercise } })\n      .then(() => this.setEntityContext());\n  }\n\n  @action setEntityContext() {\n    this.entityContext.changeExercise(this.activeExercise);\n  }\n\n  @action unsetEntityContext() {\n    this.entityContext.changeExercise();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"diagnosis-show\\\"\\n  {{did-update this.setEntityContext @queryExercise}}\\n  {{will-destroy this.unsetEntityContext}}\\n>\\n  {{#if @turningIn}}\\n    <DcLoader class=\\\"mt6 mb6\\\">\\n      {{t \\\"components.diagnosisShow.savingResult\\\"}}\\n    </DcLoader>\\n  {{else}}\\n    <ContentTopbar\\n      @content={{@model.interactive}}\\n      @model={{@model.collection}}\\n      @template={{@model.interactive.template}}\\n      @hideWorkflow={{true}}\\n      @hideNavigation={{true}}\\n      @hideIndex={{true}}\\n      @hidePlaySettings={{false}}\\n      @title={{@model.collection.title}}\\n      @toggleTools=\\\"toggleTools\\\"\\n      class=\\\"flex-shrink\\\"\\n    >\\n      {{yield (hash Controls=(component \\\"x-empty\\\"))}}\\n    </ContentTopbar>\\n\\n    <FocusMode class=\\\"flex-shrink\\\" />\\n\\n    <div class=\\\"flex-auto overflow-auto\\\">\\n      <CollectionView\\n        @collection={{@model.collection}}\\n        @exercises={{@model.exercises}}\\n        @activeExercise={{this.activeExercise}}\\n        @answers={{@model.answers}}\\n        @digilarRecordedSpeechEnabled={{@model.interactive.body.recorded_speech_activated}}\\n        @activeAnswer={{this.activeAnswer}}\\n        @shortCode={{@model.book.body.shortcode}}\\n        @editor={{@model.editor}}\\n        @openExercise={{this.openExercise}}\\n        @disabled={{@disabled}}\\n      />\\n    </div>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/diagnosis-show/template.hbs' });\n","import { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\n\nexport default class EditPenIcon extends Component {\n  @service contextHelper;\n  @service store;\n  @service router;\n\n  get editUrl() {\n    if (!this.contextHelper || !this.contextHelper?.activeBook) {\n      return null;\n    }\n\n    // Check if we're viewing a wordlist\n    const currentRoute = this.router?.currentRouteName;\n    let activeWordlist = null;\n\n    if (currentRoute && currentRoute.includes('wordlists.show.index')) {\n      const wordlistId = this.router.currentRoute.parent?.params?.wordlist_id;\n\n      if (wordlistId) {\n        activeWordlist = this.store.peekRecord('wordlist', wordlistId);\n      }\n    }\n\n    const activeItem = [\n      this.contextHelper.activeBook,\n      this.contextHelper.activeArea,\n      this.contextHelper.activeContent,\n      this.contextHelper.activeSection,\n      this.contextHelper.activeExercise,\n      this.contextHelper.activeWorkspaceSection,\n      this.contextHelper.activeWorkspaceExercise,\n      activeWordlist,\n    ]\n      .filter((item) => item)\n      .pop();\n\n    if (activeItem) {\n      return `${config.cmsBaseUrl}/nodes/${activeItem.id}`;\n    }\n\n    return null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.editUrl}}\\n  <a\\n    href={{this.editUrl}}\\n    class=\\\"edit-pen-icon\\\"\\n    target=\\\"_blank\\\"\\n    rel=\\\"noopener noreferrer\\\"\\n  >\\n    <DcIcon @name=\\\"pen\\\" />\\n  </a>\\n{{/if}}', { moduleName: 'babel/components/edit-pen-icon/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { htmlSafe } from '@ember/template';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: 'article',\n\n  classNames: ['editor-preview'],\n\n  // EXTERNAL PROPERTIES\n\n  content: null,\n\n  // COMPUTED\n\n  htmlSafeContent: computed('content', function() {\n    return htmlSafe(this.get('content'));\n  }),\n\n  // LIFECYCLE HOOKS\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    const elem = this.get('element');\n\n    if (elem) {\n      const links = elem.querySelectorAll('a');\n\n      links.forEach((link) => {\n        link.target = '_blank';\n      });\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{this.htmlSafeContent}}', { moduleName: 'babel/components/editor-preview/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nconst PICKABLE_TYPES = [\n  'books',\n  'areas',\n  'archives',\n  'glossaries',\n  'contents',\n  'interactives',\n  'sections',\n  'folders',\n  'collections',\n  'exercises',\n  'assignments',\n  'studies',\n  'materials',\n];\n\nexport default class EntityBrowser extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * selectedEntity (object)\n   * expandedEntities (array)\n   * pickedEntities (array)\n   * pickedEntity (object)\n   * blacklistedEntityTypes\n   * root (false)\n   * selectable (true)\n   * routed (true)\n   * inspectable (true)\n   * pickable (false)\n   * multiple (false)\n   * onSelect (function or null)\n   * onExpand (function)\n   * onCollapse (function)\n   * onPick (function)\n   * onUnpick (function)\n   * onClose (null?)\n   */\n\n  selectable = this.args.selectable ?? true;\n\n  routed = this.args.routed ?? true;\n\n  inspectable = this.args.inspectable ?? true;\n\n  pickable = this.args.pickable ?? false;\n\n  multiple = this.args.multiple ?? false;\n\n  @tracked rootMode = 'collapsed'; // expanded or collapsed\n\n  @action onShouldAllowPick() {\n    return true;\n  }\n\n  get pickableTypes() {\n    if (this.args.pickableTypes) return this.args.pickableTypes;\n\n    const entity = this.args.pickedEntities.firstObject;\n\n    if (this.args.multiple && entity) {\n      return [entity.type];\n    }\n\n    return PICKABLE_TYPES;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"entity-browser\\\" ...attributes>\\n  {{#if @root}}\\n\\n    <EntityBrowser::tree::item\\n      @entity={{@entity}}\\n      @selectedEntity={{this.selectedEntity}}\\n      @pickedEntity={{@pickedEntity}}\\n      @pickedEntities={{@pickedEntities}}\\n      @disabledEntities={{@disabledEntities}}\\n      @expandedEntities={{@expandedEntities}}\\n      @selectable={{this.selectable}}\\n      @routed={{this.routed}}\\n      @inspectable={{this.inspectable}}\\n      @pickable={{this.pickable}}\\n      @multiple={{this.multiple}}\\n      @allowedTypes={{this.allowedTypes}}\\n      @pickableTypes={{@pickableTypes}}\\n      @onSelect={{@onSelect}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n      @onExpand={{@onExpand}}\\n      @onCollapse={{@onCollapse}}\\n      @onShouldAllowPick={{@onShouldAllowPick}}\\n      @onClose={{@onClose}}\\n    />\\n\\n  {{/if}}\\n\\n  {{#if (includes @entity @expandedEntities)}}\\n\\n    <EntityBrowser::tree\\n      @entity={{@entity}}\\n      @selectedEntity={{@selectedEntity}}\\n      @pickedEntity={{@pickedEntity}}\\n      @pickedEntities={{@pickedEntities}}\\n      @disabledEntities={{@disabledEntities}}\\n      @expandedEntities={{@expandedEntities}}\\n      @selectable={{this.selectable}}\\n      @routed={{this.routed}}\\n      @inspectable={{this.inspectable}}\\n      @pickable={{this.pickable}}\\n      @multiple={{this.multiple}}\\n      @depth={{if @root 1 0}}\\n      @blacklistedEntityTypes={{this.blacklistedEntityTypes}}\\n      @pickableTypes={{@pickableTypes}}\\n      @onSelect={{@onSelect}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n      @onExpand={{@onExpand}}\\n      @onCollapse={{@onCollapse}}\\n      @onShouldAllowPick={{@onShouldAllowPick}}\\n      @onClose={{@onClose}}\\n    />\\n\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/entity-browser/template.hbs' });\n","import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class EntityBrowserTree extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * selectedEntity (object)\n   * expandedEntities (array)\n   * blacklistedEntityTypes (array)\n   * selectable (null)\n   * pickable (bool, false)\n   * routed (null)\n   * multiple (null)\n   * inspectable (null)\n   * pickedEntity (object)\n   * pickableTypes (array)\n   * onSelect (function)\n   * onPick (function)\n   * onUnpick (function)\n   * onExpand (function)\n   * onCollapse (function)\n   */\n\n  @tracked depth = this.args.depth ?? 1;\n\n  get indent() {\n    return ['indent', this.depth].join('-');\n  }\n\n  get indentClass() {\n    return ['entity-browser-tree', this.indent].join('--');\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport appendQueryParams from 'babel/utils/append-query-params';\nimport routeArgsForEntity from 'babel/utils/route-args-for-entity';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\nimport { hasModifier } from 'compton/utils/event';\nimport { load } from 'ember-async-data';\nimport { task } from 'ember-concurrency';\n// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport DS from 'ember-data';\nimport { resolve } from 'rsvp';\n\nconst { PromiseArray } = DS;\n\nfunction createPromiseArray(promise) {\n  return PromiseArray.create({ promise });\n}\n\nexport function extractRouteArgs(args) {\n  args = args.slice();\n  const possibleQueryParams = args[args.length - 1];\n\n  let queryParams;\n  if (\n    possibleQueryParams &&\n    Object.prototype.hasOwnProperty.call(possibleQueryParams, 'queryParams')\n  ) {\n    queryParams = args.pop().queryParams;\n  } else {\n    queryParams = {};\n  }\n\n  const routeName = args.shift();\n  const models = args;\n\n  return { routeName, models, queryParams };\n}\n\nexport default class EntityBrowserTree extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * parentEntity (object)\n   * siblingIndex (number)\n   * selectedEntity (object)\n   * expandedEntities (array)\n   * disabledEntities (array)\n   * deph (number)\n   * selectable (null)\n   * pickable (bool, false)\n   * routed (null)\n   * multiple (null)\n   * inspectable (null)\n   * pickedEntity (object)\n   * pickedEntities (array)\n   * pickableTypes (array)\n   * onSelect (function)\n   * onPick (function)\n   * onUnpick (function)\n   * onExpand (function)\n   * onCollapse (function)\n   * onClose (null?)\n   * onShouldAllowPick (bool)\n   */\n\n  @service router;\n\n  @service missionMode;\n\n  @service contextHelper;\n\n  @tracked showingMeta = false;\n\n  @tracked isLoading = false;\n\n  @tracked isSelecting = false;\n\n  baseClass = 'entity-browser-tree-item';\n\n  element = null;\n\n  get classNames() {\n    const classes = [this.baseClass];\n\n    if (this.isDisabled) {\n      classes.push(`${this.baseClass}--disabled`);\n    }\n    if (this.isExpanded) {\n      classes.push(`${this.baseClass}--expanded`);\n    }\n    if (this.isSelectable) {\n      classes.push(`${this.baseClass}--selectable`);\n    }\n    if (this.isSelected) {\n      classes.push(`${this.baseClass}--selected`);\n    }\n    if (this.isSemiRouteActive) {\n      classes.push(`${this.baseClass}--semi-route-active`);\n    }\n    if (this.isSelecting) {\n      classes.push(`${this.baseClass}--selecting`);\n    }\n    if (this.isPickable) {\n      classes.push(`${this.baseClass}--pickable`);\n    }\n    if (this.isPicked) {\n      classes.push(`${this.baseClass}--picked`);\n    }\n    if (this.isLoading) {\n      classes.push(`${this.baseClass}--loading`);\n    }\n    if (this.showingMeta) {\n      classes.push(`${this.baseClass}--metashowing`);\n    }\n    if (this.isExpandable) {\n      classes.push(`${this.baseClass}--expandable`);\n    }\n    if (this.args.multiple) {\n      classes.push(`${this.baseClass}--multiple`);\n    }\n    if (\n      !this.isDisabled &&\n      (this.isExternal || this.isJunior || this.isDigitalbok)\n    ) {\n      classes.push(`${this.baseClass}--external-link`);\n    }\n\n    return classes.join(' ');\n  }\n\n  get index() {\n    if (\n      this.args.entity.hideSortNumbers ||\n      this.args.entity.hideSectionSortNumbers ||\n      this.args.entity.hideAssignmentSortNumbers\n    ) {\n      return false;\n    }\n\n    if (this.args.entity.space !== 'content') return false;\n\n    return this.args.siblingIndex;\n  }\n\n  @cached\n  get orginalRouteArgsProxy() {\n    const entity = this.args.entity;\n    return createPromiseArray(routeArgsForEntity(entity, {}, this.missionMode));\n  }\n\n  get orginalRouteArgs() {\n    if (this.orginalRouteArgsProxy.isSettled) {\n      return this.orginalRouteArgsProxy.content;\n    }\n\n    return null;\n  }\n\n  get shouldRouteWithSection() {\n    return ['sections', 'contents'].includes(this.args.entity.type);\n  }\n\n  get shouldRouteWithExercise() {\n    const entity = this.args.entity;\n\n    return (\n      ['assignments', 'exercises', 'studies'].includes(entity.type) &&\n      entity.get('parent.space') === 'content'\n    );\n  }\n\n  @cached\n  get routeArgsProxy() {\n    const entity = this.args.entity;\n\n    return createPromiseArray(\n      routeArgsForEntity(entity).then((routeArgsProxy) => {\n        // TODO Cleanup this mess.\n\n        const router = this.router;\n\n        const route = router.recognize(router.urlFor(...routeArgsProxy));\n\n        const contentRoute = route.find(\n          (route) => route.name === 'master.contents'\n        );\n\n        const currentRoute = router.currentRoute;\n\n        const { routeName, models, queryParams } =\n          extractRouteArgs(routeArgsProxy);\n\n        const currentContentRoute = currentRoute.find(\n          (route) => route.name === 'master.contents'\n        );\n\n        const shouldRouteWithExercise =\n          this.shouldRouteWithExercise ||\n          (entity.type === 'collections' && entity.space === 'content');\n\n        if (\n          currentContentRoute &&\n          contentRoute &&\n          currentContentRoute.params.content_id ===\n            contentRoute.params.content_id\n        ) {\n          if (routeName === 'master.contents') {\n            return [\n              currentRoute.name,\n              {\n                queryParams: {\n                  ...queryParams,\n                  exercise: shouldRouteWithExercise\n                    ? queryParams.exercise\n                    : null,\n                },\n              },\n            ];\n          } else if (routeName.includes('master.contents.')) {\n            return [\n              routeName,\n              ...models,\n              {\n                queryParams: {\n                  ...currentRoute.queryParams,\n                  exercise: shouldRouteWithExercise\n                    ? currentRoute.queryParams.exercise\n                    : null,\n                },\n              },\n            ];\n          }\n        }\n\n        return routeArgsProxy;\n      })\n    );\n  }\n\n  get routeArgs() {\n    return this.routeArgsProxy.isSettled ? this.routeArgsProxy.content : null;\n  }\n\n  @cached\n  get productProxy() {\n    const promise = resolve(this.args.entity?.product);\n    return load(promise, this);\n  }\n\n  get product() {\n    return this.productProxy.isFulfilled ? this.productProxy.value : null;\n  }\n\n  @cached\n  get productsProxy() {\n    const promise = resolve(this.args.entity?.products);\n    return load(promise, this);\n  }\n\n  get products() {\n    return this.productsProxy.isResolved ? this.productsProxy.value : null;\n  }\n\n  get productId() {\n    if (this.contextHelper.activeProduct) {\n      return this.contextHelper.activeProduct.id;\n    } else if (this.contextHelper.activeCourse && this.products) {\n      const overlappingProduct = this.contextHelper.activeCourse.products.find(\n        (product) => this.products.some((p) => p.id === product.id)\n      );\n\n      if (overlappingProduct) {\n        return overlappingProduct.id;\n      }\n    }\n\n    if (this.product) {\n      return this.product.id;\n    }\n\n    return this.products?.firstObject?.id;\n  }\n\n  get href() {\n    if (!this.isSelectable && !this.isPickable) {\n      const params = {};\n\n      let target;\n      switch (this.args.entity.type) {\n        case 'books_external':\n          target = this.args.entity.body.external_url;\n          break;\n        case 'books_pdf':\n          target = `${config.digitalbokUrl}/books/${this.args.entity.id}`;\n          break;\n        case 'books_junior':\n        default:\n          target = `${config.juniorUrl}/books/${this.args.entity.id}`;\n          break;\n      }\n\n      params.statisticsIsbn = this.productId;\n\n      if (this.isJunior || this.isDigitalbok) {\n        params.courseId = this.contextHelper?.activeCourse?.id;\n      }\n\n      return appendQueryParams(target, params);\n    }\n\n    if (this.routable || this.routeArgs) {\n      return this.router.urlFor(...this.routeArgs);\n    }\n\n    return null;\n  }\n\n  get isSelectable() {\n    if (this.isExternal || this.isJunior || this.isDigitalbok) return false;\n\n    return this.args.selectable ?? true;\n  }\n\n  get isDisabled() {\n    if (this.args.disabledEntities?.includes(this.args.entity)) {\n      return true;\n    }\n\n    const entityType = this.args.entity.type;\n\n    if (this.args.pickable) {\n      const pickableTypes = this.args.pickableTypes;\n\n      return (\n        !this._shouldAllowPick() ||\n        (pickableTypes && !pickableTypes.includes(entityType))\n      );\n    }\n\n    return false;\n  }\n\n  get isSemiRouteActive() {\n    const orginalRouteArgs = this.orginalRouteArgs;\n\n    if (!orginalRouteArgs) {\n      return false;\n    }\n\n    const currentRoute = this.router.currentRoute;\n    const route = extractRouteArgs(orginalRouteArgs);\n\n    if (this.args.entity.type === 'sections') {\n      return (\n        currentRoute.name !== 'master.contents.index' &&\n        currentRoute.name.includes('master.contents.') &&\n        route.queryParams.section === currentRoute.queryParams.section &&\n        this.router.isActive(route.routeName, ...route.models)\n      );\n    }\n\n    return false;\n  }\n\n  get routeHasExercise() {\n    const routeHasExercise = true;\n\n    return routeHasExercise;\n  }\n\n  get isRouteActive() {\n    const type = this.args.entity.type;\n\n    if (['collections', 'books_external', 'books_junior'].includes(type)) {\n      return false;\n    }\n\n    const orginalRouteArgs = this.orginalRouteArgs;\n\n    if (!orginalRouteArgs) {\n      return false;\n    }\n\n    const currentRoute = this.router.currentRoute;\n\n    if (\n      type === 'archives' &&\n      currentRoute.name.split('.').includes('folders')\n    ) {\n      return false;\n    }\n\n    const { routeName, models, queryParams } =\n      extractRouteArgs(orginalRouteArgs);\n\n    const isContent =\n      currentRoute.name === 'master.contents' ||\n      currentRoute.name === 'master.contents.index';\n\n    let withSection = true;\n\n    if (this.shouldRouteWithSection) {\n      withSection =\n        isContent && queryParams.section === currentRoute.queryParams.section;\n    }\n\n    let withExercise = true;\n\n    if (this.shouldRouteWithExercise) {\n      withExercise =\n        isContent && queryParams.exercise === currentRoute.queryParams.exercise;\n    }\n\n    return (\n      this.router.isActive(routeName, ...models) && withSection && withExercise\n    );\n  }\n\n  get isSelected() {\n    if (!this.isSelectable) {\n      return false;\n    }\n\n    if (this.args.routed) {\n      return this.isRouteActive;\n    }\n\n    return this.args.selectedEntity === this.args.entity;\n  }\n\n  get isPickable() {\n    if (this.args.pickable && this._shouldAllowPick()) {\n      const pickableTypes = this.args.pickableTypes;\n\n      if (pickableTypes) {\n        return pickableTypes.includes(this.args.entity.type);\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  get typeIsPickable() {\n    return this.args.pickableTypes.includes(this.args.entity.type);\n  }\n\n  get isPicked() {\n    const entity = this.args.entity;\n\n    if (this.args.multiple) {\n      return this.args.pickedEntities.includes(entity);\n    }\n\n    return this.args.pickedEntity === entity;\n  }\n\n  get isExternal() {\n    return this.args.entity.type === 'books_external';\n  }\n\n  get isJunior() {\n    return this.args.entity.type === 'books_junior';\n  }\n\n  get isDigitalbok() {\n    return this.args.entity.type === 'books_pdf';\n  }\n\n  get isExpanded() {\n    return this.args.expandedEntities.includes(this.args.entity);\n  }\n\n  get isExpandable() {\n    if (this.isExternal || this.isJunior || this.isDigitalbok) return false;\n\n    const template = this.args.entity.template;\n    const childrenSum = this.args.entity.childrenSum;\n\n    if (['quiz'].includes(template)) {\n      return false;\n    }\n\n    return childrenSum === 0 ? false : true;\n  }\n\n  // ACTIONS\n\n  @action\n  handlePickCheckboxChange() {\n    this._pickOrUnPick();\n  }\n\n  @action\n  clickEntity(evt) {\n    if (\n      (!this.isExternal &&\n        !this.isJunior &&\n        !this.isDigitalbok &&\n        !hasModifier(evt)) ||\n      this.isPickable\n    ) {\n      if (evt.target?.tagName !== 'INPUT') {\n        evt.preventDefault();\n      }\n\n      if (this.isDisabled) {\n        this._toggle();\n      } else if (this.isSelectable) {\n        this._select();\n      } else if (this.isPickable) {\n        this._pickOrUnPick();\n      }\n    }\n  }\n\n  @action\n  handleToggleButtonClick(evt) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    this._toggle();\n  }\n\n  @action\n  handleToggleMetaButtonClick(evt) {\n    evt.preventDefault();\n    evt.stopPropagation();\n  }\n\n  @action\n  handleOpenEntityInspector() {\n    this.args.onClose(this.args.entity);\n  }\n\n  @action\n  openMeta() {\n    this.showingMeta = true;\n  }\n\n  @action\n  closeMeta() {\n    this.showingMeta = false;\n  }\n\n  // OBSERVERS\n\n  @action\n  didInsert(element) {\n    if (this.isSelected || this.isSemiRouteActive) {\n      scrollIntoViewIfNeeded(element);\n    }\n  }\n\n  _shouldAllowPick() {\n    const entity = this.args.entity;\n\n    const parent = entity.parent;\n\n    return this.args.onShouldAllowPick({\n      type: entity.type,\n      template: entity.template,\n      parentType: parent.get('type'),\n      parentTemplate: parent.get('template'),\n    });\n  }\n\n  _select() {\n    if (!this.args.selectable) {\n      return;\n    }\n\n    let promise;\n\n    if (this.args.routed && this.routeArgs) {\n      promise = this.router.transitionTo(...this.routeArgs);\n    } else {\n      promise = this.onSelect(this.args.entity);\n    }\n\n    return this.select.perform(promise);\n  }\n\n  _pickOrUnPick() {\n    if (this.args.multiple) {\n      this.isPicked ? this._unpick() : this._pick();\n    } else {\n      this._pick();\n    }\n  }\n\n  _pick() {\n    if (this.isPickable) {\n      this.args.onPick(this.args.entity);\n    }\n  }\n\n  _unpick() {\n    if (this.isPickable) {\n      this.args.onUnpick(this.args.entity);\n    }\n  }\n\n  _toggle() {\n    if (this.isExpandable) {\n      this.isExpanded ? this._collapse() : this._expand();\n    }\n  }\n\n  _expand() {\n    this.load.perform(this.args.onExpand(this.args.entity));\n  }\n\n  _collapse() {\n    this.args.onCollapse(this.args.entity);\n  }\n\n  // TASKS\n\n  @task\n  *select(promise) {\n    this.isSelecting = true;\n    yield promise;\n    this.isSelecting = false;\n  }\n\n  @task\n  *load(promise) {\n    this.isLoading = true;\n    yield promise;\n    this.isLoading = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<a\\n  class={{this.classNames}}\\n  href={{unless this.isDisabled this.href}}\\n  ...attributes\\n  {{on \\\"click\\\" this.clickEntity}}\\n  {{did-update this.didInsert this.routeArgsProxy.isSettled}}\\n  {{ref (set this \\\"element\\\")}}\\n>\\n  <div class=\\\"entity-browser-tree-item-inner\\\">\\n    {{#if (and this.isPickable @multiple)}}\\n      <XCheckbox\\n        class=\\\"mr1\\\"\\n        @checked={{or this.isDisabled this.isPicked}}\\n        @disabled={{this.isDisabled}}\\n      />\\n    {{/if}}\\n\\n    <EntityIcon class=\\\"entity-browser-tree-entity-icon\\\" @entity={{@entity}} />\\n\\n    <div class=\\\"entity-browser-tree-item-title\\\">\\n      {{#if this.index}}\\n        {{this.index}}.\\n      {{/if}}\\n      {{@entity.title}}\\n    </div>\\n\\n    {{#if @inspectable}}\\n      <EntityMeta\\n        class=\\\"entity-browser-tree-item-info-button nr1 nl1\\\"\\n        @guidanceIconOnly={{true}}\\n        @model={{@entity}}\\n        @onOpen={{this.handleOpenEntityInspector}}\\n      />\\n    {{/if}}\\n\\n    {{#if (and @pickable this.isPicked (not @multiple))}}\\n      <DcIcon\\n        @name=\\\"check-circle\\\"\\n        class=\\\"entity-browser-tree-item-picked-icon\\\"\\n      />\\n    {{/if}}\\n\\n    {{#if this.isLoading}}\\n      <div class=\\\"entity-browser-tree-item-indicator\\\"></div>\\n    {{else if this.isExpandable}}\\n      {{#let (generate-id \\\"toggle-button\\\") as |id|}}\\n        {{! template-lint-disable no-nested-interactive }}\\n        <button\\n          type=\\\"button\\\"\\n          class=\\\"entity-browser-tree-item-toggle-button\\\"\\n          id={{id}}\\n          {{on \\\"click\\\" this.handleToggleButtonClick}}\\n        >\\n          <DcIcon\\n            @name=\\\"small-down\\\"\\n            @size=\\\"sm\\\"\\n            class=\\\"entity-browser-tree-item-info-toggle-icon\\\"\\n          />\\n        </button>\\n\\n        <XTooltip @for={{id}} @delay={{1000}}>\\n          {{if\\n            this.isExpanded\\n            (t \\\"components.entityBrowser.tree.item.collapse\\\")\\n            (t \\\"components.entityBrowser.tree.item.expand\\\")\\n          }}\\n        </XTooltip>\\n      {{/let}}\\n    {{/if}}\\n  </div>\\n</a>\\n', { moduleName: 'babel/components/entity-browser/tree/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"entity-browser-tree {{this.indentClass}}\\\" ...attributes>\\n  <EntityCategorizer\\n    @entity={{@entity}}\\n    @blacklistedEntityTypes={{@blacklistedEntityTypes}}\\n    as |categoryGroup|\\n  >\\n\\n    {{#if categoryGroup.category}}\\n\\n      <div class=\\\"entity-browser-tree-heading\\\">\\n\\n        {{categoryGroup.category.name}}\\n\\n      </div>\\n\\n    {{/if}}\\n\\n    {{#each categoryGroup.entities key=\\\"id\\\" as |entityGroup|}}\\n\\n      <EntityBrowser::tree::item\\n        @parentEntity={{@entity}}\\n        @entity={{entityGroup.entity}}\\n        @selectedEntity={{@selectedEntity}}\\n        @pickedEntity={{@pickedEntity}}\\n        @pickedEntities={{@pickedEntities}}\\n        @pickableTypes={{@pickableTypes}}\\n        @expandedEntities={{@expandedEntities}}\\n        @disabledEntities={{@disabledEntities}}\\n        @siblingIndex={{entityGroup.index}}\\n        @depth={{@depth}}\\n        @selectable={{@selectable}}\\n        @routed={{@routed}}\\n        @multiple={{@multiple}}\\n        @pickable={{@pickable}}\\n        @inspectable={{@inspectable}}\\n        @onSelect={{@onSelect}}\\n        @onPick={{@onPick}}\\n        @onUnpick={{@onUnpick}}\\n        @onExpand={{@onExpand}}\\n        @onCollapse={{@onCollapse}}\\n        @onShouldAllowPick={{@onShouldAllowPick}}\\n        @onClose={{@onClose}}\\n      />\\n\\n      {{#if (includes entityGroup.entity @expandedEntities)}}\\n\\n        <EntityBrowser::tree\\n          @entity={{entityGroup.entity}}\\n          @selectedEntity={{@selectedEntity}}\\n          @pickedEntity={{@pickedEntity}}\\n          @pickedEntities={{@pickedEntities}}\\n          @expandedEntities={{@expandedEntities}}\\n          @disabledEntities={{@disabledEntities}}\\n          @blacklistedEntityTypes={{@blacklistedEntityTypes}}\\n          @selectable={{@selectable}}\\n          @routed={{@routed}}\\n          @inspectable={{@inspectable}}\\n          @multiple={{@multiple}}\\n          @pickable={{@pickable}}\\n          @pickableTypes={{@pickableTypes}}\\n          @depth={{increment this.depth}}\\n          @allowedTypes={{@allowedTypes}}\\n          @onSelect={{@onSelect}}\\n          @onPick={{@onPick}}\\n          @onUnpick={{@onUnpick}}\\n          @onExpand={{@onExpand}}\\n          @onCollapse={{@onCollapse}}\\n          @onShouldAllowPick={{@onShouldAllowPick}}\\n          @onClose={{@onClose}}\\n        />\\n\\n      {{/if}}\\n\\n    {{/each}}\\n\\n  </EntityCategorizer>\\n</div>', { moduleName: 'babel/components/entity-browser/tree/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport EmberObject from '@ember/object';\nimport sortBy from 'babel/utils/sort-by';\nimport shuffleArray from 'compton/utils/array-shuffle';\nimport groupBy from 'compton/utils/group-by';\n\nfunction flatten(arr) {\n  return [].concat.apply([], arr);\n}\n\nconst ALLOWED_TYPES = [\n  'books',\n  'areas',\n  'archives',\n  'glossaries',\n  'contents',\n  'interactives',\n  'sections',\n  'folders',\n  'collections',\n  'exercises',\n  'assignments',\n  'studies',\n  'materials'\n];\n\nconst MANUAL = 'manual';\nconst INVERSE = 'inverse';\nconst RANDOM = 'random';\nconst TITLE_ASC = 'title_asc';\nconst TITLE_DESC = 'title_desc';\nconst DATE_ASC = 'date_asc';\nconst DATE_DESC = 'date_desc';\n\nconst SORT = 'sort';\nconst TITLE = 'title';\nconst CREATED = 'created';\n\nconst ORDER_OPTIONS = {\n  [MANUAL]: {\n    shuffle: false,\n    reverse: false,\n    sortBy: SORT,\n    group: true\n  },\n  [INVERSE]: {\n    shuffle: false,\n    reverse: true,\n    sortBy: SORT,\n    group: false\n  },\n  [RANDOM]: {\n    shuffle: true,\n    reverse: false,\n    sortBy: SORT,\n    group: false\n  },\n  [TITLE_ASC]: {\n    shuffle: false,\n    reverse: false,\n    sortBy: TITLE,\n    group: false\n  },\n  [TITLE_DESC]: {\n    shuffle: false,\n    reverse: true,\n    sortBy: TITLE,\n    group: false\n  },\n  [DATE_ASC]: {\n    shuffle: false,\n    reverse: false,\n    sortBy: CREATED,\n    group: false\n  },\n  [DATE_DESC]: {\n    shuffle: false,\n    reverse: true,\n    sortBy: CREATED,\n    group: false\n  }\n};\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  // PARAMS\n\n  entity: null,\n\n  blacklistedEntityTypes: null,\n\n  validEntities: null,\n\n  // PROPERTIES\n\n  allowedEntityTypes: computed('blacklistedEntityTypes.[]', function() {\n    const blacklistedEntityTypes = this.get('blacklistedEntityTypes');\n\n    if (blacklistedEntityTypes && blacklistedEntityTypes.get('length')) {\n      return ALLOWED_TYPES.reject((type) => {\n        return blacklistedEntityTypes.includes(type);\n      });\n    }\n\n    return ALLOWED_TYPES;\n  }),\n\n  children: computed(\n    'entity.{isTeacherCollection,template,children.isFulfilled,children.[]}',\n    'validEntities.[]',\n    function() {\n      const validEntities = this.get('validEntities');\n      const entityChildren = this.get('entity.children') || [];\n\n      if (\n        !validEntities ||\n        this.get('entity.isTeacherCollection') ||\n        this.get('entity.isCarousel')\n      ) {\n        return entityChildren;\n      }\n\n      return entityChildren.filter((child) => {\n        return validEntities.includes(child);\n      });\n    }\n  ),\n\n  orderOptions: computed('entity.sortBy', function() {\n    return ORDER_OPTIONS[this.get('entity.sortBy') || MANUAL];\n  }),\n\n  categoryGroups: computed(\n    'orderOptions',\n    'entity.sortBy',\n    'children.@each',\n    'allowedEntityTypes',\n    function() {\n      const children = this.get('children')\n        .rejectBy('isTeacherCollection')\n        .rejectBy('isTeacherAssignment');\n      let categoryGroupsFinal = [];\n\n      if (this.get('entity.type') === 'areas') {\n        let sort = this.get('entity.sortBy');\n\n        if (sort === 'name_asc') sort = 'title_asc';\n        else if (sort === 'name_desc') sort = 'title_desc';\n\n        const filter = (entity) =>\n          this.get('allowedEntityTypes').includes(entity.get('type'));\n\n        let entities = sortBy(children.filter(filter), sort);\n\n        let categoryGroups = groupBy(entities, 'category', 'entities');\n\n        const uncategorizedGroup = categoryGroups.findBy('category', null);\n\n        // If we've an uncatorgized group, move it to the beginning.\n        if (uncategorizedGroup) {\n          categoryGroups.removeObject(uncategorizedGroup);\n          categoryGroups = categoryGroups.insertAt(0, uncategorizedGroup);\n        }\n\n        categoryGroupsFinal = sortBy(categoryGroups, sort).map(\n          (categoryGroup) => {\n            const entities = categoryGroup.get('entities').map((entity) => {\n              return EmberObject.create({\n                entity,\n                index: entity.get('sort')\n              });\n            });\n\n            return EmberObject.create({\n              entities,\n              category: categoryGroup.get('category')\n            });\n          }\n        );\n      } else {\n        const { sortBy, reverse, shuffle, group } = this.get('orderOptions');\n        const filter = (entity) =>\n          this.get('allowedEntityTypes').includes(entity.get('type'));\n\n        let filteredEntities = children.filter(filter);\n\n        if (group) {\n          let categoryGroups = groupBy(\n            filteredEntities,\n            'category',\n            'entities'\n          );\n\n          const order = ['contents', 'workspace', 'glossaries'];\n          const sortSpaceGroups = (a, b) => {\n            return order.indexOf(a.space) - order.indexOf(b.space);\n          };\n\n          categoryGroupsFinal = categoryGroups.map((categoryGroup) => {\n            let spaceGroups = groupBy(\n              categoryGroup.get('entities'),\n              'space',\n              'entities'\n            ).sort(sortSpaceGroups);\n\n            const entities = [];\n\n            spaceGroups.forEach((spaceGroup) => {\n              spaceGroup.get('entities').forEach((entity) => {\n                entities.push(\n                  EmberObject.create({\n                    entity,\n                    index: entity.get('sort')\n                  })\n                );\n              });\n            });\n\n            return EmberObject.create({\n              entities: entities.sortBy(sortBy),\n              category: categoryGroup.get('category'),\n            });\n          });\n        } else {\n          let entities = filteredEntities.sortBy(sortBy);\n          if (reverse) {\n            entities = entities.reverse();\n          }\n\n          if (shuffle) {\n            entities = shuffleArray(entities);\n          }\n\n          entities = entities.map((entity, index) =>\n            EmberObject.create({ entity, index })\n          );\n\n          categoryGroupsFinal = [EmberObject.create({ entities })];\n        }\n      }\n\n      let index = 1;\n\n      categoryGroupsFinal.forEach((groupEntites) => {\n        groupEntites.entities.forEach((entity) => {\n          entity.set('globalIndex', index);\n          index++;\n        });\n      });\n\n      return categoryGroupsFinal;\n    }\n  )\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.categoryGroups as |categoryGroup index|}}\\n  {{yield categoryGroup index}}\\n{{else}}\\n  {{yield}}\\n{{/each}}', { moduleName: 'babel/components/entity-categorizer/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport EntityModel from 'babel/models/entity';\\n\\ninterface IncludedEntitySetting {\\n  entityId: string,\\n  numberOfTries: number;\\n  timeAllowed: number\\n}\\n\\nexport interface EntityCustomizerSignature {\\n  Args: {\\n    entity: EntityModel;\\n    expandedEntities: EntityModel[];\\n    includedEntities: EntityModel[];\\n    includedEntitySettings: IncludedEntitySetting[];\\n    onExpand(entity: EntityModel): void;\\n    onCollapse(entity: EntityModel): void;\\n    onInclude(entity: EntityModel): void;\\n    onExclude(entity: EntityModel): void;\\n    onDiagnosisChange(): void;\\n    showCategoryNames: boolean;\\n    grouped: boolean;\\n  };\\n  Element: HTMLDivElement;\\n}\\n\\n}}\\n\\n<div class=\\\"entity-customizer\\\" ...attributes data-test-entity-customizer>\\n  <EntityCustomizer::Tree\\n    @entity={{@entity}}\\n    @expandedEntities={{@expandedEntities}}\\n    @includedEntities={{@includedEntities}}\\n    @includedEntitySettings={{@includedEntitySettings}}\\n    @level={{0}}\\n    @onExpand={{@onExpand}}\\n    @onCollapse={{@onCollapse}}\\n    @onInclude={{@onInclude}}\\n    @onExclude={{@onExclude}}\\n    @onDiagnosisChange={{@onDiagnosisChange}}\\n    @showCategoryNames={{@showCategoryNames}}\\n    @grouped={{@grouped}}\\n  />\\n</div>\", {\"contents\":\"{{!\\n\\nimport EntityModel from 'babel/models/entity';\\n\\ninterface IncludedEntitySetting {\\n  entityId: string,\\n  numberOfTries: number;\\n  timeAllowed: number\\n}\\n\\nexport interface EntityCustomizerSignature {\\n  Args: {\\n    entity: EntityModel;\\n    expandedEntities: EntityModel[];\\n    includedEntities: EntityModel[];\\n    includedEntitySettings: IncludedEntitySetting[];\\n    onExpand(entity: EntityModel): void;\\n    onCollapse(entity: EntityModel): void;\\n    onInclude(entity: EntityModel): void;\\n    onExclude(entity: EntityModel): void;\\n    onDiagnosisChange(): void;\\n    showCategoryNames: boolean;\\n    grouped: boolean;\\n  };\\n  Element: HTMLDivElement;\\n}\\n\\n}}\\n\\n<div class=\\\"entity-customizer\\\" ...attributes data-test-entity-customizer>\\n  <EntityCustomizer::Tree\\n    @entity={{@entity}}\\n    @expandedEntities={{@expandedEntities}}\\n    @includedEntities={{@includedEntities}}\\n    @includedEntitySettings={{@includedEntitySettings}}\\n    @level={{0}}\\n    @onExpand={{@onExpand}}\\n    @onCollapse={{@onCollapse}}\\n    @onInclude={{@onInclude}}\\n    @onExclude={{@onExclude}}\\n    @onDiagnosisChange={{@onDiagnosisChange}}\\n    @showCategoryNames={{@showCategoryNames}}\\n    @grouped={{@grouped}}\\n  />\\n</div>\",\"moduleName\":\"babel/components/entity-customizer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-customizer/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"entity-customizer-tree-group\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-group\\n  data-with-category={{@group.category}}\\n  data-level={{@level}}\\n>\\n  <XLockedScope @active={{this.isLocked}}>\\n    {{#if (or @showCategoryNames (and @group.category (gt @level 0)))}}\\n      <div\\n        class=\\\"entity-customizer-tree-group-heading\\\"\\n        data-test-entity-customizer-tree-group-heading\\n      >\\n        {{@group.category.name}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (gt this.entities.length 1)}}\\n      <UiButton\\n        data-test-entity-customizer-tree-group-toggle-button\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.handleToggleAllButton}}\\n      >\\n        {{t\\n          \\\"components.entityCustomizer.tree.group.toggleButtonLabel\\\"\\n          isAllIncluded=this.isAllIncluded\\n        }}\\n      </UiButton>\\n    {{/if}}\\n\\n    <div class=\\\"entity-customizer-tree-group-content\\\">\\n      {{#if this.isGroupedByType}}\\n        {{#each this.groupedEntitiesByType as |typeGroup|}}\\n          <div class=\\\"entity-customizer-tree-type-group\\\">\\n            {{#if typeGroup.typeLabel}}\\n              <div class=\\\"entity-customizer-tree-type-heading\\\">\\n                <span class=\\\"text-bold\\\">\\n                  {{typeGroup.typeLabel}}\\n                </span>\\n                <div class=\\\"line\\\" />\\n              </div>\\n            {{/if}}\\n            {{yield typeGroup.entities}}\\n          </div>\\n        {{/each}}\\n      {{else}}\\n        {{yield this.entities}}\\n      {{/if}}\\n    </div>\\n  </XLockedScope>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"entity-customizer-tree-group\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-group\\n  data-with-category={{@group.category}}\\n  data-level={{@level}}\\n>\\n  <XLockedScope @active={{this.isLocked}}>\\n    {{#if (or @showCategoryNames (and @group.category (gt @level 0)))}}\\n      <div\\n        class=\\\"entity-customizer-tree-group-heading\\\"\\n        data-test-entity-customizer-tree-group-heading\\n      >\\n        {{@group.category.name}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (gt this.entities.length 1)}}\\n      <UiButton\\n        data-test-entity-customizer-tree-group-toggle-button\\n        @appearance=\\\"link\\\"\\n        @onClick={{this.handleToggleAllButton}}\\n      >\\n        {{t\\n          \\\"components.entityCustomizer.tree.group.toggleButtonLabel\\\"\\n          isAllIncluded=this.isAllIncluded\\n        }}\\n      </UiButton>\\n    {{/if}}\\n\\n    <div class=\\\"entity-customizer-tree-group-content\\\">\\n      {{#if this.isGroupedByType}}\\n        {{#each this.groupedEntitiesByType as |typeGroup|}}\\n          <div class=\\\"entity-customizer-tree-type-group\\\">\\n            {{#if typeGroup.typeLabel}}\\n              <div class=\\\"entity-customizer-tree-type-heading\\\">\\n                <span class=\\\"text-bold\\\">\\n                  {{typeGroup.typeLabel}}\\n                </span>\\n                <div class=\\\"line\\\" />\\n              </div>\\n            {{/if}}\\n            {{yield typeGroup.entities}}\\n          </div>\\n        {{/each}}\\n      {{else}}\\n        {{yield this.entities}}\\n      {{/if}}\\n    </div>\\n  </XLockedScope>\\n</div>\",\"moduleName\":\"babel/components/entity-customizer/tree/group/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-customizer/tree/group/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n/*\n\nimport EntityModel from 'babel/models/entity';\n\ninterface Group {\n  entities: {\n    entity: EntityModel,\n    index: number,\n    globalIndex: number,\n  }[];\n  category: { name: string } | null;\n}\n\nexport interface EntityCustomizerTreeGroupSignature {\n  Args: {\n    group: Group;\n    entity: EntityModel;\n    includedEntities: EntityModel[];\n    level: number;\n    onInclude(entity: EntityModel): void;\n    onExclude(entity: EntityModel): void;\n  };\n  Blocks: {\n    default: [entities: EntityModel[]]\n  }\n  Element: HTMLDivElement;\n}\n\n*/\n\nexport default class EntityCustomizerTreeGroup extends Component {\n  @service intl;\n\n  get isLocked() {\n    if (this.args.level === 0) {\n      return false;\n    }\n\n    return !this.args.includedEntities.includes(this.args.entity);\n  }\n\n  get isGroupedByType() {\n    return this.args?.grouped;\n  }\n\n  get entities() {\n    return (this.args.group?.entities || []).map((entity) => entity.entity);\n  }\n\n  get groupedEntitiesByType() {\n    const entitiesByType = this.entities.reduce((acc, entity) => {\n      const type = entity.type;\n      if (!acc[type]) {\n        acc[type] = [];\n      }\n      acc[type].push(entity);\n      return acc;\n    }, {});\n\n    const t = (value) => {\n      const path = `components.entityInspector.missionCustomizer.entetyTypes.${value}`;\n\n      if (this.intl.exists(path)) {\n        return this.intl.t(path);\n      }\n\n      return null;\n    };\n\n    return Object.entries(entitiesByType).map(([type, entities]) => ({\n      typeLabel: t(type),\n      entities,\n    }));\n  }\n\n  get isAllIncluded() {\n    return this.entities.every((entity) =>\n      this.args.includedEntities.includes(entity)\n    );\n  }\n\n  @action\n  handleToggleAllButton() {\n    if (this.isAllIncluded) {\n      this.#excludeAll();\n    } else {\n      this.#includeAll();\n    }\n  }\n\n  #excludeAll() {\n    this.entities.forEach((entity) => {\n      this.args.onExclude(entity);\n    });\n  }\n\n  #includeAll() {\n    this.entities.forEach((entity) => {\n      this.args.onInclude(entity);\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport EntityModel from 'babel/models/entity';\\n\\ninterface IncludedEntitySetting {\\n  entityId: string,\\n  numberOfTries: number;\\n  timeAllowed: number\\n}\\n\\nexport interface EntityCustomizerTreeSignature {\\n  Args: {\\n    entity: EntityModel;\\n    expandedEntities: EntityModel[];\\n    includedEntities: EntityModel[];\\n    includedEntitySettings: IncludedEntitySetting[];\\n    level: number;\\n    onExpand(entity: EntityModel): void;\\n    onCollapse(entity: EntityModel): void;\\n    onInclude(entity: EntityModel): void;\\n    onExclude(entity: EntityModel): void;\\n    onDiagnosisChange(): void;\\n    showCategoryNames: boolean;\\n    grouped: boolean;\\n  };\\n  Element: HTMLDivElement;\\n}\\n\\n}}\\n\\n<div\\n  class=\\\"entity-customizer-tree\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree\\n  data-level={{@level}}\\n>\\n  <EntityCategorizer @entity={{@entity}} as |group|>\\n    <EntityCustomizer::Tree::Group\\n      @grouped={{@grouped}}\\n      @group={{group}}\\n      @entity={{@entity}}\\n      @level={{@level}}\\n      @includedEntities={{@includedEntities}}\\n      @onInclude={{@onInclude}}\\n      @onExclude={{@onExclude}}\\n      @showCategoryNames={{@showCategoryNames}}\\n      as |entities|\\n    >\\n      {{#each entities as |entity index|}}\\n        <EntityCustomizer::Tree::Item\\n          @entity={{entity}}\\n          @expandedEntities={{@expandedEntities}}\\n          @includedEntities={{@includedEntities}}\\n          @includedEntitySettings={{@includedEntitySettings}}\\n          @index={{index}}\\n          @level={{@level}}\\n          @onExpand={{@onExpand}}\\n          @onCollapse={{@onCollapse}}\\n          @onInclude={{@onInclude}}\\n          @onExclude={{@onExclude}}\\n          @onDiagnosisChange={{@onDiagnosisChange}}\\n        />\\n\\n        {{#if (includes entity @expandedEntities)}}\\n          <EntityCustomizer::Tree\\n            class=\\\"entity-customizer-tree-tree\\\"\\n            @entity={{entity}}\\n            @expandedEntities={{@expandedEntities}}\\n            @includedEntities={{@includedEntities}}\\n            @includedEntitySettings={{@includedEntitySettings}}\\n            @level={{increment @level}}\\n            @onExpand={{@onExpand}}\\n            @onCollapse={{@onCollapse}}\\n            @onInclude={{@onInclude}}\\n            @onExclude={{@onExclude}}\\n            @grouped={{@grouped}}\\n            @showCategoryNames={{@showCategoryNames}}\\n          />\\n        {{/if}}\\n      {{/each}}\\n    </EntityCustomizer::Tree::Group>\\n  </EntityCategorizer>\\n</div>\", {\"contents\":\"{{!\\n\\nimport EntityModel from 'babel/models/entity';\\n\\ninterface IncludedEntitySetting {\\n  entityId: string,\\n  numberOfTries: number;\\n  timeAllowed: number\\n}\\n\\nexport interface EntityCustomizerTreeSignature {\\n  Args: {\\n    entity: EntityModel;\\n    expandedEntities: EntityModel[];\\n    includedEntities: EntityModel[];\\n    includedEntitySettings: IncludedEntitySetting[];\\n    level: number;\\n    onExpand(entity: EntityModel): void;\\n    onCollapse(entity: EntityModel): void;\\n    onInclude(entity: EntityModel): void;\\n    onExclude(entity: EntityModel): void;\\n    onDiagnosisChange(): void;\\n    showCategoryNames: boolean;\\n    grouped: boolean;\\n  };\\n  Element: HTMLDivElement;\\n}\\n\\n}}\\n\\n<div\\n  class=\\\"entity-customizer-tree\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree\\n  data-level={{@level}}\\n>\\n  <EntityCategorizer @entity={{@entity}} as |group|>\\n    <EntityCustomizer::Tree::Group\\n      @grouped={{@grouped}}\\n      @group={{group}}\\n      @entity={{@entity}}\\n      @level={{@level}}\\n      @includedEntities={{@includedEntities}}\\n      @onInclude={{@onInclude}}\\n      @onExclude={{@onExclude}}\\n      @showCategoryNames={{@showCategoryNames}}\\n      as |entities|\\n    >\\n      {{#each entities as |entity index|}}\\n        <EntityCustomizer::Tree::Item\\n          @entity={{entity}}\\n          @expandedEntities={{@expandedEntities}}\\n          @includedEntities={{@includedEntities}}\\n          @includedEntitySettings={{@includedEntitySettings}}\\n          @index={{index}}\\n          @level={{@level}}\\n          @onExpand={{@onExpand}}\\n          @onCollapse={{@onCollapse}}\\n          @onInclude={{@onInclude}}\\n          @onExclude={{@onExclude}}\\n          @onDiagnosisChange={{@onDiagnosisChange}}\\n        />\\n\\n        {{#if (includes entity @expandedEntities)}}\\n          <EntityCustomizer::Tree\\n            class=\\\"entity-customizer-tree-tree\\\"\\n            @entity={{entity}}\\n            @expandedEntities={{@expandedEntities}}\\n            @includedEntities={{@includedEntities}}\\n            @includedEntitySettings={{@includedEntitySettings}}\\n            @level={{increment @level}}\\n            @onExpand={{@onExpand}}\\n            @onCollapse={{@onCollapse}}\\n            @onInclude={{@onInclude}}\\n            @onExclude={{@onExclude}}\\n            @grouped={{@grouped}}\\n            @showCategoryNames={{@showCategoryNames}}\\n          />\\n        {{/if}}\\n      {{/each}}\\n    </EntityCustomizer::Tree::Group>\\n  </EntityCategorizer>\\n</div>\",\"moduleName\":\"babel/components/entity-customizer/tree/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-customizer/tree/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nexport interface EntityCustomizerTreeItemControlFieldSignature<\\n  T extends string | number\\n> {\\n  Args: {\\n    label: string;\\n    value: T;\\n    placeholder: string;\\n    onChange(value: T): void;\\n  };\\n  Element: HTMLLabelElement;\\n}\\n\\n}}\\n\\n<label\\n  class=\\\"entity-customizer-tree-item-control-field\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-item-control-field\\n>\\n\\n  <UiInput\\n    class=\\\"entity-customizer-tree-item-control-field-input\\\"\\n    data-test-entity-customizer-tree-item-control-field-input\\n    @appearance=\\\"none\\\"\\n    @value={{@value}}\\n    @type=\\\"number\\\"\\n    @twoWay={{false}}\\n    @placeholder={{@placeholder}}\\n    @onChange={{@onChange}}\\n  />\\n\\n  <span\\n    class=\\\"entity-customizer-tree-item-control-field-input-label\\\"\\n    data-test-entity-customizer-tree-item-control-field-label\\n  >\\n\\n    {{@label}}\\n\\n  </span>\\n\\n</label>\", {\"contents\":\"{{!\\n\\nexport interface EntityCustomizerTreeItemControlFieldSignature<\\n  T extends string | number\\n> {\\n  Args: {\\n    label: string;\\n    value: T;\\n    placeholder: string;\\n    onChange(value: T): void;\\n  };\\n  Element: HTMLLabelElement;\\n}\\n\\n}}\\n\\n<label\\n  class=\\\"entity-customizer-tree-item-control-field\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-item-control-field\\n>\\n\\n  <UiInput\\n    class=\\\"entity-customizer-tree-item-control-field-input\\\"\\n    data-test-entity-customizer-tree-item-control-field-input\\n    @appearance=\\\"none\\\"\\n    @value={{@value}}\\n    @type=\\\"number\\\"\\n    @twoWay={{false}}\\n    @placeholder={{@placeholder}}\\n    @onChange={{@onChange}}\\n  />\\n\\n  <span\\n    class=\\\"entity-customizer-tree-item-control-field-input-label\\\"\\n    data-test-entity-customizer-tree-item-control-field-label\\n  >\\n\\n    {{@label}}\\n\\n  </span>\\n\\n</label>\",\"moduleName\":\"babel/components/entity-customizer/tree/item/control-field/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-customizer/tree/item/control-field/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"entity-customizer-tree-item\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-item\\n  data-included={{this.isIncluded}}\\n  data-expanded={{this.isExpanded}}\\n  data-level={{@level}}\\n>\\n  <div class=\\\"entity-customizer-tree-item-inner\\\">\\n    <div class=\\\"entity-customizer-tree-item-content\\\">\\n      <XCheckbox\\n        data-test-entity-customizer-tree-item-checkbox\\n        @checked={{this.isIncluded}}\\n        @twoWay={{false}}\\n        @onChange={{this.handleCheckboxChange}}\\n      >\\n        <span class=\\\"flex flex-center\\\">\\n          <EntityIcon\\n            data-test-entity-customizer-tree-item-entity-icon\\n            class=\\\"entity-customizer-tree-item-entity-icon\\\"\\n            @entity={{@entity}}\\n          />\\n\\n          <span data-test-entity-customizer-tree-item-label>\\n            {{#if this.showIndex}}\\n              {{increment @index}}.\\n            {{/if}}\\n\\n            {{@entity.title}}\\n          </span>\\n        </span>\\n      </XCheckbox>\\n    </div>\\n\\n    {{#if @entity.isDiagnosis}}\\n      <XLockedScope @active={{not this.isIncluded}}>\\n        <div class=\\\"entity-customizer-tree-item-control-field-group\\\">\\n          <EntityCustomizer::Tree::Item::ControlField\\n            @label={{t\\n              \\\"components.entityCustomizer.tree.item.numberOfTriesHintLabel\\\"\\n            }}\\n            @value={{this.settings.numberOfTries}}\\n            @placeholder={{@entity.allowedAttempts}}\\n            @onChange={{this.handleNumberOfTriesChange}}\\n          />\\n\\n          <EntityCustomizer::Tree::Item::ControlField\\n            @label={{t \\\"components.entityCustomizer.tree.item.timeAllowed\\\"}}\\n            @value={{this.settings.timeAllowed}}\\n            @placeholder={{@entity.timeAllowed}}\\n            @onChange={{this.handleTimeAllowedChange}}\\n          />\\n        </div>\\n      </XLockedScope>\\n    {{/if}}\\n  </div>\\n\\n  {{#if @entity.customizableDescendents.length}}\\n    {{#if this.excludedChildren}}\\n      <span class=\\\"entity-customizer-tree-item-excluded-label text-bold\\\">\\n        ({{this.excludedChildren.length}})\\n      </span>\\n    {{/if}}\\n\\n    {{#let\\n      (generate-id)\\n      (t\\n        \\\"components.entityCustomizer.tree.item.toggleButtonLabel\\\"\\n        isExpanded=this.isExpanded\\n      )\\n      as |id label|\\n    }}\\n      <UiButton\\n        id={{id}}\\n        class=\\\"entity-customizer-tree-item-toggle-button\\\"\\n        aria-label={{label}}\\n        data-test-entity-customizer-tree-item-toggle-button\\n        @appearance=\\\"none\\\"\\n        @onClick={{this.handleToggleButtonClick}}\\n      >\\n        <DcIcon\\n          @name=\\\"small-down\\\"\\n          class=\\\"entity-customizer-tree-item-toggle-icon\\\"\\n        />\\n      </UiButton>\\n\\n      <XTooltip @for={{id}} @delay={{1000}}>\\n        {{label}}\\n      </XTooltip>\\n    {{/let}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"entity-customizer-tree-item\\\"\\n  ...attributes\\n  data-test-entity-customizer-tree-item\\n  data-included={{this.isIncluded}}\\n  data-expanded={{this.isExpanded}}\\n  data-level={{@level}}\\n>\\n  <div class=\\\"entity-customizer-tree-item-inner\\\">\\n    <div class=\\\"entity-customizer-tree-item-content\\\">\\n      <XCheckbox\\n        data-test-entity-customizer-tree-item-checkbox\\n        @checked={{this.isIncluded}}\\n        @twoWay={{false}}\\n        @onChange={{this.handleCheckboxChange}}\\n      >\\n        <span class=\\\"flex flex-center\\\">\\n          <EntityIcon\\n            data-test-entity-customizer-tree-item-entity-icon\\n            class=\\\"entity-customizer-tree-item-entity-icon\\\"\\n            @entity={{@entity}}\\n          />\\n\\n          <span data-test-entity-customizer-tree-item-label>\\n            {{#if this.showIndex}}\\n              {{increment @index}}.\\n            {{/if}}\\n\\n            {{@entity.title}}\\n          </span>\\n        </span>\\n      </XCheckbox>\\n    </div>\\n\\n    {{#if @entity.isDiagnosis}}\\n      <XLockedScope @active={{not this.isIncluded}}>\\n        <div class=\\\"entity-customizer-tree-item-control-field-group\\\">\\n          <EntityCustomizer::Tree::Item::ControlField\\n            @label={{t\\n              \\\"components.entityCustomizer.tree.item.numberOfTriesHintLabel\\\"\\n            }}\\n            @value={{this.settings.numberOfTries}}\\n            @placeholder={{@entity.allowedAttempts}}\\n            @onChange={{this.handleNumberOfTriesChange}}\\n          />\\n\\n          <EntityCustomizer::Tree::Item::ControlField\\n            @label={{t \\\"components.entityCustomizer.tree.item.timeAllowed\\\"}}\\n            @value={{this.settings.timeAllowed}}\\n            @placeholder={{@entity.timeAllowed}}\\n            @onChange={{this.handleTimeAllowedChange}}\\n          />\\n        </div>\\n      </XLockedScope>\\n    {{/if}}\\n  </div>\\n\\n  {{#if @entity.customizableDescendents.length}}\\n    {{#if this.excludedChildren}}\\n      <span class=\\\"entity-customizer-tree-item-excluded-label text-bold\\\">\\n        ({{this.excludedChildren.length}})\\n      </span>\\n    {{/if}}\\n\\n    {{#let\\n      (generate-id)\\n      (t\\n        \\\"components.entityCustomizer.tree.item.toggleButtonLabel\\\"\\n        isExpanded=this.isExpanded\\n      )\\n      as |id label|\\n    }}\\n      <UiButton\\n        id={{id}}\\n        class=\\\"entity-customizer-tree-item-toggle-button\\\"\\n        aria-label={{label}}\\n        data-test-entity-customizer-tree-item-toggle-button\\n        @appearance=\\\"none\\\"\\n        @onClick={{this.handleToggleButtonClick}}\\n      >\\n        <DcIcon\\n          @name=\\\"small-down\\\"\\n          class=\\\"entity-customizer-tree-item-toggle-icon\\\"\\n        />\\n      </UiButton>\\n\\n      <XTooltip @for={{id}} @delay={{1000}}>\\n        {{label}}\\n      </XTooltip>\\n    {{/let}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/entity-customizer/tree/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-customizer/tree/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\n/*\n\nimport EntityModel from 'babel/models/entity';\n\ninterface IncludedEntitySetting {\n  entityId: string,\n  numberOfTries: number;\n  timeAllowed: number\n}\n\nexport interface EntityCustomizerTreeItemSignature {\n  Args: {\n    entity: EntityModel;\n    expandedEntities: EntityModel[];\n    includedEntities: EntityModel[];\n    includedEntitySettings: IncludedEntitySetting[];\n    index: number;\n    onExpand(entity: EntityModel): void;\n    onCollapse(entity: EntityModel): void;\n    onInclude(entity: EntityModel): void;\n    onExclude(entity: EntityModel): void;\n  },\n  Element: HTMLDivElement\n}\n\n*/\n\nexport default class EntityCustomizerTreeItem extends Component {\n  get settings() {\n    const settings = {};\n\n    this.#applyCallbackToSettings((includedEntitySetting) => {\n      settings.entityId = includedEntitySetting.entityId;\n      settings.numberOfTries = includedEntitySetting.numberOfTries;\n      settings.timeAllowed = includedEntitySetting.timeAllowed;\n    });\n\n    return settings;\n  }\n\n  get isExpanded() {\n    return this.args.expandedEntities.includes(this.args.entity);\n  }\n\n  get isIncluded() {\n    return this.args.includedEntities.includes(this.args.entity);\n  }\n\n  get excludedChildren() {\n    return this.args.entity.customizableDescendents.filter(\n      (x) => !this.args.includedEntities.includes(x)\n    );\n  }\n\n  get showIndex() {\n    if (\n      this.args.entity?.space === 'workspace' &&\n      this.args.entity?.type === 'collections'\n    ) {\n      // never show index for collections in workspace\n      return false;\n    }\n\n    if (\n      this.args.entity?.space === 'glossaries' &&\n      this.args.entity?.type === 'glossaries'\n    ) {\n      // never show index for glossaries in workspace\n      return false;\n    }\n\n    if (this.args.entity?.hideSectionSortNumbers) return false;\n    if (this.args.entity?.hideAssignmentSortNumbers) return false;\n\n    return true;\n  }\n\n  @action\n  handleNumberOfTriesChange(val) {\n    this.#applyCallbackToSettings((includedEntitySetting) => {\n      includedEntitySetting.set('numberOfTries', val);\n    });\n\n    return this.args.onDiagnosisChange?.();\n  }\n\n  @action\n  handleTimeAllowedChange(val) {\n    this.#applyCallbackToSettings((includedEntitySetting) => {\n      includedEntitySetting.set('timeAllowed', val);\n    });\n\n    return this.args.onDiagnosisChange?.();\n  }\n\n  @action\n  handleCheckboxChange() {\n    if (this.isIncluded) {\n      this.#exclude();\n    } else {\n      this.#include();\n    }\n  }\n\n  @action\n  handleToggleButtonClick() {\n    if (this.isExpanded) {\n      this.#collapse();\n    } else {\n      this.#expand();\n    }\n  }\n\n  #applyCallbackToSettings(callback) {\n    if (this.args.includedEntitySettings && this.args.entity) {\n      this.args.includedEntitySettings.map((includedEntitySetting, index) => {\n        if (includedEntitySetting.entityId === this.args.entity.id) {\n          callback(this.args.includedEntitySettings[index]);\n        }\n      });\n    }\n  }\n\n  #include() {\n    this.args.onInclude(this.args.entity);\n  }\n\n  #exclude() {\n    this.args.onExclude(this.args.entity);\n  }\n\n  #expand() {\n    this.args.onExpand(this.args.entity);\n  }\n\n  #collapse() {\n    this.args.onCollapse(this.args.entity);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcIcon data-test-entity-icon @name={{this.name}} @size={{@size}} ...attributes />\", {\"contents\":\"<DcIcon data-test-entity-icon @name={{this.name}} @size={{@size}} ...attributes />\",\"moduleName\":\"babel/components/entity-icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-icon/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nexport interface EntityCustomizerSignature {\n  Args: {\n    entity: EntityModel;\n  };\n  Element: HTMLElement;\n}\n\n*/\n\nconst ENTITY_TYPE_TO_NAME_MAPPING = {\n  archives: 'archive',\n  areas: 'area',\n  assignments: 'assignments',\n  books: 'book',\n  collections: 'collection',\n  contents: 'content',\n  exercises: 'exercise',\n  folders: 'folders',\n  glossaries: 'glossaries',\n  interactives: 'interactives',\n  sections: 'segmentation',\n  studies: 'study',\n  books_junior: 'book-external',\n  books_external: 'book-external',\n  books_pdf: 'book-external',\n};\n\nexport default class EntityIcon extends Component {\n  get name() {\n    return ENTITY_TYPE_TO_NAME_MAPPING[this.args.entity?.type];\n  }\n}\n","import Component from '@ember/component';\nimport { task } from 'ember-concurrency';\nimport { hash, resolve } from 'rsvp';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  // PARAMS\n\n  entity: null,\n\n  books: null,\n\n  multiple: false,\n\n  expandedEntities: null,\n\n  importableTypes: null,\n\n  controlled: false,\n\n  onExpand() {},\n\n  onCollapse() {},\n\n  onClose: null,\n\n  onImport: null,\n\n  onShouldAllowPick() {\n    return true;\n  },\n\n  // ACTIONS\n\n  actions: {\n    handleLoad() {\n      return Promise.all([this.disabledEntities, this.books]).then(\n        ([disabledEntities]) => disabledEntities\n      );\n    },\n\n    handleEntityBrowserExpand(entity) {\n      this._expandEntity(entity);\n      return this.loadEntityRelationships.perform(entity);\n    },\n\n    handleEntityBrowserCollapse(entity) {\n      this._collapseEntity(entity);\n    },\n\n    handleEntityBrowserPick(entity) {\n      this._pickEntity(entity);\n    },\n\n    handleEntityBrowserUnpick(entity) {\n      this._unpickEntity(entity);\n    },\n\n    handleImportButtonClick() {\n      return this._import().then(() => {\n        this._close();\n      });\n    },\n  },\n\n  // HOOKS\n\n  init() {\n    this._super(...arguments);\n    this.set('pickedEntities', []);\n  },\n\n  // TASKS\n\n  loadEntityRelationships: task(function* (entity) {\n    yield hash(entity.getProperties('children', 'categories'));\n  }),\n\n  // PRIVATE\n\n  _expandEntity(entity) {\n    this.onExpand(entity);\n  },\n\n  _collapseEntity(entity) {\n    this.onCollapse(entity);\n  },\n\n  _pickEntity(entity) {\n    if (this.multiple) {\n      this.pickedEntities.addObject(entity);\n    } else {\n      this.set('pickedEntity', entity);\n    }\n  },\n\n  _unpickEntity(entity) {\n    if (this.multiple) {\n      this.pickedEntities.removeObject(entity);\n    } else {\n      this.set('pickedEntity', null);\n    }\n  },\n\n  _close() {\n    this.onClose();\n  },\n\n  _import() {\n    const onImport = this.onImport;\n\n    if (this.multiple) {\n      return resolve(onImport(this.pickedEntities));\n    }\n    return resolve(onImport(this.pickedEntity));\n  },\n\n  _loadRelationships(entity) {\n    return hash(entity.getProperties('children', 'categories'));\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-modal\\n  title=(t \\\"components.entityImportModal.title\\\")\\n  size=(hash width=\\\"medium\\\" height=\\\"auto\\\")\\n  onClose=(action this.onClose)\\n  locked=true\\n  closeButton=false\\n  as |modal|\\n}}\\n\\n  {{modal.header}}\\n\\n  {{#modal.content class=\\\"pb1\\\"}}\\n\\n    {{#x-await (action \\\"handleLoad\\\") as |disabledEntities|}}\\n\\n      {{#each this.books key=\\\"id\\\" as |book|}}\\n\\n        <EntityBrowser\\n          @entity={{book}}\\n          @expandedEntities={{this.expandedEntities}}\\n          @disabledEntities={{disabledEntities}}\\n          @pickedEntity={{this.pickedEntity}}\\n          @pickedEntities={{this.pickedEntities}}\\n          @multiple={{this.multiple}}\\n          @root={{true}}\\n          @selectable={{false}}\\n          @routed={{false}}\\n          @inspectable={{false}}\\n          @pickable={{true}}\\n          @pickableTypes={{this.importableTypes}}\\n          @onShouldAllowPick={{this.onShouldAllowPick}}\\n          @onExpand={{action \\\"handleEntityBrowserExpand\\\"}}\\n          @onCollapse={{action \\\"handleEntityBrowserCollapse\\\"}}\\n          @onPick={{action \\\"handleEntityBrowserPick\\\"}}\\n          @onUnpick={{action \\\"handleEntityBrowserUnpick\\\"}}\\n        />\\n\\n      {{else}}\\n\\n        {{#x-alert class=\\\"m1\\\"}}\\n          {{t \\\"components.entityImportModal.noEntities\\\"}}\\n        {{/x-alert}}\\n\\n      {{/each}}\\n\\n    {{/x-await}}\\n\\n  {{/modal.content}}\\n\\n  {{#modal.footer class=\\\"justify-flex-end\\\"}}\\n\\n    <div>\\n\\n      {{#ui-button class=\\\"mr1\\\" appearance=\\\"link\\\" onClick=(action this.onClose)}}\\n\\n        {{t \\\"components.entityImportModal.cancelButtonLabel\\\"}}\\n\\n      {{/ui-button}}\\n\\n      {{#ui-button\\n        disabled=(not\\n          (if this.multiple this.pickedEntities.length this.pickedEntity)\\n        )\\n        onClick=(action \\\"handleImportButtonClick\\\")\\n      }}\\n\\n        {{t \\\"components.entityImportModal.importButtonLabel\\\"}}\\n\\n        {{#if (gt this.pickedEntities.length 1)}}\\n          ({{this.pickedEntities.length}})\\n        {{/if}}\\n\\n      {{/ui-button}}\\n\\n    </div>\\n\\n  {{/modal.footer}}\\n\\n{{/x-modal}}', { moduleName: 'babel/components/entity-import-modal/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class EntityInspectorComponent extends Component {\n  @service router;\n\n  @service session;\n\n  @service entityInspector;\n\n  @service media;\n\n  @tracked fullscreen = false;\n\n  @tracked _printComponent = null;\n\n  beforePrint = () => {\n    this._printComponent = this.component;\n  };\n\n  afterPrint = () => {\n    this._printComponent = null;\n  };\n\n  constructor() {\n    super(...arguments);\n    window.addEventListener('beforeprint', this.beforePrint);\n    window.addEventListener('afterprint', this.afterPrint);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    window.removeEventListener('beforeprint', this.beforePrint);\n    window.removeEventListener('afterprint', this.afterPrint);\n  }\n\n  get component() {\n    if (this._printComponent) {\n      return this._printComponent;\n    }\n\n    if (this.media.isMediumOrLess) {\n      return 'x-drawer';\n    }\n\n    return 'x-empty';\n  }\n\n  get classNames() {\n    const classNames = ['entity-inspector'];\n\n    if (this.fullscreen) {\n      classNames.push('entity-inspector--fullscreen');\n    }\n\n    return classNames.join(' ');\n  }\n\n  @action\n  toggleFullscreen() {\n    this.fullscreen = !this.fullscreen;\n  }\n\n  @action\n  close() {\n    this.args.onClose();\n  }\n}\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { map } from '@ember/object/computed';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport generateFallbackTitle from 'babel/utils/generate-fallback-title';\nimport DS from 'ember-data';\nimport { v4 as uuid } from 'ember-uuid';\nimport { hash, resolve } from 'rsvp';\n\nimport copyToClipboard from '../../../utils/copy-to-clipboard';\nimport routeArgsForEntity from '../../../utils/route-args-for-entity';\n\nconst { PromiseArray, PromiseObject } = DS;\n\nfunction createPromiseObject(promise) {\n  return PromiseObject.create({ promise });\n}\n\nfunction createPromiseArray(promise) {\n  return PromiseArray.create({ promise });\n}\n\nconst SECTIONS = 'sections';\n\nexport default Component.extend({\n  // SETUP\n\n  session: service(),\n\n  router: service(),\n\n  intl: service(),\n\n  snackbar: service(),\n\n  entityInspector: service(),\n\n  contextHelper: service(),\n\n  missionMode: service(),\n\n  classNames: ['entity-browser-detail'],\n\n  // PARAMS\n\n  entity: null,\n\n  section: null,\n\n  onLoadStart: null,\n\n  onLoadEnd: null,\n\n  book: computed('entity.{type,book}', function () {\n    if (this.get('entity.type') === 'books') return this.entity;\n    return this.get('entity.book');\n  }),\n\n  entityPromise: computed('entity', 'versions', function () {\n    return hash({\n      ...this.entity.getProperties('children', 'guidances'),\n      versions: this.versions,\n    });\n  }),\n\n  versions: computed(\n    'entity.children.[]',\n    'missionMode.includedEntities.each',\n    'contextHelper.{activeContent,inMission}',\n    function () {\n      const promise = this.entity.children.then((children) => {\n        const versions = [];\n\n        const categories = children\n          .filter((child) => this._entityIsAllowed(child))\n          .filterBy('type', SECTIONS)\n          .mapBy('category')\n          .uniq();\n\n        if (categories.length > 0) {\n          versions.addObjects(\n            categories.map((category) => this._createVersion(category))\n          );\n        } else {\n          versions.addObject(this._createVersion());\n        }\n\n        return Promise.all(versions);\n      });\n\n      return createPromiseArray(promise);\n    }\n  ),\n\n  routeArgs: computed('entity', function () {\n    return createPromiseObject(\n      routeArgsForEntity(this.entity, {}, this.missionMode)\n    );\n  }),\n\n  hasContentAuthors: computed('entity.{type,body.authors}', function () {\n    if (this.get('entity.type') === 'contents') {\n      const authors = this.get('entity.body.authors') || [];\n      if (authors.length > 0) return true;\n    }\n\n    return false;\n  }),\n\n  authorNames: computed('entity.{book.body.authors,body.authors}', function () {\n    let authors = this.get('entity.body.authors') || [];\n\n    if (authors.length === 0) {\n      authors = this.get('entity.book.body.authors') || [];\n    }\n\n    return authors.map((author) => {\n      if (author.indexOf(',') !== -1) {\n        const names = author.split(',');\n        const firstName = names.pop().trim();\n        const lastName = names.join(',');\n\n        return { firstName: firstName, separator: ' ', lastName: lastName };\n      }\n\n      return { firstName: '', separator: '', lastName: author };\n    });\n  }),\n\n  authors: map('authorNames', (author) => {\n    return author.firstName + author.separator + author.lastName;\n  }),\n\n  source: computed(\n    'authors.[]',\n    'contextHelper.activeProduct.title',\n    'entity.{id,title}',\n    'hasContentAuthors',\n    'intl',\n    function () {\n      const url = `${window.location.origin}/nodes/${this.get('entity.id')}`;\n      const datetime = new Date().toISOString().substring(0, 10);\n      const authors = this.authors?.length ? this.authors.join(', ') : '-';\n      const productTitle = this.contextHelper.activeProduct?.title ?? '';\n      const contentTitle = this.get('entity.title') ?? productTitle;\n\n      return this.hasContentAuthors\n        ? htmlSafe(\n            this.intl.t(\n              'components.entityInspector.detail.contentSourceString',\n              {\n                contentTitle,\n                authors,\n                productTitle,\n                url,\n                datetime,\n              }\n            )\n          )\n        : htmlSafe(\n            this.intl.t('components.entityInspector.detail.sourceString', {\n              authors,\n              productTitle,\n              url,\n              datetime,\n            })\n          );\n    }\n  ),\n\n  type: computed('entity.type', 'intl', function () {\n    return generateFallbackTitle(this.entity?.type, this.intl);\n  }),\n\n  updated: computed('entity.{latestUpdated,published}', function () {\n    let date;\n\n    if (this.get('entity.latestUpdated')) {\n      date = this.get('entity.latestUpdated');\n    } else if (this.get('entity.published')) {\n      date = this.get('entity.published');\n    } else {\n      return null;\n    }\n\n    return (\n      date.toISOString().substring(0, 10) + ' ' + date.toLocaleTimeString()\n    );\n  }),\n\n  // ACTIONS\n\n  actions: {\n    handleGoToButtonClick() {\n      this._goTo();\n    },\n\n    addToClipboard(key) {\n      return resolve(this.get(key)).then((val) => {\n        if (!val) return;\n\n        if (key === 'source') {\n          const element = document.querySelector('.content-info-source');\n          element.classList.add('copied-reference');\n\n          later(() => {\n            element.classList.remove('copied-reference');\n          }, 500);\n        }\n\n        return copyToClipboard(val)\n          .then(() => {\n            this.snackbar.enqueue(\n              this.intl.t(\n                'components.entityInspector.detail.' + key + 'CopiedToClipboard'\n              ),\n              {\n                variant: 'success',\n                autoDismiss: true,\n              }\n            );\n          })\n          .catch(() => {\n            this.snackbar.enqueue(\n              this.intl.t(\n                'components.entityInspector.detail.' +\n                  key +\n                  'FailedToCopyToClipboard'\n              ),\n              {\n                variant: 'error',\n              }\n            );\n          });\n      });\n    },\n\n    closeModal() {\n      this._goTo();\n      this.onClose();\n    },\n  },\n\n  _goTo() {\n    return this.routeArgs.then((routeArgs) => {\n      this.router.transitionTo(...routeArgs);\n      this.entityInspector.closeModal();\n    });\n  },\n\n  async _createVersion(category) {\n    const [children, materialEntityGroups] = await Promise.all([\n      this.entity.children,\n      this.entity.copyrightedMaterialEntityGroups,\n    ]);\n\n    const version = {\n      uuid: uuid(),\n      name: category?.name,\n    };\n\n    let sections = children\n      .filterBy('type', SECTIONS)\n      .filter((child) => this._entityIsAllowed(child))\n      .filter((child) => {\n        if (category) {\n          return child.category === category;\n        }\n        return true;\n      });\n\n    if (sections.length > 0) {\n      version.meta = {\n        sections: sections.length,\n        words: 0,\n        minutes: 0,\n      };\n\n      const promises = sections.map(async (section) => {\n        const editor = await section.get('contenteditor');\n\n        if (editor) {\n          if (section.heading?.length > 0) {\n            version.meta.words += section.heading.split(' ').length;\n          }\n\n          if (editor.metadata?.words) {\n            version.meta.words += editor.metadata.words;\n          }\n        }\n      });\n\n      await Promise.all(promises);\n\n      version.meta.minutes = Math.max(\n        1,\n        Math.ceil(parseInt(version.meta.words) / 120)\n      );\n    }\n\n    version.materialEntityGroups = materialEntityGroups\n      .filter((group) => {\n        if (group.entity.type === SECTIONS && group.entity.category) {\n          return group.entity.category === category;\n        }\n        return true;\n      })\n      .filter((group) => {\n        if (group.entity.type === SECTIONS) {\n          return this._entityIsAllowed(group.entity);\n        }\n        return true;\n      })\n      .filter((group) => {\n        if (\n          group.entity.type === 'books' &&\n          group.entity.backgroundType === 'color' &&\n          group.entity?.image?.id === group.material.id\n        ) {\n          return false;\n        }\n\n        return true;\n      })\n      .map((group) => {\n        if (group.entity.type === SECTIONS) {\n          return {\n            ...group,\n            index: sections.indexOf(group.entity) + 1,\n          };\n        }\n        return group;\n      });\n\n    return version;\n  },\n\n  _entityIsAllowed(entity) {\n    if (\n      this.contextHelper.inMission &&\n      this.contextHelper.activeContent === this.entity\n    ) {\n      return this.missionMode.entityIsAllowed(entity);\n    }\n    return true;\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"entity-inspector-detail-definition-list\\\" ...attributes>\\n  {{yield\\n    (hash Item=(component \\\"entity-inspector/detail/definition-list/item\\\"))\\n  }}\\n</div>\", {\"contents\":\"<div class=\\\"entity-inspector-detail-definition-list\\\" ...attributes>\\n  {{yield\\n    (hash Item=(component \\\"entity-inspector/detail/definition-list/item\\\"))\\n  }}\\n</div>\",\"moduleName\":\"babel/components/entity-inspector/detail/definition-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-inspector/detail/definition-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"entity-inspector-detail-definition-list-item\\\" ...attributes>\\n\\n  <div class=\\\"entity-inspector-detail-definition-list-item-title\\\">\\n    {{@title}}\\n  </div>\\n\\n  <div class=\\\"entity-inspector-detail-definition-list-item-description\\\">\\n    {{yield}}\\n  </div>\\n\\n</div>\", {\"contents\":\"<div class=\\\"entity-inspector-detail-definition-list-item\\\" ...attributes>\\n\\n  <div class=\\\"entity-inspector-detail-definition-list-item-title\\\">\\n    {{@title}}\\n  </div>\\n\\n  <div class=\\\"entity-inspector-detail-definition-list-item-description\\\">\\n    {{yield}}\\n  </div>\\n\\n</div>\",\"moduleName\":\"babel/components/entity-inspector/detail/definition-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-inspector/detail/definition-list/item/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAwait\\n  @value={{this.entityPromise}}\\n  @loaderClass=\\\"mt2 mb2\\\"\\n  @loaderLabel={{t \\\"components.entityInspector.detail.loading\\\"}}\\n  as |data|\\n>\\n  <article class=\\\"container-md\\\">\\n    <EntityLink\\n      class=\\\"text-primary nb1 nt1 flex flex-center\\\"\\n      @entity={{this.entity}}\\n    >\\n      {{this.entity.title}}\\n    </EntityLink>\\n\\n    {{#if this.entity.body.description}}\\n      <div class=\\\"mb1 mt1\\\">\\n        <div class=\\\"text-tertiary nb1\\\">\\n          {{t \\\"components.entityInspector.detail.description\\\"}}\\n        </div>\\n\\n        <div>\\n          <ContentPresenter class=\\\"ml0\\\">\\n            <TbRenderInline @value={{this.entity.body.description}} />\\n          </ContentPresenter>\\n        </div>\\n      </div>\\n    {{/if}}\\n\\n    <div class=\\\"mt1 mb1 pb1 bb1\\\">\\n      <div class=\\\"text-tertiary nb1\\\">\\n        {{t \\\"components.entityInspector.detail.sourceReference\\\"}}\\n      </div>\\n\\n      <div class=\\\"content-info-source nb1\\\">\\n        {{this.source}}\\n      </div>\\n\\n      {{! template-lint-disable no-action }}\\n      <UiButton\\n        id=\\\"copy-source-button\\\"\\n        class=\\\"mr1\\\"\\n        @size=\\\"small\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{action \\\"addToClipboard\\\" \\\"source\\\"}}\\n      >\\n        <DcIcon class=\\\"nr1\\\" @name=\\\"copy-paste\\\" />\\n\\n        {{t \\\"components.entityInspector.detail.copyReference\\\"}}\\n      </UiButton>\\n      {{! template-lint-enable no-action }}\\n\\n      <a\\n        class=\\\"text-small text-bold text-color-default flex-inline flex-center\\\"\\n        target=\\\"_blank\\\"\\n        href=\\\"https://support.nok.se/article/4135\\\"\\n        rel=\\\"noopener noreferrer\\\"\\n      >\\n        <DcIcon @name=\\\"external\\\" class=\\\"nr1\\\" />\\n        {{t \\\"components.entityInspector.detail.sourceDigilar\\\"}}\\n      </a>\\n    </div>\\n\\n    <div class=\\\"text-tertiary mb1\\\">\\n      {{t \\\"components.entityInspector.detail.overview\\\"}}\\n    </div>\\n\\n    <EntityInspector::Detail::DefinitionList class=\\\"mb1\\\" as |list|>\\n      <list.Item @title={{t \\\"components.entityInspector.detail.type\\\"}}>\\n        {{this.type}}\\n      </list.Item>\\n\\n      {{#if this.entity.body.language}}\\n        <list.Item @title={{t \\\"components.entityInspector.detail.language\\\"}}>\\n          {{t\\n            (concat\\n              \\\"components.entityInspector.detail.languageCodes.\\\"\\n              this.entity.body.language\\n            )\\n          }}\\n        </list.Item>\\n      {{/if}}\\n\\n      {{#if this.authors}}\\n        <list.Item\\n          @title={{t\\n            \\\"components.entityInspector.detail.authors\\\"\\n            count=this.authors.length\\n          }}\\n        >\\n          {{#each this.authors as |author|}}\\n            <div>\\n              {{author}}\\n            </div>\\n          {{/each}}\\n        </list.Item>\\n      {{/if}}\\n\\n      {{#if this.entity.body.illustrators}}\\n        <list.Item\\n          @title={{t\\n            \\\"components.entityInspector.detail.illustrators\\\"\\n            count=this.entity.body.illustrators.length\\n          }}\\n        >\\n          {{#each this.entity.body.illustrators as |illustrator|}}\\n            <div>\\n              {{illustrator}}\\n            </div>\\n          {{/each}}\\n        </list.Item>\\n      {{/if}}\\n\\n      {{#if this.entity.body.translators}}\\n        <list.Item\\n          @title={{t\\n            \\\"components.entityInspector.detail.translators\\\"\\n            count=this.entity.body.translators.length\\n          }}\\n        >\\n          {{#each this.entity.body.translators as |translator|}}\\n            <div>\\n              {{translator}}\\n            </div>\\n          {{/each}}\\n        </list.Item>\\n      {{/if}}\\n\\n      {{#if this.updated}}\\n        <list.Item @title={{t \\\"components.entityInspector.detail.lastUpdated\\\"}}>\\n          {{this.updated}}\\n        </list.Item>\\n      {{/if}}\\n    </EntityInspector::Detail::DefinitionList>\\n\\n    {{#if (gt data.versions.length 1)}}\\n      <div class=\\\"text-separator text-muted\\\">\\n        {{t \\\"components.entityInspector.detail.textVersions\\\"}}\\n      </div>\\n    {{/if}}\\n\\n    <EntityInspector::Detail::VersionTab\\n      @versions={{data.versions}}\\n      class=\\\"mb1\\\"\\n    />\\n\\n    <XAlert>\\n      <div class=\\\"text-secondary nb1\\\">\\n        {{t \\\"components.entityInspector.detail.productInformation\\\"}}\\n      </div>\\n\\n      <div class=\\\"mb2\\\">\\n        {{t\\n          \\\"components.entityInspector.detail.includedInProducts\\\"\\n          num=this.book.products.length\\n        }}\\n      </div>\\n\\n      {{#if this.book.products}}\\n        <div class=\\\"grid\\\">\\n          {{#each this.book.products as |product|}}\\n            <div class=\\\"col-xs-12 col-6\\\">\\n              <div class=\\\"nb1 text-tertiary\\\">\\n                {{product.title}}\\n              </div>\\n\\n              <div class=\\\"text-ui nb1\\\">\\n                {{t \\\"components.entityInspector.detail.product.articleNumber\\\"}}\\n              </div>\\n              <div class=\\\"mb1\\\">\\n                {{t \\\"components.entityInspector.detail.isbn\\\" id=product.id}}\\n              </div>\\n\\n              <div class=\\\"text-ui nb1\\\">\\n                {{t \\\"components.entityInspector.detail.product.firstReleased\\\"}}\\n              </div>\\n              <div>\\n                {{date product.released}}\\n              </div>\\n\\n              {{#if product.authors}}\\n                <div class=\\\"text-ui nb1 mt1\\\">\\n                  {{t\\n                    \\\"components.entityInspector.detail.product.authors\\\"\\n                    count=product.authors.length\\n                  }}\\n                </div>\\n\\n                {{#each product.authors as |author|}}\\n                  <div>\\n                    {{author}}\\n                  </div>\\n                {{/each}}\\n              {{/if}}\\n\\n              {{#if product.illustrators}}\\n                <div class=\\\"text-ui nb1 mt1\\\">\\n                  {{t\\n                    \\\"components.entityInspector.detail.product.illustrators\\\"\\n                    count=product.illustrators.length\\n                  }}\\n                </div>\\n\\n                {{#each product.illustrators as |illustrator|}}\\n                  <div>\\n                    {{illustrator}}\\n                  </div>\\n                {{/each}}\\n              {{/if}}\\n\\n              {{#if product.translators}}\\n                <div class=\\\"text-ui nb1 mt1\\\">\\n                  {{t\\n                    \\\"components.entityInspector.detail.product.translators\\\"\\n                    count=product.translators.length\\n                  }}\\n                </div>\\n\\n                {{#each product.translators as |translator|}}\\n                  <div>\\n                    {{translator}}\\n                  </div>\\n                {{/each}}\\n              {{/if}}\\n            </div>\\n          {{/each}}\\n        </div>\\n      {{/if}}\\n    </XAlert>\\n  </article>\\n</XAwait>', { moduleName: 'babel/components/entity-inspector/detail/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XTab\\n  @value={{this.value}}\\n  @onChange={{fn (mut this.value)}}\\n  {{did-update this.sectionChanged this.contextHelper.activeSection}}\\n  ...attributes\\n  as |tab|\\n>\\n\\n  {{#each @versions as |version|}}\\n\\n    <EntityInspector::Detail::VersionTab::Pane\\n      @tab={{tab}}\\n      @version={{version}}\\n    />\\n\\n  {{/each}}\\n\\n</XTab>\", {\"contents\":\"<XTab\\n  @value={{this.value}}\\n  @onChange={{fn (mut this.value)}}\\n  {{did-update this.sectionChanged this.contextHelper.activeSection}}\\n  ...attributes\\n  as |tab|\\n>\\n\\n  {{#each @versions as |version|}}\\n\\n    <EntityInspector::Detail::VersionTab::Pane\\n      @tab={{tab}}\\n      @version={{version}}\\n    />\\n\\n  {{/each}}\\n\\n</XTab>\",\"moduleName\":\"babel/components/entity-inspector/detail/version-tab/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-inspector/detail/version-tab/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { once } from '@ember/runloop';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class EntityInspectorDetailVersionTabComponent extends Component {\n  @service contextHelper;\n\n  @tracked value = null;\n\n  constructor() {\n    super(...arguments);\n    once(this, this.#setValueFromActiveSection);\n  }\n\n  @action\n  sectionChanged() {\n    once(this, this.#setValueFromActiveSection);\n  }\n\n  #setValueFromActiveSection() {\n    const activeCategoryName = this.contextHelper.activeSection?.category?.name;\n    const versions = this.args.versions || [];\n\n    let version;\n\n    if (activeCategoryName) {\n      version = versions.find(\n        (version) => version?.name === activeCategoryName\n      );\n    }\n\n    if (!version) {\n      version = versions[0];\n    }\n\n    if (version?.uuid && this.value !== version?.uuid) {\n      this.value = version?.uuid;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<@tab.pane @value={{@version.uuid}} @label={{@version.name}} ...attributes>\\n\\n  {{#if @version.meta}}\\n\\n    <div class=\\\"text-tertiary mb1\\\">\\n      {{t \\\"components.entityInspector.detail.versionTab.pane.about\\\"}}\\n    </div>\\n\\n    <EntityInspector::Detail::DefinitionList class=\\\"mb1\\\" as |list|>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.numSections\\\"\\n        }}\\n      >\\n        {{@version.meta.sections}}\\n      </list.Item>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.numWords\\\"\\n        }}\\n      >\\n        {{@version.meta.words}}\\n      </list.Item>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.readingTime\\\"\\n        }}\\n      >\\n\\n        {{t\\n          \\\"components.entityInspector.detail.versionTab.pane.readingTimeMin\\\"\\n          time=@version.meta.minutes\\n        }}\\n\\n      </list.Item>\\n\\n    </EntityInspector::Detail::DefinitionList>\\n\\n  {{/if}}\\n\\n  {{#if @version.materialEntityGroups}}\\n\\n    <div class=\\\"text-tertiary mb1\\\">\\n      {{t \\\"components.entityInspector.detail.versionTab.pane.copyright\\\"}}\\n    </div>\\n\\n    <XCopyrightList @columned={{true}} as |list|>\\n\\n      {{#each @version.materialEntityGroups as |group|}}\\n\\n        <list.Item @copyright={{group.material}} @index={{group.index}} />\\n\\n      {{/each}}\\n\\n    </XCopyrightList>\\n  {{/if}}\\n\\n</@tab.pane>\", {\"contents\":\"<@tab.pane @value={{@version.uuid}} @label={{@version.name}} ...attributes>\\n\\n  {{#if @version.meta}}\\n\\n    <div class=\\\"text-tertiary mb1\\\">\\n      {{t \\\"components.entityInspector.detail.versionTab.pane.about\\\"}}\\n    </div>\\n\\n    <EntityInspector::Detail::DefinitionList class=\\\"mb1\\\" as |list|>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.numSections\\\"\\n        }}\\n      >\\n        {{@version.meta.sections}}\\n      </list.Item>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.numWords\\\"\\n        }}\\n      >\\n        {{@version.meta.words}}\\n      </list.Item>\\n\\n      <list.Item\\n        @title={{t\\n          \\\"components.entityInspector.detail.versionTab.pane.readingTime\\\"\\n        }}\\n      >\\n\\n        {{t\\n          \\\"components.entityInspector.detail.versionTab.pane.readingTimeMin\\\"\\n          time=@version.meta.minutes\\n        }}\\n\\n      </list.Item>\\n\\n    </EntityInspector::Detail::DefinitionList>\\n\\n  {{/if}}\\n\\n  {{#if @version.materialEntityGroups}}\\n\\n    <div class=\\\"text-tertiary mb1\\\">\\n      {{t \\\"components.entityInspector.detail.versionTab.pane.copyright\\\"}}\\n    </div>\\n\\n    <XCopyrightList @columned={{true}} as |list|>\\n\\n      {{#each @version.materialEntityGroups as |group|}}\\n\\n        <list.Item @copyright={{group.material}} @index={{group.index}} />\\n\\n      {{/each}}\\n\\n    </XCopyrightList>\\n  {{/if}}\\n\\n</@tab.pane>\",\"moduleName\":\"babel/components/entity-inspector/detail/version-tab/pane/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-inspector/detail/version-tab/pane/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { getScrollParent, scrollToTop } from 'compton/utils/dom';\nimport { resolve } from 'rsvp';\n\nexport default class EntityInspectorGuidanceViewer extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   */\n\n  @tracked _selectedArticle = null;\n\n  @tracked scrollParent = null;\n\n  get selectedArticle() {\n    if (\n      this._selectedArticle &&\n      this.articles?.includes(this._selectedArticle)\n    ) {\n      return this._selectedArticle;\n    }\n    if (this.articles?.length === 1) return this.articles.firstObject;\n    return null;\n  }\n\n  get title() {\n    return this.args.entity?.title;\n  }\n\n  @cached get articlesProxy() {\n    return load(resolve(this.args.entity?.guidances), this);\n  }\n\n  get articles() {\n    return this.articlesProxy.isResolved ? this.articlesProxy.value : null;\n  }\n\n  get isLoading() {\n    return this.articlesProxy.isPending ? true : false;\n  }\n\n  @action handleIndexSelect(article) {\n    this._selectedArticle = article;\n    scrollToTop(this.scrollParent);\n  }\n\n  @action setScrollParent(element) {\n    this.scrollParent = getScrollParent(element);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each @articles as |article|}}\\n  <ul data-test-guidance-viewer-index>\\n    <li class=\\\"py1 bb1\\\">\\n      <UiButton @appearance=\\\"link\\\" @onClick={{fn @onSelect article}}>\\n        {{html-safe article.name}}\\n      </UiButton>\\n    </li>\\n  </ul>\\n{{/each}}\\n', { moduleName: 'babel/components/entity-inspector/guidance-viewer/index/template.hbs' });\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { scrollIntoView } from 'compton/utils/dom';\nimport { all, resolve } from 'rsvp';\n\nconst OFFSET = 150;\nconst HEADING_ATTENTIVE_CLASS_NAME = 'tb-render-heading--attentive';\n\nfunction queryByDataAttribute(element, key, value) {\n  return element.querySelector('[data-' + key + '=\"' + value + '\"]');\n}\n\nexport default class EntityInspectorDetailArticleViewerShowComponent extends Component {\n  /**\n   * Arguments:\n   * entity (object)\n   * article (object)\n   * articles (array)\n   * title (string)\n   * onSelect (function)\n   */\n\n  @tracked menuValue = null;\n\n  get previousArticle() {\n    const index = this.args.articles?.indexOf(this.args.article);\n\n    if (index < 1) return null;\n\n    return this.args.articles.objectAt(index - 1);\n  }\n\n  get nextArticle() {\n    const index = this.args.articles?.indexOf(this.args.article);\n    const last = this.args.articles?.length - 1;\n\n    if (index >= last) return null;\n\n    return this.args.articles.objectAt(index + 1);\n  }\n\n  @cached get editorsProxy() {\n    const promise = resolve(this.args.article?.editors).then((editors) =>\n      all(editors.map((editor) => resolve(editor.materials))).then(\n        () => editors\n      )\n    );\n\n    return load(promise, this);\n  }\n\n  get editors() {\n    return this.editorsProxy.isResolved ? this.editorsProxy.value : [];\n  }\n\n  get titles() {\n    const first = this.editors?.firstObject;\n\n    if (!first) return [];\n\n    return first.components\n      .sortBy('index')\n      .filterBy('component', 'heading')\n      .filterBy('settings.size', 'large')\n      .map((component) => {\n        if (Array.isArray(component.value) && component.value.length > 0) {\n          return { ...component, value: component.value[0].content };\n        }\n\n        return component;\n      });\n  }\n\n  get tableOfContentsMenuButtonItems() {\n    return this.titles.map((title) => ({\n      label: title.value,\n      value: title.uuid,\n    }));\n  }\n\n  @action handleTableOfContentsMenuButtonChange(value) {\n    // NOTE Query on body since this component don't have an element.\n    const element = queryByDataAttribute(document.body, 'id', value);\n\n    if (element) {\n      scrollIntoView(element, {\n        block: 'start',\n        // NOTE Pass a custom behavior function to apply a top offset.\n        // If need offset functionality elsewhere we should probably\n        // move it the scrollIntoView function itself.\n        behavior(instructions) {\n          instructions.forEach(({ el, left, top }) => {\n            el.scrollTo({\n              left,\n              top: top - OFFSET,\n              behavior: 'smooth',\n            });\n          });\n        },\n      });\n\n      element.classList.add(HEADING_ATTENTIVE_CLASS_NAME);\n\n      later(() => {\n        element.classList.remove(HEADING_ATTENTIVE_CLASS_NAME);\n        this.menuValue = null;\n      }, 1200);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (gt this.titles.length 1)}}\\n  <div class=\\\"article-viewer-side-index\\\" data-test-guidance-viewer-side-index>\\n    <div class=\\\"text-tertiary nb1\\\">\\n      {{t \\\"components.entityInspector.guidanceViewer.show.tableOfContents\\\"}}\\n    </div>\\n\\n    {{#each this.tableOfContentsMenuButtonItems as |item|}}\\n      <UiButton\\n        @appearance=\\\"link\\\"\\n        @onClick={{fn this.handleTableOfContentsMenuButtonChange item.value}}\\n        class=\\\"article-viewer-side-index-item\\\"\\n      >\\n        {{html-safe item.label}}\\n      </UiButton>\\n    {{/each}}\\n  </div>\\n{{/if}}\\n\\n<div\\n  class=\\\"entity-inspector-detail-article-viewer-show\\\"\\n  data-test-guidance-viewer-show\\n>\\n  <EntityLink\\n    class=\\\"text-primary nb1 mt2 flex flex-center\\\"\\n    @entity={{@entity}}\\n  >\\n    {{@entity.title}}\\n  </EntityLink>\\n\\n  {{#if (gt @articles.length 1)}}\\n    <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n      <breadcrumb.item>\\n        <UiButton @appearance=\\\"inherit\\\" @onClick={{fn @onSelect null}}>\\n          {{@title}}\\n        </UiButton>\\n      </breadcrumb.item>\\n\\n      <breadcrumb.item @active={{true}}>\\n        {{html-safe @article.name}}\\n      </breadcrumb.item>\\n    </XBreadcrumb>\\n  {{else}}\\n    <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n      <breadcrumb.item @active={{true}}>\\n        {{html-safe @article.name}}\\n      </breadcrumb.item>\\n    </XBreadcrumb>\\n  {{/if}}\\n\\n  {{#if (gt this.titles.length 1)}}\\n    <div\\n      class=\\\"article-viewer-select-index position-sticky mb1\\\"\\n      data-test-guidance-viewer-select-index\\n    >\\n      <XSelect\\n        @items={{this.tableOfContentsMenuButtonItems}}\\n        @onChange={{this.handleTableOfContentsMenuButtonChange}}\\n        @value={{this.menuValue}}\\n        as |Select|\\n      >\\n        <Select.box class=\\\"text-ui\\\">\\n          <DcIcon @name=\\\"segmentation\\\" class=\\\"nr1\\\" />\\n          {{t \\\"components.entityInspector.guidanceViewer.show.tableOfContents\\\"}}\\n        </Select.box>\\n\\n        <Select.menu as |option|>\\n          <TbRenderInline @value={{option.label}} @stripTags={{true}} />\\n        </Select.menu>\\n      </XSelect>\\n    </div>\\n  {{/if}}\\n\\n  <article class=\\\"article-viewer-article\\\">\\n    <ContentPresenter>\\n      <TbRenderWrapper\\n        @editorId={{@article.metadata.content_editor_id}}\\n        @model={{@article}}\\n      />\\n    </ContentPresenter>\\n  </article>\\n\\n  {{#if (gt @articles.length 1)}}\\n    <div class=\\\"article-viewer-pagination\\\">\\n      {{#if this.previousArticle}}\\n        <UiButton\\n          @appearance=\\\"none\\\"\\n          class=\\\"flex-shrink\\\"\\n          @onClick={{fn @onSelect this.previousArticle}}\\n        >\\n          <XSphere @name=\\\"small-left\\\" class=\\\"flex-shrink nr1\\\" />\\n          {{this.previousArticle.name}}\\n        </UiButton>\\n      {{else}}\\n        <div />\\n      {{/if}}\\n\\n      {{#if this.nextArticle}}\\n        <UiButton\\n          @appearance=\\\"none\\\"\\n          class=\\\"text-\\\"\\n          @onClick={{fn @onSelect this.nextArticle}}\\n        >\\n          {{this.nextArticle.name}}\\n          <XSphere @name=\\\"small-right\\\" class=\\\"flex-shrink nl1\\\" />\\n        </UiButton>\\n      {{else}}\\n        <div />\\n      {{/if}}\\n    </div>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/entity-inspector/guidance-viewer/show/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<article\\n  class=\\\"guidance-viewer container\\\"\\n  {{did-insert this.setScrollParent}}\\n  data-test-guidance-viewer\\n>\\n  {{#unless this.selectedArticle}}\\n    <EntityLink\\n      class=\\\"text-primary nb1 mt2 flex flex-center\\\"\\n      @entity={{@entity}}\\n    >\\n      {{this.title}}\\n    </EntityLink>\\n  {{/unless}}\\n\\n  {{#if this.isLoading}}\\n    <DcLoader class=\\\"my3\\\" data-test-guidance-viewer-loading />\\n  {{else if this.articles}}\\n    {{#if this.selectedArticle}}\\n      <EntityInspector::GuidanceViewer::Show\\n        @entity={{@entity}}\\n        @article={{this.selectedArticle}}\\n        @articles={{this.articles}}\\n        @title={{this.title}}\\n        @onSelect={{this.handleIndexSelect}}\\n      />\\n    {{else}}\\n      <EntityInspector::GuidanceViewer::index\\n        @articles={{this.articles}}\\n        @title={{this.title}}\\n        @onSelect={{this.handleIndexSelect}}\\n      />\\n    {{/if}}\\n  {{else}}\\n    <XAlert data-test-guidance-viewer-empty-alert>\\n      {{t\\n        \\\"components.entityInspector.guidanceViewer.noResultMessage\\\"\\n        type=\\\"guidances\\\"\\n      }}\\n    </XAlert>\\n  {{/if}}\\n</article>', { moduleName: 'babel/components/entity-inspector/guidance-viewer/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"mission-customizer p1\\\">\\n  {{#if (gt this.categoryItems.length 1)}}\\n    {{#let (generate-id \\\"category-select\\\") as |id|}}\\n      <UiLabel @for={{id}}>\\n        {{#if this.contentsController.activeCategory.id}}\\n          {{t \\\"components.entityInspector.missionCustomizer.chooseCategory\\\"}}\\n        {{else}}\\n          {{t\\n            \\\"components.entityInspector.missionCustomizer.firstChooseCategory\\\"\\n          }}\\n        {{/if}}\\n      </UiLabel>\\n\\n      <div class=\\\"mb1\\\">\\n        <XSelect\\n          @id={{id}}\\n          @value={{this.contentsController.activeCategory.id}}\\n          @items={{this.categoryItems}}\\n          @stretch={{true}}\\n          @onChange={{this.handleCategoryChange}}\\n          @sync={{false}}\\n        />\\n      </div>\\n    {{/let}}\\n  {{/if}}\\n\\n  {{#if\\n    (or\\n      (lte this.categoryItems.length 1)\\n      this.contentsController.activeCategory.id\\n    )\\n  }}\\n    <div class=\\\"text-ui mb1\\\">\\n      {{t \\\"components.entityInspector.missionCustomizer.description\\\"}}\\n    </div>\\n\\n    <WaitFor @resource={{this.resource}}>\\n      <EntityCustomizer\\n        @entity={{this.activeCategoryEntity}}\\n        @expandedEntities={{this.expandedEntities}}\\n        @includedEntities={{this.customContent.includedEntities}}\\n        @includedEntitySettings={{this.customContent.includedEntitySettings}}\\n        @onExpand={{this.handleEntityCustomizerExpand}}\\n        @onCollapse={{this.handleEntityCustomizerCollapse}}\\n        @onInclude={{this.handleEntityCustomizerInclude}}\\n        @onExclude={{this.handleEntityCustomizerExclude}}\\n        @onDiagnosisChange={{this.debouncedSave}}\\n        @showCategoryNames={{this.isInteractive}}\\n        @grouped={{true}}\\n      />\\n      {{#if\\n        (or this.contentTeacherAssignments.length this.contentWordlists.length)\\n      }}\\n        <div class=\\\"text-tertiary mt1\\\">\\n          {{t \\\"components.entityInspector.missionCustomizer.teacherMaterial\\\"}}\\n        </div>\\n\\n        {{#if (gt this.categoryItems.length 1)}}\\n          <XAlert class=\\\"my1\\\">\\n            {{t\\n              \\\"components.entityInspector.missionCustomizer.teacherMaterialDescription\\\"\\n            }}\\n          </XAlert>\\n        {{/if}}\\n\\n        <AdditionCustomizer\\n          @teacherAssignments={{this.contentTeacherAssignments}}\\n          @wordlists={{this.contentWordlists}}\\n          @includedTeacherAssignments={{this.customContent.includedTeacherAssignments}}\\n          @includedWordlists={{this.customContent.includedWordlists}}\\n          @onIncludeTeacherAssignment={{this.handleAdditionCustomizerIncludeTeacherAssignment}}\\n          @onExcludeTeacherAssignment={{this.handleAdditionCustomizerExcludeTeacherAssignment}}\\n          @onIncludeWordlist={{this.handleAdditionCustomizerIncludeWordlist}}\\n          @onExcludeWordlist={{this.handleAdditionCustomizerExcludeWordlist}}\\n        />\\n      {{/if}}\\n    </WaitFor>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"mission-customizer p1\\\">\\n  {{#if (gt this.categoryItems.length 1)}}\\n    {{#let (generate-id \\\"category-select\\\") as |id|}}\\n      <UiLabel @for={{id}}>\\n        {{#if this.contentsController.activeCategory.id}}\\n          {{t \\\"components.entityInspector.missionCustomizer.chooseCategory\\\"}}\\n        {{else}}\\n          {{t\\n            \\\"components.entityInspector.missionCustomizer.firstChooseCategory\\\"\\n          }}\\n        {{/if}}\\n      </UiLabel>\\n\\n      <div class=\\\"mb1\\\">\\n        <XSelect\\n          @id={{id}}\\n          @value={{this.contentsController.activeCategory.id}}\\n          @items={{this.categoryItems}}\\n          @stretch={{true}}\\n          @onChange={{this.handleCategoryChange}}\\n          @sync={{false}}\\n        />\\n      </div>\\n    {{/let}}\\n  {{/if}}\\n\\n  {{#if\\n    (or\\n      (lte this.categoryItems.length 1)\\n      this.contentsController.activeCategory.id\\n    )\\n  }}\\n    <div class=\\\"text-ui mb1\\\">\\n      {{t \\\"components.entityInspector.missionCustomizer.description\\\"}}\\n    </div>\\n\\n    <WaitFor @resource={{this.resource}}>\\n      <EntityCustomizer\\n        @entity={{this.activeCategoryEntity}}\\n        @expandedEntities={{this.expandedEntities}}\\n        @includedEntities={{this.customContent.includedEntities}}\\n        @includedEntitySettings={{this.customContent.includedEntitySettings}}\\n        @onExpand={{this.handleEntityCustomizerExpand}}\\n        @onCollapse={{this.handleEntityCustomizerCollapse}}\\n        @onInclude={{this.handleEntityCustomizerInclude}}\\n        @onExclude={{this.handleEntityCustomizerExclude}}\\n        @onDiagnosisChange={{this.debouncedSave}}\\n        @showCategoryNames={{this.isInteractive}}\\n        @grouped={{true}}\\n      />\\n      {{#if\\n        (or this.contentTeacherAssignments.length this.contentWordlists.length)\\n      }}\\n        <div class=\\\"text-tertiary mt1\\\">\\n          {{t \\\"components.entityInspector.missionCustomizer.teacherMaterial\\\"}}\\n        </div>\\n\\n        {{#if (gt this.categoryItems.length 1)}}\\n          <XAlert class=\\\"my1\\\">\\n            {{t\\n              \\\"components.entityInspector.missionCustomizer.teacherMaterialDescription\\\"\\n            }}\\n          </XAlert>\\n        {{/if}}\\n\\n        <AdditionCustomizer\\n          @teacherAssignments={{this.contentTeacherAssignments}}\\n          @wordlists={{this.contentWordlists}}\\n          @includedTeacherAssignments={{this.customContent.includedTeacherAssignments}}\\n          @includedWordlists={{this.customContent.includedWordlists}}\\n          @onIncludeTeacherAssignment={{this.handleAdditionCustomizerIncludeTeacherAssignment}}\\n          @onExcludeTeacherAssignment={{this.handleAdditionCustomizerExcludeTeacherAssignment}}\\n          @onIncludeWordlist={{this.handleAdditionCustomizerIncludeWordlist}}\\n          @onExcludeWordlist={{this.handleAdditionCustomizerExcludeWordlist}}\\n        />\\n      {{/if}}\\n    </WaitFor>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/entity-inspector/mission-customizer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-inspector/mission-customizer/index.hbs\"}});\nimport { inject as controller } from '@ember/controller';\nimport EmberObject, { action, notifyPropertyChange } from '@ember/object';\nimport { debounce, later } from '@ember/runloop';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport Resource from 'babel/utils/resource';\nimport sortBy from 'babel/utils/sort-by';\nimport { nextObject, previousObject } from 'compton/utils/array';\nimport { storageFor } from 'ember-local-storage';\n\nconst ROUTES_NEEDING_REFRESH_AFTER_CHANGES = [\n  'master.interactives.practices.show',\n  'master.contents.assignments.show',\n];\n\nexport default class MissionCustomizeComponent extends Component {\n  @service store;\n\n  @service router;\n\n  @service contextHelper;\n\n  @service customContentDispatcher;\n\n  @service entityInspector;\n\n  @service speaker;\n\n  @controller('master.contents') contentsController;\n\n  @controller('master.interactives.practices.show') practicesController;\n\n  @storageFor('read-setting') settings;\n\n  @tracked expandedEntities = [];\n\n  resource = new Resource(async () => {\n    const customContent = this.customContent;\n\n    if (customContent.populated) {\n      const entity = await customContent.entity;\n      await entity.customizableDescendents;\n    } else {\n      await customContent.populate();\n    }\n\n    await Promise.all([\n      customContent.includedEntities,\n      customContent.includedTeacherAssignments,\n      customContent.includedWordlists,\n    ]);\n  });\n\n  constructor() {\n    super(...arguments);\n    this.#turnOfSpeakerIfActive();\n    this.router.on('routeDidChange', this, this.#closeModalOnRouteChange);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.router.off('routeDidChange', this, this.#closeModalOnRouteChange);\n  }\n\n  get isInteractive() {\n    return this.contextHelper.activeContent?.type === 'interactives';\n  }\n\n  get categoryItems() {\n    if (this.isInteractive) return [];\n\n    return this.contentsController?.unrestrictedCategories?.map((category) => ({\n      label: category.name,\n      value: category.id,\n    }));\n  }\n\n  get activeCategoryName() {\n    return this.contextHelper.activeSection?.category?.name;\n  }\n\n  get activeCategoryEntity() {\n    const sortBy = ['sort', 'title'];\n\n    if (this.isInteractive) {\n      return this.contextHelper?.activeContent;\n    }\n\n    let activeCategoryId = this.contextHelper.activeSection?.category?.id;\n\n    if (!activeCategoryId && this.categoryItems?.length > 1) {\n      const includedSectionsAndCollections =\n        this.customContent?.includedEntities.filter((entity) =>\n          ['sections', 'collections'].includes(entity.type)\n        );\n\n      activeCategoryId =\n        includedSectionsAndCollections?.firstObject?.category?.id;\n    }\n\n    if (activeCategoryId) {\n      const filteredAndSorted = EmberObject.create({\n        children: this.contextHelper?.activeContent.children\n          ?.filterBy('category.id', activeCategoryId)\n          .sortBy(...sortBy),\n      });\n      return filteredAndSorted;\n    }\n\n    return EmberObject.create({\n      children: this.contextHelper?.activeContent?.children.sortBy(...sortBy),\n    });\n  }\n\n  get customContent() {\n    return this.contextHelper.activeCustomContent;\n  }\n\n  get courseTeacherIds() {\n    return this.contextHelper.activeCourse?.teachers?.mapBy('id') ?? [];\n  }\n\n  get contentTeacherAssignments() {\n    const teacherAssignments = this.contentsController.teacherAssignments;\n\n    if (teacherAssignments) {\n      return sortBy(\n        teacherAssignments.filter(\n          (teacherAssignment) =>\n            teacherAssignment.isPublished &&\n            teacherAssignment.hasContent(this.customContent.entity) &&\n            this.courseTeacherIds.includes(teacherAssignment.userId)\n        ),\n        'title_asc'\n      );\n    }\n\n    return [];\n  }\n\n  get contentWordlists() {\n    const wordlists = this.contentsController.wordlists;\n\n    if (wordlists) {\n      return wordlists.filter(\n        (wordlist) =>\n          wordlist.isPublished &&\n          !wordlist.isTransformed &&\n          wordlist.hasContent(this.customContent.entity) &&\n          this.courseTeacherIds.includes(wordlist.userId)\n      );\n    }\n\n    return [];\n  }\n\n  @action\n  handleEntityCustomizerExpand(entity) {\n    this.expandedEntities.addObject(entity);\n  }\n\n  @action\n  handleEntityCustomizerCollapse(entity) {\n    this.expandedEntities.removeObject(entity);\n  }\n\n  @action\n  async handleEntityCustomizerInclude(entity) {\n    const parent = await entity.parent;\n    if (\n      this.isActiveContentHidden &&\n      ['sections', 'collections'].includes(entity?.type) &&\n      entity.space !== 'workspace' &&\n      parent.template !== 'interactive'\n    ) {\n      this.router.transitionTo({\n        queryParams: { section: entity.id },\n      });\n    }\n\n    this.customContent.includedEntities.addObject(entity);\n\n    if (await this.#isAllChildrenExcluded(entity)) {\n      const children = await entity.children;\n      this.customContent.includedEntities.addObject(children.firstObject);\n    }\n\n    await this.#notifyParent(entity);\n\n    this.debouncedSave();\n  }\n\n  @action\n  async handleEntityCustomizerExclude(entity) {\n    this.customContent.includedEntities.removeObject(entity);\n    await this.#maybeNavigate(entity);\n\n    const parent = await this.#getParent(entity);\n    // Extracting this if condition to an helper in the form of:\n    // if(await this.#shouldHideParent(parent)\n    // would be nice but unfortunately that will cause\n    // everything to be hidden when the user presses \"Avmarkera alla\" (╯°□°）╯︵ ┻━┻\n    if (\n      parent.type !== 'sections' &&\n      (await this.#isAllChildrenExcluded(parent)) &&\n      this.customContent.includedEntities.toArray().includes(parent)\n    ) {\n      this.customContent.includedEntities.removeObject(parent);\n      await this.#maybeNavigate(parent);\n      await this.#notifyParent(parent);\n    }\n\n    await this.#notifyParent(entity);\n\n    this.debouncedSave();\n  }\n\n  async #maybeNavigate(entity) {\n    if (await this.#shouldNavigateToSection(entity)) {\n      this.#navigateToNextOrPreviousSection();\n    }\n\n    if (await this.#shouldNavigateToInteractive(entity)) {\n      this.#navigateToNextOrPreviousInteractive();\n    }\n  }\n\n  async #isAllChildrenExcluded(parent) {\n    const children = await parent.children;\n    return (\n      children.length > 0 &&\n      !this.customContent.includedEntities\n        .toArray()\n        .some((e) => children.includes(e))\n    );\n  }\n\n  @action\n  async handleAdditionCustomizerIncludeTeacherAssignment(teacherAssignment) {\n    this.customContent.includedTeacherAssignments.addObject(teacherAssignment);\n\n    await this.#notifyParent(teacherAssignment);\n\n    this.debouncedSave();\n  }\n\n  @action\n  async handleAdditionCustomizerExcludeTeacherAssignment(teacherAssignment) {\n    this.customContent.includedTeacherAssignments.removeObject(\n      teacherAssignment\n    );\n\n    await this.#notifyParent(teacherAssignment);\n\n    this.debouncedSave();\n  }\n\n  @action\n  handleAdditionCustomizerIncludeWordlist(wordlist) {\n    this.customContent.includedWordlists.addObject(wordlist);\n    this.debouncedSave();\n  }\n\n  @action\n  handleAdditionCustomizerExcludeWordlist(wordlist) {\n    this.customContent.includedWordlists.removeObject(wordlist);\n    this.debouncedSave();\n  }\n\n  @action\n  handleCategoryChange(categoryId) {\n    const newCategorySections = this.contentsController.sections.filterBy(\n      'category.id',\n      categoryId\n    );\n\n    const section = newCategorySections.get('firstObject.id');\n\n    this.router.replaceWith({\n      queryParams: { section },\n    });\n  }\n\n  get isActiveContentHidden() {\n    const activeCategoryId = this.contextHelper.activeSection?.category?.id;\n    const activeContentChildrenIds = this.contextHelper?.activeContent.children\n      ?.filterBy('category.id', activeCategoryId)\n      ?.filterBy('space', 'content')\n      .mapBy('id');\n\n    return !this.customContent.includedEntities\n      .mapBy('id')\n      .toArray()\n      .some((includedId) => activeContentChildrenIds.includes(includedId));\n  }\n\n  get isActiveCategoryHidden() {\n    const activeCategoryId = this.contextHelper.activeSection?.category?.id;\n    const activeContentChildrenIds = this.contextHelper?.activeContent.children\n      ?.filterBy('category.id', activeCategoryId)\n      ?.filterBy('space', 'content')\n      ?.filterBy('type', 'sections')\n      .mapBy('id');\n\n    return !this.customContent.includedEntities\n      .mapBy('id')\n      .toArray()\n      .some((includedId) => activeContentChildrenIds.includes(includedId));\n  }\n\n  async #notifyParent(entity) {\n    const parent = await this.#getParent(entity);\n    if (parent) {\n      notifyPropertyChange(parent, 'children');\n    }\n    if (\n      ROUTES_NEEDING_REFRESH_AFTER_CHANGES.includes(\n        this.router.currentRouteName\n      )\n    ) {\n      this.router.refresh(this.router.currentRouteName);\n    }\n  }\n\n  async #getParent(object) {\n    if (object?.parent) {\n      return await object.parent;\n    }\n    const entity = this.store.peekRecord('entity', object.id);\n    if (entity) {\n      return await entity.parent;\n    }\n    return;\n  }\n\n  async #shouldNavigateToSection(entity) {\n    const mode = this.settings.get('mode');\n    const parent = await entity.parent;\n    const activeSection = this.contentsController.activeSection;\n    return (\n      ((mode === 'step' || ['story', 'workflow'].includes(parent.template)) &&\n        entity === activeSection) ||\n      (entity === activeSection && this.#isAllChildrenExcluded(entity))\n    );\n  }\n\n  async #shouldNavigateToInteractive(entity) {\n    return (\n      this.router.currentRouteName === 'master.interactives.practices.show' &&\n      this.router.currentRoute?.parent?.params?.practice_id === entity.id\n    );\n  }\n\n  #navigateToNextOrPreviousSection() {\n    const sectionToNavigateTo =\n      nextObject(\n        this.contentsController.categorizedSections,\n        this.contentsController.activeSection\n      ) ||\n      previousObject(\n        this.contentsController.categorizedSections,\n        this.contentsController.activeSection\n      );\n    if (sectionToNavigateTo) {\n      this.router.transitionTo({\n        queryParams: { section: sectionToNavigateTo.id },\n      });\n    }\n  }\n\n  #navigateToNextOrPreviousInteractive() {\n    if (this.practicesController.hasNextCollection) {\n      this.practicesController.paginateToNextCollection();\n    } else if (this.practicesController.hasPreviousCollection) {\n      this.practicesController.paginateToPreviousCollection();\n    }\n  }\n\n  @action\n  debouncedSave() {\n    debounce(this, this.#save, 150);\n  }\n\n  async #save() {\n    await this.customContentDispatcher.save(this.customContent, false, {\n      adapterOptions: {\n        ignoreResponsePayload: true,\n      },\n    });\n  }\n\n  #closeModalOnRouteChange() {\n    if (\n      !this.contextHelper.activeSection &&\n      !this.contextHelper.inWorkspaceExercise &&\n      this.entityInspector?.modalIsOpen\n    ) {\n      this.entityInspector.closeModal();\n    }\n  }\n\n  #turnOfSpeakerIfActive() {\n    later(() => {\n      if (this.speaker.active) {\n        this.speaker.toggleSpeakerActive();\n      }\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let (component this.component) as |Wrapper|}}\\n  <Wrapper @position=\\\"right\\\" @closeButton={{false}} @size={{520}}>\\n    <div class={{this.classNames}} ...attributes>\\n      <div\\n        class=\\\"entity-inspector-header flex flex-center justify-space-between\\\"\\n      >\\n        <div class=\\\"text-tertiary\\\">\\n          {{@title}}\\n        </div>\\n\\n        <div class=\\\"entity-inspector-actions flex flex-center\\\">\\n          <UiButton\\n            @appearance=\\\"bulb\\\"\\n            @variant=\\\"inherit\\\"\\n            class=\\\"entity-inspector-fullscreen\\\"\\n            @onClick={{this.toggleFullscreen}}\\n          >\\n            {{#if this.fullscreen}}\\n              <DcIcon @name=\\\"collapse\\\" />\\n            {{else}}\\n              <DcIcon @name=\\\"expand\\\" />\\n            {{/if}}\\n          </UiButton>\\n\\n          <UiButton\\n            @appearance=\\\"bulb\\\"\\n            class=\\\"entity-inspector-close ml1\\\"\\n            @variant=\\\"inherit\\\"\\n            @onClick={{this.close}}\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" />\\n          </UiButton>\\n        </div>\\n      </div>\\n\\n      {{#if (eq @section \\\"about\\\")}}\\n        <EntityInspector::Detail\\n          @entity={{@selectedEntity}}\\n          @title={{@title}}\\n        />\\n      {{else if (eq @section \\\"guidance\\\")}}\\n        {{#if this.session.user.isTeacherForSchool}}\\n          <EntityInspector::GuidanceViewer @entity={{@selectedEntity}} />\\n        {{/if}}\\n      {{else if (eq @section \\\"missionCustomizer\\\")}}\\n        <EntityInspector::MissionCustomizer @entity={{@selectedEntity}} />\\n      {{/if}}\\n    </div>\\n  </Wrapper>\\n{{/let}}', { moduleName: 'babel/components/entity-inspector/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport appendQueryParams from 'babel/utils/append-query-params';\nimport { trackOpenElevwebbEvent } from 'babel/utils/matomo-events';\nimport routeArgsForEntity from 'babel/utils/route-args-for-entity';\nimport { load } from 'ember-async-data';\n\nfunction extractRouteArgs(args) {\n  args = args.slice();\n  const possibleQueryParams = args[args.length - 1];\n\n  let queryParams;\n  if (\n    possibleQueryParams &&\n    Object.prototype.hasOwnProperty.call(possibleQueryParams, 'queryParams')\n  ) {\n    queryParams = args.pop().queryParams;\n  } else {\n    queryParams = {};\n  }\n\n  const routeName = args.shift();\n  const models = args;\n\n  return { routeName, models, queryParams };\n}\n\n// NOTE When passing the params property directly to Ember's link-to helper,\n// it expects the query params to be in this format.\nfunction buildQueryParamsHash(queryParams) {\n  return {\n    isQueryParams: true,\n    values: queryParams,\n  };\n}\n\nexport default class EntityLinkComponent extends Component {\n  /**\n   * Arguments:\n   * closeMissionHeader (bool)\n   * entity (object)\n   * appearance (string)\n   */\n\n  @service contextHelper;\n\n  @service missionMode;\n\n  get isExternal() {\n    return (\n      this.args.entity?.type === 'books_external' ||\n      this.args.entity?.type === 'books_junior' ||\n      this.args.entity?.type === 'books_pdf'\n    );\n  }\n\n  get isJunior() {\n    return this.args.entity?.type === 'books_junior';\n  }\n\n  get isDigitalbok() {\n    return this.args.entity?.type === 'books_pdf';\n  }\n\n  get externalUrl() {\n    let target;\n    switch (this.args.entity?.type) {\n      case 'books_external':\n        target = this.args.entity?.body?.external_url;\n        break;\n      case 'books_pdf':\n        target = `${config.digitalbokUrl}/books/${this.args.entity?.id}`;\n        break;\n      case 'books_junior':\n      default:\n        target = `${config.juniorUrl}/books/${this.args.entity?.id}`;\n        break;\n    }\n\n    const params = {};\n\n    if (\n      (this.isJunior || this.isDigitalbok) &&\n      this.contextHelper?.activeCourse?.id\n    ) {\n      params.courseId = this.contextHelper.activeCourse.id;\n    }\n\n    return appendQueryParams(target, params);\n  }\n\n  get initialQueryParams() {\n    const initialQueryParams = {};\n    const closeMissionHeader = this.args.closeMissionHeader;\n    const section = this.args.section;\n\n    if (section) {\n      initialQueryParams.section = this.args.section.id;\n    }\n\n    if (closeMissionHeader) {\n      initialQueryParams.customContentId = null;\n      initialQueryParams.missionId = null;\n    }\n\n    return initialQueryParams;\n  }\n\n  @cached\n  get routeArgsProxy() {\n    return load(\n      routeArgsForEntity(\n        this.args.entity,\n        this.initialQueryParams,\n        this.missionMode\n      ),\n      this\n    );\n  }\n\n  get routeArgs() {\n    return this.routeArgsProxy.isResolved ? this.routeArgsProxy.value : null;\n  }\n\n  get routeParams() {\n    if (this.routeArgs) {\n      const { routeName, models, queryParams } = extractRouteArgs(\n        this.routeArgs\n      );\n\n      return [routeName, ...models, buildQueryParamsHash(queryParams)];\n    }\n\n    return [\n      'nodes',\n      this.args.entity?.id,\n      buildQueryParamsHash(this.initialQueryParams),\n    ];\n  }\n\n  @action\n  trackEvent() {\n    const elevWebb = this.args.entity?.title?.match(/elevwebb/i);\n\n    if (elevWebb) {\n      trackOpenElevwebbEvent(\n        'Öppna - Elevwebb',\n        this.contextHelper.activeProduct.id\n      );\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isExternal}}\\n  <a href={{this.externalUrl}} ...attributes>\\n    {{yield}}\\n  </a>\\n{{else if @entity}}\\n  <UiLink\\n    @click={{this.trackEvent}}\\n    @params={{this.routeParams}}\\n    @disabled={{this.routeArgsProxy.isPending}}\\n    @appearance={{this.appearance}}\\n    ...attributes\\n  >\\n    {{yield}}\\n  </UiLink>\\n{{else}}\\n  {{yield}}\\n{{/if}}', { moduleName: 'babel/components/entity-link/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class EntityMetaComponent extends Component {\n  /**\n   * Arguments:\n   * guidanceIconOnly (bool)\n   * model (object)\n   * categoryName (string)\n   * onOpen(function)\n   */\n\n  @service entityInspector;\n\n  @service session;\n\n  get entityGuidance() {\n    if (this.session.user?.isTeacherForSchool) {\n      if (this.args.model?.body?.guidance?.length > 0) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  @action handleOpenEntityInspector(evt) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    this.args.onOpen?.();\n    this.args.closeCollectionModal?.();\n    this.entityInspector.openModal(this.args.model, 'guidance');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.entityGuidance}}\\n  <div class=\\\"entity-meta\\\" ...attributes>\\n    <button\\n      type=\\\"button\\\"\\n      class=\\\"entity-meta-button\\\"\\n      {{on \\\"click\\\" this.handleOpenEntityInspector}}\\n    >\\n      <DcIcon @name=\\\"guidance\\\" />\\n\\n      {{#unless @guidanceIconOnly}}\\n        <span class=\\\"nl1\\\">{{t \\\"components.entityMeta.guidance\\\"}}</span>\\n      {{/unless}}\\n    </button>\\n  </div>\\n{{/if}}', { moduleName: 'babel/components/entity-meta/template.hbs' });\n","import Component from '@ember/component';\nimport { get, observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default Component.extend({\n  router: service(),\n  // SETUP\n\n  classNames: ['preview-page-wrapper'],\n\n  // EXTERNAL PROPERTIES\n\n  backgroundColor: null,\n\n  image: null,\n\n  cropImage: false,\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    this.element.style.backgroundColor = this.get('backgroundColor');\n\n    if (get(this, 'image')) {\n      this.setBackgroundImage();\n    }\n  },\n\n  imageChanged: observer('image', function () {\n    if (get(this, 'image')) {\n      this.setBackgroundImage();\n    }\n  }),\n\n  setBackgroundImage() {\n    let url = `url(${get(this, 'image')})`;\n    this.element.style.setProperty('--url', url);\n    this.element.style.setProperty(\n      '--gradient',\n      `linear-gradient(to top, var(--overlay-gradient-start) 20%, var(--overlay-gradient-end) 100%)`\n    );\n  },\n\n  actions: {\n    login() {\n      window.location.replace('/' + this.get('model.id'));\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"preview-page-image flex-expand\\\"></div>\\n\\n<div class=\\\"preview-page-content\\\">\\n\\n  <div class=\\\"container\\\">\\n\\n    <img\\n      alt=\\\"Logo\\\"\\n      src=\\\"/assets/images/digilar/nok.svg\\\"\\n      class=\\\"preview-logo mt2\\\"\\n    />\\n\\n    <div class=\\\"cover-page-info\\\">\\n\\n      {{#if this.model.type}}\\n\\n        <div class=\\\"text-muted text-small nb1\\\">\\n          {{t (concat \\\"components.entityPreviewPage.types.\\\" this.model.type)}}\\n        </div>\\n\\n      {{/if}}\\n\\n      <h1 class=\\\"text-extreme content-title\\\">\\n        <span>{{this.model.title}}</span>\\n      </h1>\\n\\n      {{content/c-preamble value=this.model.description}}\\n\\n    </div>\\n\\n    <div class=\\\"mt2 flex flex-center flex-wrap cover-page-actions\\\">\\n      {{#ui-button size=\\\"large\\\" variant=\\\"success\\\" onClick=(action \\\"login\\\")}}\\n        {{t \\\"components.entityPreviewPage.login\\\"}}\\n      {{/ui-button}}\\n    </div>\\n  </div>\\n\\n</div>', { moduleName: 'babel/components/entity-preview-page/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class EntityProgressComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * animated (bool)\n   * inCollectionView (bool)\n   */\n\n  @service assignmentEvents;\n\n  constructor() {\n    super(...arguments);\n\n    this.assignmentEvents.on('interactive-updated', this.setInteractivePromise);\n\n    this.setInteractivePromise();\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n\n    this.assignmentEvents.off(\n      'interactive-updated',\n      this.setInteractivePromise\n    );\n  }\n\n  @tracked interactivePromise = resolve();\n\n  @cached\n  get interactiveProxy() {\n    return load(this.interactivePromise, this);\n  }\n\n  get interactive() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value\n      : null;\n  }\n\n  @cached\n  get collectionOwnerProxy() {\n    return load(resolve(this.args.model?.owner), this);\n  }\n\n  get collectionOwner() {\n    return this.collectionOwnerProxy.isResolved\n      ? this.collectionOwnerProxy.value\n      : null;\n  }\n\n  get checked() {\n    return this.interactive?.isCompleted;\n  }\n\n  get variant() {\n    return this.checked ? 'success' : 'default';\n  }\n\n  get inActiveCarousel() {\n    return (\n      this.args.inCollectionView &&\n      this.args.model?.isCarousel &&\n      !this.interactive?.ended\n    );\n  }\n\n  get value() {\n    if (this.inActiveCarousel) {\n      return this.interactive?.numSubmittedAttemptAnswers;\n    }\n\n    if (this.interactive?.isDiagnosis) {\n      return this.interactive?.numStartedAnswers;\n    }\n\n    return this.interactive?.numSubmittedAnswers;\n  }\n\n  get total() {\n    if (this.inActiveCarousel) {\n      return this.interactive?.numAttemptExercises;\n    }\n\n    return this.interactive?.numExercises;\n  }\n\n  get progress() {\n    if (!isNaN(this.value) && !isNaN(this.total) && this.total > 0) {\n      return (this.value / this.total) * 100;\n    }\n\n    return this.interactive?.progress ?? 0;\n  }\n\n  @action\n  setInteractivePromise(collectionId) {\n    if (collectionId && this.args.model?.id !== collectionId) return;\n\n    this.interactivePromise = this.assignmentEvents\n      .getOrCreateInteractiveForCollection(this.args.model)\n      .then(({ interactive }) => interactive)\n      .catch(() => {});\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  {{progress-circle\\n    variant=this.variant\\n    progress=this.progress\\n    shouldRun=this.interactiveProxy.isResolved\\n    animated=@animated\\n  }}\\n  class=\\\"entity-progress\\\"\\n  ...attributes\\n  data-test-entity-progress-percentage-circle\\n>\\n  {{#if this.checked}}\\n    <DcIcon\\n      @name=\\\"check-circle\\\"\\n      @size=\\\"md\\\"\\n      class=\\\"text-color-success\\\"\\n      data-test-entity-progress-checked-icon\\n    />\\n  {{else if this.collectionOwner}}\\n    <DcAvatar\\n      @size=\\\"x-small\\\"\\n      @user={{this.collectionOwner}}\\n      data-test-entity-progress-teacher-icon\\n    />\\n  {{else if @model.isDiagnosis}}\\n    <DcIcon\\n      @name=\\\"diagnosis\\\"\\n      @size=\\\"xs\\\"\\n      class=\\\"text-color-default\\\"\\n      data-test-entity-progress-diagnosis-icon\\n    />\\n  {{else}}\\n    <DcIcon\\n      @name=\\\"collection\\\"\\n      @size=\\\"xs\\\"\\n      class=\\\"text-color-default\\\"\\n      data-test-entity-progress-collection-icon\\n    />\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/entity-progress/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"entity-search-container\\\">\\n  <div\\n    class=\\\"flex entity-searchbar-container\\\"\\n    role=\\\"search\\\"\\n    aria-label=\\\"entities search\\\"\\n  >\\n\\n    {{ui-input\\n      ariaLabel=(t \\\"components.entitySearch.serachInputPlaceholder\\\")\\n      value=this.entitySearch.searchVal\\n      clearable=\\\"true\\\"\\n      placeholder=(t \\\"components.entitySearch.serachInputPlaceholder\\\")\\n      class=\\\"flex-expand\\\"\\n      id=\\\"entity-search\\\"\\n      onClear=(perform this.doSearch)\\n      onEnter=(perform this.doSearch)\\n    }}\\n\\n    {{#ui-button\\n      ariaLabel=(t \\\"components.entitySearch.searchSubmit\\\")\\n      variant=\\\"default\\\"\\n      class=\\\"nl1\\\"\\n      onClick=(perform this.doSearch)\\n    }}\\n\\n      <DcIcon @name=\\\"search\\\" />\\n\\n    {{/ui-button}}\\n\\n  </div>\\n  {{#if this.entitySearch.isLoading}}\\n    <div class=\\\"entity-search-loader\\\">\\n      <DcLoader />\\n    </div>\\n  {{else}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"validSearch\\\")}}\\n      <div\\n        class=\\\"text-small mb1 entity-search-hits-container text-separator entity-search-results\\\"\\n      >\\n        {{t\\n          \\\"components.entitySearch.results\\\"\\n          hitsLow=this.entitySearch.showingResultLow\\n          hitsHigh=this.entitySearch.showingResultHight\\n          totalHits=this.entitySearch.totalHits\\n        }}\\n      </div>\\n      <AreaView::DelimitedList @contents={{this.entitySearch.searchResults}} />\\n    {{/if}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"invalidSearch\\\")}}\\n      <div class=\\\"text-color-error entity-search-invalid-search text-small\\\">\\n        {{t \\\"components.entitySearch.searchInputToShort\\\"}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"noHits\\\")}}\\n      <p class=\\\"entity-search-no-hit text-ui text-muted\\\">\\n        {{t \\\"components.entitySearch.noHit\\\"}}\\n      </p>\\n    {{/if}}\\n    {{#if this.showEntityTree}}\\n      <div class=\\\"entity-search-yield\\\">\\n        {{yield}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n  {{#if this.showPagination}}\\n    <XPagination\\n      class=\\\"entity-search-paging justify-center\\\"\\n      @page={{this.entitySearch.pageNumber}}\\n      @totalPages={{this.entitySearch.numPages}}\\n      @onChange={{this.handlePageChange}}\\n    />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"entity-search-container\\\">\\n  <div\\n    class=\\\"flex entity-searchbar-container\\\"\\n    role=\\\"search\\\"\\n    aria-label=\\\"entities search\\\"\\n  >\\n\\n    {{ui-input\\n      ariaLabel=(t \\\"components.entitySearch.serachInputPlaceholder\\\")\\n      value=this.entitySearch.searchVal\\n      clearable=\\\"true\\\"\\n      placeholder=(t \\\"components.entitySearch.serachInputPlaceholder\\\")\\n      class=\\\"flex-expand\\\"\\n      id=\\\"entity-search\\\"\\n      onClear=(perform this.doSearch)\\n      onEnter=(perform this.doSearch)\\n    }}\\n\\n    {{#ui-button\\n      ariaLabel=(t \\\"components.entitySearch.searchSubmit\\\")\\n      variant=\\\"default\\\"\\n      class=\\\"nl1\\\"\\n      onClick=(perform this.doSearch)\\n    }}\\n\\n      <DcIcon @name=\\\"search\\\" />\\n\\n    {{/ui-button}}\\n\\n  </div>\\n  {{#if this.entitySearch.isLoading}}\\n    <div class=\\\"entity-search-loader\\\">\\n      <DcLoader />\\n    </div>\\n  {{else}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"validSearch\\\")}}\\n      <div\\n        class=\\\"text-small mb1 entity-search-hits-container text-separator entity-search-results\\\"\\n      >\\n        {{t\\n          \\\"components.entitySearch.results\\\"\\n          hitsLow=this.entitySearch.showingResultLow\\n          hitsHigh=this.entitySearch.showingResultHight\\n          totalHits=this.entitySearch.totalHits\\n        }}\\n      </div>\\n      <AreaView::DelimitedList @contents={{this.entitySearch.searchResults}} />\\n    {{/if}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"invalidSearch\\\")}}\\n      <div class=\\\"text-color-error entity-search-invalid-search text-small\\\">\\n        {{t \\\"components.entitySearch.searchInputToShort\\\"}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (eq this.entitySearch.searchStatus \\\"noHits\\\")}}\\n      <p class=\\\"entity-search-no-hit text-ui text-muted\\\">\\n        {{t \\\"components.entitySearch.noHit\\\"}}\\n      </p>\\n    {{/if}}\\n    {{#if this.showEntityTree}}\\n      <div class=\\\"entity-search-yield\\\">\\n        {{yield}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n  {{#if this.showPagination}}\\n    <XPagination\\n      class=\\\"entity-search-paging justify-center\\\"\\n      @page={{this.entitySearch.pageNumber}}\\n      @totalPages={{this.entitySearch.numPages}}\\n      @onChange={{this.handlePageChange}}\\n    />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/entity-search/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-search/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport arg from 'compton/utils/arg';\nimport { task } from 'ember-concurrency';\n\nexport default class EntitySearchComponent extends Component {\n  constructor(...args) {\n    super(...args);\n    if (this.entities) {\n      if (this.entities !== this.entitySearch.entities) {\n        this.entitySearch.resetSearch();\n      }\n    }\n    if (this.entity) {\n      if (this.entity !== this.entitySearch.entity) {\n        this.entitySearch.resetSearch();\n      }\n    }\n  }\n  // SERVICE\n  @service('entity-search') entitySearch;\n\n  // PARAMS\n  @arg entity;\n  @arg entities;\n  // PROPERTIES\n\n  get showPagination() {\n    return (\n      this.entitySearch.searchStatus === 'validSearch' &&\n      !this.entitySearch.isLoading &&\n      this.entitySearch.totalHits > 24\n    );\n  }\n\n  get showEntityTree() {\n    return (\n      this.entitySearch.searchStatus === null ||\n      this.entitySearch.searchStatus === 'invalidSearch'\n    );\n  }\n\n  @task\n  *doSearch() {\n    const searchVal = this.entitySearch.searchVal;\n    if (!searchVal || searchVal === '') {\n      this.entitySearch.searchStatus = null;\n      return;\n    }\n    if (searchVal.length < 3) {\n      this.entitySearch.searchStatus = 'invalidSearch';\n      return;\n    }\n    if (searchVal.length < 3) {\n      this.entitySearch.searchStatus = 'invalidSearch';\n      return;\n    }\n    this.entitySearch.searchValue = this.entitySearch.searchVal;\n    yield this.entitySearch.search(this.entity, this.entities, true);\n    document.getElementById('entity-search').focus();\n  }\n\n  @action handlePageChange(page) {\n    this.entitySearch.pageNumber = page;\n    this.entitySearch.isLoading = true;\n    this.entitySearch.search(this.entity, this.entities);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"entity-thumbnail {{if this.isProgress \\\" entity-thumbnail--progress\\\"}}\\\" ...attributes>\\n  {{#if this.isAvatar}}\\n    <XAwait @value={{@avatarUser}} as |avatarUser|>\\n      <DcAvatar\\n        @size=\\\"x-small\\\"\\n        @user={{avatarUser}}\\n      />\\n    </XAwait>\\n  {{else if this.isProgress}}\\n    <EntityProgress @model={{@model}} />\\n  {{else if this.isIcon}}\\n    <DcIcon @name={{this.icon}}/>\\n  {{else}}\\n    {{@index}}\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"entity-thumbnail {{if this.isProgress \\\" entity-thumbnail--progress\\\"}}\\\" ...attributes>\\n  {{#if this.isAvatar}}\\n    <XAwait @value={{@avatarUser}} as |avatarUser|>\\n      <DcAvatar\\n        @size=\\\"x-small\\\"\\n        @user={{avatarUser}}\\n      />\\n    </XAwait>\\n  {{else if this.isProgress}}\\n    <EntityProgress @model={{@model}} />\\n  {{else if this.isIcon}}\\n    <DcIcon @name={{this.icon}}/>\\n  {{else}}\\n    {{@index}}\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/entity-thumbnail/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/entity-thumbnail/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class EntityThumbnailComponent extends Component {\n  get isAvatar() {\n    return this.args.avatarUser?.get('initials')?.length > 0;\n  }\n\n  get isProgress() {\n    return (\n      this.args.type === 'collections' ||\n      (this.args.type === 'sections' && this.args.model?.childrenSum > 0)\n    );\n  }\n\n  get isIcon() {\n    if (\n      this.args.type === 'sections' &&\n      this.args.model?.hideSectionSortNumbers\n    ) {\n      return true;\n    }\n\n    return ['collections', 'glossaries', 'concepts'].includes(this.args.type);\n  }\n\n  get icon() {\n    switch (this.args.type) {\n      case 'collections':\n        return 'collection';\n      case 'glossaries':\n        return 'glossaries';\n      case 'concepts':\n        return 'glossaries';\n      case 'sections':\n        return 'section';\n      default:\n        return null;\n    }\n  }\n}\n","import { service } from '@ember/service';\nimport {\n  ConflictError,\n  ForbiddenError,\n  NotFoundError,\n  ServerError,\n  UnauthorizedError,\n} from '@ember-data/adapter/error';\nimport Component from '@glimmer/component';\n\nconst ERROR_MAP = {\n  401: UnauthorizedError,\n  403: ForbiddenError,\n  404: NotFoundError,\n  409: ConflictError,\n  500: ServerError,\n};\n\nexport default class ErrorPageComponent extends Component {\n  /**\n   * Arguments:\n   * error (object)\n   */\n\n  @service intl;\n\n  get statusCode() {\n    for (const [code, errorClass] of Object.entries(ERROR_MAP)) {\n      if (this.args.error instanceof errorClass) {\n        return code;\n      }\n    }\n\n    return 404;\n  }\n\n  get explanation() {\n    return this.intl.t(`components.errorPage.${this.statusCode}.explanation`);\n  }\n\n  get greeting() {\n    return this.intl.t(`components.errorPage.${this.statusCode}.greeting`);\n  }\n\n  get heading() {\n    return this.intl.t(`components.errorPage.${this.statusCode}.heading`);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XErrorPage\\n  @explanation={{this.explanation}}\\n  @greeting={{this.greeting}}\\n  @heading={{this.heading}}\\n  @statusCode={{this.statusCode}}\\n/>\\n', { moduleName: 'babel/components/error-page/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"exercise-bottombar {{@status}}\\\">\\n  <div class=\\\"flex flex-center flex-grow\\\">\\n    <AnswerStatusIcon @status={{@status}} class=\\\"nr1\\\" />\\n\\n    <span class=\\\"text-small text-bold status-text {{@status}}-text hide-xs\\\">\\n      {{#if (not-eq @status \\\"not-started\\\")}}\\n        {{t (concat \\\"components.exerciseBottombar.status.\\\" (camelize @status))}}\\n      {{/if}}\\n    </span>\\n  </div>\\n\\n  {{#if this.specialCharactersEnabled}}\\n    {{! template-lint-disable no-pointer-down-event-binding }}\\n    <UiButton\\n      @id={{this.keyboardButtonId}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{@toggleKeyboard}}\\n      class={{concat\\n        \\\"nl1 bottombar-button-keyboard\\\"\\n        (if @showKeyboard \\\" bottombar-button-keyboard--active\\\")\\n      }}\\n    >\\n      <DcIcon @size=\\\"md\\\" @name=\\\"Keyboard\\\" />\\n\\n      <XTooltip\\n        @content={{t \\\"components.exerciseBottombar.button.keyboardTooltip\\\"}}\\n        @for={{this.keyboardButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonReset}}\\n    <UiButton\\n      @id={{this.resetButtonId}}\\n      @appearance=\\\"link\\\"\\n      class=\\\"ml1 bottombar-button-reset\\\"\\n      @onClick={{@resetAnswer}}\\n      data-test-exercise-bottombar-reset\\n    >\\n      <DcIcon @name=\\\"eraser\\\" />\\n\\n      <XTooltip\\n        @content={{t \\\"components.exerciseBottombar.button.resetTooltip\\\"}}\\n        @for={{this.resetButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonKey}}\\n    <UiButton\\n      @id={{this.keyButtonId}}\\n      @appearance=\\\"link\\\"\\n      class={{concat\\n        \\\"nl1 bottombar-button-key\\\"\\n        (if @showKey \\\" bottombar-button-key--active\\\")\\n      }}\\n      @onClick={{@toggleKey}}\\n      @disabled={{this.buttonKeyDisabled}}\\n      data-test-exercise-bottombar-key\\n    >\\n      <DcIcon @name=\\\"key\\\" />\\n\\n      <XTooltip\\n        @content={{this.keyLabel}}\\n        @for={{this.keyButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonSubmit}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-submit\\\"\\n      @onClick={{@submitAnswer}}\\n      @disabled={{this.buttonSubmitDisabled}}\\n      @variant=\\\"success\\\"\\n      data-test-exercise-bottombar-submit\\n    >\\n      {{this.submitButtonLabel}}\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonNext}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-next\\\"\\n      @onClick={{@nextExercise}}\\n      @disabled={{this.buttonNextDisabled}}\\n    >\\n      {{t \\\"components.exerciseBottombar.button.next\\\"}}\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonDone}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-done\\\"\\n      @onClick={{this.handleButtonDone}}\\n      @disabled={{this.buttonDoneDisabled}}\\n    >\\n      {{t \\\"components.exerciseBottombar.button.done\\\"}}\\n    </UiButton>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"exercise-bottombar {{@status}}\\\">\\n  <div class=\\\"flex flex-center flex-grow\\\">\\n    <AnswerStatusIcon @status={{@status}} class=\\\"nr1\\\" />\\n\\n    <span class=\\\"text-small text-bold status-text {{@status}}-text hide-xs\\\">\\n      {{#if (not-eq @status \\\"not-started\\\")}}\\n        {{t (concat \\\"components.exerciseBottombar.status.\\\" (camelize @status))}}\\n      {{/if}}\\n    </span>\\n  </div>\\n\\n  {{#if this.specialCharactersEnabled}}\\n    {{! template-lint-disable no-pointer-down-event-binding }}\\n    <UiButton\\n      @id={{this.keyboardButtonId}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{@toggleKeyboard}}\\n      class={{concat\\n        \\\"nl1 bottombar-button-keyboard\\\"\\n        (if @showKeyboard \\\" bottombar-button-keyboard--active\\\")\\n      }}\\n    >\\n      <DcIcon @size=\\\"md\\\" @name=\\\"Keyboard\\\" />\\n\\n      <XTooltip\\n        @content={{t \\\"components.exerciseBottombar.button.keyboardTooltip\\\"}}\\n        @for={{this.keyboardButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonReset}}\\n    <UiButton\\n      @id={{this.resetButtonId}}\\n      @appearance=\\\"link\\\"\\n      class=\\\"ml1 bottombar-button-reset\\\"\\n      @onClick={{@resetAnswer}}\\n      data-test-exercise-bottombar-reset\\n    >\\n      <DcIcon @name=\\\"eraser\\\" />\\n\\n      <XTooltip\\n        @content={{t \\\"components.exerciseBottombar.button.resetTooltip\\\"}}\\n        @for={{this.resetButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonKey}}\\n    <UiButton\\n      @id={{this.keyButtonId}}\\n      @appearance=\\\"link\\\"\\n      class={{concat\\n        \\\"nl1 bottombar-button-key\\\"\\n        (if @showKey \\\" bottombar-button-key--active\\\")\\n      }}\\n      @onClick={{@toggleKey}}\\n      @disabled={{this.buttonKeyDisabled}}\\n      data-test-exercise-bottombar-key\\n    >\\n      <DcIcon @name=\\\"key\\\" />\\n\\n      <XTooltip\\n        @content={{this.keyLabel}}\\n        @for={{this.keyButtonId}}\\n        @placement=\\\"top\\\"\\n      />\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonSubmit}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-submit\\\"\\n      @onClick={{@submitAnswer}}\\n      @disabled={{this.buttonSubmitDisabled}}\\n      @variant=\\\"success\\\"\\n      data-test-exercise-bottombar-submit\\n    >\\n      {{this.submitButtonLabel}}\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonNext}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-next\\\"\\n      @onClick={{@nextExercise}}\\n      @disabled={{this.buttonNextDisabled}}\\n    >\\n      {{t \\\"components.exerciseBottombar.button.next\\\"}}\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.showButtonDone}}\\n    <UiButton\\n      class=\\\"ml1 bottombar-button-done\\\"\\n      @onClick={{this.handleButtonDone}}\\n      @disabled={{this.buttonDoneDisabled}}\\n    >\\n      {{t \\\"components.exerciseBottombar.button.done\\\"}}\\n    </UiButton>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-bottombar/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-bottombar/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nconst TEMPLATES_WITH_EDITOR = [\n  'text-gap',\n  'reply',\n  'place-text-gaps',\n  'editable-matrix',\n  'editor',\n  'matrix',\n];\n\nexport default class ExerciseBottombarComponent extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * interactive (object)\n   * disabled (bool)\n   * activeExercise (object)\n   * exercises (array)\n   * status (string)\n   * showKey (bool)\n   * toggleKey (function)\n   * nextExercise (function)\n   * resetAnswer (function)\n   * submitAnswer (function)\n   * toggleSuggestion (function)\n   * toggleCollectionSummary (function)\n   * answers (array)\n   * showKeyboard (bool)\n   * toggleKeyboard (function)\n   */\n\n  @service assignmentEvents;\n\n  @service session;\n\n  @service contextHelper;\n\n  @service intl;\n\n  @cached\n  get activeExerciseProxy() {\n    return load(resolve(this.args.activeExercise), this);\n  }\n\n  get activeExercise() {\n    return this.activeExerciseProxy.isResolved\n      ? this.activeExerciseProxy.value\n      : null;\n  }\n\n  @cached\n  get exercisesProxy() {\n    return load(resolve(this.args.exercises), this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : null;\n  }\n\n  get specialCharactersEnabled() {\n    if (!this.contextHelper.activeBook?.body?.special_keyboard_preset) {\n      return false;\n    }\n\n    const assignments = this.activeExercise?.body?.exercise?.assignments || [];\n\n    const containsEditableAssignment = assignments.some((assignment) => {\n      if (assignment.template === 'text-gap') {\n        return assignment.settings?.behaviour === 'write';\n      }\n\n      return TEMPLATES_WITH_EDITOR.includes(assignment.template);\n    });\n\n    if (containsEditableAssignment) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get resetButtonId() {\n    return `${guidFor(this)}-reset`;\n  }\n\n  get keyboardButtonId() {\n    return `${guidFor(this)}-keyboard`;\n  }\n\n  get keyButtonId() {\n    return `${guidFor(this)}-key`;\n  }\n\n  get exerciseHasOnlyCheckAssignments() {\n    const assignments = this.activeExercise?.body?.exercise?.assignments;\n\n    return (\n      assignments &&\n      !assignments.find((assignment) => assignment.template !== 'check')\n    );\n  }\n\n  get started() {\n    return this.args.status !== 'not-started';\n  }\n\n  get completed() {\n    return [\n      'correct',\n      'wrong',\n      'turned-in',\n      'audited',\n      'teacher-correct',\n      'teacher-wrong',\n      'done',\n    ].includes(this.args.status);\n  }\n\n  get allExercisesStarted() {\n    return this.args.answers?.every(\n      (exercise) => exercise.status !== 'not-started'\n    );\n  }\n\n  get incomplete() {\n    return this.args.status === 'incomplete';\n  }\n\n  get keyLabel() {\n    const type = this.activeExercise.type;\n    if (this.args.showKey) {\n      if (type === 'exercises') {\n        return this.intl.t(\n          'components.exerciseBottombar.button.hideKeyTooltip'\n        );\n      } else {\n        return this.intl.t(\n          'components.exerciseBottombar.button.hideSolutionTooltip'\n        );\n      }\n    } else {\n      if (type === 'exercises') {\n        return this.intl.t('components.exerciseBottombar.button.keyTooltip');\n      } else {\n        return this.intl.t(\n          'components.exerciseBottombar.button.solutionTooltip'\n        );\n      }\n    }\n  }\n\n  get hasSolutions() {\n    return this.activeExercise?.body?.exercise?.assignments?.find(\n      (assignment) => {\n        if (\n          ['assignments', 'studies'].includes(this.activeExercise.type) &&\n          (assignment.template === 'matrix' ||\n            assignment.template === 'text-gap')\n        ) {\n          return assignment?.content?.objects?.find((item) =>\n            item?.alternatives?.find(\n              (alternative) => alternative.value && alternative.value !== ''\n            )\n          );\n        }\n\n        return (\n          assignment?.settings?.solution ||\n          assignment?.content?.objects?.find((item) => item?.alternatives)\n        );\n      }\n    )\n      ? true\n      : false;\n  }\n\n  get buttonKeyDisabled() {\n    if (this.session.user?.isTeacher) {\n      return false;\n    }\n\n    const shouldCheck =\n      ['wrong'].includes(this.args.status) ||\n      (['turned-in', 'done', 'teacher-correct', 'audited'].includes(\n        this.args.status\n      ) &&\n        this.hasSolutions);\n\n    let disabled = true;\n\n    const showKey = undefined;\n    const hideSolution = this.contextHelper.activeMission?.hideSolutions;\n\n    if (hideSolution != null) {\n      if (shouldCheck && hideSolution === false) {\n        disabled = false;\n      }\n    } else if (showKey != null) {\n      if (shouldCheck && showKey === true) {\n        disabled = false;\n      }\n    } else {\n      // Check for course settings\n      const courseSetting = this.contextHelper.activeCourse?.showKey;\n\n      if (shouldCheck && courseSetting != null) {\n        disabled = !courseSetting;\n      } else if (shouldCheck) {\n        disabled = !shouldCheck;\n      }\n    }\n\n    return disabled;\n  }\n\n  get showButtonKey() {\n    // Don't show if only check assignments\n    if (this.exerciseHasOnlyCheckAssignments) return false;\n\n    // Dont show if its teacher corrected and no solution exists.\n    if (\n      ['assignments', 'studies'].includes(this.activeExercise?.type) &&\n      !this.hasSolutions\n    ) {\n      return false;\n    }\n\n    if (this.args.collection?.isDiagnosis && !this.args.disabled) return false;\n\n    return true;\n  }\n\n  get buttonNextDisabled() {\n    return this.activeExercise === this.exercises?.lastObject;\n  }\n\n  get showButtonNext() {\n    if (\n      (this.args.collection?.isCarousel && !this.carouselNextExercise) ||\n      (this.args.toggleCollectionSummary &&\n        this.activeExercise === this.exercises?.lastObject)\n    ) {\n      return false;\n    }\n\n    return this.completed || this.args.collection?.isDiagnosis;\n  }\n\n  @cached\n  get carouselNextExerciseProxy() {\n    const promise = this.assignmentEvents.carouselNextExercise(\n      this.args.interactive\n    );\n\n    return load(promise, this);\n  }\n\n  get carouselNextExercise() {\n    return this.carouselNextExerciseProxy.isResolved\n      ? this.carouselNextExerciseProxy.value\n      : true;\n  }\n\n  get showButtonDone() {\n    // Diagnosis\n    if (this.args.collection?.isDiagnosis) return false;\n\n    return (\n      // Carousel\n      (this.args.collection?.isCarousel &&\n        this.completed &&\n        !this.carouselNextExercise) ||\n      // Over types\n      (this.args.toggleCollectionSummary &&\n        this.completed &&\n        this.activeExercise === this.exercises?.lastObject)\n    );\n  }\n\n  get buttonDoneDisabled() {\n    return !this.allExercisesStarted;\n  }\n\n  get showButtonReset() {\n    if (!this.args.disabled) {\n      if (this.args.collection?.isCarousel) {\n        return this.started && !this.completed;\n      }\n\n      return this.started;\n    }\n\n    return false;\n  }\n\n  get buttonSubmitDisabled() {\n    return this.args.status === 'not-started';\n  }\n\n  get showButtonSubmit() {\n    if (this.args.collection?.isDiagnosis) {\n      return false;\n    } else {\n      return !this.completed;\n    }\n  }\n\n  get submitButtonLabel() {\n    if (['exercises', 'studies'].includes(this.activeExercise?.type)) {\n      return this.intl.t('components.exerciseBottombar.button.correct');\n    }\n\n    return this.intl.t('components.exerciseBottombar.button.submit');\n  }\n\n  constructor() {\n    super(...arguments);\n    this.assignmentEvents.on('onEnter', this._onEnter);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.assignmentEvents.off('onEnter', this._onEnter);\n  }\n\n  @action\n  _onEnter() {\n    if (this.args.status === 'not-started') return;\n    if (this.showButtonSubmit) return this.args.submitAnswer?.();\n    if (this.showButtonNext) return this.args.nextExercise?.();\n  }\n\n  @action\n  handleButtonDone() {\n    this.args.toggleKey?.(false);\n    this.args.toggleSuggestion?.(false);\n\n    if (this.args.collection?.isCarousel) {\n      return this.assignmentEvents.carouselDone(this.args.interactive);\n    } else {\n      this.args.toggleCollectionSummary?.(true);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"exercise-topbar\\\">\\n  {{#if @user}}\\n    <UserAvatarAndName @user={{@user}} />\\n  {{/if}}\\n\\n  {{#if @target}}\\n    <UiLink\\n      @params={{@target}}\\n      class=\\\"flex-shrink\\\"\\n      target={{if @openInNewTab \\\"_blank\\\"}}\\n      rel={{if @openInNewTab \\\"noopener noreferrer\\\"}}\\n    >\\n      {{t \\\"components.exerciseTopbar.goToExercise\\\"}}\\n      <DcIcon @name={{if @openInNewTab \\\"external\\\" \\\"tail-right\\\"}} class=\\\"nl1\\\" />\\n    </UiLink>\\n  {{/if}}\\n</div>\\n\", {\"contents\":\"<div class=\\\"exercise-topbar\\\">\\n  {{#if @user}}\\n    <UserAvatarAndName @user={{@user}} />\\n  {{/if}}\\n\\n  {{#if @target}}\\n    <UiLink\\n      @params={{@target}}\\n      class=\\\"flex-shrink\\\"\\n      target={{if @openInNewTab \\\"_blank\\\"}}\\n      rel={{if @openInNewTab \\\"noopener noreferrer\\\"}}\\n    >\\n      {{t \\\"components.exerciseTopbar.goToExercise\\\"}}\\n      <DcIcon @name={{if @openInNewTab \\\"external\\\" \\\"tail-right\\\"}} class=\\\"nl1\\\" />\\n    </UiLink>\\n  {{/if}}\\n</div>\\n\",\"moduleName\":\"babel/components/exercise-topbar/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-topbar/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{class\\n    \\\"execise-view-assignment-arrange-arrow-indicator\\\"\\n    (concat\\n      \\\"execise-view-assignment-arrange-arrow--presentation-\\\" this.presentation\\n    )\\n  }}\\n  ...attributes\\n  data-test-exercise-view-assignment-arrange-arrow-indicator\\n>\\n\\n  {{#if this.startLabel}}\\n    <div\\n      class=\\\"execise-view-assignment-arrange-arrow-indicator-label\\\"\\n      data-test-exercise-view-assignment-arrange-arrow-indicator-start-label\\n    >\\n      {{this.startLabel}}\\n    </div>\\n\\n  {{/if}}\\n\\n  <div class=\\\"execise-view-assignment-arrange-arrow-control\\\">\\n\\n    {{#if (or (eq this.direction \\\"end-to-start\\\") (eq this.direction \\\"both\\\"))}}\\n      <div\\n        class=\\\"execise-view-assignment-arrange-arrow-control-start {{unless this.startLabel \\\"execise-view-assignment-arrange-arrow-control-start--empty-label\\\"}}\\\"\\n        data-test-exercise-view-assignment-arrange-arrow-indicator-arrow-control-start\\n      ></div>\\n    {{/if}}\\n\\n    <div class=\\\"execise-view-assignment-arrange-arrow-control-line \\\"></div>\\n\\n    {{#if (or (eq this.direction \\\"start-to-end\\\") (eq this.direction \\\"both\\\"))}}\\n      <div\\n        class=\\\"execise-view-assignment-arrange-arrow-control-end {{unless this.endLabel \\\"execise-view-assignment-arrange-arrow-control-end--empty-label\\\"}}\\\"\\n        data-test-exercise-view-assignment-arrange-arrow-indicator-arrow-control-end\\n      ></div>\\n    {{/if}}\\n\\n  </div>\\n\\n  {{#if this.endLabel}}\\n    <div\\n      class=\\\"execise-view-assignment-arrange-arrow-indicator-label\\\"\\n      data-test-exercise-view-assignment-arrange-arrow-indicator-end-label\\n    >\\n      {{this.endLabel}}\\n    </div>\\n\\n  {{/if}}\\n\\n</div>\", {\"contents\":\"<div\\n  class={{class\\n    \\\"execise-view-assignment-arrange-arrow-indicator\\\"\\n    (concat\\n      \\\"execise-view-assignment-arrange-arrow--presentation-\\\" this.presentation\\n    )\\n  }}\\n  ...attributes\\n  data-test-exercise-view-assignment-arrange-arrow-indicator\\n>\\n\\n  {{#if this.startLabel}}\\n    <div\\n      class=\\\"execise-view-assignment-arrange-arrow-indicator-label\\\"\\n      data-test-exercise-view-assignment-arrange-arrow-indicator-start-label\\n    >\\n      {{this.startLabel}}\\n    </div>\\n\\n  {{/if}}\\n\\n  <div class=\\\"execise-view-assignment-arrange-arrow-control\\\">\\n\\n    {{#if (or (eq this.direction \\\"end-to-start\\\") (eq this.direction \\\"both\\\"))}}\\n      <div\\n        class=\\\"execise-view-assignment-arrange-arrow-control-start {{unless this.startLabel \\\"execise-view-assignment-arrange-arrow-control-start--empty-label\\\"}}\\\"\\n        data-test-exercise-view-assignment-arrange-arrow-indicator-arrow-control-start\\n      ></div>\\n    {{/if}}\\n\\n    <div class=\\\"execise-view-assignment-arrange-arrow-control-line \\\"></div>\\n\\n    {{#if (or (eq this.direction \\\"start-to-end\\\") (eq this.direction \\\"both\\\"))}}\\n      <div\\n        class=\\\"execise-view-assignment-arrange-arrow-control-end {{unless this.endLabel \\\"execise-view-assignment-arrange-arrow-control-end--empty-label\\\"}}\\\"\\n        data-test-exercise-view-assignment-arrange-arrow-indicator-arrow-control-end\\n      ></div>\\n    {{/if}}\\n\\n  </div>\\n\\n  {{#if this.endLabel}}\\n    <div\\n      class=\\\"execise-view-assignment-arrange-arrow-indicator-label\\\"\\n      data-test-exercise-view-assignment-arrange-arrow-indicator-end-label\\n    >\\n      {{this.endLabel}}\\n    </div>\\n\\n  {{/if}}\\n\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/arrange/arrow-indicator/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/arrange/arrow-indicator/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport Component from '@glimmer/component';\n\n/*\n\ninterface Signature {\n  Args: {\n    startLabel?: string;\n    endLabel?: string;\n    presentation: 'horizontal' | 'vertical';\n    direction: 'start-to-end' | 'end-to-start' | 'both';\n  };\n  Element: HTMLDivElement;\n}\n\n*/\n\nexport default class ExerciseViewAssignmentArrangeArrowIndicatorComponent extends Component {\n  get startLabel() {\n    const startLabel = this.args.startLabel;\n\n    assert(\n      `The @startLabel arg passed to <ExerciseView::Assignment::Arrange::ArrowIndicator> must be a string. Got ${typeof startLabel}`,\n      startLabel == null || typeof startLabel === 'string'\n    );\n\n    return startLabel;\n  }\n\n  get endLabel() {\n    const endLabel = this.args.endLabel;\n\n    assert(\n      `The @endLabel arg passed to <ExerciseView::Assignment::Arrange::ArrowIndicator> must be a string. Got ${typeof endLabel}`,\n      endLabel == null || typeof endLabel === 'string'\n    );\n\n    return endLabel;\n  }\n\n  get presentation() {\n    const presentation = this.args.presentation ?? 'horizontal';\n\n    assert(\n      \"The @presentation arg passed to <ExerciseView::Assignment::Arrange::ArrowIndicator> is not valid. Valid values are 'horizontal' and 'vertical'.\",\n      ['horizontal', 'vertical'].includes(presentation)\n    );\n\n    return presentation;\n  }\n\n  get direction() {\n    const direction = this.args.direction ?? 'both';\n\n    assert(\n      \"The @direction arg passed to <ExerciseView::Assignment::Arrange::ArrowIndicator> is not valid. Valid values are 'start-to-end', 'end-to-start' and 'both'.\",\n      ['start-to-end', 'end-to-start', 'both'].includes(direction)\n    );\n\n    return direction;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class={{this.wrapperClassNames}} {{did-insert this.setElement}}>\\n  <XDroppable\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <XDraggable\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @rotation={{1}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @hasHover={{true}}\\n        class={{this.dragItemClassNames}}\\n        @size=\\\"large\\\"\\n        @showValidation={{false}}\\n      >\\n\\n        <div class=\\\"arrange-horizontal-item-container justify-center\\\">\\n          {{#if @imageId}}\\n            <div class={{this.horizontalImageContainerClassNames}}>\\n              <ExerciseView::Assignment::Arrange::Image\\n                @imageId={{@imageId}}\\n                @isHorizontal={{true}}\\n                @assignmentId={{@assignmentId}}\\n                @isRoundedCorners={{this.isRoundedCorners}}\\n              />\\n            </div>\\n          {{/if}}\\n          {{#if this.hasText}}\\n            <div class=\\\"horizontal-text flex\\\">\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--key horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"key\\\" />\\n              </span>\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--success horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"quite-happy\\\" />\\n              </span>\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--error horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"t-warning\\\" />\\n              </span>\\n              <div class=\\\"flex-one white-space-no-wrap\\\">\\n                <TbRenderInline @value={{@item.value}} />\\n              </div>\\n            </div>\\n          {{else}}\\n            <span\\n              class=\\\"drag-item-state drag-item-state--key horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"key\\\" />\\n            </span>\\n\\n            <span\\n              class=\\\"drag-item-state drag-item-state--success horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"quite-happy\\\" />\\n            </span>\\n\\n            <span\\n              class=\\\"drag-item-state drag-item-state--error horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"t-warning\\\" />\\n            </span>\\n          {{/if}}\\n        </div>\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\", {\"contents\":\"<div class={{this.wrapperClassNames}} {{did-insert this.setElement}}>\\n  <XDroppable\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <XDraggable\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @rotation={{1}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @hasHover={{true}}\\n        class={{this.dragItemClassNames}}\\n        @size=\\\"large\\\"\\n        @showValidation={{false}}\\n      >\\n\\n        <div class=\\\"arrange-horizontal-item-container justify-center\\\">\\n          {{#if @imageId}}\\n            <div class={{this.horizontalImageContainerClassNames}}>\\n              <ExerciseView::Assignment::Arrange::Image\\n                @imageId={{@imageId}}\\n                @isHorizontal={{true}}\\n                @assignmentId={{@assignmentId}}\\n                @isRoundedCorners={{this.isRoundedCorners}}\\n              />\\n            </div>\\n          {{/if}}\\n          {{#if this.hasText}}\\n            <div class=\\\"horizontal-text flex\\\">\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--key horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"key\\\" />\\n              </span>\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--success horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"quite-happy\\\" />\\n              </span>\\n\\n              <span\\n                class=\\\"drag-item-state drag-item-state--error horizontal-arrange-validation nr1\\\"\\n              >\\n                <DcIcon @name=\\\"t-warning\\\" />\\n              </span>\\n              <div class=\\\"flex-one white-space-no-wrap\\\">\\n                <TbRenderInline @value={{@item.value}} />\\n              </div>\\n            </div>\\n          {{else}}\\n            <span\\n              class=\\\"drag-item-state drag-item-state--key horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"key\\\" />\\n            </span>\\n\\n            <span\\n              class=\\\"drag-item-state drag-item-state--success horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"quite-happy\\\" />\\n            </span>\\n\\n            <span\\n              class=\\\"drag-item-state drag-item-state--error horizontal-arrange-validation n1\\\"\\n            >\\n              <DcIcon @name=\\\"t-warning\\\" />\\n            </span>\\n          {{/if}}\\n        </div>\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/arrange/horizontal-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/arrange/horizontal-item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { isPresent } from '@ember/utils';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentArrangeItemComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * scope (string)\n   * alternatives (array)\n   * hasText (bool)\n   * image (object)\n   * showKey (bool)\n   * showValidation (bool)\n   * index (number)\n   * disabled (bool)\n   * incomplete (bool)\n   * onStart (function)\n   * onEnd (function)\n   * onDrop (function)\n   * item (object)\n   */\n\n  get suffix() {\n    const alternatives = this.args.alternatives;\n    const index = this.args.index;\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n    const item = this.args.item;\n\n    let suffix;\n\n    if (showKey) {\n      suffix = 'key';\n    } else if (showValidation) {\n      suffix =\n        alternatives?.mapBy('uuid').indexOf(item?.uuid) === index\n          ? 'success'\n          : 'error';\n    }\n\n    return suffix;\n  }\n\n  get hasText() {\n    return this.args.hasText && isPresent(this.args.item.value);\n  }\n\n  get wrapperClassNames() {\n    return [this.classNames, 'horizontal-item'].join(' ');\n  }\n\n  get dragItemClassNames() {\n    const classes = ['arrange-drag-item', 'p0'];\n\n    if (!this.args.item?.value) {\n      classes.push('no-box-shadow');\n    }\n\n    return classes.join(' ');\n  }\n\n  get horizontalImageContainerClassNames() {\n    const classes = [\n      'horizontal-image-container',\n      `target-width-${this.args.assignmentId}`,\n    ];\n\n    if (!this.args.item?.value) {\n      classes.push('only-image');\n    }\n\n    return classes.join(' ');\n  }\n\n  @action droppableAccepts(droppableData, draggableData) {\n    return (\n      draggableData?.scope && draggableData?.scope === droppableData?.scope\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"arrange-image {{if @isHorizontal 'horizontal-image' 'vertical-image'}}\\\"\\n>\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        \\\"\\n    >\\n      <div class=\\\"image-container\\\">\\n        <XImage\\n          @source={{this.imageSrc}}\\n          @width={{this.image.imageWidth}}\\n          @height={{this.image.imageHeight}}\\n          @color={{this.image.imageColor}}\\n          @mimetype={{this.image.imageMimetype}}\\n          @alt={{or this.image.name \\\"Image\\\"}}\\n        />\\n      </div>\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"arrange-image {{if @isHorizontal 'horizontal-image' 'vertical-image'}}\\\"\\n>\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        \\\"\\n    >\\n      <div class=\\\"image-container\\\">\\n        <XImage\\n          @source={{this.imageSrc}}\\n          @width={{this.image.imageWidth}}\\n          @height={{this.image.imageHeight}}\\n          @color={{this.image.imageColor}}\\n          @mimetype={{this.image.imageMimetype}}\\n          @alt={{or this.image.name \\\"Image\\\"}}\\n        />\\n      </div>\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/arrange/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/arrange/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewArrangeImage extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{class\\n    \\\"exercise-view-assignment-arrange\\\"\\n    (concat \\\"exercise-view-assignment-arrange--presentation-\\\" this.presentation)\\n    this.draggingClassName\\n  }}\\n  ...attributes\\n  {{did-insert this.setElement}}\\n>\\n\\n  {{#if @assignment.settings.arrows}}\\n\\n    <ExerciseView::Assignment::Arrange::ArrowIndicator\\n      class=\\\"flex-shrink\\\"\\n      @startLabel={{@assignment.settings.arrow_start_label}}\\n      @endLabel={{@assignment.settings.arrow_end_label}}\\n      @presentation={{this.presentation}}\\n      @direction={{@assignment.settings.arrow_direction}}\\n    />\\n\\n  {{/if}}\\n\\n  <div class=\\\"flex-one\\\">\\n\\n    {{#if (eq this.presentation \\\"vertical\\\")}}\\n\\n      {{#each this.items as |item index|}}\\n        <ExerciseView::Assignment::Arrange::Item\\n          @scope={{this.scope}}\\n          @alternatives={{this.alternatives}}\\n          @hasText={{this.hasText}}\\n          @image={{if (and this.hasImages item.image) item.image}}\\n          @showKey={{@showKey}}\\n          @showValidation={{@showValidation}}\\n          @index={{index}}\\n          @disabled={{@disabled}}\\n          @incomplete={{@incomplete}}\\n          @onStart={{this.handleDragStart}}\\n          @onEnd={{this.handleDragEnd}}\\n          @onDrop={{this.onDroppableDrop}}\\n          @item={{item}}\\n        />\\n      {{/each}}\\n\\n    {{else}}\\n      <div class={{this.horizontalWrapperClassNames}}>\\n        {{#each this.items as |item index|}}\\n          <ExerciseView::Assignment::Arrange::HorizontalItem\\n            @scope={{this.scope}}\\n            @alternatives={{this.alternatives}}\\n            @hasText={{this.hasText}}\\n            @imageId={{if (and this.hasImages item.image) item.image}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n            @index={{index}}\\n            @disabled={{@disabled}}\\n            @incomplete={{@incomplete}}\\n            @onStart={{this.handleDragStart}}\\n            @onEnd={{this.handleDragEnd}}\\n            @onDrop={{this.onDroppableDrop}}\\n            @item={{item}}\\n            @assignmentId={{@assignment.uuid}}\\n          />\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class={{class\\n    \\\"exercise-view-assignment-arrange\\\"\\n    (concat \\\"exercise-view-assignment-arrange--presentation-\\\" this.presentation)\\n    this.draggingClassName\\n  }}\\n  ...attributes\\n  {{did-insert this.setElement}}\\n>\\n\\n  {{#if @assignment.settings.arrows}}\\n\\n    <ExerciseView::Assignment::Arrange::ArrowIndicator\\n      class=\\\"flex-shrink\\\"\\n      @startLabel={{@assignment.settings.arrow_start_label}}\\n      @endLabel={{@assignment.settings.arrow_end_label}}\\n      @presentation={{this.presentation}}\\n      @direction={{@assignment.settings.arrow_direction}}\\n    />\\n\\n  {{/if}}\\n\\n  <div class=\\\"flex-one\\\">\\n\\n    {{#if (eq this.presentation \\\"vertical\\\")}}\\n\\n      {{#each this.items as |item index|}}\\n        <ExerciseView::Assignment::Arrange::Item\\n          @scope={{this.scope}}\\n          @alternatives={{this.alternatives}}\\n          @hasText={{this.hasText}}\\n          @image={{if (and this.hasImages item.image) item.image}}\\n          @showKey={{@showKey}}\\n          @showValidation={{@showValidation}}\\n          @index={{index}}\\n          @disabled={{@disabled}}\\n          @incomplete={{@incomplete}}\\n          @onStart={{this.handleDragStart}}\\n          @onEnd={{this.handleDragEnd}}\\n          @onDrop={{this.onDroppableDrop}}\\n          @item={{item}}\\n        />\\n      {{/each}}\\n\\n    {{else}}\\n      <div class={{this.horizontalWrapperClassNames}}>\\n        {{#each this.items as |item index|}}\\n          <ExerciseView::Assignment::Arrange::HorizontalItem\\n            @scope={{this.scope}}\\n            @alternatives={{this.alternatives}}\\n            @hasText={{this.hasText}}\\n            @imageId={{if (and this.hasImages item.image) item.image}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n            @index={{index}}\\n            @disabled={{@disabled}}\\n            @incomplete={{@incomplete}}\\n            @onStart={{this.handleDragStart}}\\n            @onEnd={{this.handleDragEnd}}\\n            @onDrop={{this.onDroppableDrop}}\\n            @item={{item}}\\n            @assignmentId={{@assignment.uuid}}\\n          />\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/arrange/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/arrange/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached } from '@glimmer/tracking';\nimport DragAssignmentComponent from 'babel/components/exercise-view/common/drag-assignment/index';\nimport generateId from 'compton/utils/generate-id';\n\nexport default class ExerciseViewAssignmentArrangeComponent extends DragAssignmentComponent {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get hasImages() {\n    return this.args.assignment?.settings?.image;\n  }\n\n  get hasText() {\n    return this.args.assignment?.settings?.text ?? true;\n  }\n\n  get alternatives() {\n    return this.args.assignment?.content?.alternatives;\n  }\n\n  get presentation() {\n    if (this.args.assignment?.settings?.presentation) {\n      return this.args.assignment.settings.presentation;\n    }\n    return 'vertical';\n  }\n\n  get allowMultipleRows() {\n    return this.args.assignment.settings.allow_multi_line ? true : false;\n  }\n\n  get horizontalWrapperClassNames() {\n    const classes = ['flex'];\n\n    if (this.allowMultipleRows) {\n      classes.push('flex-wrap');\n    }\n\n    return classes.join(' ');\n  }\n\n  @cached get items() {\n    const showKey = this.args.showKey;\n    const input = this.input;\n    const alternatives = this.alternatives;\n\n    alternatives.forEach((alternative) => {\n      // Remove null values from alternatives and input.\n      // Null values leads to the answer being treated\n      // as \"incomplete\". See DINO-640.\n\n      if (alternative.value === null) {\n        delete alternative.value;\n      }\n\n      const inputRow = input?.findBy('uuid', alternative.uuid);\n\n      if (inputRow?.value === null) {\n        delete inputRow.value;\n      }\n    });\n\n    return showKey || !input ? alternatives : input;\n  }\n\n  get scope() {\n    return generateId('arrange-scope');\n  }\n\n  @action onDroppableDrop(draggableData, droppableData) {\n    const input = this.input;\n    const obj = input?.objectAt(draggableData.index);\n\n    input.removeAt(draggableData.index);\n    input.insertAt(droppableData.index, obj);\n\n    this.args.assignmentAnswer.input = input;\n    this.args.handleOnChange?.(input);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"nb1 {{this.classNames}}\\\" {{did-insert this.setElement}}>\\n  <XDroppable\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <XDraggable\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @rotation={{1}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @hasHover={{true}}\\n        class=\\\"arrange-drag-item\\\"\\n        @size=\\\"none\\\"\\n        @showValidation={{true}}\\n      >\\n        {{#if @image}}\\n          <ExerciseView::Assignment::Arrange::Image\\n            @classNames=\\\"mr1\\\"\\n            @imageId={{@image}}\\n            @width=\\\"110\\\"\\n            @height=\\\"110\\\"\\n          />\\n        {{/if}}\\n\\n        {{#if @hasText}}\\n          <div\\n            class=\\\"flex-one\\n              {{if @image 'nl1' 'nt1 nb1 mr1'}}\\n              {{this.textMarginLeft}}\\\"\\n          >\\n            <TbRenderInline @value={{@item.value}} />\\n          </div>\\n        {{/if}}\\n\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\", {\"contents\":\"<div class=\\\"nb1 {{this.classNames}}\\\" {{did-insert this.setElement}}>\\n  <XDroppable\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <XDraggable\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @rotation={{1}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @hasHover={{true}}\\n        class=\\\"arrange-drag-item\\\"\\n        @size=\\\"none\\\"\\n        @showValidation={{true}}\\n      >\\n        {{#if @image}}\\n          <ExerciseView::Assignment::Arrange::Image\\n            @classNames=\\\"mr1\\\"\\n            @imageId={{@image}}\\n            @width=\\\"110\\\"\\n            @height=\\\"110\\\"\\n          />\\n        {{/if}}\\n\\n        {{#if @hasText}}\\n          <div\\n            class=\\\"flex-one\\n              {{if @image 'nl1' 'nt1 nb1 mr1'}}\\n              {{this.textMarginLeft}}\\\"\\n          >\\n            <TbRenderInline @value={{@item.value}} />\\n          </div>\\n        {{/if}}\\n\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/arrange/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/arrange/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentArrangeItemComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * scope (string)\n   * alternatives (array)\n   * hasText (bool)\n   * image (object)\n   * showKey (bool)\n   * showValidation (bool)\n   * index (number)\n   * disabled (bool)\n   * incomplete (bool)\n   * onStart (function)\n   * onEnd (function)\n   * onDrop (function)\n   * item (object)\n   */\n\n  get suffix() {\n    const alternatives = this.args.alternatives;\n    const index = this.args.index;\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n    const item = this.args.item;\n\n    let suffix;\n\n    if (showKey) {\n      suffix = 'key';\n    } else if (showValidation) {\n      suffix =\n        alternatives?.mapBy('uuid').indexOf(item?.uuid) === index\n          ? 'success'\n          : 'error';\n    }\n\n    return suffix;\n  }\n\n  get textMarginLeft() {\n    if (this.args.image) return null;\n\n    if (this.args.showKey || this.args.showValidation) return 'nl1';\n\n    return 'ml1';\n  }\n\n  @action droppableAccepts(droppableData, draggableData) {\n    return (\n      draggableData?.scope && draggableData?.scope === droppableData?.scope\n    );\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentCheckComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  @service assignmentEvents;\n\n  get showIncompleteMessage() {\n    return this.args.incomplete && this.args.assignmentAnswer.input !== true;\n  }\n\n  @action handleChange(val) {\n    if (this.args.assignmentAnswer) {\n      this.args.assignmentAnswer.input = val;\n    }\n\n    return this.args.handleOnChange?.(val);\n  }\n\n  @action handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"check-assignment\\\" data-test-check-assignment ...attributes>\\n  <XCheckbox\\n    @labelPlacement=\\\"left\\\"\\n    @checked={{@assignmentAnswer.input}}\\n    @onChange={{this.handleChange}}\\n    @disabled={{@disabled}}\\n    class=\\\"check-assignment-checkbox\\\"\\n    data-test-check-assignment-checkbox\\n  >\\n    {{@assignment.value}}\\n  </XCheckbox>\\n\\n  {{#if this.showIncompleteMessage}}\\n    <div\\n      class=\\\"incomplete-message\\\"\\n      data-test-check-assignment-incomplete-message\\n    >\\n      {{t \\\"components.exerciseView.assignment.check.incompleteMessage\\\"}}\\n    </div>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/exercise-view/assignment/check/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"grid horizon-loop-container\\\">\\n  {{#each this.alternatives as |alternative|}}\\n    <div class={{alternative.cssClass}} data-test-choice-horizontal-grid-item>\\n      <ExerciseView::Assignment::Choice::Horizontal::item\\n        @exerciseType={{@exerciseType}}\\n        @alternative={{alternative}}\\n        @onChange={{@onChange}}\\n        @showKey={{@showKey}}\\n        @disabled={{@disabled}}\\n        @showValidationAndOption={{@showValidationAndOption}}\\n        @assignmentAnswer={{@assignmentAnswer}}\\n        @groupValue={{@groupValue}}\\n        @isMultiple={{@isMultiple}}\\n        @onEnter={{@onEnter}}\\n        @name={{@name}}\\n        @assignmentId={{@assignmentId}}\\n        @settings={{@settings}}\\n      />\\n    </div>\\n  {{/each}}\\n</div>\", {\"contents\":\"<div class=\\\"grid horizon-loop-container\\\">\\n  {{#each this.alternatives as |alternative|}}\\n    <div class={{alternative.cssClass}} data-test-choice-horizontal-grid-item>\\n      <ExerciseView::Assignment::Choice::Horizontal::item\\n        @exerciseType={{@exerciseType}}\\n        @alternative={{alternative}}\\n        @onChange={{@onChange}}\\n        @showKey={{@showKey}}\\n        @disabled={{@disabled}}\\n        @showValidationAndOption={{@showValidationAndOption}}\\n        @assignmentAnswer={{@assignmentAnswer}}\\n        @groupValue={{@groupValue}}\\n        @isMultiple={{@isMultiple}}\\n        @onEnter={{@onEnter}}\\n        @name={{@name}}\\n        @assignmentId={{@assignmentId}}\\n        @settings={{@settings}}\\n      />\\n    </div>\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/choice/horizontal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/choice/horizontal/index.hbs\"}});\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentCommonHorizontalComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * alternatives (array)\n   */\n\n  get alternatives() {\n    const len = this.args.alternatives?.length ?? 0;\n\n    return (this.args.alternatives || []).map((item) => {\n      if (len < 2) item.cssClass = 'col-12';\n      else if (len === 2 || len === 4) item.cssClass = 'col-6';\n      else item.cssClass = 'col-4';\n      return item;\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label for={{@alternative.value}} class=\\\"cursor-pointer\\\">\\n  <div\\n    class=\\\"choice-horizontal-item-container flex flex-column\\n      {{this.classNames}}\\\"\\n  >\\n    {{#if @alternative.image}}\\n      <div class=\\\"horizontal-img-container target-width-{{@assignmentId}}\\\">\\n\\n        <ExerciseView::Assignment::Choice::Image\\n          @imageId={{@alternative.image}}\\n          @isHorizontal={{true}}\\n          @assignmentId={{@assignmentId}}\\n        />\\n\\n      </div>\\n    {{/if}}\\n\\n    <div class=\\\"horizontal-radio-button\\\">\\n      <div class=\\\"horizontal-radio-button-container\\\">\\n        {{#if\\n          (and\\n            (not (eq @exerciseType \\\"assignments\\\"))\\n            (not (eq @exerciseType \\\"studies\\\"))\\n          )\\n        }}\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--error\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-warning nc-icon-16\\\" @name=\\\"t-warning\\\" />\\n          </div>\\n\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--success\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-happy nc-icon-16\\\" @name=\\\"quite-happy\\\" />\\n          </div>\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--key\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-key nc-icon-16\\\" @name=\\\"key\\\" />\\n          </div>\\n        {{/if}}\\n        {{#if @isMultiple}}\\n\\n          <XCheckbox\\n            @disabled={{@disabled}}\\n            @name={{@name}}\\n            @controlId={{@alternative.value}}\\n            @onChange={{fn this.onChangeCheckbox @alternative.value}}\\n            @value={{@alternative.correct}}\\n            @checked={{this.checked}}\\n            @twoWay={{false}}\\n            onKeyDown={{this.onEnter}}\\n          />\\n\\n        {{else}}\\n          <UiRadioButton\\n            @disabled={{@disabled}}\\n            @name={{@name}}\\n            @controlId={{@alternative.value}}\\n            @onChange={{fn this.onChangeRadioButton @alternative.value}}\\n            @value={{@alternative.correct}}\\n            @checked={{this.checked}}\\n            @twoWay={{false}}\\n            onKeyDown={{this.onEnter}}\\n          />\\n\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"horizontal-text\\\">\\n      {{#if @settings.text}}\\n        <TbRenderInline @value={{@alternative.label}} />\\n      {{/if}}\\n    </div>\\n  </div>\\n</label>\", {\"contents\":\"<label for={{@alternative.value}} class=\\\"cursor-pointer\\\">\\n  <div\\n    class=\\\"choice-horizontal-item-container flex flex-column\\n      {{this.classNames}}\\\"\\n  >\\n    {{#if @alternative.image}}\\n      <div class=\\\"horizontal-img-container target-width-{{@assignmentId}}\\\">\\n\\n        <ExerciseView::Assignment::Choice::Image\\n          @imageId={{@alternative.image}}\\n          @isHorizontal={{true}}\\n          @assignmentId={{@assignmentId}}\\n        />\\n\\n      </div>\\n    {{/if}}\\n\\n    <div class=\\\"horizontal-radio-button\\\">\\n      <div class=\\\"horizontal-radio-button-container\\\">\\n        {{#if\\n          (and\\n            (not (eq @exerciseType \\\"assignments\\\"))\\n            (not (eq @exerciseType \\\"studies\\\"))\\n          )\\n        }}\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--error\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-warning nc-icon-16\\\" @name=\\\"t-warning\\\" />\\n          </div>\\n\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--success\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-happy nc-icon-16\\\" @name=\\\"quite-happy\\\" />\\n          </div>\\n          <div\\n            class=\\\"horizontal-choice-validation horizontal-choice-validation--key\\\"\\n          >\\n            <DcIcon class=\\\"horizontal-key nc-icon-16\\\" @name=\\\"key\\\" />\\n          </div>\\n        {{/if}}\\n        {{#if @isMultiple}}\\n\\n          <XCheckbox\\n            @disabled={{@disabled}}\\n            @name={{@name}}\\n            @controlId={{@alternative.value}}\\n            @onChange={{fn this.onChangeCheckbox @alternative.value}}\\n            @value={{@alternative.correct}}\\n            @checked={{this.checked}}\\n            @twoWay={{false}}\\n            onKeyDown={{this.onEnter}}\\n          />\\n\\n        {{else}}\\n          <UiRadioButton\\n            @disabled={{@disabled}}\\n            @name={{@name}}\\n            @controlId={{@alternative.value}}\\n            @onChange={{fn this.onChangeRadioButton @alternative.value}}\\n            @value={{@alternative.correct}}\\n            @checked={{this.checked}}\\n            @twoWay={{false}}\\n            onKeyDown={{this.onEnter}}\\n          />\\n\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div class=\\\"horizontal-text\\\">\\n      {{#if @settings.text}}\\n        <TbRenderInline @value={{@alternative.label}} />\\n      {{/if}}\\n    </div>\\n  </div>\\n</label>\",\"moduleName\":\"babel/components/exercise-view/assignment/choice/horizontal/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/choice/horizontal/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentCommonHorizontalItemComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * alternative (object)\n   */\n\n  get checked() {\n    if (this.args.groupValue) {\n      if (this.args.isMultiple) {\n        return this.args.groupValue.includes(this.args.alternative.value);\n      } else {\n        return this.args.alternative.value === this.args.groupValue;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  get suffix() {\n    const alternative = this.args.alternative;\n    const showKey = this.args.showKey;\n    const showValidationAndOption = this.args.showValidationAndOption;\n    const input = this.args.assignmentAnswer;\n\n    if (showKey) {\n      return alternative?.correct ? 'key-correct' : 'key-incorrect';\n    }\n\n    if (showValidationAndOption && input?.includes(alternative.value)) {\n      return input.includes(alternative.value) === alternative.correct\n        ? 'success'\n        : 'error';\n    }\n\n    return null;\n  }\n\n  @action onChangeCheckbox(value) {\n    const groupValue = this.args.groupValue;\n    if (groupValue.includes(value)) {\n      const index = groupValue.indexOf(value);\n      groupValue.splice(index, 1);\n    } else {\n      groupValue.push(value);\n    }\n    this.args.onChange(groupValue);\n  }\n\n  @action onChangeRadioButton(value) {\n    this.args.onChange(value);\n  }\n\n  @action onEnter(evt) {\n    if (evt.key === 'Enter') {\n      this.args.onEnter();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"choice-image {{if @isHorizontal 'horizontal-image' 'vertical-image'}}\\\"\\n>\\n  {{#if this.imageSrc}}\\n\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"choice-image {{if @isHorizontal 'horizontal-image' 'vertical-image'}}\\\"\\n>\\n  {{#if this.imageSrc}}\\n\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/choice/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/choice/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewChoiceImage extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"choice-assignment{{if\\n      this.showValidationAndOption\\n      ' choice--show-validation'\\n    }}\\n    {{if @assignment.settings.image 'choice-images' 'choice-text'}}\\n    {{unless @assignment.settings.text 'choice-empty-label'}}\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n  {{#if this.isMultiple}}\\n    {{#if (is-array this.groupValue)}}\\n      {{#if (eq this.presentation \\\"horizontal\\\")}}\\n        <ExerciseView::Assignment::Choice::Horizontal\\n          @exerciseType={{@exerciseType}}\\n          @disabled={{@disabled}}\\n          @groupValue={{this.groupValue}}\\n          @alternatives={{this.alternatives}}\\n          @onChange={{this.onChange}}\\n          @showKey={{@showKey}}\\n          @showValidationAndOption={{this.showValidationAndOption}}\\n          @assignmentAnswer={{this.input}}\\n          @isMultiple={{true}}\\n          @onEnter={{this.handleEnter}}\\n          @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n          @assignmentId={{@assignment.uuid}}\\n          @settings={{@assignment.settings}}\\n        />\\n      {{else}}\\n        <XCheckboxGroup\\n          @groupValue={{this.groupValue}}\\n          @options={{this.alternatives}}\\n          @disabled={{@disabled}}\\n          @onChange={{this.onChange}}\\n          @onEnter={{this.handleEnter}}\\n          @twoWay={{false}}\\n          @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n          as |alternative|\\n        >\\n          <ExerciseView::Assignment::Choice::Label\\n            @exerciseType={{@exerciseType}}\\n            @alternative={{alternative}}\\n            @assignmentAnswer={{this.input}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @showValidationAndOption={{this.showValidationAndOption}}\\n            @incomplete={{@incomplete}}\\n          />\\n        </XCheckboxGroup>\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if this.showIncompleteMessage}}\\n      <div class=\\\"incomplete-message\\\">\\n        {{t\\n          \\\"components.exerciseView.assignment.choice.incompleteMessageMultiple\\\"\\n        }}\\n      </div>\\n    {{/if}}\\n  {{else}}\\n    {{#if (eq this.presentation \\\"horizontal\\\")}}\\n      <ExerciseView::Assignment::Choice::Horizontal\\n        @exerciseType={{@exerciseType}}\\n        @groupValue={{this.groupValue}}\\n        @alternatives={{this.alternatives}}\\n        @onChange={{this.onChange}}\\n        @showKey={{@showKey}}\\n        @disabled={{@disabled}}\\n        @showValidationAndOption={{this.showValidationAndOption}}\\n        @assignmentAnswer={{this.input}}\\n        @onEnter={{this.handleEnter}}\\n        @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n        @assignmentId={{@assignment.uuid}}\\n        @settings={{@assignment.settings}}\\n      />\\n    {{else}}\\n      <UiRadioButtonGroup\\n        @groupValue={{this.groupValue}}\\n        @options={{this.alternatives}}\\n        @disabled={{@disabled}}\\n        @onChange={{this.onChange}}\\n        @onEnter={{this.handleEnter}}\\n        @twoWay={{false}}\\n        @direction={{this.presentation}}\\n        @elementId={{concat \\\"assignment-\\\" @assignment.uuid}}\\n        data-test-choice-assignment-radio-button-group\\n        as |alternative|\\n      >\\n        <ExerciseView::Assignment::Choice::Label\\n          @exerciseType={{@exerciseType}}\\n          @alternative={{alternative}}\\n          @assignmentAnswer={{this.input}}\\n          @assignment={{@assignment}}\\n          @showKey={{@showKey}}\\n          @showValidationAndOption={{this.showValidationAndOption}}\\n          @incomplete={{@incomplete}}\\n          @presentation={{this.presentation}}\\n        />\\n      </UiRadioButtonGroup>\\n    {{/if}}\\n\\n    {{#if this.showIncompleteMessage}}\\n      <div class=\\\"incomplete-message\\\">\\n        {{t \\\"components.exerciseView.assignment.choice.incompleteMessage\\\"}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n  {{#if (and (not @showSuggestion) this.showHint)}}\\n    <ExerciseView::Common::Hint class=\\\"mt1 text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.choice.hint\\\" htmlSafe=true}}\\n    </ExerciseView::Common::Hint>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"choice-assignment{{if\\n      this.showValidationAndOption\\n      ' choice--show-validation'\\n    }}\\n    {{if @assignment.settings.image 'choice-images' 'choice-text'}}\\n    {{unless @assignment.settings.text 'choice-empty-label'}}\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n  {{#if this.isMultiple}}\\n    {{#if (is-array this.groupValue)}}\\n      {{#if (eq this.presentation \\\"horizontal\\\")}}\\n        <ExerciseView::Assignment::Choice::Horizontal\\n          @exerciseType={{@exerciseType}}\\n          @disabled={{@disabled}}\\n          @groupValue={{this.groupValue}}\\n          @alternatives={{this.alternatives}}\\n          @onChange={{this.onChange}}\\n          @showKey={{@showKey}}\\n          @showValidationAndOption={{this.showValidationAndOption}}\\n          @assignmentAnswer={{this.input}}\\n          @isMultiple={{true}}\\n          @onEnter={{this.handleEnter}}\\n          @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n          @assignmentId={{@assignment.uuid}}\\n          @settings={{@assignment.settings}}\\n        />\\n      {{else}}\\n        <XCheckboxGroup\\n          @groupValue={{this.groupValue}}\\n          @options={{this.alternatives}}\\n          @disabled={{@disabled}}\\n          @onChange={{this.onChange}}\\n          @onEnter={{this.handleEnter}}\\n          @twoWay={{false}}\\n          @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n          as |alternative|\\n        >\\n          <ExerciseView::Assignment::Choice::Label\\n            @exerciseType={{@exerciseType}}\\n            @alternative={{alternative}}\\n            @assignmentAnswer={{this.input}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @showValidationAndOption={{this.showValidationAndOption}}\\n            @incomplete={{@incomplete}}\\n          />\\n        </XCheckboxGroup>\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if this.showIncompleteMessage}}\\n      <div class=\\\"incomplete-message\\\">\\n        {{t\\n          \\\"components.exerciseView.assignment.choice.incompleteMessageMultiple\\\"\\n        }}\\n      </div>\\n    {{/if}}\\n  {{else}}\\n    {{#if (eq this.presentation \\\"horizontal\\\")}}\\n      <ExerciseView::Assignment::Choice::Horizontal\\n        @exerciseType={{@exerciseType}}\\n        @groupValue={{this.groupValue}}\\n        @alternatives={{this.alternatives}}\\n        @onChange={{this.onChange}}\\n        @showKey={{@showKey}}\\n        @disabled={{@disabled}}\\n        @showValidationAndOption={{this.showValidationAndOption}}\\n        @assignmentAnswer={{this.input}}\\n        @onEnter={{this.handleEnter}}\\n        @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n        @assignmentId={{@assignment.uuid}}\\n        @settings={{@assignment.settings}}\\n      />\\n    {{else}}\\n      <UiRadioButtonGroup\\n        @groupValue={{this.groupValue}}\\n        @options={{this.alternatives}}\\n        @disabled={{@disabled}}\\n        @onChange={{this.onChange}}\\n        @onEnter={{this.handleEnter}}\\n        @twoWay={{false}}\\n        @direction={{this.presentation}}\\n        @elementId={{concat \\\"assignment-\\\" @assignment.uuid}}\\n        data-test-choice-assignment-radio-button-group\\n        as |alternative|\\n      >\\n        <ExerciseView::Assignment::Choice::Label\\n          @exerciseType={{@exerciseType}}\\n          @alternative={{alternative}}\\n          @assignmentAnswer={{this.input}}\\n          @assignment={{@assignment}}\\n          @showKey={{@showKey}}\\n          @showValidationAndOption={{this.showValidationAndOption}}\\n          @incomplete={{@incomplete}}\\n          @presentation={{this.presentation}}\\n        />\\n      </UiRadioButtonGroup>\\n    {{/if}}\\n\\n    {{#if this.showIncompleteMessage}}\\n      <div class=\\\"incomplete-message\\\">\\n        {{t \\\"components.exerciseView.assignment.choice.incompleteMessage\\\"}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n  {{#if (and (not @showSuggestion) this.showHint)}}\\n    <ExerciseView::Common::Hint class=\\\"mt1 text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.choice.hint\\\" htmlSafe=true}}\\n    </ExerciseView::Common::Hint>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/choice/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/choice/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport shuffle from 'compton/utils/array-shuffle';\n\nexport default class ExerciseViewAssignmentChoiceComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   * preview (bool)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    if (this.args.assignment && !this.args.assignment.meta) {\n      this.args.assignment.meta = {};\n    }\n\n    if (this.args.assignment?.settings?.random) {\n      if (this.args.assignment?.content?.alternatives) {\n        shuffle(this.args.assignment.content.alternatives);\n      }\n    }\n\n    this._setAnswer();\n  }\n\n  @service assignmentEvents;\n\n  @service store;\n\n  @tracked input;\n\n  @tracked groupValue;\n\n  get presentation() {\n    if (this.args.assignment?.settings?.presentation) {\n      return this.args.assignment.settings.presentation;\n    }\n    return 'vertical';\n  }\n\n  get isMultiple() {\n    return this.args.assignment?.settings?.multiple;\n  }\n\n  get hasImages() {\n    return this.args.assignment?.settings?.image;\n  }\n\n  get showValidationAndOption() {\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n\n    return !showKey && showValidation;\n  }\n\n  @cached\n  get alternatives() {\n    const hasImages = this.hasImages;\n\n    return this.args.assignment?.content?.alternatives?.map((alternative) => {\n      const image = hasImages ? alternative.image : null;\n      const correct = alternative.correct;\n      const label = alternative.value;\n      const value = alternative.uuid;\n\n      return { correct, label, value, image };\n    });\n  }\n\n  get showIncompleteMessage() {\n    return this.args.incomplete && isEmpty(this.groupValue);\n  }\n\n  @cached\n  get showHint() {\n    const input = this.input;\n\n    // Never show hint if answer is correct or showing keys, and only on show validation\n    if (\n      !input ||\n      input.length === 0 ||\n      this.args.assignmentAnswer?.correct ||\n      this.args.showKey ||\n      !this.args.showValidation ||\n      this.args.disabled\n    ) {\n      return false;\n    }\n\n    const falseAlternatives = this.args.assignment?.content?.alternatives\n      ?.filterBy('correct', false)\n      .mapBy('uuid');\n\n    // Answer is not correct and we should not show keys, but show validation\n    // Don't show hint if there are any incorrect alternatives.\n    return !input.any((i) => falseAlternatives.includes(i));\n  }\n\n  @action\n  onChange(value) {\n    if (this.args.assignmentAnswer) {\n      this.input = this.isMultiple ? value : [value];\n      this.args.assignmentAnswer.input = this.input;\n    }\n\n    this._setGroupValue();\n    this.args.handleOnChange?.(value);\n  }\n\n  @action\n  handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n\n  @action\n  answerUpdated() {\n    this._setAnswer();\n  }\n\n  _setAnswer() {\n    this.input = this.args.assignmentAnswer?.input;\n    this._setGroupValue();\n  }\n\n  _setGroupValue() {\n    if (this.args.preview) {\n      this.groupValue = [];\n      return;\n    }\n\n    this.groupValue =\n      this.isMultiple || !this.input ? this.input : this.input.firstObject;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"choice-label {{this.classNames}}\\\">\\n\\n  {{#if\\n    (and\\n      (not (eq @exerciseType \\\"assignments\\\")) (not (eq @exerciseType \\\"studies\\\"))\\n    )\\n  }}\\n    <div class=\\\"choice-validation choice-validation--error\\\">\\n      <DcIcon @name=\\\"t-warning\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--success\\\">\\n      <DcIcon @name=\\\"quite-happy\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--key-incorrect\\\">\\n      <DcIcon @name=\\\"key\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--key-correct\\\">\\n      <DcIcon @name=\\\"key\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n  {{/if}}\\n\\n  {{#if @alternative.image}}\\n    <ExerciseView::Assignment::Choice::Image\\n      @imageId={{@alternative.image}}\\n      @width=\\\"124\\\"\\n      @height=\\\"110\\\"\\n    />\\n  {{/if}}\\n\\n  {{#if this.hasText}}\\n    <div class=\\\"flex-one\\\">\\n      <TbRenderInline @value={{@alternative.label}} />\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"choice-label {{this.classNames}}\\\">\\n\\n  {{#if\\n    (and\\n      (not (eq @exerciseType \\\"assignments\\\")) (not (eq @exerciseType \\\"studies\\\"))\\n    )\\n  }}\\n    <div class=\\\"choice-validation choice-validation--error\\\">\\n      <DcIcon @name=\\\"t-warning\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--success\\\">\\n      <DcIcon @name=\\\"quite-happy\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--key-incorrect\\\">\\n      <DcIcon @name=\\\"key\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n\\n    <div class=\\\"choice-validation choice-validation--key-correct\\\">\\n      <DcIcon @name=\\\"key\\\" class=\\\"nc-icon-16\\\" />\\n    </div>\\n  {{/if}}\\n\\n  {{#if @alternative.image}}\\n    <ExerciseView::Assignment::Choice::Image\\n      @imageId={{@alternative.image}}\\n      @width=\\\"124\\\"\\n      @height=\\\"110\\\"\\n    />\\n  {{/if}}\\n\\n  {{#if this.hasText}}\\n    <div class=\\\"flex-one\\\">\\n      <TbRenderInline @value={{@alternative.label}} />\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/choice/label/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/choice/label/index.hbs\"}});\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentChoiceLabelComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * alternative (object)\n   * assignment (object)\n   * assignmentAnswer (object)\n   * showKey (bool)\n   * showValidationAndOption (bool)\n   * incomplete (bool)\n   * presentation (string)\n   */\n\n  get suffix() {\n    const alternative = this.args.alternative;\n    const showKey = this.args.showKey;\n    const showValidationAndOption = this.args.showValidationAndOption;\n    const input = this.args.assignmentAnswer;\n\n    if (showKey) {\n      return alternative?.correct ? 'key-correct' : 'key-incorrect';\n    }\n\n    if (showValidationAndOption && input?.includes(alternative.value)) {\n      return input.includes(alternative.value) === alternative.correct\n        ? 'success'\n        : 'error';\n    }\n\n    return null;\n  }\n\n  get hasText() {\n    return this.args.assignment?.settings?.text ?? true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"exercise-view-editable-matrix\\\" ...attributes>\\n  <XTable\\n    @appearance={{this.tableAppearance}}\\n    class={{class this.tableClass}}\\n    as |table|\\n  >\\n    {{#each this.tableData as |dataRow index|}}\\n      <table.row class=\\\"matrix-tr\\\" as |row|>\\n        {{#each dataRow.columns as |cell|}}\\n          {{#if cell.object_id}}\\n            <row.cell\\n              class=\\\"matrix-td matrix-editable-td\\\"\\n              @tagName={{if cell.isHeading \\\"th\\\" \\\"td\\\"}}\\n              @valign={{this.valign}}\\n              @halign={{this.halign}}\\n            >\\n              <ExerciseView::Assignment::EditableMatrix::Textarea\\n                @onChange={{this.onChange}}\\n                @id={{cell.object_id}}\\n                @input={{this.input}}\\n                @align={{this.halign}}\\n                @objectId={{cell.object_id}}\\n                @answers={{this.answers}}\\n                @showKey={{@showKey}}\\n                @placeholder={{cell.placeholder}}\\n                @clue={{cell.clue}}\\n                @disabled={{@disabled}}\\n              />\\n            </row.cell>\\n          {{else}}\\n            <row.cell\\n              class=\\\"matrix-td\\\"\\n              @tagName={{if cell.isHeading \\\"th\\\" \\\"td\\\"}}\\n              @valign={{this.valign}}\\n              @halign={{this.halign}}\\n            >\\n              <TbRenderInline @value={{cell.value}} />\\n            </row.cell>\\n          {{/if}}\\n        {{/each}}\\n      </table.row>\\n    {{/each}}\\n  </XTable>\\n  {{#if this.showIncompleteMessage}}\\n    <div\\n      class=\\\"text-small text-base text-color-error\\\"\\n      data-test-editable-matrix-incomplete-message\\n    >\\n      {{t\\n        \\\"components.exerciseView.assignment.editableMatrix.incompleteMessage\\\"\\n      }}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"exercise-view-editable-matrix\\\" ...attributes>\\n  <XTable\\n    @appearance={{this.tableAppearance}}\\n    class={{class this.tableClass}}\\n    as |table|\\n  >\\n    {{#each this.tableData as |dataRow index|}}\\n      <table.row class=\\\"matrix-tr\\\" as |row|>\\n        {{#each dataRow.columns as |cell|}}\\n          {{#if cell.object_id}}\\n            <row.cell\\n              class=\\\"matrix-td matrix-editable-td\\\"\\n              @tagName={{if cell.isHeading \\\"th\\\" \\\"td\\\"}}\\n              @valign={{this.valign}}\\n              @halign={{this.halign}}\\n            >\\n              <ExerciseView::Assignment::EditableMatrix::Textarea\\n                @onChange={{this.onChange}}\\n                @id={{cell.object_id}}\\n                @input={{this.input}}\\n                @align={{this.halign}}\\n                @objectId={{cell.object_id}}\\n                @answers={{this.answers}}\\n                @showKey={{@showKey}}\\n                @placeholder={{cell.placeholder}}\\n                @clue={{cell.clue}}\\n                @disabled={{@disabled}}\\n              />\\n            </row.cell>\\n          {{else}}\\n            <row.cell\\n              class=\\\"matrix-td\\\"\\n              @tagName={{if cell.isHeading \\\"th\\\" \\\"td\\\"}}\\n              @valign={{this.valign}}\\n              @halign={{this.halign}}\\n            >\\n              <TbRenderInline @value={{cell.value}} />\\n            </row.cell>\\n          {{/if}}\\n        {{/each}}\\n      </table.row>\\n    {{/each}}\\n  </XTable>\\n  {{#if this.showIncompleteMessage}}\\n    <div\\n      class=\\\"text-small text-base text-color-error\\\"\\n      data-test-editable-matrix-incomplete-message\\n    >\\n      {{t\\n        \\\"components.exerciseView.assignment.editableMatrix.incompleteMessage\\\"\\n      }}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/editable-matrix/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/editable-matrix/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { isEmpty } from '@ember/utils';\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentEditableMatrixComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  get answers() {\n    const alternatives = this.args.assignment.content.objects;\n    const answers = [];\n    alternatives.map((a) => {\n      const answer = { uuid: a.uuid, answer: a.alternatives[0].value };\n      answers.push(answer);\n    });\n    return answers;\n  }\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get showIncompleteMessage() {\n    return (\n      this.args.incomplete && this.input.some(({ value }) => isEmpty(value))\n    );\n  }\n\n  get tableClass() {\n    if (!this.header) return 'matrix-table';\n    if (this.header === 'horizontal') {\n      return 'matrix-table matrix-horizontal-header';\n    } else if (this.header === 'vertical') {\n      return 'matrix-table matrix-vertical-header';\n    } else {\n      return 'matrix-table matrix-vertical-header matrix-horizontal-header';\n    }\n  }\n\n  get valign() {\n    return this.args.assignment?.settings.vertical_alignment ?? 'top';\n  }\n\n  get halign() {\n    return this.args.assignment?.settings.horizontal_alignment ?? 'left';\n  }\n\n  get header() {\n    const header = this.args.assignment?.settings?.table;\n    if (!header) return null;\n    if (header.length < 2) {\n      return header[0] === 'horizontalHeading' ? 'horizontal' : 'vertical';\n    } else {\n      return 'horizntalAndVertical';\n    }\n  }\n\n  get tableData() {\n    const rows = (this.args.assignment?.content?.value?.cells || []).map(\n      (row, rowIndex) => ({\n        index: rowIndex,\n        columns: row.map((column, colIndex) => ({\n          uuid: column.uuid,\n          index: colIndex,\n          value: column.value,\n          placeholder: this.placeholder(column.object_id),\n          clue: this.clue(column.object_id),\n          object_id: column.object_id,\n          isHeading: this._isHeading(rowIndex, colIndex),\n        })),\n      })\n    );\n\n    return rows;\n  }\n\n  get tableAppearance() {\n    const appearance = this.args.assignment?.settings?.appearance;\n    return appearance ? appearance : 'standard';\n  }\n\n  placeholder(object_id) {\n    const objects = this.args.assignment?.content?.objects;\n    return object_id\n      ? objects.find((item) => item.uuid === object_id)?.placeholder\n      : null;\n  }\n\n  clue(object_id) {\n    const objects = this.args.assignment?.content?.objects;\n    return object_id\n      ? objects.find((item) => item.uuid === object_id)?.clue\n      : null;\n  }\n\n  @action onChange(e) {\n    this.args.handleOnChange?.(e);\n  }\n\n  _isHeading(rowIndex, colIndex) {\n    const header = this.args.assignment?.settings?.table;\n    if (\n      (rowIndex === 0 && header.includes('horizontalHeading')) ||\n      (colIndex === 0 && header.includes('verticalHeading'))\n    ) {\n      return true;\n    }\n    return false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"flex flex-justify\\\"\\n  tabindex=\\\"-1\\\"\\n  {{on \\\"focus\\\" this.handleTableCellFocus}}\\n>\\n\\n  {{#if (and @showKey this.value)}}\\n    <DcIcon class=\\\"matrix-show-key\\\" @name=\\\"key\\\" />\\n  {{/if}}\\n  <UiTextarea\\n    @controlId={{@id}}\\n    @autoResize={{true}}\\n    @appearance=\\\"clean\\\"\\n    @align={{@align}}\\n    @disabled={{@disabled}}\\n    @placeholder={{@placeholder}}\\n    @value={{this.value}}\\n    @onChange={{@onChange}}\\n    @rows={{1}}\\n    class=\\\"matrix-textarea\\\"\\n  />\\n  {{#if @clue}}\\n    {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n      <UiButton\\n        class=\\\"matrix-clue flex nr1\\\"\\n        @onClick={{this.handleToggleClue}}\\n        @active={{this.showClue}}\\n        @appearance=\\\"none\\\"\\n      >\\n        <span class=\\\"matrix-clue-icon-bg flex flex-center justify-center\\\">\\n          <DcIcon id={{id}} @name=\\\"clue\\\" />\\n        </span>\\n      </UiButton>\\n      {{#if this.showClue}}\\n        <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n          <div class=\\\"p1\\\">\\n            {{@clue}}\\n          </div>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"flex flex-justify\\\"\\n  tabindex=\\\"-1\\\"\\n  {{on \\\"focus\\\" this.handleTableCellFocus}}\\n>\\n\\n  {{#if (and @showKey this.value)}}\\n    <DcIcon class=\\\"matrix-show-key\\\" @name=\\\"key\\\" />\\n  {{/if}}\\n  <UiTextarea\\n    @controlId={{@id}}\\n    @autoResize={{true}}\\n    @appearance=\\\"clean\\\"\\n    @align={{@align}}\\n    @disabled={{@disabled}}\\n    @placeholder={{@placeholder}}\\n    @value={{this.value}}\\n    @onChange={{@onChange}}\\n    @rows={{1}}\\n    class=\\\"matrix-textarea\\\"\\n  />\\n  {{#if @clue}}\\n    {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n      <UiButton\\n        class=\\\"matrix-clue flex nr1\\\"\\n        @onClick={{this.handleToggleClue}}\\n        @active={{this.showClue}}\\n        @appearance=\\\"none\\\"\\n      >\\n        <span class=\\\"matrix-clue-icon-bg flex flex-center justify-center\\\">\\n          <DcIcon id={{id}} @name=\\\"clue\\\" />\\n        </span>\\n      </UiButton>\\n      {{#if this.showClue}}\\n        <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n          <div class=\\\"p1\\\">\\n            {{@clue}}\\n          </div>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/editable-matrix/textarea/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/editable-matrix/textarea/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentEditableMatrixTextareaComponent extends Component {\n  @tracked showClue;\n\n  get value() {\n    if (this.args.showKey) {\n      return this.answer;\n    } else if (this.args.input) {\n      return this.args.input.findBy('uuid', this.args.objectId).value;\n    } else {\n      return null;\n    }\n  }\n\n  get answer() {\n    const id = this.args.id;\n    const answers = this.args.answers;\n    return answers.find((a) => a.uuid === id).answer;\n  }\n\n  set value(value) {\n    const input = this.args.input;\n    input.findBy('uuid', this.args.objectId).value = value;\n  }\n\n  @action handleTableCellFocus(evt) {\n    const textarea = evt?.target?.querySelector('textarea');\n\n    if (textarea) {\n      textarea.focus();\n    }\n  }\n\n  @action handleToggleClue() {\n    this.showClue = !this.showClue;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"editor-assignment {{this.presetClass}}\\\" ...attributes>\\n  <div class=\\\"editor-wrapper\\\" {{did-update this.inputChanged this.input}}>\\n    {{#if this.ready}}\\n      <XEditor\\n        @value={{this.input}}\\n        @capabilities={{this.editorCapabilities}}\\n        @toolbarOptions={{this.editorToolbarOptions}}\\n        @theme={{this.colorTheme.currentTheme}}\\n        @readOnly={{@disabled}}\\n        @onChange={{this.updateText}}\\n        {{ref (set this \\\"editorElement\\\")}}\\n      />\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.isIncomplete}}\\n    <div class=\\\"incomplete-message\\\">\\n      {{t \\\"components.exerciseView.assignment.editor.incompleteMessage\\\"}}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"editor-assignment {{this.presetClass}}\\\" ...attributes>\\n  <div class=\\\"editor-wrapper\\\" {{did-update this.inputChanged this.input}}>\\n    {{#if this.ready}}\\n      <XEditor\\n        @value={{this.input}}\\n        @capabilities={{this.editorCapabilities}}\\n        @toolbarOptions={{this.editorToolbarOptions}}\\n        @theme={{this.colorTheme.currentTheme}}\\n        @readOnly={{@disabled}}\\n        @onChange={{this.updateText}}\\n        {{ref (set this \\\"editorElement\\\")}}\\n      />\\n    {{/if}}\\n  </div>\\n\\n  {{#if this.isIncomplete}}\\n    <div class=\\\"incomplete-message\\\">\\n      {{t \\\"components.exerciseView.assignment.editor.incompleteMessage\\\"}}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/editor/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/editor/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentEditorComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  @service colorTheme;\n\n  editorElement = null;\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get ready() {\n    return (\n      (this.input !== undefined && this.input !== false) || this.args.disabled\n    );\n  }\n\n  get isIncomplete() {\n    if (this.args.incomplete) {\n      return (\n        isEmpty(this.input) &&\n        this.args.canHaveAttachments &&\n        this.args.answer?.files?.length === this.args.numberOfMediaAssignments\n      );\n    }\n\n    return false;\n  }\n\n  get presetClass() {\n    return ['preset', this.args.assignment?.settings?.preset].join('-');\n  }\n\n  @cached\n  get editorToolbarOptions() {\n    const preset = this.args.assignment?.settings?.preset;\n\n    switch (preset) {\n      case 'minimal':\n        return {\n          textFormats: false,\n          headings: false,\n          lists: false,\n          tables: false,\n        };\n      case 'basic':\n        return {\n          textFormats: ['bold', 'italic', 'underline'],\n          headings: false,\n          lists: false,\n          tables: false,\n        };\n      case 'balanced':\n        return {\n          textFormats: ['bold', 'italic', 'underline'],\n          headings: [1, 2, 3],\n          lists: true,\n          tables: true,\n        };\n\n      default:\n        return {\n          textFormats: [\n            'bold',\n            'italic',\n            'underline',\n            'strikethrough',\n            'subscript',\n            'superscript',\n          ],\n          headings: [1, 2, 3],\n          lists: true,\n          tables: true,\n        };\n    }\n  }\n\n  @cached\n  get editorCapabilities() {\n    return {\n      textFormats: [\n        'bold',\n        'italic',\n        'underline',\n        'strikethrough',\n        'subscript',\n        'superscript',\n      ],\n      headings: [1, 2, 3],\n      lists: true,\n      tables: true,\n    };\n  }\n\n  @action\n  updateText(value) {\n    if (!this.args.disabled) {\n      if (this.args.assignmentAnswer) {\n        this.args.assignmentAnswer.input = value;\n      }\n\n      this.args.handleOnChange?.(value);\n    }\n  }\n\n  @action\n  inputChanged() {\n    // Update editor version if input is cleared or\n    // equal to pattern / answer template\n    if (\n      this.input === this.args.assignment?.content?.pattern ||\n      this.input == null ||\n      this.input == undefined ||\n      this.input == ''\n    ) {\n      this.editorElement.setValueFromHtml('');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{this.classNames}}\\n  tabindex=\\\"-1\\\"\\n  data-exercise-view-assignment\\n  {{did-insert @onDidInsert}}\\n>\\n  {{#if this.index}}\\n    <div class=\\\"exercise-main-assignments-index text-bold\\\">\\n      <ContentPresenter>\\n        {{this.index}}\\n      </ContentPresenter>\\n    </div>\\n  {{/if}}\\n\\n  <div class={{this.contentClassNames}}>\\n    <ContentPresenter>\\n      {{#if this.audioSource}}\\n        <XAudio\\n          @source={{this.audioSource}}\\n          @canSpeedUp={{this.audio.metadata.can_speed_up}}\\n          @canSlowDown={{this.audio.metadata.can_slow_down}}\\n          class=\\\"mb1\\\"\\n        />\\n      {{/if}}\\n\\n      {{#if (and @assignment.settings.question @assignment.content.question)}}\\n        <div class=\\\"nb1\\\">\\n          <TbRenderInline @value={{@assignment.content.question}} />\\n        </div>\\n      {{/if}}\\n\\n      {{#if (and this.assignmentAnswer (eq this.assignmentAnswer.input null))}}\\n        <XAlert @variant=\\\"error\\\" class=\\\"p2\\\">\\n          <p>\\n            {{t \\\"components.exerciseView.assignment.missingAnswer.info\\\"}}\\n          </p>\\n\\n          <UiButton @appearance=\\\"link\\\" class=\\\"mt1\\\" @onClick={{@handleReset}}>\\n            {{t \\\"components.exerciseView.assignment.missingAnswer.startOver\\\"}}\\n          </UiButton>\\n        </XAlert>\\n      {{else}}\\n        {{#let\\n          (component (concat \\\"exercise-view/assignment/\\\" this.template))\\n          as |AssignmentComponent|\\n        }}\\n          <div\\n            class={{if\\n              (and\\n                (eq this.presentation \\\"horizontal\\\")\\n                (eq @assignment.template \\\"arrange\\\")\\n              )\\n              \\\"horizontal-scroll\\\"\\n            }}\\n          >\\n            <AssignmentComponent\\n              class=\\\"relative\\\"\\n              @numberOfMediaAssignments={{@numberOfMediaAssignments}}\\n              @exerciseType={{@exerciseType}}\\n              @withinContent={{@withinContent}}\\n              @assignment={{@assignment}}\\n              @canHaveAttachments={{@canHaveAttachments}}\\n              @assignmentAnswer={{this.assignmentAnswer}}\\n              @answer={{@answer}}\\n              @handleOnChange={{@handleOnChange}}\\n              @showValidation={{this.validationVisible}}\\n              @showKey={{this.showKey}}\\n              @disabled={{@disabled}}\\n              @showSuggestion={{this.suggestionVisible}}\\n              @incomplete={{@incomplete}}\\n              @image={{this.image}}\\n              @isAutoCorrected={{@isAutoCorrected}}\\n              @mediaIsRecording={{@mediaIsRecording}}\\n              @changeMediaRecordingStatus={{@changeMediaRecordingStatus}}\\n              @preview={{@preview}}\\n            />\\n          </div>\\n        {{/let}}\\n      {{/if}}\\n\\n      {{#if this.suggestionVisible}}\\n        <ExerciseView::Common::Hint class=\\\"mt1\\\">\\n          <div class=\\\"text-small\\\">\\n            <TbRenderInline @value={{@assignment.content.suggestion}} />\\n          </div>\\n        </ExerciseView::Common::Hint>\\n      {{/if}}\\n    </ContentPresenter>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class={{this.classNames}}\\n  tabindex=\\\"-1\\\"\\n  data-exercise-view-assignment\\n  {{did-insert @onDidInsert}}\\n>\\n  {{#if this.index}}\\n    <div class=\\\"exercise-main-assignments-index text-bold\\\">\\n      <ContentPresenter>\\n        {{this.index}}\\n      </ContentPresenter>\\n    </div>\\n  {{/if}}\\n\\n  <div class={{this.contentClassNames}}>\\n    <ContentPresenter>\\n      {{#if this.audioSource}}\\n        <XAudio\\n          @source={{this.audioSource}}\\n          @canSpeedUp={{this.audio.metadata.can_speed_up}}\\n          @canSlowDown={{this.audio.metadata.can_slow_down}}\\n          class=\\\"mb1\\\"\\n        />\\n      {{/if}}\\n\\n      {{#if (and @assignment.settings.question @assignment.content.question)}}\\n        <div class=\\\"nb1\\\">\\n          <TbRenderInline @value={{@assignment.content.question}} />\\n        </div>\\n      {{/if}}\\n\\n      {{#if (and this.assignmentAnswer (eq this.assignmentAnswer.input null))}}\\n        <XAlert @variant=\\\"error\\\" class=\\\"p2\\\">\\n          <p>\\n            {{t \\\"components.exerciseView.assignment.missingAnswer.info\\\"}}\\n          </p>\\n\\n          <UiButton @appearance=\\\"link\\\" class=\\\"mt1\\\" @onClick={{@handleReset}}>\\n            {{t \\\"components.exerciseView.assignment.missingAnswer.startOver\\\"}}\\n          </UiButton>\\n        </XAlert>\\n      {{else}}\\n        {{#let\\n          (component (concat \\\"exercise-view/assignment/\\\" this.template))\\n          as |AssignmentComponent|\\n        }}\\n          <div\\n            class={{if\\n              (and\\n                (eq this.presentation \\\"horizontal\\\")\\n                (eq @assignment.template \\\"arrange\\\")\\n              )\\n              \\\"horizontal-scroll\\\"\\n            }}\\n          >\\n            <AssignmentComponent\\n              class=\\\"relative\\\"\\n              @numberOfMediaAssignments={{@numberOfMediaAssignments}}\\n              @exerciseType={{@exerciseType}}\\n              @withinContent={{@withinContent}}\\n              @assignment={{@assignment}}\\n              @canHaveAttachments={{@canHaveAttachments}}\\n              @assignmentAnswer={{this.assignmentAnswer}}\\n              @answer={{@answer}}\\n              @handleOnChange={{@handleOnChange}}\\n              @showValidation={{this.validationVisible}}\\n              @showKey={{this.showKey}}\\n              @disabled={{@disabled}}\\n              @showSuggestion={{this.suggestionVisible}}\\n              @incomplete={{@incomplete}}\\n              @image={{this.image}}\\n              @isAutoCorrected={{@isAutoCorrected}}\\n              @mediaIsRecording={{@mediaIsRecording}}\\n              @changeMediaRecordingStatus={{@changeMediaRecordingStatus}}\\n              @preview={{@preview}}\\n            />\\n          </div>\\n        {{/let}}\\n      {{/if}}\\n\\n      {{#if this.suggestionVisible}}\\n        <ExerciseView::Common::Hint class=\\\"mt1\\\">\\n          <div class=\\\"text-small\\\">\\n            <TbRenderInline @value={{@assignment.content.suggestion}} />\\n          </div>\\n        </ExerciseView::Common::Hint>\\n      {{/if}}\\n    </ContentPresenter>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport indexString from 'compton/utils/index-string';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class ExerciseViewAssignmentComponent extends Component {\n  /**\n   * Arguments:\n   * listType (string)\n   * hasMultipleAssignments (bool)\n   * answer (object)\n   * assignment (object)\n   * disabled (bool)\n   * canHaveAttachments (bool)\n   * showSuggestion (bool)\n   * handleOnChange (function)\n   * handleReset (function)\n   * showKey (bool)\n   * showValidation (bool)\n   * incomplete (bool)\n   * isAutoCorrected (bool)\n   * exerciseType (string)\n   * solution (object)\n   */\n\n  @service store;\n\n  get showKey() {\n    if (this.args.showKey) {\n      if (this.args.solution || this.args.isAutoCorrected) {\n        return true;\n      } else if (\n        !this.args.isAutoCorrected &&\n        ['text-gap', 'matrix'].includes(this.args.assignment?.template)\n      ) {\n        // Teacher corrected text-gap or matrix assignments don't have solutions\n        // but still have a key\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  get index() {\n    if (!this.args.assignment) return null;\n    if (!this.args.hasMultipleAssignments) return null;\n    if (this.args.listType === 'none') return null;\n\n    let style = 'lower-latin';\n    let suffix = ')';\n\n    if (this.args.listType === 'numbers') {\n      style = 'numerical';\n      suffix = '.';\n    }\n\n    return indexString(this.args.assignment.index, { style, suffix });\n  }\n\n  get template() {\n    const isEditableMatrix =\n      this.args.assignment.template === 'matrix' &&\n      ['assignments', 'studies'].includes(this.args.exerciseType);\n    if (isEditableMatrix) {\n      return 'editable-matrix';\n    }\n    return this.args.assignment.template;\n  }\n\n  get hasSuggestion() {\n    return this.args.assignment?.settings?.suggestion;\n  }\n\n  get suggestionVisible() {\n    return (\n      this.hasSuggestion &&\n      this.args.showSuggestion &&\n      this.args.answer?.status === 'wrong'\n    );\n  }\n\n  get presentation() {\n    if (this.args.assignment?.settings?.presentation) {\n      return this.args.assignment.settings.presentation;\n    }\n    return 'vertical';\n  }\n\n  get suffix() {\n    const showValidation = this.args.showValidation;\n    const status = this.args.answer?.status;\n\n    if (showValidation) {\n      if (status === 'correct') return 'success';\n      if (status === 'wrong') return 'error';\n    }\n\n    return null;\n  }\n\n  get suffixClassName() {\n    return this.suffix && ['assignment-status', this.suffix].join('--');\n  }\n\n  get behaviourClassName() {\n    const behaviour = this.args.assignment?.settings?.behaviour;\n    return behaviour && ['assignment-behaviour', behaviour].join('--');\n  }\n\n  get disabledClassName() {\n    return this.args.disabled && ['assignment', 'disabled'].join('--');\n  }\n\n  get keyClassName() {\n    return this.showKey && ['assignment', 'key'].join('--');\n  }\n\n  get classNames() {\n    const classNames = ['exercise-main-assignment'];\n\n    if (this.behaviourClassName) classNames.push(this.behaviourClassName);\n    if (this.disabledClassName) classNames.push(this.disabledClassName);\n    if (this.keyClassName) classNames.push(this.keyClassName);\n    if (this.suffixClassName) classNames.push(this.suffixClassName);\n\n    return classNames.join(' ');\n  }\n\n  get contentClassNames() {\n    const classNames = ['exercise-main-assignments-content'];\n\n    if (this.args.hasMultipleAssignments) {\n      classNames.push('exercise-main-assignments-content-push');\n    }\n\n    return classNames.join(' ');\n  }\n\n  @cached\n  get assignmentAnswer() {\n    const answer = this.args.answer;\n    const assignmentId = this.args.assignment?.uuid;\n\n    if (answer && assignmentId) {\n      const assignments = answer.assignments;\n\n      if (assignments) {\n        const assignmentAnswer = assignments.findBy('uuid', assignmentId);\n\n        return assignmentAnswer;\n      }\n    }\n\n    return null;\n  }\n\n  get validationVisible() {\n    if (this.args.preview) return false;\n\n    if (this.args.showValidation) {\n      return this.args.showValidation;\n    }\n\n    if (\n      this.args.isAutoCorrected &&\n      this.args.disabled &&\n      this.assignmentAnswer?.input\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  @cached\n  get audioProxy() {\n    let promise = resolve();\n\n    const audio = this.args.assignment?.content?.audio;\n\n    if (audio) {\n      promise = this.store.findRecord('material', audio);\n    }\n\n    return load(promise, this);\n  }\n\n  get audio() {\n    return this.audioProxy.isResolved ? this.audioProxy.value : null;\n  }\n\n  get audioSource() {\n    return this.audio?.meta?.attachment_url;\n  }\n\n  @cached\n  get imageProxy() {\n    let promise = resolve();\n\n    const image = this.args.assignment?.content?.image;\n\n    if (image) {\n      promise = this.store.findRecord('material', image);\n    }\n\n    return load(promise, this);\n  }\n\n  get image() {\n    return this.imageProxy.isResolved ? this.imageProxy.value : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"match-image\\\">\\n  {{#if this.imageSrc}}\\n\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"match-image\\\">\\n  {{#if this.imageSrc}}\\n\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/match/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/match/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewMatchImage extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{this.draggingClassName}}\\n  ...attributes\\n  {{did-insert this.setElement}}\\n>\\n  {{#each this.items as |item index|}}\\n    <ExerciseView::Assignment::Match::Item\\n      @withinContent={{@withinContent}}\\n      @showKey={{@showKey}}\\n      @showValidation={{@showValidation}}\\n      @alternatives={{@assignment.content.alternatives}}\\n      @assignmentAnswer={{this.input}}\\n      @scope={{this.scope}}\\n      @index={{index}}\\n      @disabled={{@disabled}}\\n      @onStart={{this.handleDragStart}}\\n      @onEnd={{this.handleDragEnd}}\\n      @onDrop={{this.onDroppableDrop}}\\n      @droppableContent={{item.droppableContent}}\\n      @droppableImage={{item.droppableImage}}\\n      @draggableContent={{item.draggableContent}}\\n      @incomplete={{@incomplete}}\\n    />\\n  {{/each}}\\n</div>\", {\"contents\":\"<div\\n  class={{this.draggingClassName}}\\n  ...attributes\\n  {{did-insert this.setElement}}\\n>\\n  {{#each this.items as |item index|}}\\n    <ExerciseView::Assignment::Match::Item\\n      @withinContent={{@withinContent}}\\n      @showKey={{@showKey}}\\n      @showValidation={{@showValidation}}\\n      @alternatives={{@assignment.content.alternatives}}\\n      @assignmentAnswer={{this.input}}\\n      @scope={{this.scope}}\\n      @index={{index}}\\n      @disabled={{@disabled}}\\n      @onStart={{this.handleDragStart}}\\n      @onEnd={{this.handleDragEnd}}\\n      @onDrop={{this.onDroppableDrop}}\\n      @droppableContent={{item.droppableContent}}\\n      @droppableImage={{item.droppableImage}}\\n      @draggableContent={{item.draggableContent}}\\n      @incomplete={{@incomplete}}\\n    />\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/match/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/match/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached } from '@glimmer/tracking';\nimport DragAssignmentComponent from 'babel/components/exercise-view/common/drag-assignment/index';\nimport generateId from 'compton/utils/generate-id';\n\nexport default class ExerciseViewAssignmentMatchComponent extends DragAssignmentComponent {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get hasValueImage() {\n    return this.args.assignment?.settings?.value_image;\n  }\n\n  @cached get items() {\n    const hasValueImage = this.hasValueImage;\n    const alternatives = this.args.assignment?.content?.alternatives;\n    const input = this.input;\n    const showKey = this.args.showKey;\n\n    return alternatives?.map((alternative, index) => {\n      const key = input ? input.objectAt(index) : null;\n\n      let keyValue;\n\n      if (showKey || !key) {\n        keyValue = alternative.key;\n      } else {\n        keyValue = alternatives.findBy('uuid', key.uuid).key;\n      }\n\n      return {\n        droppableContent: alternative.value,\n        droppableImage: hasValueImage && alternative.value_image,\n        draggableContent: keyValue,\n      };\n    });\n  }\n\n  get scope() {\n    return generateId('match-scope');\n  }\n\n  @action onDroppableDrop(draggableData, droppableData) {\n    const input = this.input;\n    const key = input?.objectAt(draggableData.index);\n    const oldKey = input?.objectAt(droppableData.index);\n\n    if (key) {\n      key.assigned = true;\n    }\n\n    if (key && oldKey && key.uuid !== oldKey.uuid) {\n      oldKey.assigned = false;\n\n      input.replace(draggableData.index, 1, [oldKey]);\n      input.replace(droppableData.index, 1, [key]);\n    }\n\n    if (this.args.assignmentAnswer) {\n      this.args.assignmentAnswer.input = input;\n    }\n\n    this.args.handleOnChange?.(input);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"match-assignment-item nb1 {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <XDroppable\\n    class=\\\"flex\\\"\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <ExerciseView::Common::DropItem\\n      class=\\\"flex-one match-drop-item\\\"\\n      @pairable={{true}}\\n    >\\n      {{#if @droppableImage}}\\n        <ExerciseView::Assignment::Match::Image\\n          @imageId={{@droppableImage}}\\n          @width=\\\"150\\\"\\n          @height=\\\"150\\\"\\n        />\\n      {{/if}}\\n\\n      <div\\n        class=\\\"flex-one\\n          {{if @droppableImage 'match-item-text-padding' 'ml1 mr1 nt1 nb1'}}\\\"\\n      >\\n        <TbRenderInline @value={{@droppableContent}} />\\n      </div>\\n    </ExerciseView::Common::DropItem>\\n\\n    <XDraggable\\n      class=\\\"flex flex-one\\\"\\n      @rotation={{1}}\\n      @scrollSize={{this.draggableScrollSize}}\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @size=\\\"large\\\"\\n        class=\\\"flex flex-one match-drag-item\\\"\\n        @showValidation={{true}}\\n      >\\n        <div class=\\\"flex-one {{this.textMarginLeft}}\\\">\\n          <TbRenderInline @value={{@draggableContent}} />\\n        </div>\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"match-assignment-item nb1 {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <XDroppable\\n    class=\\\"flex\\\"\\n    @data={{hash scope=@scope index=@index}}\\n    @accept={{this.droppableAccepts}}\\n    @disabled={{@disabled}}\\n  >\\n    <ExerciseView::Common::DropItem\\n      class=\\\"flex-one match-drop-item\\\"\\n      @pairable={{true}}\\n    >\\n      {{#if @droppableImage}}\\n        <ExerciseView::Assignment::Match::Image\\n          @imageId={{@droppableImage}}\\n          @width=\\\"150\\\"\\n          @height=\\\"150\\\"\\n        />\\n      {{/if}}\\n\\n      <div\\n        class=\\\"flex-one\\n          {{if @droppableImage 'match-item-text-padding' 'ml1 mr1 nt1 nb1'}}\\\"\\n      >\\n        <TbRenderInline @value={{@droppableContent}} />\\n      </div>\\n    </ExerciseView::Common::DropItem>\\n\\n    <XDraggable\\n      class=\\\"flex flex-one\\\"\\n      @rotation={{1}}\\n      @scrollSize={{this.draggableScrollSize}}\\n      @data={{hash scope=@scope index=@index}}\\n      @onDrop={{@onDrop}}\\n      @onStart={{@onStart}}\\n      @onEnd={{@onEnd}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @size=\\\"large\\\"\\n        class=\\\"flex flex-one match-drag-item\\\"\\n        @showValidation={{true}}\\n      >\\n        <div class=\\\"flex-one {{this.textMarginLeft}}\\\">\\n          <TbRenderInline @value={{@draggableContent}} />\\n        </div>\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </XDroppable>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/match/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/match/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentMatchItemComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * showKey (bool)\n   * showValidation (bool)\n   * alternatives (array)\n   * assignmentAnswer (object)\n   * scope (string)\n   * index (number)\n   * disabled (bool)\n   * onStart (function)\n   * onEnd (function)\n   * onDrop (function)\n   * droppableContent (object)\n   * droppableImage (object)\n   * draggableContent (object)\n   * incomplete (bool)\n   */\n\n  get suffix() {\n    const alternatives = this.args.alternatives;\n    const assignmentAnswer = this.args.assignmentAnswer;\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n    const index = this.args.index;\n\n    const alternative = alternatives?.objectAt(index);\n    const key = assignmentAnswer?.objectAt(index);\n    const keyAssigned = key?.assigned;\n\n    let suffix;\n\n    if (showKey) {\n      suffix = 'key';\n    } else {\n      if (showValidation && keyAssigned) {\n        if (key && alternative && key.uuid === alternative.uuid) {\n          suffix = 'success';\n        } else {\n          suffix = 'error';\n        }\n      }\n    }\n\n    return suffix;\n  }\n\n  get draggableScrollSize() {\n    if (this.args.withinContent) {\n      return { top: 200 };\n    }\n    return undefined;\n  }\n\n  get textMarginLeft() {\n    if (this.args.showKey || this.args.showValidation) return 'nl1';\n\n    return null;\n  }\n\n  get paired() {\n    const assignmentAnswer = this.args.assignmentAnswer;\n    const showKey = this.args.showKey;\n    const index = this.args.index;\n\n    const key = assignmentAnswer?.objectAt(index);\n    const keyAssigned = key?.assigned;\n\n    return showKey || keyAssigned;\n  }\n\n  @action droppableAccepts(droppableData, draggableData) {\n    if (droppableData?.scope) {\n      if (draggableData && draggableData.scope === droppableData.scope) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n","import { underscore } from '@ember/string';\nimport { cached, tracked } from '@glimmer/tracking';\nimport TextGapComponent from 'babel/components/exercise-view/assignment/text-gap/index';\nimport { v4 as uuid } from 'ember-uuid';\n\nconst TABLE_SETTINGS = [\n  'showTitle',\n  'showCaption',\n  'verticalHeading',\n  'horizontalHeading',\n];\n\nexport default class ExerciseViewAssignmentMatrixComponent extends TextGapComponent {\n  @tracked inline = false;\n\n  @cached\n  get tbRenderContent() {\n    const settings = {};\n    const assignmentSettings = this.args.assignment?.settings?.table;\n\n    for (const key of TABLE_SETTINGS) {\n      if (assignmentSettings) {\n        if (assignmentSettings[key]) {\n          settings[underscore(key)] = assignmentSettings[key];\n        } else if (\n          Array.isArray(assignmentSettings) &&\n          assignmentSettings.indexOf(key) !== -1\n        ) {\n          settings[underscore(key)] = true;\n        }\n      }\n    }\n\n    ['appearance', 'vertical_alignment', 'horizontal_alignment'].forEach(\n      (key) => {\n        settings[key] = this.args.assignment?.settings?.[key];\n      }\n    );\n\n    const rows = (this.args.assignment?.content?.value?.cells || []).map(\n      (row, rowIndex) => ({\n        uuid: uuid(),\n        index: rowIndex,\n        columns: row.map((column, colIndex) => ({\n          uuid: column.uuid,\n          index: colIndex,\n          value: column.value,\n        })),\n      })\n    );\n\n    const component = {\n      component: 'table',\n      index: 0,\n      language: null,\n      metadata: {},\n      settings,\n      template: 'standard',\n      uuid: uuid(),\n      rows,\n    };\n\n    return this.store.createRecord('editor', {\n      rows: [\n        {\n          type: 'row',\n          uuid: uuid(),\n          index: 0,\n          settings: {\n            template: 'standard',\n          },\n          columns: [\n            {\n              type: 'column',\n              uuid: uuid(),\n              index: 0,\n              components: [component],\n            },\n          ],\n        },\n      ],\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"media-assignment {{this.presetClass}}\\\" ...attributes>\\n  <DcCard id=\\\"audio-card\\\" class=\\\"snt1 text-standard\\\">\\n    {{#if this.filesProxy.isResolved}}\\n      {{#if (or this.audioURL @disabled)}}\\n        {{#if this.audioURL}}\\n          <div class=\\\"assignment-media-xcard flex flex-justify\\\">\\n            <XAudio\\n              @source={{this.audioURL}}\\n              @label={{this.playerText}}\\n              @showTime={{@disabled}}\\n              @showPlayStatus={{not @disabled}}\\n            />\\n            {{#unless @disabled}}\\n              <UiButton\\n                class=\\\"pull-right text-small text-color-error assignment-media-remove-button\\\"\\n                @appearance=\\\"link\\\"\\n                @onClick={{this.removeAudioFile}}\\n              >\\n                {{t \\\"components.exerciseView.assignment.media.removeSoundFile\\\"}}\\n              </UiButton>\\n            {{/unless}}\\n          </div>\\n        {{else}}\\n          <div class=\\\"p1\\\">\\n            {{t \\\"components.exerciseView.assignment.media.noRecording\\\"}}\\n          </div>\\n        {{/if}}\\n      {{else}}\\n        <div class=\\\"flex flex-justify flex-center m1\\\">\\n          <div class=\\\"flex flex-center assignment-media-record-wrapper\\\">\\n            {{#if (not-eq this.micPermission \\\"denied\\\")}}\\n              <UiButton\\n                @disabled={{this.disableRecordButton}}\\n                @onClick={{this.handleRecording}}\\n                @appearance=\\\"circle\\\"\\n                class=\\\"assignment-media-icon-background flex flex-center justify-center\\n                  {{if this.isRecording 'recording'}}\\\"\\n              >\\n                <DcIcon @name={{this.playerStatus}} />\\n              </UiButton>\\n              <div class=\\\"assignment-media-audio-label flex flex-column\\\">\\n                <span>\\n                  <UiButton\\n                    @appearance=\\\"none\\\"\\n                    @disabled={{this.disableRecordButton}}\\n                    @onClick={{this.handleRecording}}\\n                  >\\n                    {{this.playerText}}\\n                  </UiButton>\\n                </span>\\n                {{#if this.showIncomplete}}\\n                  <span class=\\\"text-small text-base text-color-error\\\">\\n                    {{t \\\"components.exerciseView.assignment.media.incomplete\\\"}}\\n                  </span>\\n                {{/if}}\\n              </div>\\n            {{else}}\\n              <div class=\\\"flex flex-justify assignment-media-record-wrapper\\\">\\n                <div>\\n                  {{t \\\"components.exerciseView.assignment.media.access\\\"}}\\n                </div>\\n                <!-- <a class=\\\"text-color-error text-bold\\\" href=\\\"\\\">\\n                  {{t \\\"components.exerciseView.assignment.media.readMore\\\"}}\\n                </a> -->\\n              </div>\\n            {{/if}}\\n          </div>\\n          {{#if this.isRecording}}\\n            {{#if this.showTimer}}\\n              <span class=\\\"text-color-error text-bold mr1\\\">\\n                {{human-time this.recordTime}}\\n              </span>\\n            {{/if}}\\n            <span class=\\\"assignment-media-audio-record-dot\\\"></span>\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    {{else}}\\n      <DcLoader class=\\\"m1\\\" />\\n    {{/if}}\\n  </DcCard>\\n</div>\", {\"contents\":\"<div class=\\\"media-assignment {{this.presetClass}}\\\" ...attributes>\\n  <DcCard id=\\\"audio-card\\\" class=\\\"snt1 text-standard\\\">\\n    {{#if this.filesProxy.isResolved}}\\n      {{#if (or this.audioURL @disabled)}}\\n        {{#if this.audioURL}}\\n          <div class=\\\"assignment-media-xcard flex flex-justify\\\">\\n            <XAudio\\n              @source={{this.audioURL}}\\n              @label={{this.playerText}}\\n              @showTime={{@disabled}}\\n              @showPlayStatus={{not @disabled}}\\n            />\\n            {{#unless @disabled}}\\n              <UiButton\\n                class=\\\"pull-right text-small text-color-error assignment-media-remove-button\\\"\\n                @appearance=\\\"link\\\"\\n                @onClick={{this.removeAudioFile}}\\n              >\\n                {{t \\\"components.exerciseView.assignment.media.removeSoundFile\\\"}}\\n              </UiButton>\\n            {{/unless}}\\n          </div>\\n        {{else}}\\n          <div class=\\\"p1\\\">\\n            {{t \\\"components.exerciseView.assignment.media.noRecording\\\"}}\\n          </div>\\n        {{/if}}\\n      {{else}}\\n        <div class=\\\"flex flex-justify flex-center m1\\\">\\n          <div class=\\\"flex flex-center assignment-media-record-wrapper\\\">\\n            {{#if (not-eq this.micPermission \\\"denied\\\")}}\\n              <UiButton\\n                @disabled={{this.disableRecordButton}}\\n                @onClick={{this.handleRecording}}\\n                @appearance=\\\"circle\\\"\\n                class=\\\"assignment-media-icon-background flex flex-center justify-center\\n                  {{if this.isRecording 'recording'}}\\\"\\n              >\\n                <DcIcon @name={{this.playerStatus}} />\\n              </UiButton>\\n              <div class=\\\"assignment-media-audio-label flex flex-column\\\">\\n                <span>\\n                  <UiButton\\n                    @appearance=\\\"none\\\"\\n                    @disabled={{this.disableRecordButton}}\\n                    @onClick={{this.handleRecording}}\\n                  >\\n                    {{this.playerText}}\\n                  </UiButton>\\n                </span>\\n                {{#if this.showIncomplete}}\\n                  <span class=\\\"text-small text-base text-color-error\\\">\\n                    {{t \\\"components.exerciseView.assignment.media.incomplete\\\"}}\\n                  </span>\\n                {{/if}}\\n              </div>\\n            {{else}}\\n              <div class=\\\"flex flex-justify assignment-media-record-wrapper\\\">\\n                <div>\\n                  {{t \\\"components.exerciseView.assignment.media.access\\\"}}\\n                </div>\\n                <!-- <a class=\\\"text-color-error text-bold\\\" href=\\\"\\\">\\n                  {{t \\\"components.exerciseView.assignment.media.readMore\\\"}}\\n                </a> -->\\n              </div>\\n            {{/if}}\\n          </div>\\n          {{#if this.isRecording}}\\n            {{#if this.showTimer}}\\n              <span class=\\\"text-color-error text-bold mr1\\\">\\n                {{human-time this.recordTime}}\\n              </span>\\n            {{/if}}\\n            <span class=\\\"assignment-media-audio-record-dot\\\"></span>\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    {{else}}\\n      <DcLoader class=\\\"m1\\\" />\\n    {{/if}}\\n  </DcCard>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/media/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/media/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cancel, later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked, cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class ExerciseViewAssignmentMediaComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  @tracked micPermission = 'prompt';\n  @tracked isRecording = false;\n  @tracked finishRecording = null;\n  @tracked pendingFile = null;\n  @tracked recordTime;\n  @tracked showTimer = false;\n  @tracked isUploading = false;\n\n  @service recordAudio;\n  @service intl;\n  @service fileDispatcher;\n  @service store;\n  @service session;\n  @service confirmManager;\n\n  timer = null;\n\n  @cached get filesProxy() {\n    const files = load(resolve(this.args.answer?.files), this);\n    return files;\n  }\n\n  get files() {\n    return this.filesProxy.isResolved ? this.filesProxy.value : null;\n  }\n\n  get audioURL() {\n    if (this.files) {\n      return this.files.findBy('id', this.args.assignmentAnswer.input)?.url;\n    }\n\n    return;\n  }\n\n  get playerStatus() {\n    if (this.isRecording) {\n      return 'stop';\n    } else {\n      return 'audio';\n    }\n  }\n\n  get playerText() {\n    if (this.isUploading) {\n      return this.intl.t(`components.exerciseView.assignment.media.processing`);\n    }\n    if (this.args.assignment.settings.label || this.isRecording) {\n      if (!this.audioURL) {\n        return this.isRecording\n          ? this.intl.t(`components.exerciseView.assignment.media.stop`)\n          : this.args.assignment?.content?.mediaLabel;\n      }\n      return this.intl.t(\n        `components.exerciseView.assignment.media.recordingFinished`\n      );\n    } else {\n      return this.intl.t(`components.exerciseView.assignment.media.record`);\n    }\n  }\n\n  get showIncomplete() {\n    return !this.isRecording && this.args.incomplete && !this.isUploading\n      ? true\n      : false;\n  }\n\n  get disableRecordButton() {\n    return !this.isRecording && this.args.mediaIsRecording === true\n      ? true\n      : false;\n  }\n\n  @action async handleRecording() {\n    if (this.micPermission === 'prompt') {\n      this.micPermission = await this._getMicApproval();\n      if (this.micPermission !== 'granted') return;\n    }\n    if (this.isRecording) {\n      this._stopTimer();\n      this.isRecording = !this.isRecording;\n      this.isUploading = true;\n      await this.recordAudio.stopRecording();\n      this.finishRecording = await this.recordAudio.returnRecording(\n        this.args.assignment.uuid\n      );\n      await this.handleFileUploadPerform(this.finishRecording.audioBlob);\n      this.isUploading = false;\n      this.args.changeMediaRecordingStatus();\n    } else {\n      this.args.changeMediaRecordingStatus();\n      this._startTimer();\n      this.isRecording = !this.isRecording;\n      this.recordAudio.uuid = this.args.assignment.uuid;\n      this.recordAudio.startRecording();\n    }\n  }\n\n  @action removeAudioFile() {\n    return this.confirmManager\n      .confirm({\n        message: this.intl.t(\n          'components.exerciseView.assignment.media.removeConfirm'\n        ),\n        danger: true,\n      })\n      .then(() => {\n        if (this.audioURL) {\n          const file = this.files.findBy(\n            'id',\n            this.args.assignmentAnswer.input\n          );\n\n          if (this.args.incomplete) {\n            this.fileDispatcher.delete(file, true);\n          }\n          this.args.answer.files.removeObject(file);\n\n          this.args.assignmentAnswer.input = undefined;\n          this.isRecording = false;\n          this.onChange();\n        }\n      });\n  }\n\n  @action handleFileUploadPerform(fileData) {\n    if (this.audioURL) {\n      this.removeAudioFile();\n    }\n    const pendingFile = this.store.createRecord('file', {\n      name: this.args.assignmentAnswer.uuid,\n      user: this.session.user,\n      recorded: true,\n    });\n\n    this.pendingFile = pendingFile;\n\n    const onResolve = () => {\n      this.args.answer.files.addObject(pendingFile);\n      this.args.assignmentAnswer.input = pendingFile.id;\n      this.onChange();\n    };\n\n    const onFinally = () => {\n      this.pendingFile = null;\n    };\n\n    fileData.name = this.args.assignmentAnswer.uuid;\n\n    return this.fileDispatcher\n      .performUpload(pendingFile, fileData)\n      .then(onResolve)\n      .finally(onFinally);\n  }\n\n  @action onChange(e) {\n    this.args.handleOnChange?.(e);\n  }\n  // Private\n  async _getMicApproval() {\n    return await navigator.mediaDevices\n      .getUserMedia({ audio: true })\n      .then(function (stream) {\n        return 'granted';\n      })\n      .catch(function (err) {\n        return 'denied';\n      });\n  }\n\n  _startTimer() {\n    this.recordTime = 60 * 15;\n    this.timer = this._tick();\n  }\n\n  _stopTimer() {\n    this.showTimer = false;\n    cancel(this.timer);\n  }\n\n  _tick() {\n    if (this.recordTime == 0) {\n      this.handleRecording();\n      return;\n    } else if (this.recordTime < 60 * 5) {\n      this.showTimer = true;\n    }\n\n    return later(\n      this,\n      function () {\n        this.recordTime--;\n        this.timer = this._tick();\n      },\n      1000\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"number-line-assignment nb1\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n  <XNumberLine\\n    class=\\\"mb3\\\"\\n    @start={{@assignment.content.start}}\\n    @end={{@assignment.content.end}}\\n    @interval={{@assignment.content.interval}}\\n    @annotate={{@assignment.content.annotate}}\\n    @values={{this.input}}\\n    @validValues={{this.validValues}}\\n    @multiple={{@assignment.settings.multiple}}\\n    @stage={{this.stage}}\\n    @onChange={{this.handleChange}}\\n  />\\n\\n  {{#if this.showHint}}\\n    <div class=\\\"text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.numberLine.hint\\\" htmlSafe=true}}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"number-line-assignment nb1\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n  <XNumberLine\\n    class=\\\"mb3\\\"\\n    @start={{@assignment.content.start}}\\n    @end={{@assignment.content.end}}\\n    @interval={{@assignment.content.interval}}\\n    @annotate={{@assignment.content.annotate}}\\n    @values={{this.input}}\\n    @validValues={{this.validValues}}\\n    @multiple={{@assignment.settings.multiple}}\\n    @stage={{this.stage}}\\n    @onChange={{this.handleChange}}\\n  />\\n\\n  {{#if this.showHint}}\\n    <div class=\\\"text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.numberLine.hint\\\" htmlSafe=true}}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/number-line/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/number-line/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentNumberLineComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this._setAnswer();\n  }\n\n  @service assignmentEvents;\n\n  @tracked input;\n\n  get isMultiple() {\n    return this.args.assignment?.settings?.multiple;\n  }\n\n  get showValidationAndOption() {\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n\n    return !showKey && showValidation;\n  }\n\n  get validValues() {\n    return (\n      this.args.assignment.content.alternatives?.map(\n        (alternative) => alternative.start_index\n      ) || []\n    );\n  }\n\n  get stage() {\n    if (this.args.showKey) return 'reveal';\n\n    if (this.showValidationAndOption) return 'validate';\n\n    return 'answer';\n  }\n\n  @cached get showHint() {\n    const input = this.input;\n\n    // Never show hint if answer is correct or showing keys, and only on show validation\n    if (\n      !input ||\n      input.length === 0 ||\n      this.args.assignmentAnswer?.correct ||\n      this.args.showKey ||\n      !this.args.showValidation ||\n      this.args.disabled\n    ) {\n      return false;\n    }\n\n    return input.every((i) => this.validValues.includes(i));\n  }\n\n  @action handleChange(value) {\n    if (this.args.assignmentAnswer) {\n      this.input = value;\n      this.args.assignmentAnswer.input = this.input;\n    }\n    this.args.handleOnChange?.(value);\n  }\n\n  @action handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n\n  @action answerUpdated() {\n    this._setAnswer();\n  }\n\n  _setAnswer() {\n    this.input = this.args.assignmentAnswer?.input;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"place-choices-assignment\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n\\n  <ExerciseView::Common::MarkerScope\\n    {{on \\\"click\\\" this.handleMarkerScopeClick}}\\n    @assignment={{@assignment}}\\n    as |scope|\\n  >\\n\\n    {{#each this.markers as |alternative|}}\\n\\n      <scope.Marker @x={{alternative.x}} @y={{alternative.y}} as |marker|>\\n\\n        <marker.Content\\n          class=\\\"place-choices-assignment-marker-content\\n            {{if\\n              this.highlightMarkers\\n              'place-choices-assignment-marker-content--highlight'\\n            }}\\\"\\n          @placement=\\\"middle\\\"\\n          @alignment=\\\"center\\\"\\n        >\\n\\n          <ExerciseView::Assignment::PlaceChoices::Item\\n            @alternative={{alternative}}\\n            @exerciseType={{@exerciseType}}\\n            @disabled={{@disabled}}\\n            @groupValue={{this.groupValue}}\\n            @alternatives={{this.alternatives}}\\n            @onChange={{this.handleChange}}\\n            @showKey={{@showKey}}\\n            @showValidationAndOption={{this.showValidationAndOption}}\\n            @assignmentAnswer={{this.input}}\\n            @isMultiple={{this.isMultiple}}\\n            @onEnter={{this.handleEnter}}\\n            @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n            @assignmentId={{@assignment.uuid}}\\n            @settings={{@assignment.settings}}\\n          />\\n\\n        </marker.Content>\\n\\n      </scope.Marker>\\n\\n    {{/each}}\\n\\n  </ExerciseView::Common::MarkerScope>\\n\\n  {{#if this.showIncompleteMessage}}\\n    <div class=\\\"incomplete-message\\\">\\n\\n      {{#if this.isMultiple}}\\n        {{t\\n          \\\"components.exerciseView.assignment.placeChoices.incompleteMessageMultiple\\\"\\n        }}\\n      {{else}}\\n        {{t\\n          \\\"components.exerciseView.assignment.placeChoices.incompleteMessage\\\"\\n        }}\\n      {{/if}}\\n\\n    </div>\\n  {{/if}}\\n\\n  {{#if this.showHint}}\\n    <ExerciseView::Common::Hint class=\\\"mt1 text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.placeChoices.hint\\\" htmlSafe=true}}\\n    </ExerciseView::Common::Hint>\\n  {{/if}}\\n\\n  {{#if this.highlightMarkers}}\\n    <div class=\\\"text-small mt1\\\">\\n      {{t\\n        \\\"components.exerciseView.assignment.placeChoices.highlightMarkersMessage\\\"\\n      }}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"place-choices-assignment\\\"\\n  {{did-update this.answerUpdated @assignmentAnswer.input}}\\n  ...attributes\\n>\\n\\n  <ExerciseView::Common::MarkerScope\\n    {{on \\\"click\\\" this.handleMarkerScopeClick}}\\n    @assignment={{@assignment}}\\n    as |scope|\\n  >\\n\\n    {{#each this.markers as |alternative|}}\\n\\n      <scope.Marker @x={{alternative.x}} @y={{alternative.y}} as |marker|>\\n\\n        <marker.Content\\n          class=\\\"place-choices-assignment-marker-content\\n            {{if\\n              this.highlightMarkers\\n              'place-choices-assignment-marker-content--highlight'\\n            }}\\\"\\n          @placement=\\\"middle\\\"\\n          @alignment=\\\"center\\\"\\n        >\\n\\n          <ExerciseView::Assignment::PlaceChoices::Item\\n            @alternative={{alternative}}\\n            @exerciseType={{@exerciseType}}\\n            @disabled={{@disabled}}\\n            @groupValue={{this.groupValue}}\\n            @alternatives={{this.alternatives}}\\n            @onChange={{this.handleChange}}\\n            @showKey={{@showKey}}\\n            @showValidationAndOption={{this.showValidationAndOption}}\\n            @assignmentAnswer={{this.input}}\\n            @isMultiple={{this.isMultiple}}\\n            @onEnter={{this.handleEnter}}\\n            @name={{concat \\\"assignment-\\\" @assignment.uuid}}\\n            @assignmentId={{@assignment.uuid}}\\n            @settings={{@assignment.settings}}\\n          />\\n\\n        </marker.Content>\\n\\n      </scope.Marker>\\n\\n    {{/each}}\\n\\n  </ExerciseView::Common::MarkerScope>\\n\\n  {{#if this.showIncompleteMessage}}\\n    <div class=\\\"incomplete-message\\\">\\n\\n      {{#if this.isMultiple}}\\n        {{t\\n          \\\"components.exerciseView.assignment.placeChoices.incompleteMessageMultiple\\\"\\n        }}\\n      {{else}}\\n        {{t\\n          \\\"components.exerciseView.assignment.placeChoices.incompleteMessage\\\"\\n        }}\\n      {{/if}}\\n\\n    </div>\\n  {{/if}}\\n\\n  {{#if this.showHint}}\\n    <ExerciseView::Common::Hint class=\\\"mt1 text-small\\\">\\n      {{t \\\"components.exerciseView.assignment.placeChoices.hint\\\" htmlSafe=true}}\\n    </ExerciseView::Common::Hint>\\n  {{/if}}\\n\\n  {{#if this.highlightMarkers}}\\n    <div class=\\\"text-small mt1\\\">\\n      {{t\\n        \\\"components.exerciseView.assignment.placeChoices.highlightMarkersMessage\\\"\\n      }}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-choices/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-choices/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentPlaceChoicesComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this._setAnswer();\n  }\n\n  @service assignmentEvents;\n\n  @tracked input;\n\n  @tracked groupValue;\n\n  @tracked highlightMarkers = false;\n\n  get isMultiple() {\n    return this.args.assignment?.settings?.multiple;\n  }\n\n  get showValidationAndOption() {\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n\n    return !showKey && showValidation;\n  }\n\n  get markers() {\n    return this.args.assignment?.content?.markers ?? [];\n  }\n\n  get showIncompleteMessage() {\n    return this.args.incomplete && isEmpty(this.groupValue);\n  }\n\n  @cached get showHint() {\n    const input = this.input;\n\n    // Never show hint if answer is correct or showing keys, and only on show validation\n    if (\n      !input ||\n      input.length === 0 ||\n      this.args.assignmentAnswer?.correct ||\n      this.args.showKey ||\n      !this.args.showValidation ||\n      this.args.disabled\n    ) {\n      return false;\n    }\n\n    const falseAlternatives = this.args.assignment?.content?.markers\n      ?.filterBy('correct', false)\n      .mapBy('uuid');\n\n    // Answer is not correct and we should not show keys, but show validation\n    // Don't show hint if there are any incorrect alternatives.\n    return !input.any((i) => falseAlternatives.includes(i));\n  }\n\n  @action handleChange(value) {\n    if (this.args.assignmentAnswer) {\n      this.input = this.isMultiple ? value : [value];\n      this.args.assignmentAnswer.input = this.input;\n    }\n    this._setGroupValue();\n    this.args.handleOnChange?.(value);\n  }\n\n  @action handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n\n  @action answerUpdated() {\n    this._setAnswer();\n  }\n\n  @action handleMarkerScopeClick(event) {\n    if (\n      this._isClickOnBackground(event.target) &&\n      this.args?.assignmentAnswer?.input?.length === 0\n    ) {\n      this.highlightMarkers = true;\n      setTimeout(() => {\n        this.highlightMarkers = false;\n      }, 1500);\n    }\n  }\n\n  _isClickOnBackground(element) {\n    return element?.classList?.contains('x-marker-scope-inner');\n  }\n\n  _setAnswer() {\n    this.input = this.args.assignmentAnswer?.input;\n    this._setGroupValue();\n  }\n\n  _setGroupValue() {\n    this.groupValue =\n      this.isMultiple || !this.input ? this.input : this.input.firstObject;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{class \\\"exercise-view-assignment-place-choices-item\\\" this.classNames}}\\n  ...attributes\\n>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--error\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-warning\\\" @name=\\\"t-warning\\\" />\\n  </div>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--success\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-happy\\\" @name=\\\"quite-happy\\\" />\\n  </div>\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--key\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-key\\\" @name=\\\"key\\\" />\\n  </div>\\n\\n  {{#if @isMultiple}}\\n\\n    <XCheckbox\\n      @disabled={{@disabled}}\\n      @name={{@name}}\\n      @onChange={{fn this.onChangeCheckbox @alternative.uuid}}\\n      @value={{@alternative.correct}}\\n      @checked={{this.checked}}\\n      @twoWay={{false}}\\n      onKeyDown={{this.onEnter}}\\n    />\\n\\n  {{else}}\\n    <UiRadioButton\\n      @disabled={{@disabled}}\\n      @name={{@name}}\\n      @onChange={{fn this.onChangeRadioButton @alternative.uuid}}\\n      @value={{@alternative.correct}}\\n      @checked={{this.checked}}\\n      @twoWay={{false}}\\n      onKeyDown={{this.onEnter}}\\n    />\\n\\n  {{/if}}\\n\\n</div>\", {\"contents\":\"<div\\n  class={{class \\\"exercise-view-assignment-place-choices-item\\\" this.classNames}}\\n  ...attributes\\n>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--error\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-warning\\\" @name=\\\"t-warning\\\" />\\n  </div>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--success\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-happy\\\" @name=\\\"quite-happy\\\" />\\n  </div>\\n  <div\\n    class=\\\"exercise-view-assignment-place-choices-item-validation exercise-view-assignment-place-choices-item-validation--key\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-key\\\" @name=\\\"key\\\" />\\n  </div>\\n\\n  {{#if @isMultiple}}\\n\\n    <XCheckbox\\n      @disabled={{@disabled}}\\n      @name={{@name}}\\n      @onChange={{fn this.onChangeCheckbox @alternative.uuid}}\\n      @value={{@alternative.correct}}\\n      @checked={{this.checked}}\\n      @twoWay={{false}}\\n      onKeyDown={{this.onEnter}}\\n    />\\n\\n  {{else}}\\n    <UiRadioButton\\n      @disabled={{@disabled}}\\n      @name={{@name}}\\n      @onChange={{fn this.onChangeRadioButton @alternative.uuid}}\\n      @value={{@alternative.correct}}\\n      @checked={{this.checked}}\\n      @twoWay={{false}}\\n      onKeyDown={{this.onEnter}}\\n    />\\n\\n  {{/if}}\\n\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-choices/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-choices/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentPlaceChoicesItemComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * alternative (object)\n   */\n\n  get checked() {\n    if (this.args.groupValue) {\n      if (this.args.isMultiple) {\n        return this.args.groupValue.includes(this.args.alternative.uuid);\n      } else {\n        return this.args.alternative.uuid === this.args.groupValue;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  get suffix() {\n    const alternative = this.args.alternative;\n    const showKey = this.args.showKey;\n    const showValidationAndOption = this.args.showValidationAndOption;\n    const input = this.args.assignmentAnswer;\n\n    if (showKey) {\n      return alternative?.correct ? 'key-correct' : 'key-incorrect';\n    }\n\n    if (showValidationAndOption && input?.includes(alternative.uuid)) {\n      return input.includes(alternative.uuid) === alternative.correct\n        ? 'success'\n        : 'error';\n    }\n\n    return null;\n  }\n\n  @action onChangeCheckbox(value) {\n    const groupValue = this.args.groupValue;\n\n    if (groupValue.includes(value)) {\n      groupValue.removeObject(value);\n    } else {\n      groupValue.addObject(value);\n    }\n    this.args.onChange(groupValue);\n  }\n\n  @action onChangeRadioButton(value) {\n    this.args.onChange(value);\n  }\n\n  @action onEnter(evt) {\n    if (evt.key === 'Enter') {\n      this.args.onEnter();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"place-images-image\\\">\\n  {{#if this.imageSrc}}\\n    <div>\\n      <div class=\\\"place-images-image-container\\\">\\n        <XImage\\n          class=\\\"place-images-image-object\\\"\\n          @source={{this.imageUrl}}\\n          @width={{this.image.imageWidth}}\\n          @height={{this.image.imageHeight}}\\n          @mimetype={{this.image.imageMimetype}}\\n          @alt={{or this.image.name \\\"Image\\\"}}\\n        />\\n      </div>\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"place-images-image\\\">\\n  {{#if this.imageSrc}}\\n    <div>\\n      <div class=\\\"place-images-image-container\\\">\\n        <XImage\\n          class=\\\"place-images-image-object\\\"\\n          @source={{this.imageUrl}}\\n          @width={{this.image.imageWidth}}\\n          @height={{this.image.imageHeight}}\\n          @mimetype={{this.image.imageMimetype}}\\n          @alt={{or this.image.name \\\"Image\\\"}}\\n        />\\n      </div>\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-images/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-images/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewPlaceImagesComponent extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n   get imageUrl() {\n    return `${this.image.imageUrl}&preserve-transparency=true`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"place-images-assignment\\\" ...attributes>\\n\\n  {{#if this.alternativeImagesProxy.isPending}}\\n    <DcLoader />\\n  {{else}}\\n\\n    <div class=\\\"place-images-image-holder mb1\\\">\\n      {{#if this.hasAlternatives}}\\n        {{#each this.input as |alternative|}}\\n          {{#unless alternative.assignedTo}}\\n            {{! template-lint-disable no-pointer-down-event-binding }}\\n            <UiButton\\n              class=\\\"place-images-alternative\\n                {{if\\n                  (eq alternative.uuid this.selectedAlternative.uuid)\\n                  'place-images-alternative-selected'\\n                }}\\n                {{this.highlightImageClass}}\\\"\\n              @appearance=\\\"none\\\"\\n              @onClick={{fn this.handleImageClick alternative}}\\n              {{on \\\"mousedown\\\" this.handleButtonHold}}\\n              {{on \\\"mouseup\\\" this.handleClearButtonHold}}\\n              {{on \\\"mouseleave\\\" this.triedDragItem}}\\n              data-test-image-alternative\\n            >\\n              <ExerciseView::Assignment::PlaceImages::Image\\n                @imageId={{alternative.image}}\\n                @assignmentId={{@assignment.id}}\\n              />\\n            </UiButton>\\n          {{/unless}}\\n        {{/each}}\\n      {{else}}\\n        <div\\n          class=\\\"place-images-no-alternatives text-center text-ui\\\"\\n          data-test-no-alternatives-left\\n        >\\n          {{t \\\"components.exerciseView.assignment.placeImages.imagesEmpty\\\"}}\\n        </div>\\n      {{/if}}\\n    </div>\\n\\n    <div class=\\\"flex\\\">\\n      {{#if this.showHint}}\\n        <ExerciseView::Common::Hint class=\\\"nt1 mb1 text-small\\\">\\n            <span class=\\\"text-bold\\\">\\n              {{t \\\"components.exerciseView.assignment.placeImages.hint\\\"}}\\n            </span>\\n            {{t \\\"components.exerciseView.assignment.placeImages.hintMessage\\\"}}\\n        </ExerciseView::Common::Hint>\\n      {{else if this.showClickHint}}\\n        <div class=\\\"nb1 text-small text-italic\\\">\\n          {{t \\\"components.exerciseView.assignment.placeImages.triedDrag\\\"}}\\n        </div>\\n      {{/if}}\\n    </div>\\n\\n    <ExerciseView::Common::MarkerScope\\n      @assignment={{@assignment}}\\n      {{on \\\"click\\\" this.handleClickOnBackgroundImage}}\\n      as |scope|\\n    >\\n\\n      {{#each this.markers as |markerItem|}}\\n\\n        <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n\\n          <ExerciseView::Assignment::PlaceImages::Marker\\n            @marker={{markerItem}}\\n            @markerComponent={{marker}}\\n            @isDropzone={{this.isDropzone}}\\n            @alternatives={{this.images}}\\n            @backgroundImage={{this.image}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @assignmentAnswer={{@assignmentAnswer}}\\n            @showValidation={{@showValidation}}\\n            @selectedAlternative={{this.selectedAlternative}}\\n            @onSelectMarker={{this.handleSelectMarker}}\\n            @alternativeImages={{this.alternativeImages}}\\n            @disabled={{@disabled}}\\n          />\\n\\n        </scope.Marker>\\n\\n      {{/each}}\\n\\n    </ExerciseView::Common::MarkerScope>\\n\\n  {{/if}}\\n\\n</div>\", {\"contents\":\"<div class=\\\"place-images-assignment\\\" ...attributes>\\n\\n  {{#if this.alternativeImagesProxy.isPending}}\\n    <DcLoader />\\n  {{else}}\\n\\n    <div class=\\\"place-images-image-holder mb1\\\">\\n      {{#if this.hasAlternatives}}\\n        {{#each this.input as |alternative|}}\\n          {{#unless alternative.assignedTo}}\\n            {{! template-lint-disable no-pointer-down-event-binding }}\\n            <UiButton\\n              class=\\\"place-images-alternative\\n                {{if\\n                  (eq alternative.uuid this.selectedAlternative.uuid)\\n                  'place-images-alternative-selected'\\n                }}\\n                {{this.highlightImageClass}}\\\"\\n              @appearance=\\\"none\\\"\\n              @onClick={{fn this.handleImageClick alternative}}\\n              {{on \\\"mousedown\\\" this.handleButtonHold}}\\n              {{on \\\"mouseup\\\" this.handleClearButtonHold}}\\n              {{on \\\"mouseleave\\\" this.triedDragItem}}\\n              data-test-image-alternative\\n            >\\n              <ExerciseView::Assignment::PlaceImages::Image\\n                @imageId={{alternative.image}}\\n                @assignmentId={{@assignment.id}}\\n              />\\n            </UiButton>\\n          {{/unless}}\\n        {{/each}}\\n      {{else}}\\n        <div\\n          class=\\\"place-images-no-alternatives text-center text-ui\\\"\\n          data-test-no-alternatives-left\\n        >\\n          {{t \\\"components.exerciseView.assignment.placeImages.imagesEmpty\\\"}}\\n        </div>\\n      {{/if}}\\n    </div>\\n\\n    <div class=\\\"flex\\\">\\n      {{#if this.showHint}}\\n        <ExerciseView::Common::Hint class=\\\"nt1 mb1 text-small\\\">\\n            <span class=\\\"text-bold\\\">\\n              {{t \\\"components.exerciseView.assignment.placeImages.hint\\\"}}\\n            </span>\\n            {{t \\\"components.exerciseView.assignment.placeImages.hintMessage\\\"}}\\n        </ExerciseView::Common::Hint>\\n      {{else if this.showClickHint}}\\n        <div class=\\\"nb1 text-small text-italic\\\">\\n          {{t \\\"components.exerciseView.assignment.placeImages.triedDrag\\\"}}\\n        </div>\\n      {{/if}}\\n    </div>\\n\\n    <ExerciseView::Common::MarkerScope\\n      @assignment={{@assignment}}\\n      {{on \\\"click\\\" this.handleClickOnBackgroundImage}}\\n      as |scope|\\n    >\\n\\n      {{#each this.markers as |markerItem|}}\\n\\n        <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n\\n          <ExerciseView::Assignment::PlaceImages::Marker\\n            @marker={{markerItem}}\\n            @markerComponent={{marker}}\\n            @isDropzone={{this.isDropzone}}\\n            @alternatives={{this.images}}\\n            @backgroundImage={{this.image}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @assignmentAnswer={{@assignmentAnswer}}\\n            @showValidation={{@showValidation}}\\n            @selectedAlternative={{this.selectedAlternative}}\\n            @onSelectMarker={{this.handleSelectMarker}}\\n            @alternativeImages={{this.alternativeImages}}\\n            @disabled={{@disabled}}\\n          />\\n\\n        </scope.Marker>\\n\\n      {{/each}}\\n\\n    </ExerciseView::Common::MarkerScope>\\n\\n  {{/if}}\\n\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-images/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-images/index.hbs\"}});\nimport { action, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { cached } from '@glimmer/tracking';\nimport clone from 'babel/utils/clone';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class ExerciseViewAssignmentPlaceImagesComponent extends Component {\n  @service store;\n\n  @tracked selectedAlternative;\n\n  @tracked selectedMarker;\n\n  @tracked highlightImages;\n\n  @tracked showClickHint;\n\n  @tracked buttonHold;\n\n  skipHighlight;\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get alternatives() {\n    return this.args.assignment?.content?.alternatives;\n  }\n\n  get images() {\n    return this.args.showKey ? this.alternatives : this.input;\n  }\n\n  get hasAlternatives() {\n    return this.input?.findBy('assignedTo', null);\n  }\n\n  get isDropzone() {\n    return this.args.assignment?.settings?.behavior === 'dropzone';\n  }\n\n  get highlightImageClass() {\n    return this.highlightImages ? 'place-images-alternative-highlight' : null;\n  }\n\n  @cached get imageProxy() {\n    let promise = resolve();\n\n    const imageId = this.args.assignment?.content?.image;\n\n    if (imageId) {\n      promise = this.store.findRecord('material', imageId);\n    }\n\n    return load(promise, this);\n  }\n\n  @cached get alternativeImagesProxy() {\n    const promises = [];\n\n    const alternatives = this.alternatives;\n\n    alternatives.forEach((alternative) => {\n      if (alternative.image) {\n        promises.push(this.store.findRecord('material', alternative.image));\n      }\n    });\n\n    return load(all(promises), this);\n  }\n\n  get image() {\n    return this.imageProxy.isResolved ? this.imageProxy.value : null;\n  }\n\n  get alternativeImages() {\n    return this.alternativeImagesProxy.isResolved\n      ? this.alternativeImagesProxy.value\n      : null;\n  }\n\n  get imageURL() {\n    return this.image?.imageURL;\n  }\n\n  get showHint() {\n    let incomplete = false;\n    if (!this.showClickHint && !this.validateAssignmentCompleted) {\n      this.args.assignment.content.markers.map((marker) => {\n        const markerStatus = this._markerStatus(marker);\n\n        if (!markerStatus) {\n          incomplete = true;\n        }\n      });\n    }\n    return incomplete;\n  }\n\n  get markers() {\n    const markers = this.args.assignment.content.markers\n      ? clone(this.args.assignment.content.markers)\n      : [];\n\n    markers.map((marker) => {\n      const markerStatus = this._markerStatus(marker);\n\n      if (\n        !this.validateAssignmentCompleted &&\n        !markerStatus &&\n        !this.selectedAlternative &&\n        !this.highlightImages\n      ) {\n        this._remainingMarker(marker);\n      }\n    });\n\n    return markers;\n  }\n\n  get validateAssignmentCompleted() {\n    if (!this.args.incomplete) return true;\n\n    return this.args.assignment.content.markers.every((marker) => {\n      if (marker.extra) return true;\n\n      if (this.input.mapBy('assignedTo').includes(marker.uuid)) return true;\n\n      return this.input?.findBy('assignedTo', null) ? false : true;\n    });\n  }\n\n  @action triedDragItem() {\n    if (this.buttonHold) {\n      this.showClickHint = true;\n      this.buttonHold = false;\n    }\n  }\n\n  @action handleButtonHold() {\n    this.buttonHold = true;\n  }\n\n  @action handleClearButtonHold() {\n    this.buttonHold = false;\n  }\n\n  @action handleSelectMarker(marker) {\n    if (this.args.disabled) return;\n\n    const alternative = this._markerAlternative(marker);\n\n    if (alternative) {\n      this.handleRemoveAlternative(alternative);\n    }\n\n    this.selectedMarker = marker;\n\n    if (this.selectedAlternative && !this._markerStatus(marker)) {\n      this.showClickHint = false;\n      this.handleAssignmentAnswer();\n      this.skipHighlight = true;\n      this._clearMarker();\n      this.selectedAlternative = null;\n    }\n  }\n\n  @action handleRemoveAlternative(alternative) {\n    if (this.args.disabled) return;\n\n    this._clearMarker();\n\n    this.input.map((item) => {\n      if (item.uuid === alternative.uuid) {\n        set(item, 'assignedTo', null);\n      }\n    });\n\n    this.skipHighlight = true;\n\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleAssignmentAnswer() {\n    this.input?.map((item) => {\n      if (item.uuid === this.selectedAlternative.uuid) {\n        set(item, 'assignedTo', this.selectedMarker.uuid);\n      }\n    });\n\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleImageClick(item) {\n    if (this.args.disabled) return;\n    this.showClickHint = false;\n    this.highlightImages = false;\n\n    this.selectedAlternative = item;\n    if (this.selectedMarker) {\n      this._clearMarker();\n    }\n  }\n\n  @action handleClickOnBackgroundImage() {\n    if (this.args.disabled) return;\n\n    if (this.skipHighlight || this.selectedAlternative) {\n      this.skipHighlight = false;\n    } else {\n      this.highlightImages = true;\n    }\n  }\n\n  _markerStatus(marker) {\n    return this.input?.findBy('assignedTo', marker.uuid);\n  }\n\n  _markerAlternative(marker) {\n    return this.input?.findBy('assignedTo', marker.uuid);\n  }\n\n  _remainingMarker(marker) {\n    marker.incomplete = true;\n  }\n\n  _clearMarker() {\n    this.selectedMarker = null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"place-images-item-marker-container {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <div class=\\\"flex flex-center\\\">\\n\\n    {{#if this.suffix}}\\n      <div class=\\\"place-images-validation\\\">\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--error\\\"\\n          data-test-validation-error\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-warning\\\" @name=\\\"t-warning\\\" />\\n        </div>\\n\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--success\\\"\\n          data-test-validation-success\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-happy\\\" @name=\\\"quite-happy\\\" />\\n        </div>\\n\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--key\\\"\\n          data-test-validation-key\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-key\\\" @name=\\\"key\\\" />\\n        </div>\\n      </div>\\n    {{/if}}\\n\\n    {{yield}}\\n\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"place-images-item-marker-container {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <div class=\\\"flex flex-center\\\">\\n\\n    {{#if this.suffix}}\\n      <div class=\\\"place-images-validation\\\">\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--error\\\"\\n          data-test-validation-error\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-warning\\\" @name=\\\"t-warning\\\" />\\n        </div>\\n\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--success\\\"\\n          data-test-validation-success\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-happy\\\" @name=\\\"quite-happy\\\" />\\n        </div>\\n\\n        <div\\n          class=\\\"place-images-item-validation place-images-item-validation--key\\\"\\n          data-test-validation-key\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-images-item-validation-key\\\" @name=\\\"key\\\" />\\n        </div>\\n      </div>\\n    {{/if}}\\n\\n    {{yield}}\\n\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-images/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-images/item/index.hbs\"}});\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewPlaceImagesItemComponent extends ItemStateComponent {\n  get suffix() {\n    let suffix;\n\n    const alternatives = this.args.assignment?.content.alternatives;\n    const showValidation = this.args.showValidation;\n    const assignedAlternative = this.args.assignedAlternative;\n    const assignmentAnswer = this.args.assignmentAnswer;\n\n    let alternative = alternatives.findBy('uuid', assignedAlternative?.uuid);\n    let answer = assignmentAnswer.input.findBy('uuid', alternative?.uuid);\n\n    // This fix has been added to handle cases where the same image should be accepted at multiple points.\n    const duplicateImages = alternatives.filter(\n      (item) => item.image === answer.image\n    );\n\n    if (this.args.showKey) {\n      suffix = 'key-correct';\n    } else {\n      if (showValidation) {\n        if (\n          duplicateImages.some(\n            (image) => image?.assignedTo === answer?.assignedTo\n          )\n        ) {\n          suffix = 'success';\n        } else {\n          suffix = 'error';\n        }\n      }\n    }\n\n    return suffix;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @assignedAlternative}}\\n  <ExerciseView::Assignment::PlaceImages::Item\\n    @marker={{@marker}}\\n    @assignment={{@assignment}}\\n    @showKey={{@showKey}}\\n    @assignmentAnswer={{@assignmentAnswer}}\\n    @assignedAlternative={{@assignedAlternative}}\\n    @showValidation={{@showValidation}}\\n    @alternatives={{@alternatives}}\\n    @onRemove={{@onRemove}}\\n    data-test-attached-alternative\\n    >\\n    <XImage\\n      class=\\\"place-images-image\\\"\\n      @source={{this.imageUrl}}\\n      @width={{this.image.imageWidth}}\\n      @height={{this.image.imageHeight}}\\n    />\\n  </ExerciseView::Assignment::PlaceImages::Item>\\n{{/if}}\", {\"contents\":\"{{#if @assignedAlternative}}\\n  <ExerciseView::Assignment::PlaceImages::Item\\n    @marker={{@marker}}\\n    @assignment={{@assignment}}\\n    @showKey={{@showKey}}\\n    @assignmentAnswer={{@assignmentAnswer}}\\n    @assignedAlternative={{@assignedAlternative}}\\n    @showValidation={{@showValidation}}\\n    @alternatives={{@alternatives}}\\n    @onRemove={{@onRemove}}\\n    data-test-attached-alternative\\n    >\\n    <XImage\\n      class=\\\"place-images-image\\\"\\n      @source={{this.imageUrl}}\\n      @width={{this.image.imageWidth}}\\n      @height={{this.image.imageHeight}}\\n    />\\n  </ExerciseView::Assignment::PlaceImages::Item>\\n{{/if}}\",\"moduleName\":\"babel/components/exercise-view/assignment/place-images/marker-image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-images/marker-image/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentPlaceImagesMarkerImageComponent extends Component {\n  get image() {\n    return this.args.alternativeImages?.findBy('id', this.args.imageId);\n  }\n\n  get imageUrl() {\n    return `${this.image.imageUrl}&preserve-transparency=true`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.showMarker}}\\n  <button\\n    class=\\\"place-images-marker {{this.markerClass}}\\\"\\n    type=\\\"button\\\"\\n    {{style-variable \\\"x\\\" (concat @marker.x \\\"%\\\")}}\\n    {{style-variable \\\"y\\\" (concat @marker.y \\\"%\\\")}}\\n    {{on \\\"click\\\" this.handleSelectMarker}}\\n    data-test-image-marker\\n    ...attributes\\n    >\\n      <span class=\\\"place-images-marker-span\\\">\\n        {{#if this.markerIcon}}\\n          <DcIcon @size=\\\"sm\\\" @name={{this.markerIcon}} />\\n        {{/if}}\\n      </span>\\n  </button>\\n{{/if}}\\n\\n<@markerComponent.Content\\n  class=\\\"place-images-marker-content {{if this.isDropped 'place-images-marker-content-dropped'}}\\\"\\n  @width={{@marker.width}}\\n  @height={{this.dropzoneHeight}}\\n  @placement={{this.placement}}\\n  @alignment={{this.alignment}}\\n>\\n  {{#if this.showDropzone}}\\n    <UiButton\\n      class={{this.dropzoneClass}}\\n      @appearance=\\\"none\\\"\\n      @onClick={{this.handleSelectMarker}}\\n      data-test-dropzone\\n    >\\n      {{#if this.isDroppable}}\\n        <div\\n          class=\\\"place-images-marker-content-dropzone-button\\\"\\n          data-test-droppable\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-words-dropzone--icon\\\" @name={{this.markerIcon}} />\\n        </div>\\n      {{/if}}\\n    </UiButton>\\n  {{/if}}\\n  <ExerciseView::Assignment::PlaceImages::MarkerImage\\n    @marker={{@marker}}\\n    @assignment={{@assignment}}\\n    @imageId={{this.assignedAlternative.image}}\\n    @showKey={{@showKey}}\\n    @showValidation={{@showValidation}}\\n    @assignedAlternative={{this.assignedAlternative}}\\n    @assignmentAnswer={{@assignmentAnswer}}\\n    @alternatives={{@alternatives}}\\n    @alternativeImages={{@alternativeImages}}\\n  />\\n</@markerComponent.Content>\\n\", {\"contents\":\"{{#if this.showMarker}}\\n  <button\\n    class=\\\"place-images-marker {{this.markerClass}}\\\"\\n    type=\\\"button\\\"\\n    {{style-variable \\\"x\\\" (concat @marker.x \\\"%\\\")}}\\n    {{style-variable \\\"y\\\" (concat @marker.y \\\"%\\\")}}\\n    {{on \\\"click\\\" this.handleSelectMarker}}\\n    data-test-image-marker\\n    ...attributes\\n    >\\n      <span class=\\\"place-images-marker-span\\\">\\n        {{#if this.markerIcon}}\\n          <DcIcon @size=\\\"sm\\\" @name={{this.markerIcon}} />\\n        {{/if}}\\n      </span>\\n  </button>\\n{{/if}}\\n\\n<@markerComponent.Content\\n  class=\\\"place-images-marker-content {{if this.isDropped 'place-images-marker-content-dropped'}}\\\"\\n  @width={{@marker.width}}\\n  @height={{this.dropzoneHeight}}\\n  @placement={{this.placement}}\\n  @alignment={{this.alignment}}\\n>\\n  {{#if this.showDropzone}}\\n    <UiButton\\n      class={{this.dropzoneClass}}\\n      @appearance=\\\"none\\\"\\n      @onClick={{this.handleSelectMarker}}\\n      data-test-dropzone\\n    >\\n      {{#if this.isDroppable}}\\n        <div\\n          class=\\\"place-images-marker-content-dropzone-button\\\"\\n          data-test-droppable\\n        >\\n          <DcIcon @size=\\\"sm\\\" class=\\\"place-words-dropzone--icon\\\" @name={{this.markerIcon}} />\\n        </div>\\n      {{/if}}\\n    </UiButton>\\n  {{/if}}\\n  <ExerciseView::Assignment::PlaceImages::MarkerImage\\n    @marker={{@marker}}\\n    @assignment={{@assignment}}\\n    @imageId={{this.assignedAlternative.image}}\\n    @showKey={{@showKey}}\\n    @showValidation={{@showValidation}}\\n    @assignedAlternative={{this.assignedAlternative}}\\n    @assignmentAnswer={{@assignmentAnswer}}\\n    @alternatives={{@alternatives}}\\n    @alternativeImages={{@alternativeImages}}\\n  />\\n</@markerComponent.Content>\\n\",\"moduleName\":\"babel/components/exercise-view/assignment/place-images/marker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-images/marker/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nconst PLACEMENT = {\n  'left-up': 'top',\n  'left-down': 'bottom',\n  'center-up': 'top',\n  'center-down': 'bottom',\n  'right-up': 'top',\n  'right-down': 'bottom',\n};\n\nconst ALIGNMENT = {\n  'left-up': 'end',\n  'left-down': 'end',\n  'center-up': 'center',\n  'center-down': 'center',\n  'right-up': 'start',\n  'right-down': 'start',\n};\nexport default class ExerciseViewAssignmentPlaceImagesMarkerComponent extends Component {\n  get assignedAlternative() {\n    let assignedAlternative;\n\n    this.args.alternatives?.map((alternative) => {\n      if (\n        alternative.assigned_to === this.args.marker.uuid ||\n        alternative.assignedTo === this.args.marker.uuid\n      ) {\n        assignedAlternative = alternative;\n      }\n    });\n    return assignedAlternative;\n  }\n\n  get isDroppable() {\n    return this.args.selectedAlternative && !this.assignedAlternative;\n  }\n\n  get markerAlternative() {\n    return this.args.assignment?.content?.alternatives?.findBy(\n      'assignedTo',\n      this.args.marker.uuid\n    );\n  }\n\n  get isDropped() {\n    return this.args.isDropzone && this.assignedAlternative;\n  }\n\n  get iconClass() {\n    return this.markerIcon ? 'place-images-marker-icon' : '';\n  }\n\n  get hasAlternativeImage() {\n    return this.args.image;\n  }\n\n  get isEmptyDropzone() {\n    return this.args.isDropzone && !this.hasAlternativeImage;\n  }\n\n  get dropzoneHeight() {\n    if (!this.isEmptyDropzone) {\n      return null;\n    }\n    let wrapperWidthPx = this.args.backgroundImage?.imageWidth;\n    let wrapperHeightPx = this.args.backgroundImage?.imageHeight;\n    let innerWidthPercent = this.args.marker?.width;\n    let innerHeightPx = this.image?.imageHeight;\n    let innerWidthPx = this.image?.imageWidth;\n\n    const aspectRatio = innerHeightPx / innerWidthPx;\n    const innerWidthPxScaled = (innerWidthPercent / 100) * wrapperWidthPx;\n    const heightPx = aspectRatio * innerWidthPxScaled;\n    const innerHeightPercent = (heightPx / wrapperHeightPx) * 100;\n\n    return innerHeightPercent || innerWidthPercent;\n  }\n\n  get imageId() {\n    if (this.markerAlternative?.image) {\n      return this.markerAlternative?.image;\n    } else {\n      return this.args.alternatives?.[0]?.image;\n    }\n  }\n\n  get image() {\n    return this.args.alternativeImages?.findBy('id', this.imageId);\n  }\n\n  get showMarker() {\n    if (this.args.disabled && this.args.isDropzone) {\n      return false;\n    }\n    return !this.args.isDropzone || this.assignedAlternative;\n  }\n\n  get showDropzone() {\n    return this.args.isDropzone && !this.assignedAlternative;\n  }\n\n  get markerIcon() {\n    if (this.args.disabled) return null;\n\n    if (this.args.selectedAlternative) {\n      return 'simple-add';\n    } else if (this.assignedAlternative) {\n      return 'simple-remove';\n    }\n    return null;\n  }\n\n  get markerClass() {\n    const classNames = [];\n\n    classNames.push(this.iconClass);\n\n    if (this.args.isDropzone) {\n      classNames.push('place-images-marker-dropzone');\n    }\n    if (this.args.marker.incomplete) {\n      classNames.push('place-images--incomplete');\n    }\n    return classNames.join(' ');\n  }\n\n  get dropzoneClass() {\n    const classNames = [];\n\n    classNames.push('place-images-marker-content-dropzone');\n\n    if (this.args.marker.incomplete) {\n      classNames.push('place-images-dropzone--incomplete');\n    }\n    return classNames.join(' ');\n  }\n\n  @action\n  handleSelectMarker() {\n    this.args.onSelectMarker?.(this.args.marker);\n  }\n\n  get placement() {\n    if (this.args.isDropzone) {\n      return 'bottom';\n    }\n    return PLACEMENT[this.args.marker.position];\n  }\n\n  get alignment() {\n    if (this.args.isDropzone) {\n      return 'end';\n    }\n    return ALIGNMENT[this.args.marker.position];\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div ...attributes>\\n\\n  <ExerciseView::Common::MarkerScope @assignment={{@assignment}} as |scope|>\\n\\n    {{#each @assignment.content.markers as |markerItem|}}\\n      <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n\\n        <marker.Content\\n          class=\\\"place-text-gaps-marker-content\\\"\\n          @width={{markerItem.width}}\\n          @height={{markerItem.height}}\\n          @placement=\\\"bottom\\\"\\n          @alignment=\\\"center\\\"\\n        >\\n\\n          <ExerciseView::Assignment::PlaceTextGaps::Item\\n            @markerItem={{markerItem}}\\n            @assignmentAnswer={{@assignmentAnswer}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n            @disabled={{@disabled}}\\n            @incomplete={{@incomplete}}\\n            @onChange={{this.handleChange}}\\n            @onEnter={{this.handleEnter}}\\n          />\\n\\n        </marker.Content>\\n\\n      </scope.Marker>\\n\\n    {{/each}}\\n\\n  </ExerciseView::Common::MarkerScope>\\n\\n</div>\", {\"contents\":\"<div ...attributes>\\n\\n  <ExerciseView::Common::MarkerScope @assignment={{@assignment}} as |scope|>\\n\\n    {{#each @assignment.content.markers as |markerItem|}}\\n      <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n\\n        <marker.Content\\n          class=\\\"place-text-gaps-marker-content\\\"\\n          @width={{markerItem.width}}\\n          @height={{markerItem.height}}\\n          @placement=\\\"bottom\\\"\\n          @alignment=\\\"center\\\"\\n        >\\n\\n          <ExerciseView::Assignment::PlaceTextGaps::Item\\n            @markerItem={{markerItem}}\\n            @assignmentAnswer={{@assignmentAnswer}}\\n            @assignment={{@assignment}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n            @disabled={{@disabled}}\\n            @incomplete={{@incomplete}}\\n            @onChange={{this.handleChange}}\\n            @onEnter={{this.handleEnter}}\\n          />\\n\\n        </marker.Content>\\n\\n      </scope.Marker>\\n\\n    {{/each}}\\n\\n  </ExerciseView::Common::MarkerScope>\\n\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-text-gaps/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-text-gaps/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentPlaceTextGapsComponent extends Component {\n  @service assignmentEvents;\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  @action\n  handleChange(marker, event) {\n    const input = this.input?.findBy('uuid', marker.uuid);\n    if (input) {\n      input.value = event.target.value;\n      this.args?.handleOnChange(this.input);\n    }\n  }\n\n  @action\n  handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.showFeedbackIcons}}\\n  <div class=\\\"place-text-gaps-marker-content-validation\\\">\\n    <DcIcon\\n      class={{this.validationClass @markerItem}}\\n      @name={{this.validationIcon @markerItem}}\\n    />\\n  </div>\\n{{/if}}\\n\\n<div\\n  class={{class\\n    \\\"exercise-view-assignment-place-text-gaps-item\\\"\\n    this.classNames\\n  }}\\n  ...attributes\\n>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--error\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-warning\\\" @name=\\\"t-warning\\\" />\\n  </div>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--success\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-happy\\\" @name=\\\"quite-happy\\\" />\\n  </div>\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--key\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-key\\\" @name=\\\"key\\\" />\\n  </div>\\n\\n  {{! template-lint-disable require-input-label }}\\n  <input\\n    class=\\\"place-text-gaps-input\\\"\\n    type=\\\"text\\\"\\n    value={{this.value}}\\n    autocapitalize=\\\"off\\\"\\n    autocomplete=\\\"off\\\"\\n    spellcheck={{false}}\\n    autocorrect=\\\"off\\\"\\n    disabled={{@disabled}}\\n    {{on \\\"input\\\" (fn @onChange @markerItem)}}\\n    {{on \\\"keydown\\\" this.handleInputKeyDown}}\\n    {{style-variable \\\"fontSize\\\" (concat @markerItem.fontSize \\\"px\\\")}}\\n    {{did-insert this.setElement}}\\n  />\\n</div>\", {\"contents\":\"{{#if this.showFeedbackIcons}}\\n  <div class=\\\"place-text-gaps-marker-content-validation\\\">\\n    <DcIcon\\n      class={{this.validationClass @markerItem}}\\n      @name={{this.validationIcon @markerItem}}\\n    />\\n  </div>\\n{{/if}}\\n\\n<div\\n  class={{class\\n    \\\"exercise-view-assignment-place-text-gaps-item\\\"\\n    this.classNames\\n  }}\\n  ...attributes\\n>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--error\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-warning\\\" @name=\\\"t-warning\\\" />\\n  </div>\\n\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--success\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-happy\\\" @name=\\\"quite-happy\\\" />\\n  </div>\\n  <div\\n    class=\\\"exercise-view-assignment-place-text-gaps-item-validation exercise-view-assignment-place-text-gaps-item-validation--key\\\"\\n  >\\n    <DcIcon class=\\\"horizontal-key\\\" @name=\\\"key\\\" />\\n  </div>\\n\\n  {{! template-lint-disable require-input-label }}\\n  <input\\n    class=\\\"place-text-gaps-input\\\"\\n    type=\\\"text\\\"\\n    value={{this.value}}\\n    autocapitalize=\\\"off\\\"\\n    autocomplete=\\\"off\\\"\\n    spellcheck={{false}}\\n    autocorrect=\\\"off\\\"\\n    disabled={{@disabled}}\\n    {{on \\\"input\\\" (fn @onChange @markerItem)}}\\n    {{on \\\"keydown\\\" this.handleInputKeyDown}}\\n    {{style-variable \\\"fontSize\\\" (concat @markerItem.fontSize \\\"px\\\")}}\\n    {{did-insert this.setElement}}\\n  />\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-text-gaps/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-text-gaps/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { isBlank } from '@ember/utils';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\nimport { isPlaceTextGapWordCorrect } from 'babel/utils/assignments';\n\nexport default class ExerciseViewAssignmentPlaceTextGapsItemComponent extends ItemStateComponent {\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get value() {\n    if (this.args?.showKey) {\n      return this.args.markerItem.word ?? '';\n    }\n\n    const input = this.input?.findBy('uuid', this.args.markerItem.uuid);\n\n    if (input?.value) {\n      return input.value;\n    }\n\n    return '';\n  }\n\n  get suffix() {\n    if (this.args.showKey) {\n      return 'key';\n    }\n\n    if (this.args.incomplete && isBlank(this.value)) {\n      return 'error';\n    }\n\n    const showValidation = this.args.showValidation;\n\n    if (showValidation) {\n      const marker = this.args.markerItem;\n      const input = this.input?.findBy('uuid', marker.uuid);\n      const corrections = this.args.assignment.settings.correctionwrite;\n\n      const isCorrect = isPlaceTextGapWordCorrect(\n        marker.word,\n        input?.value,\n        corrections\n      );\n      return isCorrect ? 'success' : 'error';\n    }\n\n    return null;\n  }\n\n  @action\n  handleInputKeyDown(evt) {\n    if (evt.key === 'Enter') {\n      this.args.onEnter();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"place-words-assignment {{this.presetClass}} \\\" ...attributes>\\n  <div class=\\\"item-container\\\">\\n    {{#if this.hasItems}}\\n      {{#each this.input as |item|}}\\n        {{#unless item.assignedTo}}\\n          <UiButton\\n            class=\\\"place-words-items text-base\\n              {{this.highlightWordsClass}}\\n              {{if (eq this.selectedItem item) 'place-words-items-selected'}}\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{fn this.handleLabelClick item}}\\n            {{on \\\"mousedown\\\" (fn this.handleButtonHold item)}}\\n            {{on \\\"mouseup\\\" this.handleClearButtonHold}}\\n            {{on \\\"mouseleave\\\" this.triedDragItem}}\\n          >\\n            <div>\\n              <TbRenderInline @value={{item.value}} />\\n            </div>\\n          </UiButton>\\n        {{/unless}}\\n      {{/each}}\\n    {{else}}\\n      <div\\n        class=\\\"place-words-assignment-no-words flex justify-center text-bold\\\"\\n      >\\n        {{t \\\"components.exerciseView.assignment.placeWords.wordsEmpty\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  <div class=\\\"flex text-small\\\">\\n    {{#if this.showHint}}\\n      <ExerciseView::Common::Hint class=\\\"nt1 mb1\\\">\\n        <span class=\\\"text-bold\\\">\\n          {{t \\\"components.exerciseView.assignment.placeWords.hint\\\"}}\\n        </span>\\n        {{t \\\"components.exerciseView.assignment.placeWords.hintMessage\\\"}}\\n      </ExerciseView::Common::Hint>\\n    {{else if this.showClickHint}}\\n      <div class=\\\"nb1 text-small text-italic\\\">\\n        {{t \\\"components.exerciseView.assignment.placeWords.triedDrag\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  <div class=\\\"flex flex-column flex-center\\\">\\n    <ExerciseView::Common::MarkerScope\\n      @assignment={{@assignment}}\\n      {{on \\\"click\\\" this.handleClickOnImage}}\\n      as |scope|\\n    >\\n      <div class=\\\"place-words-canvas\\\">\\n        {{#each this.markers as |markerItem|}}\\n          <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n            <ExerciseView::Assignment::PlaceWords::Marker\\n              @markerComponent={{marker}}\\n              @markerItem={{markerItem}}\\n              @labels={{this.labels}}\\n              @assignment={{@assignment}}\\n              @onRemoveLabel={{this.handleRemoveLabel}}\\n              @showKey={{@showKey}}\\n              @validationIsVisible={{this.validationIsVisible}}\\n              @assignmentAnswer={{@assignmentAnswer}}\\n              @handleSelectMarker={{this.handleSelectMarker}}\\n              @labelHeight={{this.labelHeight}}\\n              @labelWidth={{this.labelWidth}}\\n              @textSize={{this.textSize}}\\n              @behavior={{this.behavior}}\\n            />\\n          </scope.Marker>\\n        {{/each}}\\n      </div>\\n    </ExerciseView::Common::MarkerScope>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"place-words-assignment {{this.presetClass}} \\\" ...attributes>\\n  <div class=\\\"item-container\\\">\\n    {{#if this.hasItems}}\\n      {{#each this.input as |item|}}\\n        {{#unless item.assignedTo}}\\n          <UiButton\\n            class=\\\"place-words-items text-base\\n              {{this.highlightWordsClass}}\\n              {{if (eq this.selectedItem item) 'place-words-items-selected'}}\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{fn this.handleLabelClick item}}\\n            {{on \\\"mousedown\\\" (fn this.handleButtonHold item)}}\\n            {{on \\\"mouseup\\\" this.handleClearButtonHold}}\\n            {{on \\\"mouseleave\\\" this.triedDragItem}}\\n          >\\n            <div>\\n              <TbRenderInline @value={{item.value}} />\\n            </div>\\n          </UiButton>\\n        {{/unless}}\\n      {{/each}}\\n    {{else}}\\n      <div\\n        class=\\\"place-words-assignment-no-words flex justify-center text-bold\\\"\\n      >\\n        {{t \\\"components.exerciseView.assignment.placeWords.wordsEmpty\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  <div class=\\\"flex text-small\\\">\\n    {{#if this.showHint}}\\n      <ExerciseView::Common::Hint class=\\\"nt1 mb1\\\">\\n        <span class=\\\"text-bold\\\">\\n          {{t \\\"components.exerciseView.assignment.placeWords.hint\\\"}}\\n        </span>\\n        {{t \\\"components.exerciseView.assignment.placeWords.hintMessage\\\"}}\\n      </ExerciseView::Common::Hint>\\n    {{else if this.showClickHint}}\\n      <div class=\\\"nb1 text-small text-italic\\\">\\n        {{t \\\"components.exerciseView.assignment.placeWords.triedDrag\\\"}}\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  <div class=\\\"flex flex-column flex-center\\\">\\n    <ExerciseView::Common::MarkerScope\\n      @assignment={{@assignment}}\\n      {{on \\\"click\\\" this.handleClickOnImage}}\\n      as |scope|\\n    >\\n      <div class=\\\"place-words-canvas\\\">\\n        {{#each this.markers as |markerItem|}}\\n          <scope.Marker @x={{markerItem.x}} @y={{markerItem.y}} as |marker|>\\n            <ExerciseView::Assignment::PlaceWords::Marker\\n              @markerComponent={{marker}}\\n              @markerItem={{markerItem}}\\n              @labels={{this.labels}}\\n              @assignment={{@assignment}}\\n              @onRemoveLabel={{this.handleRemoveLabel}}\\n              @showKey={{@showKey}}\\n              @validationIsVisible={{this.validationIsVisible}}\\n              @assignmentAnswer={{@assignmentAnswer}}\\n              @handleSelectMarker={{this.handleSelectMarker}}\\n              @labelHeight={{this.labelHeight}}\\n              @labelWidth={{this.labelWidth}}\\n              @textSize={{this.textSize}}\\n              @behavior={{this.behavior}}\\n            />\\n          </scope.Marker>\\n        {{/each}}\\n      </div>\\n    </ExerciseView::Common::MarkerScope>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-words/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-words/index.hbs\"}});\nimport { action, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport clone from 'babel/utils/clone';\nimport Resource from 'babel/utils/resource';\n\n/**\n * Arguments:\n * assignment (object)\n * canHaveAttachments (bool)\n * assignmentAnswer (object)\n * answer (object)\n * handleOnChange (function)\n * showValidation (bool)\n * showKey (bool)\n * disabled (bool)\n * showSuggestion (bool)\n * incomplete (bool)\n * image (object)\n */\n\nexport default class ExerciseViewAssignmentPlaceWordsComponent extends Component {\n  @service store;\n\n  @tracked selectedItem;\n\n  @tracked selectedMarker;\n\n  @tracked highlightWords;\n\n  @tracked meta;\n\n  @tracked buttonHold;\n\n  @tracked showClickHint;\n\n  skipHighlighWords;\n\n  resource = new Resource(async () => {\n    let imageId = this.args.assignment?.content?.image;\n\n    if (imageId) {\n      const image = await this.store.findRecord('material', imageId);\n      return {\n        image,\n      };\n    }\n\n    return {\n      image: null,\n    };\n  });\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get validationIsVisible() {\n    const showKey = this.args.showKey;\n    const showValidation = this.args.showValidation;\n\n    return !showKey && showValidation;\n  }\n\n  get hasItems() {\n    return this.input?.findBy('assignedTo', null);\n  }\n\n  get alternatives() {\n    return this.args.assignment?.content?.alternatives;\n  }\n\n  get labels() {\n    return this.args.showKey ? this.alternatives : this.input;\n  }\n\n  get highlightWordsClass() {\n    return this.highlightWords ? 'word-highlight' : null;\n  }\n\n  get markers() {\n    const markers = this.args.assignment.content.markers\n      ? clone(this.args.assignment.content.markers)\n      : [];\n\n    markers.map((marker) => {\n      const markerStatus = this._markerStatus(marker);\n\n      if (\n        !this.validateAssignmentCompleted &&\n        !markerStatus &&\n        !this.selectedItem &&\n        !this.highlightWords\n      ) {\n        this._remainingMarker(marker);\n      }\n\n      if (this.selectedItem) {\n        this._highlightMarker(marker);\n      }\n    });\n\n    return markers;\n  }\n\n  get showHint() {\n    let incomplete = false;\n    if (!this.showClickHint && !this.validateAssignmentCompleted) {\n      this.args.assignment.content.markers.map((marker) => {\n        const markerStatus = this._markerStatus(marker);\n\n        if (!markerStatus) {\n          incomplete = true;\n        }\n      });\n    }\n    return incomplete;\n  }\n\n  get validateAssignmentCompleted() {\n    if (!this.args.incomplete) return true;\n\n    return this.args.assignment.content.markers.every((marker) => {\n      if (marker.extra) return true;\n\n      if (this.input.mapBy('assignedTo').includes(marker.uuid)) return true;\n\n      return this.input?.findBy('assignedTo', null) ? false : true;\n    });\n  }\n\n  get labelWidth() {\n    const width = (80 / 480) * 100;\n    return width;\n  }\n\n  get behavior() {\n    return this.args.assignment.settings.behaviour ?? 'marker';\n  }\n\n  @action handleLabelClick(item) {\n    if (this.args.disabled) return;\n    this.showClickHint = false;\n\n    this.highlightWords = false;\n    this.selectedItem = item;\n    if (this.selectedMarker) {\n      this._clearMarker();\n    }\n  }\n\n  @action handleSelectMarker(marker) {\n    if (this.args.disabled) return;\n\n    const label = this._markerLabel(marker);\n\n    if (label) {\n      this.onRemoveLabel(label);\n    }\n\n    this.selectedMarker = marker;\n\n    if (this.selectedItem) {\n      this.showClickHint = false;\n      this.handleAssignmentAnswer();\n      this.skipHighlighWords = true;\n      this._clearMarker();\n      this.selectedItem = null;\n    }\n  }\n\n  @action handleRemoveLabel(label) {\n    this.onRemoveLabel(label);\n    this.selectedItem = null;\n  }\n\n  @action onRemoveLabel(label) {\n    if (this.args.disabled) return;\n\n    this.highlightWords = false;\n\n    this._clearMarker();\n\n    this.input.map((item) => {\n      if (item == label) {\n        set(item, 'assignedTo', null);\n      }\n    });\n\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleAssignmentAnswer() {\n    this.input.map((item) => {\n      if (item === this.selectedItem) {\n        set(item, 'assignedTo', this.selectedMarker.uuid);\n      }\n    });\n\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleClickOnImage() {\n    if (this.args.disabled) return;\n\n    if (this.skipHighlighWords || this.selectedItem) {\n      this.skipHighlighWords = false;\n    } else {\n      this.highlightWords = true;\n    }\n  }\n\n  @action handleClearButtonHold() {\n    this.buttonHold = false;\n  }\n\n  @action handleButtonHold(item, element) {\n    this.selectedItem = item;\n    this.buttonHold = true;\n  }\n\n  @action triedDragItem() {\n    if (this.buttonHold) {\n      this.showClickHint = true;\n      this.buttonHold = false;\n    }\n  }\n\n  // PRIVATE\n\n  _markerStatus(marker) {\n    return this.input?.findBy('assignedTo', marker.uuid)?.value;\n  }\n\n  _markerLabel(marker) {\n    return this.input?.findBy('assignedTo', marker.uuid);\n  }\n\n  _clearMarker() {\n    this.selectedMarker = null;\n  }\n\n  _remainingMarker(marker) {\n    marker.incomplete = true;\n  }\n\n  _highlightMarker(marker) {\n    marker.highlight = true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"place-words-container {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <div\\n    class=\\\"place-words-label\\\"\\n    {{style-variable \\\"fontSize\\\" (concat @textSize \\\"rem\\\")}}\\n  >\\n    <div class=\\\"text-color flex flex-center\\\">\\n      <div class=\\\"place-words-validation place-words-validation--error snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-warning\\\" @name=\\\"t-warning\\\" />\\n      </div>\\n\\n      <div class=\\\"place-words-validation place-words-validation--success snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-happy\\\" @name=\\\"quite-happy\\\" />\\n      </div>\\n\\n      <div class=\\\"place-words-validation place-words-validation--key snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-key\\\" @name=\\\"key\\\" />\\n      </div>\\n      <div>\\n        <TbRenderInline @value={{@label.value}} />\\n      </div>\\n      {{#if (and (not @showKey) (eq @behavior \\\"dropzone\\\"))}}\\n        <UiButton\\n          class=\\\"label-remove-btn text-small snl1\\\"\\n          @appearance=\\\"none\\\"\\n          @onClick={{fn @onRemoveLabel @label}}\\n        >\\n          <DcIcon @name=\\\"simple-remove\\\" />\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"place-words-container {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <div\\n    class=\\\"place-words-label\\\"\\n    {{style-variable \\\"fontSize\\\" (concat @textSize \\\"rem\\\")}}\\n  >\\n    <div class=\\\"text-color flex flex-center\\\">\\n      <div class=\\\"place-words-validation place-words-validation--error snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-warning\\\" @name=\\\"t-warning\\\" />\\n      </div>\\n\\n      <div class=\\\"place-words-validation place-words-validation--success snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-happy\\\" @name=\\\"quite-happy\\\" />\\n      </div>\\n\\n      <div class=\\\"place-words-validation place-words-validation--key snr1\\\">\\n        <DcIcon class=\\\"place-words-validation-key\\\" @name=\\\"key\\\" />\\n      </div>\\n      <div>\\n        <TbRenderInline @value={{@label.value}} />\\n      </div>\\n      {{#if (and (not @showKey) (eq @behavior \\\"dropzone\\\"))}}\\n        <UiButton\\n          class=\\\"label-remove-btn text-small snl1\\\"\\n          @appearance=\\\"none\\\"\\n          @onClick={{fn @onRemoveLabel @label}}\\n        >\\n          <DcIcon @name=\\\"simple-remove\\\" />\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-words/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-words/item/index.hbs\"}});\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewCommonInteractiveItemComponent extends ItemStateComponent {\n  get suffix() {\n    const input = this.args.assignmentAnswer;\n    const showKey = this.args.showKey;\n    const validationIsVisible = this.args.validationIsVisible;\n    const alternatives = this.args.assignment.content.alternatives;\n    const assignedTo = this.args.label.assignedTo;\n    const labelValue = this.args.label.value;\n    if (showKey) {\n      return 'key-correct';\n    } else if (validationIsVisible && input) {\n      return alternatives?.findBy('assigned_to', assignedTo)?.value ===\n        labelValue\n        ? 'success'\n        : 'error';\n    }\n\n    return null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (eq @behavior \\\"marker\\\")}}\\n  <div\\n    class=\\\"place-words-marker\\\"\\n    {{style-variable \\\"x\\\" (concat @markerItem.x \\\"%\\\")}}\\n    {{style-variable \\\"y\\\" (concat @markerItem.y \\\"%\\\")}}\\n  >\\n    <UiButton\\n      class={{this.markerClass}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{fn @handleSelectMarker @markerItem}}\\n    >\\n      <DcIcon @name={{this.markerIcon}} @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n{{/if}}\\n\\n<@markerComponent.Content\\n  class=\\\"place-images-marker-content\\\"\\n  @placement={{this._labelPlacement @markerItem.position}}\\n  @alignment={{this._labelAlignment @markerItem.position}}\\n  @width={{if (eq @behavior \\\"dropzone\\\") @labelWidth}}\\n>\\n  {{#if (eq @behavior \\\"dropzone\\\")}}\\n    <UiButton\\n      class={{this.markerClass}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{fn @handleSelectMarker @markerItem}}\\n    >\\n      &nbsp;\\n      {{#if @markerItem.highlight}}\\n        <DcIcon class=\\\"place-words-dropzone--icon\\\" @name={{this.markerIcon}} />\\n      {{/if}}\\n      &nbsp;\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.assignedAlternative}}\\n    <ExerciseView::Assignment::PlaceWords::Item\\n      @marker={{@markerItem}}\\n      @label={{this.assignedAlternative}}\\n      @assignment={{@assignment}}\\n      @onRemoveLabel={{@onRemoveLabel}}\\n      @showKey={{@showKey}}\\n      @validationIsVisible={{@validationIsVisible}}\\n      @assignmentAnswer={{@assignmentAnswer}}\\n      @behavior={{@behavior}}\\n    />\\n  {{/if}}\\n</@markerComponent.Content>\", {\"contents\":\"{{#if (eq @behavior \\\"marker\\\")}}\\n  <div\\n    class=\\\"place-words-marker\\\"\\n    {{style-variable \\\"x\\\" (concat @markerItem.x \\\"%\\\")}}\\n    {{style-variable \\\"y\\\" (concat @markerItem.y \\\"%\\\")}}\\n  >\\n    <UiButton\\n      class={{this.markerClass}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{fn @handleSelectMarker @markerItem}}\\n    >\\n      <DcIcon @name={{this.markerIcon}} @size=\\\"sm\\\" />\\n    </UiButton>\\n  </div>\\n{{/if}}\\n\\n<@markerComponent.Content\\n  class=\\\"place-images-marker-content\\\"\\n  @placement={{this._labelPlacement @markerItem.position}}\\n  @alignment={{this._labelAlignment @markerItem.position}}\\n  @width={{if (eq @behavior \\\"dropzone\\\") @labelWidth}}\\n>\\n  {{#if (eq @behavior \\\"dropzone\\\")}}\\n    <UiButton\\n      class={{this.markerClass}}\\n      @appearance=\\\"link\\\"\\n      @onClick={{fn @handleSelectMarker @markerItem}}\\n    >\\n      &nbsp;\\n      {{#if @markerItem.highlight}}\\n        <DcIcon class=\\\"place-words-dropzone--icon\\\" @name={{this.markerIcon}} />\\n      {{/if}}\\n      &nbsp;\\n    </UiButton>\\n  {{/if}}\\n\\n  {{#if this.assignedAlternative}}\\n    <ExerciseView::Assignment::PlaceWords::Item\\n      @marker={{@markerItem}}\\n      @label={{this.assignedAlternative}}\\n      @assignment={{@assignment}}\\n      @onRemoveLabel={{@onRemoveLabel}}\\n      @showKey={{@showKey}}\\n      @validationIsVisible={{@validationIsVisible}}\\n      @assignmentAnswer={{@assignmentAnswer}}\\n      @behavior={{@behavior}}\\n    />\\n  {{/if}}\\n</@markerComponent.Content>\",\"moduleName\":\"babel/components/exercise-view/assignment/place-words/marker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/place-words/marker/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nconst labelPlacement = {\n  'left-up': 'top',\n  'left-down': 'bottom',\n  'center-up': 'top',\n  'center-down': 'bottom',\n  'right-up': 'top',\n  'right-down': 'bottom',\n};\n\nconst labelAlignment = {\n  'left-up': 'end',\n  'left-down': 'end',\n  'center-up': 'center',\n  'center-down': 'center',\n  'right-up': 'start',\n  'right-down': 'start',\n};\n\nexport default class ExerciseViewAssignmentPlaceWordsMarkerComponent extends Component {\n  get assignedAlternative() {\n    let alternative;\n\n    this.args.labels?.map((label) => {\n      if (\n        label.assignedTo === this.args.markerItem.uuid ||\n        label.assigned_to === this.args.markerItem.uuid\n      ) {\n        alternative = label;\n      }\n    });\n\n    return alternative;\n  }\n\n  get markerIcon() {\n    if (this.args.markerItem.highlight) {\n      return 'simple-add';\n    } else if (this.assignedAlternative) {\n      return 'simple-remove';\n    }\n\n    return null;\n  }\n\n  get markerClass() {\n    const classNames = [];\n\n    if (this.args.behavior === 'marker') {\n      classNames.push('place-words-marker-button');\n\n      if (this.assignedAlternative) {\n        classNames.push('place-words-marker-button--assigned');\n      }\n    } else {\n      classNames.push('place-words-dropzone');\n\n      if (this.assignedAlternative) {\n        classNames.push('place-words-dropzone--hide');\n      }\n    }\n    if (this.args.markerItem.incomplete) {\n      classNames.push('place-words--incomplete');\n    }\n    return classNames.join(' ');\n  }\n\n  _labelPlacement(value) {\n    return labelPlacement[value];\n  }\n\n  _labelAlignment(value) {\n    return labelAlignment[value];\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"reply-image nr1\\\">\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"reply-image nr1\\\">\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/reply/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/reply/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewReplyImage extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"reply-assignment\\n    {{if this.hasUnit 'formula--has-unit '}}{{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <div class=\\\"flex\\\">\\n    {{#if @image}}\\n      <ExerciseView::Assignment::Reply::Image\\n        @imageId={{@image.id}}\\n        @width=\\\"150\\\"\\n        @height=\\\"132\\\"\\n      />\\n    {{/if}}\\n\\n    <div class=\\\"align-self-center flex-auto\\\">\\n      {{#if this.isFormula}}\\n        <div class=\\\"formula shake-on-error\\\">\\n          <div\\n            class=\\\"flex flex-grow math-input position-relative\\n              {{this.suffixClass}}\\\"\\n          >\\n            <div\\n              {{math-input\\n                disabled=this.inputDisabled\\n                value=this.inputValue\\n                onChange=this.onChange\\n                onEnter=this.handleEnter\\n              }}\\n            ></div>\\n\\n            {{#if (and @assignment.settings.clue @assignment.content.clue)}}\\n              <div class=\\\"clue-icon-math flex flex-center\\\">\\n                {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n                  <UiButton\\n                    class=\\\"nr1\\\"\\n                    @onClick={{this.handleToggleClue}}\\n                    @active={{this.showClue}}\\n                    @appearance=\\\"none\\\"\\n                  >\\n                    <span class=\\\"clue-icon-bg flex flex-center justify-center\\\">\\n                      <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n                    </span>\\n                  </UiButton>\\n\\n                  {{#if this.showClue}}\\n                    <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n                      <div class=\\\"p1\\\">\\n                        {{@assignment.content.clue}}\\n                      </div>\\n                    </XPopup>\\n                  {{/if}}\\n                {{/let}}\\n              </div>\\n            {{/if}}\\n          </div>\\n\\n          {{#if @assignment.settings.unit}}\\n            <div class=\\\"reply-math-unit\\\">\\n              <TbRenderInline @value={{@assignment.content.unit}} />\\n            </div>\\n          {{/if}}\\n\\n          <div class=\\\"flex flex-center ml1 nr1\\\">\\n            {{#let (generate-id \\\"formula-instruction\\\") as |id|}}\\n              <UiButton\\n                @appearance=\\\"none\\\"\\n                @id={{id}}\\n                @onClick={{fn (mut this.showFormulaInstructions) true}}\\n              >\\n                <DcIcon @name=\\\"command\\\" />\\n              </UiButton>\\n\\n              <XTooltip\\n                @content={{t\\n                  \\\"components.exerciseView.assignment.reply.instruction\\\"\\n                }}\\n                @for={{id}}\\n                @placement=\\\"top\\\"\\n              />\\n            {{/let}}\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"position-relative\\\">\\n          <UiInput\\n            @disabled={{this.inputDisabled}}\\n            @variant={{this.suffix}}\\n            @value={{this.inputValue}}\\n            @placeholder={{@assignment.content.placeholder}}\\n            @onChange={{this.onChange}}\\n            @onEnter={{this.handleEnter}}\\n            @sync={{false}}\\n            data-test-reply-input\\n          />\\n\\n          {{#if (and @assignment.settings.clue @assignment.content.clue)}}\\n            {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n              <UiButton\\n                class=\\\"clue-icon nr1\\\"\\n                @onClick={{this.handleToggleClue}}\\n                @active={{this.showClue}}\\n                @appearance=\\\"none\\\"\\n              >\\n                <span class=\\\"clue-icon-bg flex flex-center justify-center\\\">\\n                  <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n                </span>\\n              </UiButton>\\n\\n              {{#if this.showClue}}\\n                <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n                  <div class=\\\"p1\\\">\\n                    {{@assignment.content.clue}}\\n                  </div>\\n                </XPopup>\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </div>\\n\\n  {{#if this.showFormulaInstructions}}\\n    <XModal\\n      @title={{t \\\"components.exerciseView.assignment.reply.mathHelp.title\\\"}}\\n      @onClose={{fn (mut this.showFormulaInstructions) false}}\\n      @closeButtonLabel={{t \\\"components.exerciseView.assignment.reply.close\\\"}}\\n      @size={{hash width=\\\"medium\\\" height=\\\"auto\\\"}}\\n    >\\n      <div class=\\\"p1\\\">\\n        <ContentPresenter>\\n          {{t\\n            \\\"components.exerciseView.assignment.reply.mathHelp.content\\\"\\n            htmlSafe=true\\n          }}\\n        </ContentPresenter>\\n      </div>\\n    </XModal>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"reply-assignment\\n    {{if this.hasUnit 'formula--has-unit '}}{{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <div class=\\\"flex\\\">\\n    {{#if @image}}\\n      <ExerciseView::Assignment::Reply::Image\\n        @imageId={{@image.id}}\\n        @width=\\\"150\\\"\\n        @height=\\\"132\\\"\\n      />\\n    {{/if}}\\n\\n    <div class=\\\"align-self-center flex-auto\\\">\\n      {{#if this.isFormula}}\\n        <div class=\\\"formula shake-on-error\\\">\\n          <div\\n            class=\\\"flex flex-grow math-input position-relative\\n              {{this.suffixClass}}\\\"\\n          >\\n            <div\\n              {{math-input\\n                disabled=this.inputDisabled\\n                value=this.inputValue\\n                onChange=this.onChange\\n                onEnter=this.handleEnter\\n              }}\\n            ></div>\\n\\n            {{#if (and @assignment.settings.clue @assignment.content.clue)}}\\n              <div class=\\\"clue-icon-math flex flex-center\\\">\\n                {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n                  <UiButton\\n                    class=\\\"nr1\\\"\\n                    @onClick={{this.handleToggleClue}}\\n                    @active={{this.showClue}}\\n                    @appearance=\\\"none\\\"\\n                  >\\n                    <span class=\\\"clue-icon-bg flex flex-center justify-center\\\">\\n                      <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n                    </span>\\n                  </UiButton>\\n\\n                  {{#if this.showClue}}\\n                    <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n                      <div class=\\\"p1\\\">\\n                        {{@assignment.content.clue}}\\n                      </div>\\n                    </XPopup>\\n                  {{/if}}\\n                {{/let}}\\n              </div>\\n            {{/if}}\\n          </div>\\n\\n          {{#if @assignment.settings.unit}}\\n            <div class=\\\"reply-math-unit\\\">\\n              <TbRenderInline @value={{@assignment.content.unit}} />\\n            </div>\\n          {{/if}}\\n\\n          <div class=\\\"flex flex-center ml1 nr1\\\">\\n            {{#let (generate-id \\\"formula-instruction\\\") as |id|}}\\n              <UiButton\\n                @appearance=\\\"none\\\"\\n                @id={{id}}\\n                @onClick={{fn (mut this.showFormulaInstructions) true}}\\n              >\\n                <DcIcon @name=\\\"command\\\" />\\n              </UiButton>\\n\\n              <XTooltip\\n                @content={{t\\n                  \\\"components.exerciseView.assignment.reply.instruction\\\"\\n                }}\\n                @for={{id}}\\n                @placement=\\\"top\\\"\\n              />\\n            {{/let}}\\n          </div>\\n        </div>\\n      {{else}}\\n        <div class=\\\"position-relative\\\">\\n          <UiInput\\n            @disabled={{this.inputDisabled}}\\n            @variant={{this.suffix}}\\n            @value={{this.inputValue}}\\n            @placeholder={{@assignment.content.placeholder}}\\n            @onChange={{this.onChange}}\\n            @onEnter={{this.handleEnter}}\\n            @sync={{false}}\\n            data-test-reply-input\\n          />\\n\\n          {{#if (and @assignment.settings.clue @assignment.content.clue)}}\\n            {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n              <UiButton\\n                class=\\\"clue-icon nr1\\\"\\n                @onClick={{this.handleToggleClue}}\\n                @active={{this.showClue}}\\n                @appearance=\\\"none\\\"\\n              >\\n                <span class=\\\"clue-icon-bg flex flex-center justify-center\\\">\\n                  <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n                </span>\\n              </UiButton>\\n\\n              {{#if this.showClue}}\\n                <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n                  <div class=\\\"p1\\\">\\n                    {{@assignment.content.clue}}\\n                  </div>\\n                </XPopup>\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </div>\\n\\n  {{#if this.showFormulaInstructions}}\\n    <XModal\\n      @title={{t \\\"components.exerciseView.assignment.reply.mathHelp.title\\\"}}\\n      @onClose={{fn (mut this.showFormulaInstructions) false}}\\n      @closeButtonLabel={{t \\\"components.exerciseView.assignment.reply.close\\\"}}\\n      @size={{hash width=\\\"medium\\\" height=\\\"auto\\\"}}\\n    >\\n      <div class=\\\"p1\\\">\\n        <ContentPresenter>\\n          {{t\\n            \\\"components.exerciseView.assignment.reply.mathHelp.content\\\"\\n            htmlSafe=true\\n          }}\\n        </ContentPresenter>\\n      </div>\\n    </XModal>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/reply/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/reply/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentReplyComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  @service assignmentEvents;\n\n  @tracked showFormulaInstructions = false;\n\n  @tracked showClue;\n\n  get inputValue() {\n    if (this.args.showKey) {\n      return this.args.assignment?.content?.keys?.firstObject;\n    }\n\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get isFormula() {\n    return this.args.assignment?.settings?.behaviour === 'formula';\n  }\n\n  get hasUnit() {\n    return this.args.assignment?.settings?.unit;\n  }\n\n  get suffix() {\n    let suffix;\n\n    if (this.args.showKey) {\n      suffix = 'key';\n    } else if (this.args.showValidation) {\n      suffix = this.args.assignmentAnswer?.correct ? 'success' : 'error';\n    }\n\n    return suffix;\n  }\n\n  get suffixClass() {\n    if (this.suffix) return `math-input--${this.suffix}`;\n    return null;\n  }\n\n  get inputDisabled() {\n    if (this.args.disabled) return true;\n    if (this.args.showKey) return true;\n    return false;\n  }\n\n  @action\n  handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n\n  @action\n  onChange(val) {\n    if (this.args.assignmentAnswer?.input === val) {\n      return;\n    }\n\n    if (this.args.assignmentAnswer) {\n      this.args.assignmentAnswer.input = val;\n    }\n\n    return this.args.handleOnChange?.(val);\n  }\n\n  @action\n  handleToggleClue() {\n    this.showClue = !this.showClue;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"sort-label\\\">{{@group.label}}</div>\\n<div\\n  class=\\\"sort-assignment-group flex-center\\n    {{if this.isIncomplete ' exercise-view-assignment-sort-group--incomplete'}}\\\"\\n>\\n  {{#if @image}}\\n    <ExerciseView::Assignment::Sort::Image\\n      class=\\\"nr1\\n        {{if\\n          (eq @behaviour 'images')\\n          'sort-image-group'\\n          'sort-image-group-text'\\n        }}\\n        {{this.imageSelector}}\\\"\\n      @imageId={{@image}}\\n      @isGroup={{true}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex-auto\\\">\\n\\n    <XDroppable @data={{@group}}>\\n      <ExerciseView::Common::DropItem\\n        @single={{false}}\\n        @size={{if (eq @behaviour \\\"images\\\") \\\"x-large\\\" \\\"large\\\"}}\\n        @hasDraggable={{not-eq this.items.length 0}}\\n      >\\n        {{#each this.items as |item index|}}\\n          <ExerciseView::Assignment::Sort::Item\\n            @assignment={{@assignment}}\\n            @behaviour={{@behaviour}}\\n            @disabled={{@disabled}}\\n            @item={{item}}\\n            @index={{index}}\\n            @inGroup={{true}}\\n            @onDrop={{@onDrop}}\\n            @onDragEnd={{@onDragEnd}}\\n            @onDragStart={{@onDragStart}}\\n            @onRemove={{@onRemoveItem}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n          />\\n        {{/each}}\\n        <DcIcon class=\\\"sort-add-icon nc-icon-16 mr1\\\" @name=\\\"add-circle\\\" />\\n      </ExerciseView::Common::DropItem>\\n    </XDroppable>\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"sort-label\\\">{{@group.label}}</div>\\n<div\\n  class=\\\"sort-assignment-group flex-center\\n    {{if this.isIncomplete ' exercise-view-assignment-sort-group--incomplete'}}\\\"\\n>\\n  {{#if @image}}\\n    <ExerciseView::Assignment::Sort::Image\\n      class=\\\"nr1\\n        {{if\\n          (eq @behaviour 'images')\\n          'sort-image-group'\\n          'sort-image-group-text'\\n        }}\\n        {{this.imageSelector}}\\\"\\n      @imageId={{@image}}\\n      @isGroup={{true}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex-auto\\\">\\n\\n    <XDroppable @data={{@group}}>\\n      <ExerciseView::Common::DropItem\\n        @single={{false}}\\n        @size={{if (eq @behaviour \\\"images\\\") \\\"x-large\\\" \\\"large\\\"}}\\n        @hasDraggable={{not-eq this.items.length 0}}\\n      >\\n        {{#each this.items as |item index|}}\\n          <ExerciseView::Assignment::Sort::Item\\n            @assignment={{@assignment}}\\n            @behaviour={{@behaviour}}\\n            @disabled={{@disabled}}\\n            @item={{item}}\\n            @index={{index}}\\n            @inGroup={{true}}\\n            @onDrop={{@onDrop}}\\n            @onDragEnd={{@onDragEnd}}\\n            @onDragStart={{@onDragStart}}\\n            @onRemove={{@onRemoveItem}}\\n            @showKey={{@showKey}}\\n            @showValidation={{@showValidation}}\\n          />\\n        {{/each}}\\n        <DcIcon class=\\\"sort-add-icon nc-icon-16 mr1\\\" @name=\\\"add-circle\\\" />\\n      </ExerciseView::Common::DropItem>\\n    </XDroppable>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/sort/group/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/sort/group/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentSortGroupComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * behaviour (string)\n   * disabled (bool)\n   * image (object)\n   * group (object)\n   * assignmentAnswer (object)\n   * incomplete (bool)\n   * onDrop (function)\n   * onDragEnd (function)\n   * onDragStart (function)\n   * onRemoveItem (function)\n   * showKey (bool)\n   * showValidation (bool)\n   */\n\n  get isIncomplete() {\n    return this.args.incomplete && this.items?.length === 0;\n  }\n\n  get imageSelector() {\n    return 'target-width-' + this.args.assignmentId;\n  }\n\n  @cached get items() {\n    const answer = this.args.assignmentAnswer || [];\n    const groupId = this.args.group?.uuid;\n\n    if (this.args.showKey) {\n      const groupItems = this.args.assignment?.content?.items\n        ?.filterBy('assigned_to', groupId)\n        ?.mapBy('uuid');\n\n      return answer.filter((item) => groupItems.includes(item.uuid));\n    }\n\n    return answer.filterBy('assignedTo', groupId);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"sort-image\\\" ...attributes>\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"sort-image\\\" ...attributes>\\n  {{#if this.imageSrc}}\\n    <div\\n      class=\\\"{{if this.allowCrop 'keep-proportions' 'allow-crop'}}\\n        {{if this.imagePadding 'small-padding'}}\\n        image-container\\\"\\n    >\\n      <XImage\\n        @source={{this.imageSrc}}\\n        @width={{this.image.imageWidth}}\\n        @height={{this.image.imageHeight}}\\n        @color={{this.image.imageColor}}\\n        @mimetype={{this.image.imageMimetype}}\\n        @alt={{or this.image.name \\\"Image\\\"}}\\n      />\\n    </div>\\n\\n  {{else}}\\n    <DcLoader />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/sort/image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/sort/image/index.hbs\"}});\nimport ItemImageComponent from 'babel/components/exercise-view/common/item-image/index';\n\nexport default class ExerciseViewSortImage extends ItemImageComponent {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"sort-assignment {{this.draggingClassName}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <div class=\\\"sort-container\\\">\\n    <ExerciseView::Common::DragAlternatives\\n      @alternatives={{this.itemsInList}}\\n      @behaviour={{@assignment.settings.behaviour}}\\n      class=\\\"sort-items\\\"\\n      as |drag|\\n    >\\n      <ExerciseView::Assignment::Sort::Item\\n        @assignment={{@assignment}}\\n        @behaviour={{@assignment.settings.behaviour}}\\n        @disabled={{@disabled}}\\n        @item={{drag.alternative}}\\n        @isAssigned={{drag.alternative.assignedTo}}\\n        @showKey={{@showKey}}\\n        @inGroup={{false}}\\n        @showValidation={{@showValidation}}\\n        @incomplete={{@incomplete}}\\n        @onDrop={{this.handleDroppedItem}}\\n        @onDragEnd={{this.handleDragEnd}}\\n        @onDragStart={{this.handleDragStart}}\\n        @onRemove={{this.handleRemoveItem}}\\n      />\\n    </ExerciseView::Common::DragAlternatives>\\n\\n    <div class=\\\"sort-groups{{if this.hasGroupImages ' sort-groups--images'}}\\\">\\n      {{#each @assignment.content.groups as |group|}}\\n        <ExerciseView::Assignment::Sort::Group\\n          @assignment={{@assignment}}\\n          @behaviour={{@assignment.settings.behaviour}}\\n          @disabled={{@disabled}}\\n          @image={{if (and this.hasGroupImages group.image) group.image}}\\n          @group={{group}}\\n          @assignmentAnswer={{this.input}}\\n          @incomplete={{@incomplete}}\\n          @onDrop={{this.handleDroppedItem}}\\n          @onDragEnd={{this.handleDragEnd}}\\n          @onDragStart={{this.handleDragStart}}\\n          @onRemoveItem={{this.handleRemoveItem}}\\n          @showKey={{@showKey}}\\n          @showValidation={{@showValidation}}\\n        />\\n      {{/each}}\\n    </div>\\n  </div>\\n\\n  {{#if this.showHint}}\\n    <div class=\\\"text-small nt1 sort-hint\\\">\\n      {{t \\\"components.exerciseView.assignment.sort.hint\\\" htmlSafe=true}}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"sort-assignment {{this.draggingClassName}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <div class=\\\"sort-container\\\">\\n    <ExerciseView::Common::DragAlternatives\\n      @alternatives={{this.itemsInList}}\\n      @behaviour={{@assignment.settings.behaviour}}\\n      class=\\\"sort-items\\\"\\n      as |drag|\\n    >\\n      <ExerciseView::Assignment::Sort::Item\\n        @assignment={{@assignment}}\\n        @behaviour={{@assignment.settings.behaviour}}\\n        @disabled={{@disabled}}\\n        @item={{drag.alternative}}\\n        @isAssigned={{drag.alternative.assignedTo}}\\n        @showKey={{@showKey}}\\n        @inGroup={{false}}\\n        @showValidation={{@showValidation}}\\n        @incomplete={{@incomplete}}\\n        @onDrop={{this.handleDroppedItem}}\\n        @onDragEnd={{this.handleDragEnd}}\\n        @onDragStart={{this.handleDragStart}}\\n        @onRemove={{this.handleRemoveItem}}\\n      />\\n    </ExerciseView::Common::DragAlternatives>\\n\\n    <div class=\\\"sort-groups{{if this.hasGroupImages ' sort-groups--images'}}\\\">\\n      {{#each @assignment.content.groups as |group|}}\\n        <ExerciseView::Assignment::Sort::Group\\n          @assignment={{@assignment}}\\n          @behaviour={{@assignment.settings.behaviour}}\\n          @disabled={{@disabled}}\\n          @image={{if (and this.hasGroupImages group.image) group.image}}\\n          @group={{group}}\\n          @assignmentAnswer={{this.input}}\\n          @incomplete={{@incomplete}}\\n          @onDrop={{this.handleDroppedItem}}\\n          @onDragEnd={{this.handleDragEnd}}\\n          @onDragStart={{this.handleDragStart}}\\n          @onRemoveItem={{this.handleRemoveItem}}\\n          @showKey={{@showKey}}\\n          @showValidation={{@showValidation}}\\n        />\\n      {{/each}}\\n    </div>\\n  </div>\\n\\n  {{#if this.showHint}}\\n    <div class=\\\"text-small nt1 sort-hint\\\">\\n      {{t \\\"components.exerciseView.assignment.sort.hint\\\" htmlSafe=true}}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/sort/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/sort/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached } from '@glimmer/tracking';\nimport DragAssignmentComponent from 'babel/components/exercise-view/common/drag-assignment/index';\n\nexport default class ExerciseViewAssignmentSortComponent extends DragAssignmentComponent {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this.input?.forEach((item) => {\n      if (item.assignedTo === '') {\n        item.assignedTo = null;\n      }\n    });\n\n    this.args.assignment?.content?.items?.forEach((item) => {\n      if (item.assigned_to === '') {\n        item.assigned_to = null;\n      }\n    });\n  }\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get hasGroupImages() {\n    return this.args.assignment?.settings?.group_image;\n  }\n\n  @cached get itemsInList() {\n    const answer = this.input?.sortBy('index') || [];\n\n    if (this.args.assignment?.settings?.behaviour === 'objects') {\n      return answer;\n    }\n\n    if (this.args.showKey) {\n      const unassignedItems = this.args.assignment?.content?.items\n        ?.filterBy('assigned_to', null)\n        ?.mapBy('uuid');\n\n      return answer.filter((item) => unassignedItems.includes(item.uuid));\n    }\n\n    return answer.filter((item) => item.assignedTo === null);\n  }\n\n  get noItemsInList() {\n    return this.itemsInList.length === 0;\n  }\n\n  @cached get showHint() {\n    const input = this.input;\n    const assignmentAnswer = this.args.assignmentAnswer;\n\n    // Never show hint if answer is correct or showing keys, and only on show validation\n    if (\n      !input ||\n      input.length === 0 ||\n      assignmentAnswer?.correct ||\n      this.args.showKey ||\n      !this.args.showValidation\n    ) {\n      return false;\n    }\n\n    const items = this.args.assignment?.content?.items;\n    const assigned = input.filter((item) => item.assignedTo !== null);\n\n    const correctAssigned = assigned.filter((item) => {\n      return (\n        items\n          ?.filterBy('assigned_to', item.assignedTo)\n          ?.mapBy('value')\n          ?.indexOf(items?.findBy('uuid', item.uuid)?.value) !== -1\n      );\n    });\n\n    if (assigned.length !== correctAssigned.length) {\n      return false;\n    }\n\n    return true;\n  }\n\n  @action handleDroppedItem(item, _, group) {\n    const availableGroups = this.args.assignment?.content?.groups;\n\n    if (!availableGroups.some((groupItem) => groupItem.uuid === group.uuid)) {\n      return;\n    }\n\n    if (this.args.showKey) {\n      this.args.handleOnChange?.(this.input);\n      return;\n    }\n\n    if (item.assignedTo === group.uuid) {\n      return;\n    }\n\n    this.input?.removeObject(item)?.pushObject(item);\n\n    item.set('assignedTo', group.uuid);\n\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleRemoveItem(item) {\n    item.set('assignedTo', null);\n\n    this.args.handleOnChange?.(this.input);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"sort-assignment-item {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <XDraggable\\n    @disabled={{or @disabled this.assigned}}\\n    @data={{@item}}\\n    @onDrop={{fn @onDrop @item}}\\n    @onStart={{@onDragStart}}\\n    @onEnd={{@onDragEnd}}\\n    @rotation={{1}}\\n    @delay={{100}}\\n  >\\n    <ExerciseView::Common::DragItem\\n      class=\\\"sort-item\\\"\\n      @placeholder={{if this.behaviourObjects \\\"pressed\\\" \\\"hidden\\\"}}\\n      @compact={{this.behaviourObjects}}\\n      @hasValidation={{this.inGroup}}\\n      @canRemove={{this.showRemoveIcon}}\\n      @onRemove={{fn @onRemove @item}}\\n      @showValidation={{true}}\\n      @size={{this.size}}\\n      @behaviour={{@behaviour}}\\n    >\\n      {{#if (eq @behaviour \\\"images\\\")}}\\n        <div class=\\\"sort-item-image\\\">\\n          <ExerciseView::Assignment::Sort::Image\\n            class=\\\"sort-image-item\\\"\\n            @imageId={{this.image.id}}\\n            @width=\\\"112\\\"\\n            @height=\\\"80\\\"\\n          />\\n\\n        </div>\\n      {{else}}\\n        {{this.innerValue}}\\n      {{/if}}\\n    </ExerciseView::Common::DragItem>\\n  </XDraggable>\\n\\n  {{#if this.outerValue}}\\n    <div class=\\\"sort-item-value text-small\\\">\\n      {{this.outerValue}}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"sort-assignment-item {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n>\\n  <XDraggable\\n    @disabled={{or @disabled this.assigned}}\\n    @data={{@item}}\\n    @onDrop={{fn @onDrop @item}}\\n    @onStart={{@onDragStart}}\\n    @onEnd={{@onDragEnd}}\\n    @rotation={{1}}\\n    @delay={{100}}\\n  >\\n    <ExerciseView::Common::DragItem\\n      class=\\\"sort-item\\\"\\n      @placeholder={{if this.behaviourObjects \\\"pressed\\\" \\\"hidden\\\"}}\\n      @compact={{this.behaviourObjects}}\\n      @hasValidation={{this.inGroup}}\\n      @canRemove={{this.showRemoveIcon}}\\n      @onRemove={{fn @onRemove @item}}\\n      @showValidation={{true}}\\n      @size={{this.size}}\\n      @behaviour={{@behaviour}}\\n    >\\n      {{#if (eq @behaviour \\\"images\\\")}}\\n        <div class=\\\"sort-item-image\\\">\\n          <ExerciseView::Assignment::Sort::Image\\n            class=\\\"sort-image-item\\\"\\n            @imageId={{this.image.id}}\\n            @width=\\\"112\\\"\\n            @height=\\\"80\\\"\\n          />\\n\\n        </div>\\n      {{else}}\\n        {{this.innerValue}}\\n      {{/if}}\\n    </ExerciseView::Common::DragItem>\\n  </XDraggable>\\n\\n  {{#if this.outerValue}}\\n    <div class=\\\"sort-item-value text-small\\\">\\n      {{this.outerValue}}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/sort/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/sort/item/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport { cached } from '@glimmer/tracking';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\nimport { load } from 'ember-async-data';\nimport indexString from 'compton/utils/index-string';\nimport { resolve } from 'rsvp';\n\nexport default class ExerciseViewAssignmentSortItemComponent extends ItemStateComponent {\n  /**\n   * Arguments\n   * assignment (object)\n   * behaviour (string)\n   * disabled (bool)\n   * index (number)\n   * item (object)\n   * isAssigned (bool)\n   * showKey (bool)\n   * inGroup (bool)\n   * showValidation (bool)\n   * incomplete (bool)\n   * onDrop (function)\n   * onDragEnd (function)\n   * onDragStart (function)\n   * onRemove (function)\n   */\n\n  @service store;\n\n  get value() {\n    return this.args.assignment?.content?.items?.findBy(\n      'uuid',\n      this.args.item?.uuid\n    )?.value;\n  }\n\n  get imageId() {\n    return this.args.assignment?.content?.items?.findBy(\n      'uuid',\n      this.args.item?.uuid\n    )?.image;\n  }\n\n  @cached get imageProxy() {\n    let promise = resolve();\n\n    const imageId = this.imageId;\n\n    if (imageId) {\n      promise = this.store.findRecord('material', imageId);\n    }\n\n    return load(promise, this);\n  }\n\n  get image() {\n    return this.imageProxy.isResolved ? this.imageProxy.value : null;\n  }\n\n  get textMarginLeft() {\n    if (this.args.showKey || this.args.showValidation) return 'nl1';\n\n    return null;\n  }\n\n  get innerValue() {\n    const number = this.args.item?.index + 1;\n\n    const isAlphabetical =\n      this.args.assignment?.settings?.appearance === 'alphabetical';\n\n    if (this.args.behaviour === 'objects') {\n      return isAlphabetical ? indexString(number) : number;\n    } else {\n      return this.value;\n    }\n  }\n\n  get inGroup() {\n    return this.args.inGroup;\n  }\n\n  get outerValue() {\n    return this.args.behaviour === 'objects' && !this.inGroup\n      ? this.value\n      : null;\n  }\n\n  get behaviourObjects() {\n    return this.args.assignment?.settings?.behaviour === 'objects';\n  }\n\n  get assigned() {\n    return this.args.isAssigned;\n  }\n\n  get suffix() {\n    let suffix;\n\n    if (this.args.showKey) {\n      suffix = 'key';\n    } else if (this.args.showValidation && this.args.item?.assignedTo) {\n      const items = this.args.assignment?.content?.items;\n\n      suffix =\n        items\n          ?.filterBy('assigned_to', this.args.item.assignedTo)\n          ?.mapBy('value')\n          ?.indexOf(items?.findBy('uuid', this.args.item.uuid)?.value) !== -1\n          ? 'success'\n          : 'error';\n    }\n\n    return suffix;\n  }\n\n  get size() {\n    return this.image ? 'none' : 'normal';\n  }\n\n  get showRemoveIcon() {\n    return (\n      !this.args.disabled &&\n      this.inGroup &&\n      this.args.item?.assignedTo &&\n      !this.args.showKey\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"text-gap-drag {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <XDroppable @data={{this.gapObj}} @accept={{this.droppableAccept}}>\\n    <ExerciseView::Common::DropItem\\n      @single={{true}}\\n      @hasDraggable={{this.gapValue}}\\n    >\\n      {{#if this.gapValue}}\\n        <XDraggable\\n          @data={{this.gapObj}}\\n          @onStart={{@onDragStart}}\\n          @onEnd={{@onDragEnd}}\\n          @onDrop={{fn @dragEndAction this.gapValue}}\\n          @disabled={{@disabled}}\\n          @delay={{100}}\\n        >\\n          <ExerciseView::Common::DragItem\\n            @placeholder=\\\"hidden\\\"\\n            @showValidation={{true}}\\n            @canRemove={{this.showRemoveIcon}}\\n            @onRemove={{fn this.handleRemove this.gapObj}}\\n          >\\n            <div class=\\\"{{this.textMarginLeft}}\\\">{{this.gapValue.label}}</div>\\n          </ExerciseView::Common::DragItem>\\n        </XDraggable>\\n      {{else if this.gapObj.placeholder}}\\n        <div class=\\\"gap-placeholder\\\">{{this.gapObj.placeholder}}</div>\\n      {{/if}}\\n    </ExerciseView::Common::DropItem>\\n  </XDroppable>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"text-gap-drag {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <XDroppable @data={{this.gapObj}} @accept={{this.droppableAccept}}>\\n    <ExerciseView::Common::DropItem\\n      @single={{true}}\\n      @hasDraggable={{this.gapValue}}\\n    >\\n      {{#if this.gapValue}}\\n        <XDraggable\\n          @data={{this.gapObj}}\\n          @onStart={{@onDragStart}}\\n          @onEnd={{@onDragEnd}}\\n          @onDrop={{fn @dragEndAction this.gapValue}}\\n          @disabled={{@disabled}}\\n          @delay={{100}}\\n        >\\n          <ExerciseView::Common::DragItem\\n            @placeholder=\\\"hidden\\\"\\n            @showValidation={{true}}\\n            @canRemove={{this.showRemoveIcon}}\\n            @onRemove={{fn this.handleRemove this.gapObj}}\\n          >\\n            <div class=\\\"{{this.textMarginLeft}}\\\">{{this.gapValue.label}}</div>\\n          </ExerciseView::Common::DragItem>\\n        </XDraggable>\\n      {{else if this.gapObj.placeholder}}\\n        <div class=\\\"gap-placeholder\\\">{{this.gapObj.placeholder}}</div>\\n      {{/if}}\\n    </ExerciseView::Common::DropItem>\\n  </XDroppable>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/drag/gap/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/drag/gap/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached } from '@glimmer/tracking';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentTextGapDragGapComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * disabled (bool)\n   * node (object)\n   * id (string)\n   * parentElementId (string)\n   * onChange (function)\n   * onEnter (function)\n   * dragEndAction (function)\n   * droppedItem (function)\n   * removeDragItem (function)\n   * onDragStart (function)\n   * onDragEnd (function)\n   * assignment (object)\n   * alternatives (array)\n   * input (object)\n   * showKey (bool)\n   * incomplete (bool)\n   * showValidation (bool)\n   */\n\n  get uuid() {\n    return this.args.node?.attributes?.findBy('key', 'data-id')?.value;\n  }\n\n  get gapObj() {\n    return this.assignment?.content?.objects?.findBy('uuid', this.uuid);\n  }\n\n  get assignment() {\n    return this.args.assignment;\n  }\n\n  get alternatives() {\n    return this.args.alternatives;\n  }\n\n  get textMarginLeft() {\n    if (this.args.showKey || this.args.showValidation) return 'nl1';\n\n    return null;\n  }\n\n  get gapValue() {\n    if (this.showKey) {\n      return {\n        label:\n          this.assignment?.content?.objects\n            ?.findBy('uuid', this.uuid)\n            .alternatives?.filterBy('correct')?.firstObject?.value || '',\n      };\n    }\n\n    return this.alternatives.findBy('target', this.uuid);\n  }\n\n  get input() {\n    return this.args.input;\n  }\n\n  get showKey() {\n    return this.args.showKey;\n  }\n\n  get showValidation() {\n    return this.args.showValidation;\n  }\n\n  @cached get suffix() {\n    let suffix;\n\n    const keys =\n      this.assignment?.content?.objects\n        ?.findBy('uuid', this.uuid)\n        ?.alternatives?.filterBy('correct')\n        ?.map((alternative) => alternative.value.trim()) || [];\n\n    const value = this.input?.findBy('uuid', this.uuid)?.value?.trim() || '';\n\n    if (this.showKey) {\n      suffix = 'key';\n    } else if (this.showValidation) {\n      if (!value) {\n        suffix = 'error';\n      } else {\n        suffix = keys.includes(value) ? 'success' : 'error';\n      }\n    }\n\n    return suffix;\n  }\n\n  get showRemoveIcon() {\n    if (this.args.disabled) return false;\n    return !this.showKey;\n  }\n\n  @action droppableAccept(droppableData, draggableData) {\n    return droppableData.uuid === draggableData.uuid ? false : true;\n  }\n\n  @action handleRemove(obj) {\n    this.args.removeDragItem?.(obj);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class={{this.draggingClassName}}\\n  {{did-insert this.setElement}}\\n  {{did-update this.inputChanged this.input}}\\n  ...attributes\\n>\\n  <ExerciseView::Common::DragAlternatives\\n    @alternatives={{this.dragAlternatives}}\\n    as |drag|\\n  >\\n    <XDraggable\\n      @content={{drag.alternative}}\\n      @onStart={{this.handleDragStart}}\\n      @onEnd={{this.handleDragEnd}}\\n      @onDrop={{fn this.handleDroppedItem drag.alternative}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @showValidation={{true}}\\n        @placeholder=\\\"hidden\\\"\\n      >\\n        {{drag.alternative.label}}\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </ExerciseView::Common::DragAlternatives>\\n\\n  <div>\\n    {{#let\\n      (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\"))\\n      as |RenderComponent|\\n    }}\\n      <RenderComponent\\n        @value={{@tbRenderContent}}\\n        @content={{@tbRenderContent}}\\n        as |render|\\n      >\\n        {{~#if render.customComponent~}}\\n          <ExerciseView::Assignment::TextGap::Drag::Gap\\n            @disabled={{@disabled}}\\n            @node={{render.node}}\\n            @id={{this.id}}\\n            @parentElementId={{render.parentElementId}}\\n            @onChange={{@onChange}}\\n            @onEnter={{@handleEnter}}\\n            @dragEndAction={{this.handleDroppedItem}}\\n            @droppedItem={{this.handleDroppedItem}}\\n            @removeDragItem={{this.handleRemoveDragItem}}\\n            @onDragStart={{this.handleDragStart}}\\n            @onDragEnd={{this.handleDragEnd}}\\n            @assignment={{@assignment}}\\n            @alternatives={{this.alternatives}}\\n            @input={{@assignmentAnswer}}\\n            @showKey={{@showKey}}\\n            @incomplete={{@incomplete}}\\n            @showValidation={{@showValidation}}\\n          />\\n        {{~/if~}}\\n      </RenderComponent>\\n    {{/let}}\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class={{this.draggingClassName}}\\n  {{did-insert this.setElement}}\\n  {{did-update this.inputChanged this.input}}\\n  ...attributes\\n>\\n  <ExerciseView::Common::DragAlternatives\\n    @alternatives={{this.dragAlternatives}}\\n    as |drag|\\n  >\\n    <XDraggable\\n      @content={{drag.alternative}}\\n      @onStart={{this.handleDragStart}}\\n      @onEnd={{this.handleDragEnd}}\\n      @onDrop={{fn this.handleDroppedItem drag.alternative}}\\n      @disabled={{@disabled}}\\n      @delay={{100}}\\n    >\\n      <ExerciseView::Common::DragItem\\n        @showValidation={{true}}\\n        @placeholder=\\\"hidden\\\"\\n      >\\n        {{drag.alternative.label}}\\n      </ExerciseView::Common::DragItem>\\n    </XDraggable>\\n  </ExerciseView::Common::DragAlternatives>\\n\\n  <div>\\n    {{#let\\n      (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\"))\\n      as |RenderComponent|\\n    }}\\n      <RenderComponent\\n        @value={{@tbRenderContent}}\\n        @content={{@tbRenderContent}}\\n        as |render|\\n      >\\n        {{~#if render.customComponent~}}\\n          <ExerciseView::Assignment::TextGap::Drag::Gap\\n            @disabled={{@disabled}}\\n            @node={{render.node}}\\n            @id={{this.id}}\\n            @parentElementId={{render.parentElementId}}\\n            @onChange={{@onChange}}\\n            @onEnter={{@handleEnter}}\\n            @dragEndAction={{this.handleDroppedItem}}\\n            @droppedItem={{this.handleDroppedItem}}\\n            @removeDragItem={{this.handleRemoveDragItem}}\\n            @onDragStart={{this.handleDragStart}}\\n            @onDragEnd={{this.handleDragEnd}}\\n            @assignment={{@assignment}}\\n            @alternatives={{this.alternatives}}\\n            @input={{@assignmentAnswer}}\\n            @showKey={{@showKey}}\\n            @incomplete={{@incomplete}}\\n            @showValidation={{@showValidation}}\\n          />\\n        {{~/if~}}\\n      </RenderComponent>\\n    {{/let}}\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/drag/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/drag/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached, tracked } from '@glimmer/tracking';\nimport DragAssignmentComponent from 'babel/components/exercise-view/common/drag-assignment/index';\nimport shuffle from 'compton/utils/array-shuffle';\nimport { v4 as uuid } from 'ember-uuid';\n\nexport default class ExerciseViewAssignmentTextGapDragComponent extends DragAssignmentComponent {\n  /**\n   * Arguments:\n   * inline (bool)\n   * disabled (bool)\n   * tbRenderContent (object)\n   * assignment (object)\n   * assignmentAnswer (object)\n   * showKey (bool)\n   * showValidation (bool)\n   * incomplete (bool)\n   * onChange (function)\n   * handleEnter (function)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this._setAlternatives();\n    this._setDragAlternatives();\n  }\n\n  @tracked alternatives;\n\n  @tracked dragAlternatives;\n\n  get input() {\n    return this.args.assignmentAnswer;\n  }\n\n  @cached get shuffledAlternatives() {\n    const keys =\n      this.args.assignment?.content?.objects\n        ?.mapBy('alternatives')\n        ?.filter((x) => x)\n        ?.reduce((a, b) => a.concat(b), [])\n        ?.filterBy('correct')\n        ?.mapBy('value') || [];\n\n    const extra =\n      this.args.assignment?.content?.extra?.map((obj) => {\n        if (obj.value) return obj.value;\n        return obj;\n      }) || [];\n\n    return shuffle([...keys, ...extra]).map((alternative, index) => ({\n      belongsTo: this.args.assignment.uuid,\n      id: index,\n      label: alternative,\n      target: null,\n    }));\n  }\n\n  get id() {\n    return uuid();\n  }\n\n  // Target action when item is dropped\n  @action handleDroppedItem(item, _, { uuid }) {\n    // Ensure target is in current assignment\n    const availableGroups = this.args.assignment?.content?.objects;\n\n    if (\n      availableGroups &&\n      !availableGroups.some((groupItem) => groupItem.uuid === uuid)\n    ) {\n      return;\n    }\n\n    if (this.args.showKey) {\n      return this.args.onChange?.();\n    }\n\n    const answer = this.input?.findBy('uuid', uuid);\n\n    if (answer) {\n      answer.value = item.label || '';\n    }\n\n    // Remove previous items from target\n    this.alternatives?.filterBy('target', uuid).forEach((alternative) => {\n      alternative.target = null;\n    });\n\n    const alternative = this.alternatives?.findBy('id', item.id);\n\n    if (alternative) {\n      alternative.target = uuid;\n    }\n\n    this._setDragAlternatives();\n\n    return this.args.onChange?.();\n  }\n\n  @action handleRemoveDragItem(gap) {\n    const item = this.alternatives?.findBy('target', gap.uuid);\n\n    if (item) {\n      item.target = null;\n    }\n\n    this._setDragAlternatives();\n\n    const answer = this.input?.findBy('uuid', gap.uuid);\n\n    if (answer) {\n      answer.value = '';\n    }\n\n    this.args.onChange?.();\n  }\n\n  @action inputChanged() {\n    this._setAlternatives();\n    this._setDragAlternatives();\n  }\n\n  _setAlternatives() {\n    const input = this.input?.filterBy('value');\n    const added = [];\n\n    this.alternatives = this.shuffledAlternatives?.map((alternative) => {\n      if (input) {\n        alternative.target = null;\n\n        input.forEach((input) => {\n          if (\n            !added.includes(input.uuid) &&\n            alternative.label === input.value &&\n            alternative.target === null\n          ) {\n            alternative.target = input.uuid;\n            added.push(input.uuid);\n          }\n        });\n      }\n\n      return alternative;\n    });\n  }\n\n  _setDragAlternatives() {\n    this.dragAlternatives = this.alternatives?.filterBy('target', null) || null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div ...attributes>\\n  {{#if this.behaviour}}\\n    {{#let\\n      (component (concat \\\"exercise-view/assignment/text-gap/\\\" this.behaviour))\\n      as |Component|\\n    }}\\n      <Component\\n        @inline={{this.inline}}\\n        @disabled={{or @disabled @showKey}}\\n        @tbRenderContent={{this.tbRenderContent}}\\n        @assignment={{@assignment}}\\n        @assignmentAnswer={{this.input}}\\n        @showKey={{@showKey}}\\n        @showValidation={{@showValidation}}\\n        @incomplete={{@incomplete}}\\n        @onChange={{this.onChange}}\\n        @handleEnter={{this.handleEnter}}\\n        @isAutoCorrected={{@isAutoCorrected}}\\n      />\\n    {{/let}}\\n    {{#if this.showIncompleteMessage}}\\n      <div\\n        class=\\\"text-small text-base text-color-error\\\"\\n        data-test-text-gap-incomplete-message\\n      >\\n        {{t \\\"components.exerciseView.assignment.textGap.incompleteMessage\\\"}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div ...attributes>\\n  {{#if this.behaviour}}\\n    {{#let\\n      (component (concat \\\"exercise-view/assignment/text-gap/\\\" this.behaviour))\\n      as |Component|\\n    }}\\n      <Component\\n        @inline={{this.inline}}\\n        @disabled={{or @disabled @showKey}}\\n        @tbRenderContent={{this.tbRenderContent}}\\n        @assignment={{@assignment}}\\n        @assignmentAnswer={{this.input}}\\n        @showKey={{@showKey}}\\n        @showValidation={{@showValidation}}\\n        @incomplete={{@incomplete}}\\n        @onChange={{this.onChange}}\\n        @handleEnter={{this.handleEnter}}\\n        @isAutoCorrected={{@isAutoCorrected}}\\n      />\\n    {{/let}}\\n    {{#if this.showIncompleteMessage}}\\n      <div\\n        class=\\\"text-small text-base text-color-error\\\"\\n        data-test-text-gap-incomplete-message\\n      >\\n        {{t \\\"components.exerciseView.assignment.textGap.incompleteMessage\\\"}}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewAssignmentTextGapComponent extends Component {\n  /**\n   * Arguments:\n   * assignment (object)\n   * canHaveAttachments (bool)\n   * assignmentAnswer (object)\n   * answer (object)\n   * handleOnChange (function)\n   * showValidation (bool)\n   * showKey (bool)\n   * disabled (bool)\n   * showSuggestion (bool)\n   * incomplete (bool)\n   * image (object)\n   * isAutoCorrected (bool)\n   */\n\n  @service assignmentEvents;\n\n  @service store;\n\n  @tracked inline = true;\n\n  get input() {\n    return this.args.assignmentAnswer?.input;\n  }\n\n  get behaviour() {\n    return this.args.assignment?.settings?.behaviour;\n  }\n\n  get tbRenderContent() {\n    return this.args.assignment?.content?.text;\n  }\n\n  get showIncompleteMessage() {\n    return (\n      this.args.incomplete && this.input.some(({ value }) => isEmpty(value))\n    );\n  }\n\n  @action onChange() {\n    this.args.handleOnChange?.(this.input);\n  }\n\n  @action handleEnter() {\n    this.assignmentEvents.trigger('onEnter');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"text-gap-select {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <XSelect\\n    @disabled={{@disabled}}\\n    @value={{this.gapValue}}\\n    @items={{this.selectAlternatives}}\\n    @placeholder={{this.gapObj.placeholder}}\\n    @onChange={{this.onChange}}\\n    @onEnter={{@onEnter}}\\n  />\\n</div>\\n\", {\"contents\":\"<div\\n  class=\\\"text-gap-select {{this.classNames}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n  <XSelect\\n    @disabled={{@disabled}}\\n    @value={{this.gapValue}}\\n    @items={{this.selectAlternatives}}\\n    @placeholder={{this.gapObj.placeholder}}\\n    @onChange={{this.onChange}}\\n    @onEnter={{@onEnter}}\\n  />\\n</div>\\n\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/select/gap/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/select/gap/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached, tracked } from '@glimmer/tracking';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\nimport shuffle from 'compton/utils/array-shuffle';\n\nexport default class ExerciseViewAssignmentTextGapSelectGapComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * onChange (function)\n   * onEnter (function)\n   * node (object)\n   * disabled (bool)\n   * assignment (object)\n   * input (object)\n   * showKey (bool)\n   * incomplete (bool)\n   * showValidation (bool)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this.gapValue = this.input?.findBy('uuid', this.uuid)?.value;\n  }\n\n  @tracked gapValue;\n\n  get uuid() {\n    return this.args.node?.attributes?.findBy('key', 'data-id')?.value;\n  }\n\n  @cached\n  get gapObj() {\n    const gaps = this.assignment?.content?.objects;\n\n    if (gaps && this.assignment?.settings?.random) {\n      gaps.forEach((gap) => {\n        shuffle(gap.alternatives);\n      });\n    }\n\n    return gaps?.findBy('uuid', this.uuid);\n  }\n\n  get assignment() {\n    return this.args.assignment;\n  }\n\n  get input() {\n    return this.args.input;\n  }\n\n  @cached\n  get showKey() {\n    const showKey = this.args.showKey;\n\n    if (showKey) {\n      this.gapValue =\n        this.assignment?.content?.objects\n          ?.findBy('uuid', this.uuid)\n          ?.alternatives?.filterBy('correct')?.firstObject?.value || '';\n    } else {\n      this.gapValue = this.input?.findBy('uuid', this.uuid)?.value;\n    }\n\n    return showKey;\n  }\n\n  get showValidation() {\n    return this.args.showValidation;\n  }\n\n  get selectAlternatives() {\n    return this.gapObj?.alternatives?.mapBy('value');\n  }\n\n  @cached\n  get suffix() {\n    let suffix;\n\n    const keys =\n      this.assignment?.content?.objects\n        ?.findBy('uuid', this.uuid)\n        ?.alternatives?.filterBy('correct')\n        ?.map((alternative) => alternative.value.trim()) || [];\n\n    const value = this.input?.findBy('uuid', this.uuid)?.value?.trim() || '';\n\n    if (this.showKey) {\n      suffix = 'key';\n    } else if (this.showValidation) {\n      if (!value) {\n        suffix = 'error';\n      } else {\n        suffix = keys.includes(value) ? 'success' : 'error';\n      }\n    }\n\n    return suffix;\n  }\n\n  @action\n  setElement(elem) {\n    this.element = elem;\n  }\n\n  @action\n  onChange(value) {\n    if (!this.showKey) {\n      if (this.input?.findBy('uuid', this.uuid)) {\n        this.args.input.findBy('uuid', this.uuid).value = value;\n      }\n    }\n\n    this.args.onChange?.(value);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div>\\n  {{#let (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\")) as |RenderComponent|}}\\n    <RenderComponent\\n      @value={{@tbRenderContent}}\\n      @content={{@tbRenderContent}}\\n      as |render|\\n    >\\n      {{~#if render.customComponent~}}\\n        <ExerciseView::Assignment::TextGap::Select::Gap\\n          @disabled={{@disabled}}\\n          @node={{render.node}}\\n          @id={{this.id}}\\n          @parentElementId={{render.parentElementId}}\\n          @onChange={{@onChange}}\\n          @onEnter={{@handleEnter}}\\n          @assignment={{@assignment}}\\n          @input={{@assignmentAnswer}}\\n          @showKey={{@showKey}}\\n          @incomplete={{@incomplete}}\\n          @showValidation={{@showValidation}}\\n        />\\n      {{~/if~}}\\n    </RenderComponent>\\n  {{/let}}\\n</div>\\n\", {\"contents\":\"<div>\\n  {{#let (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\")) as |RenderComponent|}}\\n    <RenderComponent\\n      @value={{@tbRenderContent}}\\n      @content={{@tbRenderContent}}\\n      as |render|\\n    >\\n      {{~#if render.customComponent~}}\\n        <ExerciseView::Assignment::TextGap::Select::Gap\\n          @disabled={{@disabled}}\\n          @node={{render.node}}\\n          @id={{this.id}}\\n          @parentElementId={{render.parentElementId}}\\n          @onChange={{@onChange}}\\n          @onEnter={{@handleEnter}}\\n          @assignment={{@assignment}}\\n          @input={{@assignmentAnswer}}\\n          @showKey={{@showKey}}\\n          @incomplete={{@incomplete}}\\n          @showValidation={{@showValidation}}\\n        />\\n      {{~/if~}}\\n    </RenderComponent>\\n  {{/let}}\\n</div>\\n\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/select/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/select/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { v4 as uuid } from 'ember-uuid';\n\nexport default class ExerciseViewAssignmentTextGapWriteComponent extends Component {\n  /**\n   * Arguments:\n   * inline (bool)\n   * disabled (bool)\n   * tbRenderContent (object)\n   * assignment (object)\n   * assignmentAnswer (object)\n   * showKey (bool)\n   * showValidation (bool)\n   * incomplete (bool)\n   * onChange (function)\n   * handleEnter (function)\n   */\n\n  get id() {\n    return uuid();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"text-gap-write {{this.classNames}} {{if this.clue 'clue'}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n\\n  <UiInput\\n    @appearance=\\\"line\\\"\\n    @autogrow={{true}}\\n    @size=\\\"6\\\"\\n    @disabled={{@disabled}}\\n    @value={{this.gapValue}}\\n    @autocapitalize=\\\"off\\\"\\n    @autocomplete=\\\"off\\\"\\n    @spellcheck={{false}}\\n    @autocorrect=\\\"off\\\"\\n    @placeholder={{this.gapObj.placeholder}}\\n    @onChange={{this.onChange}}\\n    @onEnter={{@onEnter}}\\n    @role=\\\"presentation\\\"\\n  />\\n\\n  {{#if this.clue}}\\n    {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n      <UiButton\\n        class=\\\"text-gap-write-clue-btn\\\"\\n        @onClick={{this.handleToggleClue}}\\n        @appearance=\\\"none\\\"\\n        @active={{this.showClue}}\\n      >\\n        <div class=\\\"text-gap-write-icon-bg\\\">\\n          <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n        </div>\\n      </UiButton>\\n      {{#if this.showClue}}\\n        <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n          <div class=\\\"p1\\\">\\n            {{this.clue}}\\n          </div>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"text-gap-write {{this.classNames}} {{if this.clue 'clue'}}\\\"\\n  {{did-insert this.setElement}}\\n  ...attributes\\n>\\n\\n  <UiInput\\n    @appearance=\\\"line\\\"\\n    @autogrow={{true}}\\n    @size=\\\"6\\\"\\n    @disabled={{@disabled}}\\n    @value={{this.gapValue}}\\n    @autocapitalize=\\\"off\\\"\\n    @autocomplete=\\\"off\\\"\\n    @spellcheck={{false}}\\n    @autocorrect=\\\"off\\\"\\n    @placeholder={{this.gapObj.placeholder}}\\n    @onChange={{this.onChange}}\\n    @onEnter={{@onEnter}}\\n    @role=\\\"presentation\\\"\\n  />\\n\\n  {{#if this.clue}}\\n    {{#let (generate-id \\\"assignment-clue\\\") as |id|}}\\n      <UiButton\\n        class=\\\"text-gap-write-clue-btn\\\"\\n        @onClick={{this.handleToggleClue}}\\n        @appearance=\\\"none\\\"\\n        @active={{this.showClue}}\\n      >\\n        <div class=\\\"text-gap-write-icon-bg\\\">\\n          <DcIcon id={{id}} @name=\\\"clue\\\" @size=\\\"sm\\\" />\\n        </div>\\n      </UiButton>\\n      {{#if this.showClue}}\\n        <XPopup @for={{id}} @onClose={{this.handleToggleClue}}>\\n          <div class=\\\"p1\\\">\\n            {{this.clue}}\\n          </div>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/write/gap/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/write/gap/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { cached, tracked } from '@glimmer/tracking';\nimport ItemStateComponent from 'babel/components/exercise-view/common/item-state/index';\n\nexport default class ExerciseViewAssignmentTextGapWriteGapComponent extends ItemStateComponent {\n  /**\n   * Arguments:\n   * onChange (function)\n   * onEnter (function)\n   * node (object)\n   * disabled (bool)\n   * assignment (object)\n   * input (object)\n   * showKey (bool)\n   * incomplete (bool)\n   * showValidation (bool)\n   * isAutoCorrected (bool)\n   */\n\n  @tracked showClue;\n\n  get gapValue() {\n    if (this.args.showKey) {\n      return (\n        this.assignment?.content?.objects\n          ?.findBy('uuid', this.uuid)\n          ?.alternatives?.filterBy('correct')?.firstObject?.value || ''\n      );\n    }\n\n    return this.input?.findBy('uuid', this.uuid)?.value;\n  }\n\n  set gapValue(val) {\n    const input = this.input?.findBy('uuid', this.uuid);\n\n    if (input) {\n      input.value = val;\n    }\n  }\n\n  get clue() {\n    return this.gapObj.clue;\n  }\n\n  get uuid() {\n    return this.args.node?.attributes?.findBy('key', 'data-id')?.value;\n  }\n\n  get gapObj() {\n    return this.assignment?.content?.objects?.findBy('uuid', this.uuid);\n  }\n\n  get assignment() {\n    return this.args.assignment;\n  }\n\n  get input() {\n    return this.args.input;\n  }\n\n  get showValidation() {\n    return this.args.showValidation;\n  }\n\n  @cached\n  get suffix() {\n    let suffix;\n\n    let keys =\n      this.assignment?.content?.objects\n        ?.findBy('uuid', this.uuid)\n        ?.alternatives?.filterBy('correct')\n        ?.map((alternative) => alternative.value?.trim()) || [];\n\n    let value = this.input?.findBy('uuid', this.uuid)?.value?.trim() || '';\n\n    if (this.args.showKey && this.gapValue) {\n      suffix = 'key';\n    } else if (this.showValidation) {\n      if (!value) {\n        suffix = 'error';\n      } else {\n        const settings = this.assignment?.settings?.correctionwrite || [];\n\n        if (!settings.includes('case')) {\n          keys = keys.map((key) => key.toLowerCase());\n          value = value.toLowerCase();\n        }\n\n        if (!settings.includes('whitespace')) {\n          keys = keys.map((key) => key.replace(/\\s/g, ''));\n          value = value.replace(/\\s/g, '');\n        }\n\n        suffix = keys.includes(value) ? 'success' : 'error';\n      }\n    }\n\n    return suffix;\n  }\n\n  @action\n  setElement(elem) {\n    this.element = elem;\n  }\n\n  @action\n  onChange(value) {\n    if (!this.args.showKey) {\n      if (this.input?.findBy('uuid', this.uuid)) {\n        this.args.input.findBy('uuid', this.uuid).value = value;\n      }\n    }\n\n    this.args.onChange?.(value);\n  }\n\n  @action\n  handleToggleClue() {\n    this.showClue = !this.showClue;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div>\\n  {{#let (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\")) as |RenderComponent|}}\\n    <RenderComponent\\n      @value={{@tbRenderContent}}\\n      @content={{@tbRenderContent}}\\n      as |render|\\n    >\\n      {{~#if render.customComponent~}}\\n        <ExerciseView::Assignment::TextGap::Write::Gap\\n          @disabled={{@disabled}}\\n          @node={{render.node}}\\n          @id={{this.id}}\\n          @parentElementId={{render.parentElementId}}\\n          @onChange={{@onChange}}\\n          @onEnter={{@handleEnter}}\\n          @assignment={{@assignment}}\\n          @input={{@assignmentAnswer}}\\n          @showKey={{@showKey}}\\n          @incomplete={{@incomplete}}\\n          @showValidation={{@showValidation}}\\n          @isAutoCorrected={{@isAutoCorrected}}\\n        />\\n      {{~/if~}}\\n    </RenderComponent>\\n  {{/let}}\\n</div>\\n\", {\"contents\":\"<div>\\n  {{#let (component (if @inline \\\"tb-render-inline\\\" \\\"tb-render\\\")) as |RenderComponent|}}\\n    <RenderComponent\\n      @value={{@tbRenderContent}}\\n      @content={{@tbRenderContent}}\\n      as |render|\\n    >\\n      {{~#if render.customComponent~}}\\n        <ExerciseView::Assignment::TextGap::Write::Gap\\n          @disabled={{@disabled}}\\n          @node={{render.node}}\\n          @id={{this.id}}\\n          @parentElementId={{render.parentElementId}}\\n          @onChange={{@onChange}}\\n          @onEnter={{@handleEnter}}\\n          @assignment={{@assignment}}\\n          @input={{@assignmentAnswer}}\\n          @showKey={{@showKey}}\\n          @incomplete={{@incomplete}}\\n          @showValidation={{@showValidation}}\\n          @isAutoCorrected={{@isAutoCorrected}}\\n        />\\n      {{~/if~}}\\n    </RenderComponent>\\n  {{/let}}\\n</div>\\n\",\"moduleName\":\"babel/components/exercise-view/assignment/text-gap/write/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/assignment/text-gap/write/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { v4 as uuid } from 'ember-uuid';\n\nexport default class ExerciseViewAssignmentTextGapWriteComponent extends Component {\n  /**\n   * Arguments:\n   * inline (bool)\n   * disabled (bool)\n   * tbRenderContent (object)\n   * assignment (object)\n   * assignmentAnswer (object)\n   * showKey (bool)\n   * showValidation (bool)\n   * incomplete (bool)\n   * onChange (function)\n   * handleEnter (function)\n   * isAutoCorrected (bool)\n   */\n\n  get id() {\n    return uuid();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"drag-alternatives{{if this.empty ' drag-alternatives--empty'}}\\\"\\n  ...attributes\\n>\\n  {{#if this.empty}}\\n    <span class=\\\"text-small text-ui\\\">\\n      {{this.emptyLabel}}\\n    </span>\\n  {{else}}\\n    {{#each @alternatives as |alternative|}}\\n      {{yield (hash alternative=alternative)}}\\n    {{/each}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"drag-alternatives{{if this.empty ' drag-alternatives--empty'}}\\\"\\n  ...attributes\\n>\\n  {{#if this.empty}}\\n    <span class=\\\"text-small text-ui\\\">\\n      {{this.emptyLabel}}\\n    </span>\\n  {{else}}\\n    {{#each @alternatives as |alternative|}}\\n      {{yield (hash alternative=alternative)}}\\n    {{/each}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/exercise-view/common/drag-alternatives/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/common/drag-alternatives/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewCommonDragAlternativesComponent extends Component {\n  /**\n   * Arguments:\n   * alternatives (object)\n   */\n\n  @service intl;\n\n  get empty() {\n    return this.args.alternatives?.length === 0;\n  }\n\n  get emptyLabel() {\n    return this.args.behaviour === 'images'\n      ? this.intl.t(\n          'components.exerciseView.common.dragAlternatives.imageDragEmpty'\n        )\n      : this.intl.t(\n          'components.exerciseView.common.dragAlternatives.textGapDragEmpty'\n        );\n  }\n}\n","import { action } from '@ember/object';\nimport { later, scheduleOnce } from '@ember/runloop';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ExerciseViewCommonDragAssignmentComponent extends Component {\n  @tracked element;\n\n  @tracked dragging = false;\n\n  @tracked activeDraggable;\n\n  @tracked draggablePositions;\n\n  get draggingClassName() {\n    return this.dragging && ['drag-assignment', 'dragging'].join('--');\n  }\n\n  @action setElement(elem) {\n    this.element = elem;\n  }\n\n  @action handleDragStart() {\n    this.dragging = true;\n    this.draggablePositions = this._getDraggablePositions();\n\n    scheduleOnce('afterRender', this, '_getActiveDraggable');\n  }\n\n  @action handleDragEnd() {\n    this.dragging = false;\n\n    scheduleOnce('afterRender', this, '_findChangedDraggable');\n  }\n\n  _getDraggablePositions() {\n    const elem = this.element;\n    const droppables = elem && elem.querySelectorAll('.x-droppable');\n    const positions = [];\n\n    if (droppables) {\n      droppables.forEach((droppable) => {\n        const paired = droppable.closest('.item-state--paired');\n        const draggables = [];\n\n        let textContent = '';\n\n        droppable.querySelectorAll('.x-draggable').forEach((draggable) => {\n          draggables.push({\n            id: draggable.id,\n            text: draggable.textContent,\n            elem: draggable,\n          });\n\n          textContent += draggable.textContent;\n        });\n\n        positions.push({\n          id: droppable.id,\n          paired: paired ? true : false,\n          text: textContent,\n          draggables,\n        });\n      });\n    }\n\n    return positions;\n  }\n\n  _getActiveDraggable() {\n    const elem = this.element;\n    const activeDraggable = elem && elem.querySelector('.x-draggable--started');\n\n    this.activeDraggable = activeDraggable;\n  }\n\n  _findChangedDraggable() {\n    const initial = this.draggablePositions;\n    const current = this._getDraggablePositions();\n\n    if (\n      current.filter((curr) => !initial.find((x) => x.id === curr.id)).length >\n      0\n    ) {\n      // droppables have been replaced = match\n      // check for changes in paired state\n\n      current.forEach((curr, idx) => {\n        const init = initial[idx];\n\n        if (\n          init &&\n          curr.paired &&\n          (curr.text !== init.text || curr.paired !== init.paired)\n        ) {\n          curr.draggables.forEach((draggable) => {\n            this._highlightDraggable(draggable.elem);\n          });\n        }\n      });\n    } else if (\n      current.filter(\n        (curr, idx) => !(initial[idx] && initial[idx].id === curr.id)\n      ).length > 0\n    ) {\n      // droppables moved = arrange\n      // highlight active draggable\n\n      const activeDraggable = this.activeDraggable;\n      this._highlightDraggable(activeDraggable);\n    } else {\n      // droppables unchanged, look for draggable changes\n\n      current.forEach((curr) => {\n        const init = initial.find((x) => x.id === curr.id);\n\n        if (init) {\n          curr.draggables.forEach((draggable) => {\n            const initDraggable = init.draggables.find(\n              (x) => x.id === draggable.id\n            );\n\n            if (!initDraggable || initDraggable.text !== draggable.text) {\n              this._highlightDraggable(draggable.elem);\n            }\n          });\n        }\n      });\n    }\n  }\n\n  _highlightDraggable(elem) {\n    if (elem) {\n      elem.classList.add('x-draggable--dropped');\n    }\n\n    later(\n      this,\n      () => {\n        if (elem) {\n          elem.classList.remove('x-draggable--dropped');\n        }\n      },\n      1000\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"drag-item {{this.classNames}}\\\" ...attributes>\\n  <ContentPresenter class=\\\"content\\\">\\n    {{#if this.showValidation}}\\n      <span class=\\\"drag-item-state drag-item-state--key\\\">\\n        <DcIcon @name=\\\"key\\\" />\\n      </span>\\n\\n      <span class=\\\"drag-item-state drag-item-state--success\\\">\\n        <DcIcon @name=\\\"quite-happy\\\" />\\n      </span>\\n\\n      <span class=\\\"drag-item-state drag-item-state--error\\\">\\n        <DcIcon @name=\\\"t-warning\\\" />\\n      </span>\\n\\n    {{/if}}\\n\\n    {{yield}}\\n\\n    {{#if @canRemove}}\\n      <UiButton\\n        class=\\\"drag-item-remove-button\\\"\\n        @appearance=\\\"none\\\"\\n        @onClick={{@onRemove}}\\n      >\\n        <DcIcon @name=\\\"simple-remove\\\" />\\n      </UiButton>\\n    {{/if}}\\n  </ContentPresenter>\\n</div>\", {\"contents\":\"<div class=\\\"drag-item {{this.classNames}}\\\" ...attributes>\\n  <ContentPresenter class=\\\"content\\\">\\n    {{#if this.showValidation}}\\n      <span class=\\\"drag-item-state drag-item-state--key\\\">\\n        <DcIcon @name=\\\"key\\\" />\\n      </span>\\n\\n      <span class=\\\"drag-item-state drag-item-state--success\\\">\\n        <DcIcon @name=\\\"quite-happy\\\" />\\n      </span>\\n\\n      <span class=\\\"drag-item-state drag-item-state--error\\\">\\n        <DcIcon @name=\\\"t-warning\\\" />\\n      </span>\\n\\n    {{/if}}\\n\\n    {{yield}}\\n\\n    {{#if @canRemove}}\\n      <UiButton\\n        class=\\\"drag-item-remove-button\\\"\\n        @appearance=\\\"none\\\"\\n        @onClick={{@onRemove}}\\n      >\\n        <DcIcon @name=\\\"simple-remove\\\" />\\n      </UiButton>\\n    {{/if}}\\n  </ContentPresenter>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/common/drag-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/common/drag-item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentCommonDragItemComponent extends Component {\n  /**\n   * Arguments:\n   * compact (bool)\n   * hasHover (bool)\n   * placeholder (string)\n   * size (string)\n   * canRemove (bool)\n   * hasValidation (bool)\n   * onRemove (function)\n   */\n\n  get placeholder() {\n    return this.args.placeholder || 'shadow';\n  }\n\n  get size() {\n    return this.args.size || 'normal';\n  }\n\n  get showValidation() {\n    if (this.args.showValidation) {\n      return this.args.hasValidation === false ? false : true;\n    }\n    return false;\n  }\n\n  get placeholderClass() {\n    return ['drag-item', this.placeholder].join('--');\n  }\n\n  get sizeClass() {\n    return ['drag-item', this.size].join('--');\n  }\n\n  get classNames() {\n    const classNames = [this.placeholderClass, this.sizeClass];\n\n    if (this.args.compact) classNames.push('drag-item--compact');\n    if (this.args.hasHover) classNames.push('drag-item--has-hover');\n    if (this.args.behaviour === 'images') classNames.push('drag-item--image');\n\n    return classNames.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"drop-item {{this.classNames}}\\\" ...attributes>\\n  <div class=\\\"content\\\">\\n    {{yield}}\\n\\n    {{#if @pairable}}\\n      <div class=\\\"drop-item-icon drop-item-icon--pairable\\\">\\n        <DcIcon @name=\\\"add-circle\\\"/>\\n      </div>\\n\\n      <div class=\\\"drop-item-icon drop-item-icon--paired\\\">\\n        <svg width=\\\"12\\\" height=\\\"23\\\" viewBox=\\\"0 0 12 23\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n          <g stroke=\\\"none\\\" stroke-width=\\\"1\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\">\\n            <path d=\\\"M13 0v7C5.667 5 2 6.667 2 12s3.667 7 11 5v6\\\" fill=\\\"var(--background)\\\"/>\\n            <path class=\\\"drop-item-icon--connect\\\" d=\\\"M13 0v8.31l-1.263-.345C4.957 6.115 2 7.46 2 12c0 4.464 2.86 5.838 9.401 4.125L13 15.691V23h-2v-4.721l-.112.027C3.98 19.839.124 17.826.003 12.272L0 12c0-5.67 3.747-7.796 10.556-6.377L11 5.72V0h2z\\\" fill=\\\"#979797\\\" fill-rule=\\\"nonzero\\\"/>\\n          </g>\\n        </svg>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\\n\", {\"contents\":\"<div class=\\\"drop-item {{this.classNames}}\\\" ...attributes>\\n  <div class=\\\"content\\\">\\n    {{yield}}\\n\\n    {{#if @pairable}}\\n      <div class=\\\"drop-item-icon drop-item-icon--pairable\\\">\\n        <DcIcon @name=\\\"add-circle\\\"/>\\n      </div>\\n\\n      <div class=\\\"drop-item-icon drop-item-icon--paired\\\">\\n        <svg width=\\\"12\\\" height=\\\"23\\\" viewBox=\\\"0 0 12 23\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n          <g stroke=\\\"none\\\" stroke-width=\\\"1\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\">\\n            <path d=\\\"M13 0v7C5.667 5 2 6.667 2 12s3.667 7 11 5v6\\\" fill=\\\"var(--background)\\\"/>\\n            <path class=\\\"drop-item-icon--connect\\\" d=\\\"M13 0v8.31l-1.263-.345C4.957 6.115 2 7.46 2 12c0 4.464 2.86 5.838 9.401 4.125L13 15.691V23h-2v-4.721l-.112.027C3.98 19.839.124 17.826.003 12.272L0 12c0-5.67 3.747-7.796 10.556-6.377L11 5.72V0h2z\\\" fill=\\\"#979797\\\" fill-rule=\\\"nonzero\\\"/>\\n          </g>\\n        </svg>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\\n\",\"moduleName\":\"babel/components/exercise-view/common/drop-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/common/drop-item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class ExerciseViewAssignmentCommonDropItemComponent extends Component {\n  /**\n   * Arguments:\n   * pairable (bool)\n   * single (bool)\n   * size (string)\n   * hasDraggable (bool)\n   */\n\n  get size() {\n    return this.args.size || 'normal';\n  }\n\n  get sizeClass() {\n    return ['drop-item', this.size].join('--');\n  }\n\n  get classNames() {\n    const classNames = [this.sizeClass];\n\n    if (this.args.pairable) classNames.push('drop-item--pairable');\n    if (this.args.single) classNames.push('drop-item--single');\n    if (this.args.hasDraggable) classNames.push('drop-item--has-draggable');\n\n    return classNames.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XAlert\\n  class=\\\"flex-one text-center position-relative\\\"\\n  @variant=\\\"default\\\"\\n  ...attributes\\n>\\n  <div class=\\\"exercise-view-common-hint-arrow\\\"></div>\\n  {{ yield }}\\n</XAlert>\", {\"contents\":\"<XAlert\\n  class=\\\"flex-one text-center position-relative\\\"\\n  @variant=\\\"default\\\"\\n  ...attributes\\n>\\n  <div class=\\\"exercise-view-common-hint-arrow\\\"></div>\\n  {{ yield }}\\n</XAlert>\",\"moduleName\":\"babel/components/exercise-view/common/hint/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/common/hint/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport imageSource from 'compton/utils/image-source';\nimport { resolve } from 'rsvp';\n\nexport default class ExerciseViewCommonItemImageComponent extends Component {\n  /**\n   * Arguments:\n   * imageId (string)\n   * width (number)\n   * height (number)\n   */\n\n  @service store;\n\n  @cached get imageProxy() {\n    let promise = resolve();\n\n    const imageId = this.args.imageId;\n\n    if (imageId) {\n      promise = this.store.findRecord('material', imageId);\n    }\n\n    return load(promise, this);\n  }\n\n  get image() {\n    return this.imageProxy.isResolved ? this.imageProxy.value : null;\n  }\n\n  get allowCrop() {\n    return !this.image?.metadata?.keep_proportions;\n  }\n\n  get imagePadding() {\n    return this.allowCrop && !this.args.disablePadding;\n  }\n\n  @cached get imageSrc() {\n    const image = this.image;\n    if (!image) {\n      return false;\n    }\n\n    let width;\n    let height;\n    const allowCrop = this.allowCrop;\n\n    if (this.args.isHorizontal || this.args.isGroup) {\n      const assignmentId = this.args.assignmentId;\n      const selector = `.target-width-${assignmentId}`;\n      const box = document.querySelector(selector);\n      if (allowCrop) {\n        if (image.imageIsPortrait) {\n          height = box.offsetHeight * 2;\n        } else {\n          width = box.offsetWidth * 2;\n        }\n      } else {\n        height = box.offsetHeight * 2;\n        width = box.offsetWidth * 2;\n      }\n    } else {\n      if (this.allowCrop) {\n        if (image.imageIsPortrait) {\n          height = this.args.height;\n        } else {\n          width = this.args.width;\n        }\n      } else {\n        height = this.args.height;\n        width = this.args.width;\n      }\n    }\n\n    // If width and height is set we will crop the image keeping in mind the keep_proportions\n    if (width || height) {\n      const focusPoint = image.metadata?.focus_point\n        ? {\n            px: parseInt(image.metadata.focus_point.x),\n            py: parseInt(image.metadata.focus_point.y),\n          }\n        : null;\n\n      if (focusPoint && !allowCrop) {\n        return imageSource(image.imageUrl, {\n          crop: true,\n          w: width,\n          h: height,\n          ...focusPoint,\n        });\n      } else {\n        return imageSource(image.imageUrl, {\n          embed: !allowCrop,\n          w: width,\n          h: height,\n          ...focusPoint,\n        });\n      }\n    } else {\n      return imageSource(image.imageUrl);\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport { isBlank } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport shakeElement from 'babel/utils/shake-element';\n\nexport default class ExerciseViewCommonItemStateComponent extends Component {\n  @tracked assigned = false;\n\n  @tracked paired = false;\n\n  @tracked inGroup = false;\n\n  @tracked suffix;\n\n  @tracked gapValue;\n\n  @tracked inputValue;\n\n  @tracked incomplete;\n\n  @tracked componentData;\n\n  @tracked element;\n\n  get isIncomplete() {\n    return (\n      !this.assigned &&\n      !this.paired &&\n      isBlank(this.gapValue) &&\n      isBlank(this.inputValue) &&\n      (this.incomplete || this.componentData?.incomplete)\n    );\n  }\n\n  get assignedClassName() {\n    return this.assigned && ['item-state', 'assigned'].join('--');\n  }\n\n  get pairedClassName() {\n    return this.paired && ['item-state', 'paired'].join('--');\n  }\n\n  get inGroupClassName() {\n    return this.inGroup && ['item-state', 'in-group'].join('--');\n  }\n\n  get suffixClassName() {\n    const elem = this.element;\n    const suffix = this.suffix;\n\n    if (elem && suffix === 'error') {\n      shakeElement(elem);\n    }\n\n    return this.suffix && ['item-state', this.suffix].join('--');\n  }\n\n  get classNames() {\n    const classNames = [];\n\n    if (this.assignedClassName) classNames.push(this.assignedClassName);\n    if (this.pairedClassName) classNames.push(this.pairedClassName);\n    if (this.inGroupClassName) classNames.push(this.inGroupClassName);\n    if (this.suffixClassName) classNames.push(this.suffixClassName);\n    if (this.isIncomplete) classNames.push('item-state--incomplete');\n\n    return classNames.join(' ');\n  }\n\n  @action setElement(elem) {\n    this.element = elem;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div ...attributes>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <XMarkerScope>\\n\\n      <:content>\\n\\n        <XImage\\n          @source={{data.image.imageUrl}}\\n          @color={{data.image.imageColor}}\\n          @width={{data.image.imageWidth}}\\n          @height={{data.image.imageHeight}}\\n        />\\n\\n      </:content>\\n\\n      <:default as |scope|>\\n\\n        {{yield scope}}\\n\\n      </:default>\\n\\n    </XMarkerScope>\\n\\n  </WaitFor>\\n\\n</div>\", {\"contents\":\"<div ...attributes>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <XMarkerScope>\\n\\n      <:content>\\n\\n        <XImage\\n          @source={{data.image.imageUrl}}\\n          @color={{data.image.imageColor}}\\n          @width={{data.image.imageWidth}}\\n          @height={{data.image.imageHeight}}\\n        />\\n\\n      </:content>\\n\\n      <:default as |scope|>\\n\\n        {{yield scope}}\\n\\n      </:default>\\n\\n    </XMarkerScope>\\n\\n  </WaitFor>\\n\\n</div>\",\"moduleName\":\"babel/components/exercise-view/common/marker-scope/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/common/marker-scope/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport Resource from 'babel/utils/resource';\n\nexport default class ExerciseViewCommonMarkerScopeComponent extends Component {\n  @service store;\n\n  resource = new Resource(async () => {\n    let imageId = this.args.assignment?.content?.image;\n\n    if (imageId) {\n      const image = await this.store.findRecord('material', imageId);\n      return {\n        image,\n      };\n    }\n\n    return {\n      image: null,\n    };\n  });\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class={{this.classNames}} ...attributes>\\n  {{yield (hash topbar=(component \\\"x-empty\\\") target=this.exerciseLink)}}\\n\\n  <div\\n    class=\\\"exercise-view-body-main-component{{unless\\n        @answer\\n        ' exercise-audit-no-answer'\\n      }}\\\"\\n  >\\n    <ShowResponse id={{concat \\\"show-response-\\\" @answer.id}} />\\n\\n    <div class=\\\"exercise-main\\\">\\n      {{#if (not (or this.exerciseParent.isDiagnosis @exercise.owner))}}\\n        <div class=\\\"exercise-meta\\\">\\n          <div class=\\\"flex\\\">\\n            {{#unless @hideMeta}}\\n              <EntityMeta\\n                class=\\\"text-color-default mr1 mb1\\\"\\n                @model={{@exercise}}\\n                @closeCollectionModal={{@closeModal}}\\n              />\\n            {{/unless}}\\n          </div>\\n        </div>\\n      {{/if}}\\n\\n      {{#if (or this.showTitle this.showDraftBadge this.showComments @preview)}}\\n        <ContentPresenter>\\n          <div class=\\\"flex flex-center\\\">\\n            <h2\\n              class=\\\"flex-auto\\\"\\n              data-id={{generate-id @exercise.id}}\\n              {{ref (set this \\\"titleElement\\\")}}\\n            >\\n              {{#if this.showTitle}}\\n                {{this.exerciseTitle}}\\n              {{else if @preview}}\\n                {{#unless @exercise.hideAssignmentSortNumbers}}\\n                  {{or @index @exercise.sort}}.\\n                {{/unless}}\\n              {{/if}}\\n            </h2>\\n\\n            {{#if this.showDraftBadge}}\\n              <XBadge class=\\\"flex-shrink ml1\\\" @size=\\\"small\\\">\\n                {{t \\\"components.exerciseView.draftBadgeLabel\\\"}}\\n              </XBadge>\\n            {{/if}}\\n\\n            {{#if this.showComments}}\\n              <UiButton\\n                @size=\\\"small\\\"\\n                @appearance=\\\"link\\\"\\n                @onClick={{this.scrollToComments}}\\n                class=\\\"flex-shrink nl1\\\"\\n              >\\n                <XBadge @size=\\\"small\\\">\\n                  {{t \\\"components.exerciseView.comments\\\"}}\\n                  ({{this.numComments}})\\n                </XBadge>\\n              </UiButton>\\n            {{/if}}\\n          </div>\\n        </ContentPresenter>\\n      {{/if}}\\n\\n      {{#if this.canEditExercise}}\\n        <div class=\\\"nb1\\\">\\n          <UiLink\\n            @route=\\\"master.contents.assignments.edit\\\"\\n            @model={{@exercise.id}}\\n            @size=\\\"small\\\"\\n          >\\n            {{t \\\"components.exerciseView.edit\\\"}}\\n          </UiLink>\\n\\n          <UiButton\\n            @size=\\\"small\\\"\\n            @onClick={{this.removeExerciseFromWorkspace}}\\n            @variant=\\\"error\\\"\\n            @appearance=\\\"link\\\"\\n            class=\\\"nl1\\\"\\n          >\\n            {{t \\\"components.exerciseView.removeFromWorkspace\\\"}}\\n          </UiButton>\\n        </div>\\n      {{/if}}\\n\\n      {{#if @canToggleQuestion}}\\n        <UiButton @appearance=\\\"link\\\" class=\\\"mb1\\\" @onClick={{@toggleQuestion}}>\\n          {{#if @hideQuestion}}\\n            {{t \\\"components.exerciseView.showDescription\\\"}}\\n          {{else}}\\n            {{t \\\"components.exerciseView.hideDescription\\\"}}\\n          {{/if}}\\n        </UiButton>\\n      {{/if}}\\n\\n      {{#unless @hideQuestion}}\\n        {{#if @exercise.contenteditor}}\\n          {{#if @exercise.contenteditor.components}}\\n            <ContentPresenter class=\\\"mb1\\\">\\n              <TbRender\\n                @content={{@exercise.contenteditor}}\\n                @canvasUser={{@answerUser}}\\n              />\\n            </ContentPresenter>\\n          {{/if}}\\n        {{else}}\\n          {{#if @exercise.questionHtml}}\\n            <ContentPresenter class=\\\"mb1 question-html\\\">\\n              <EditorPreview\\n                @content={{@exercise.questionHtml}}\\n                data-id={{@exercise.id}}\\n                data-language={{this.languages.contentLanguage}}\\n              />\\n            </ContentPresenter>\\n          {{else}}\\n            {{#if @exercise.contenteditor.isRejected}}\\n              <XAlert @variant=\\\"error\\\" class=\\\"p1\\\">\\n                {{t\\n                  \\\"components.exerciseView.missingContenteditor\\\"\\n                  htmlSafe=true\\n                }}\\n              </XAlert>\\n            {{/if}}\\n          {{/if}}\\n          {{#if @exercise.teacherAssignment.files.length}}\\n            <AttachmentPreview\\n              class=\\\"mb1\\\"\\n              @files={{@exercise.teacherAssignment.files}}\\n              @sortable={{false}}\\n              @removeable={{true}}\\n            />\\n          {{/if}}\\n        {{/if}}\\n      {{/unless}}\\n\\n      {{#if this.shouldShowDivider}}\\n        <div class=\\\"bb1 mb1 mt1\\\"></div>\\n      {{/if}}\\n      {{#component (if @emptyAnswer \\\"x-empty\\\" \\\"x-await\\\") @answer}}\\n        {{#each this.assignmentsOrdered as |assignment index|}}\\n          <ExerciseView::Assignment\\n            @numberOfMediaAssignments={{this.numberOfMediaAssignments}}\\n            @listType={{@exercise.body.exercise_list_type}}\\n            @withinContent={{@withinContent}}\\n            @exerciseType={{@exercise.type}}\\n            @hasMultipleAssignments={{this.hasMultipleAssignments}}\\n            @answer={{@answer}}\\n            @assignment={{assignment}}\\n            @disabled={{@disabled}}\\n            @canHaveAttachments={{this.canHaveAttachments}}\\n            @showSuggestion={{@showSuggestion}}\\n            @handleOnChange={{this.handleChange}}\\n            @handleReset={{this.handleReset}}\\n            @solution={{assignment.settings.solution}}\\n            @showKey={{@showKey}}\\n            @showValidation={{this.showValidation}}\\n            @incomplete={{this.isIncomplete}}\\n            @isAutoCorrected={{this.isAutoCorrected}}\\n            @mediaIsRecording={{this.mediaIsRecording}}\\n            @changeMediaRecordingStatus={{this.changeMediaRecordingStatus}}\\n            @preview={{@preview}}\\n            @onDidInsert={{fn this.handleDidInsertAssignment index}}\\n          />\\n\\n          {{#if this.showKeyboard}}\\n            <SpecialKeyboard\\n              @preset={{@exercise.book.body.special_keyboard_preset}}\\n              @objects={{assignment.content.objects}}\\n              class=\\\"mt1\\\"\\n            />\\n          {{/if}}\\n\\n          {{#if (and @showKey assignment.settings.solution)}}\\n            <DcCard class=\\\"mt1 mb1\\\" as |Card|>\\n              <Card.content>\\n                <div class=\\\"text-tertiary nb1 flex flex-center\\\">\\n                  <DcIcon @name=\\\"key\\\" class=\\\"nr1\\\" />\\n                  {{t \\\"components.exerciseView.editor.solution\\\"}}\\n                </div>\\n\\n                <ContentPresenter>\\n                  <TbRenderWrapper\\n                    @editorId={{assignment.content.solution_editor_id}}\\n                    @model={{@exercise}}\\n                  />\\n                </ContentPresenter>\\n              </Card.content>\\n            </DcCard>\\n          {{/if}}\\n        {{/each}}\\n      {{/component}}\\n\\n      {{#if this.canHaveAttachments}}\\n        {{#if @disabled}}\\n          {{#if this.files}}\\n            <AttachmentPreview\\n              class=\\\"mb2\\\"\\n              @files={{this.files}}\\n              @sortable={{false}}\\n              @removeable={{false}}\\n            />\\n          {{/if}}\\n        {{else}}\\n          <FileAssignment\\n            class=\\\"mt1\\\"\\n            @files={{this.files}}\\n            @onAdd={{this.handleFileAssignmentAdd}}\\n            @onRemove={{this.handleFileAssignmentRemove}}\\n          />\\n        {{/if}}\\n      {{/if}}\\n    </div>\\n    {{yield\\n      (hash\\n        bottombar=(component \\\"x-empty\\\")\\n        resetAnswer=this.resetAnswer\\n        submitAnswer=this.submitAnswer\\n        status=this.status\\n        toggleKeyboard=this.toggleKeyboard\\n        showKeyboard=this.showKeyboard\\n      )\\n    }}\\n\\n    {{#if this.showComments}}\\n      <AnswerComments\\n        @assignment={{@exercise}}\\n        @answer={{this.originalAnswer}}\\n        @commentsDisabled={{this.commentsDisabled}}\\n      />\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div class={{this.classNames}} ...attributes>\\n  {{yield (hash topbar=(component \\\"x-empty\\\") target=this.exerciseLink)}}\\n\\n  <div\\n    class=\\\"exercise-view-body-main-component{{unless\\n        @answer\\n        ' exercise-audit-no-answer'\\n      }}\\\"\\n  >\\n    <ShowResponse id={{concat \\\"show-response-\\\" @answer.id}} />\\n\\n    <div class=\\\"exercise-main\\\">\\n      {{#if (not (or this.exerciseParent.isDiagnosis @exercise.owner))}}\\n        <div class=\\\"exercise-meta\\\">\\n          <div class=\\\"flex\\\">\\n            {{#unless @hideMeta}}\\n              <EntityMeta\\n                class=\\\"text-color-default mr1 mb1\\\"\\n                @model={{@exercise}}\\n                @closeCollectionModal={{@closeModal}}\\n              />\\n            {{/unless}}\\n          </div>\\n        </div>\\n      {{/if}}\\n\\n      {{#if (or this.showTitle this.showDraftBadge this.showComments @preview)}}\\n        <ContentPresenter>\\n          <div class=\\\"flex flex-center\\\">\\n            <h2\\n              class=\\\"flex-auto\\\"\\n              data-id={{generate-id @exercise.id}}\\n              {{ref (set this \\\"titleElement\\\")}}\\n            >\\n              {{#if this.showTitle}}\\n                {{this.exerciseTitle}}\\n              {{else if @preview}}\\n                {{#unless @exercise.hideAssignmentSortNumbers}}\\n                  {{or @index @exercise.sort}}.\\n                {{/unless}}\\n              {{/if}}\\n            </h2>\\n\\n            {{#if this.showDraftBadge}}\\n              <XBadge class=\\\"flex-shrink ml1\\\" @size=\\\"small\\\">\\n                {{t \\\"components.exerciseView.draftBadgeLabel\\\"}}\\n              </XBadge>\\n            {{/if}}\\n\\n            {{#if this.showComments}}\\n              <UiButton\\n                @size=\\\"small\\\"\\n                @appearance=\\\"link\\\"\\n                @onClick={{this.scrollToComments}}\\n                class=\\\"flex-shrink nl1\\\"\\n              >\\n                <XBadge @size=\\\"small\\\">\\n                  {{t \\\"components.exerciseView.comments\\\"}}\\n                  ({{this.numComments}})\\n                </XBadge>\\n              </UiButton>\\n            {{/if}}\\n          </div>\\n        </ContentPresenter>\\n      {{/if}}\\n\\n      {{#if this.canEditExercise}}\\n        <div class=\\\"nb1\\\">\\n          <UiLink\\n            @route=\\\"master.contents.assignments.edit\\\"\\n            @model={{@exercise.id}}\\n            @size=\\\"small\\\"\\n          >\\n            {{t \\\"components.exerciseView.edit\\\"}}\\n          </UiLink>\\n\\n          <UiButton\\n            @size=\\\"small\\\"\\n            @onClick={{this.removeExerciseFromWorkspace}}\\n            @variant=\\\"error\\\"\\n            @appearance=\\\"link\\\"\\n            class=\\\"nl1\\\"\\n          >\\n            {{t \\\"components.exerciseView.removeFromWorkspace\\\"}}\\n          </UiButton>\\n        </div>\\n      {{/if}}\\n\\n      {{#if @canToggleQuestion}}\\n        <UiButton @appearance=\\\"link\\\" class=\\\"mb1\\\" @onClick={{@toggleQuestion}}>\\n          {{#if @hideQuestion}}\\n            {{t \\\"components.exerciseView.showDescription\\\"}}\\n          {{else}}\\n            {{t \\\"components.exerciseView.hideDescription\\\"}}\\n          {{/if}}\\n        </UiButton>\\n      {{/if}}\\n\\n      {{#unless @hideQuestion}}\\n        {{#if @exercise.contenteditor}}\\n          {{#if @exercise.contenteditor.components}}\\n            <ContentPresenter class=\\\"mb1\\\">\\n              <TbRender\\n                @content={{@exercise.contenteditor}}\\n                @canvasUser={{@answerUser}}\\n              />\\n            </ContentPresenter>\\n          {{/if}}\\n        {{else}}\\n          {{#if @exercise.questionHtml}}\\n            <ContentPresenter class=\\\"mb1 question-html\\\">\\n              <EditorPreview\\n                @content={{@exercise.questionHtml}}\\n                data-id={{@exercise.id}}\\n                data-language={{this.languages.contentLanguage}}\\n              />\\n            </ContentPresenter>\\n          {{else}}\\n            {{#if @exercise.contenteditor.isRejected}}\\n              <XAlert @variant=\\\"error\\\" class=\\\"p1\\\">\\n                {{t\\n                  \\\"components.exerciseView.missingContenteditor\\\"\\n                  htmlSafe=true\\n                }}\\n              </XAlert>\\n            {{/if}}\\n          {{/if}}\\n          {{#if @exercise.teacherAssignment.files.length}}\\n            <AttachmentPreview\\n              class=\\\"mb1\\\"\\n              @files={{@exercise.teacherAssignment.files}}\\n              @sortable={{false}}\\n              @removeable={{true}}\\n            />\\n          {{/if}}\\n        {{/if}}\\n      {{/unless}}\\n\\n      {{#if this.shouldShowDivider}}\\n        <div class=\\\"bb1 mb1 mt1\\\"></div>\\n      {{/if}}\\n      {{#component (if @emptyAnswer \\\"x-empty\\\" \\\"x-await\\\") @answer}}\\n        {{#each this.assignmentsOrdered as |assignment index|}}\\n          <ExerciseView::Assignment\\n            @numberOfMediaAssignments={{this.numberOfMediaAssignments}}\\n            @listType={{@exercise.body.exercise_list_type}}\\n            @withinContent={{@withinContent}}\\n            @exerciseType={{@exercise.type}}\\n            @hasMultipleAssignments={{this.hasMultipleAssignments}}\\n            @answer={{@answer}}\\n            @assignment={{assignment}}\\n            @disabled={{@disabled}}\\n            @canHaveAttachments={{this.canHaveAttachments}}\\n            @showSuggestion={{@showSuggestion}}\\n            @handleOnChange={{this.handleChange}}\\n            @handleReset={{this.handleReset}}\\n            @solution={{assignment.settings.solution}}\\n            @showKey={{@showKey}}\\n            @showValidation={{this.showValidation}}\\n            @incomplete={{this.isIncomplete}}\\n            @isAutoCorrected={{this.isAutoCorrected}}\\n            @mediaIsRecording={{this.mediaIsRecording}}\\n            @changeMediaRecordingStatus={{this.changeMediaRecordingStatus}}\\n            @preview={{@preview}}\\n            @onDidInsert={{fn this.handleDidInsertAssignment index}}\\n          />\\n\\n          {{#if this.showKeyboard}}\\n            <SpecialKeyboard\\n              @preset={{@exercise.book.body.special_keyboard_preset}}\\n              @objects={{assignment.content.objects}}\\n              class=\\\"mt1\\\"\\n            />\\n          {{/if}}\\n\\n          {{#if (and @showKey assignment.settings.solution)}}\\n            <DcCard class=\\\"mt1 mb1\\\" as |Card|>\\n              <Card.content>\\n                <div class=\\\"text-tertiary nb1 flex flex-center\\\">\\n                  <DcIcon @name=\\\"key\\\" class=\\\"nr1\\\" />\\n                  {{t \\\"components.exerciseView.editor.solution\\\"}}\\n                </div>\\n\\n                <ContentPresenter>\\n                  <TbRenderWrapper\\n                    @editorId={{assignment.content.solution_editor_id}}\\n                    @model={{@exercise}}\\n                  />\\n                </ContentPresenter>\\n              </Card.content>\\n            </DcCard>\\n          {{/if}}\\n        {{/each}}\\n      {{/component}}\\n\\n      {{#if this.canHaveAttachments}}\\n        {{#if @disabled}}\\n          {{#if this.files}}\\n            <AttachmentPreview\\n              class=\\\"mb2\\\"\\n              @files={{this.files}}\\n              @sortable={{false}}\\n              @removeable={{false}}\\n            />\\n          {{/if}}\\n        {{else}}\\n          <FileAssignment\\n            class=\\\"mt1\\\"\\n            @files={{this.files}}\\n            @onAdd={{this.handleFileAssignmentAdd}}\\n            @onRemove={{this.handleFileAssignmentRemove}}\\n          />\\n        {{/if}}\\n      {{/if}}\\n    </div>\\n    {{yield\\n      (hash\\n        bottombar=(component \\\"x-empty\\\")\\n        resetAnswer=this.resetAnswer\\n        submitAnswer=this.submitAnswer\\n        status=this.status\\n        toggleKeyboard=this.toggleKeyboard\\n        showKeyboard=this.showKeyboard\\n      )\\n    }}\\n\\n    {{#if this.showComments}}\\n      <AnswerComments\\n        @assignment={{@exercise}}\\n        @answer={{this.originalAnswer}}\\n        @commentsDisabled={{this.commentsDisabled}}\\n      />\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/exercise-view/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/exercise-view/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isPresent, typeOf } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { correctExercise } from 'babel/utils/assignments';\nimport htmlEntities from 'compton/utils/html-entities';\nimport { load } from 'ember-async-data';\nimport { storageFor } from 'ember-local-storage';\nimport { all, resolve } from 'rsvp';\n\nconst showDividerTemplateList = ['arrange', 'sort', 'choice', 'text-gap'];\n\nconst hideAttachedFiles = ['audio-recording'];\n\nconst CANDIDATE_SELECTOR =\n  'input, textarea:not([style*=\"display: none\"]), [contenteditable]';\n\nconst ASSIGNMENT_SELECTOR = '[data-exercise-view-assignment]';\n\nexport function isElementInViewport(element) {\n  return new Promise(function (resolve) {\n    const observer = new IntersectionObserver(function (entries) {\n      entries.forEach(function (entry) {\n        resolve(entry.isIntersecting);\n        observer.disconnect();\n      });\n    });\n\n    observer.observe(element);\n  });\n}\n\nexport default class ExerciseViewComponent extends Component {\n  /**\n   * Arguments:\n   * exercise (object)\n   * index (number)\n   * answer (object)\n   * emptyAnswer (bool)\n   * canToggleQuestion (bool)\n   * disabled (bool)\n   * hideMeta (bool)\n   * onExerciseChange (function)\n   * canStartConversation (bool)\n   * showKey (bool)\n   * toggleKey (function)\n   * showSuggestion (bool)\n   * toggleSuggestion (function)\n   * answerUser (object)\n   */\n\n  constructor() {\n    super(...arguments);\n\n    this.languages.exerciseLanguage = this.args.exercise?.body?.language;\n  }\n\n  @service showResponse;\n\n  @service intl;\n\n  @service confirmManager;\n\n  @service languages;\n\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  @service assignmentEvents;\n\n  @service contextHelper;\n\n  @storageFor('read-setting') settings;\n\n  @tracked localStatus = null;\n\n  @tracked mediaIsRecording = false;\n\n  @tracked titleElement = null;\n\n  @tracked showKeyboard = false;\n\n  get numberOfMediaAssignments() {\n    const assignments = this.args.exercise?.body?.exercise?.assignments;\n    if (!assignments) return null;\n    const count = assignments.filter((obj) => obj.template === 'media').length;\n    return count;\n  }\n\n  get showValidation() {\n    if (this.args.exercise?.body?.exercise?.hide_fields_feedback) return false;\n\n    return ['correct', 'wrong'].includes(this.args.answer?.status);\n  }\n\n  get isIncomplete() {\n    return this.args.answer?.status === 'incomplete';\n  }\n\n  @cached\n  get originalAnswerProxy() {\n    const answer = this.args.answer;\n\n    let promise;\n\n    if (!answer) {\n      promise = resolve();\n    } else if (answer.belongsTo('originalAnswer').id() === null) {\n      promise = resolve(answer);\n    } else {\n      promise = resolve(answer.originalAnswer);\n    }\n\n    return load(promise, this);\n  }\n\n  get showComments() {\n    return (\n      !this.exerciseParent?.isDiagnosis &&\n      (this.args.canStartConversation || this.numComments > 0)\n    );\n  }\n\n  get classNames() {\n    const classNames = ['exercise-view-component'];\n\n    if (this.showComments) {\n      classNames.push('exercise--commenting');\n    }\n\n    if (this.args.class) {\n      classNames.push(this.args.class);\n    }\n\n    return classNames.join(' ');\n  }\n\n  get originalAnswer() {\n    if (\n      this.originalAnswerProxy.isPending ||\n      this.originalAnswerProxy.isRejected\n    ) {\n      return null;\n    }\n\n    return this.originalAnswerProxy.value;\n  }\n\n  get fileList() {\n    return this.args.disabled\n      ? this.originalAnswer?.files\n      : this.args.answer?.files;\n  }\n\n  get files() {\n    const result = [];\n    this.fileList?.map((file) => {\n      if (!hideAttachedFiles.includes(file.type)) {\n        result.push(file);\n      }\n    });\n\n    return result.length > 0 ? result : null;\n  }\n\n  get canHaveAttachments() {\n    if (this.args.exercise?.isTeacherAssignment) return true;\n    if (this.args.exercise?.body?.exercise?.allow_attachments) return true;\n    return false;\n  }\n\n  @cached\n  get exerciseOwnerProxy() {\n    const promise = resolve(this.args.exercise?.owner);\n    return load(promise, this);\n  }\n\n  get exerciseOwner() {\n    if (\n      this.exerciseOwnerProxy.isPending ||\n      this.exerciseOwnerProxy.isRejected\n    ) {\n      return null;\n    }\n\n    return this.exerciseOwnerProxy.value;\n  }\n\n  get canEditExercise() {\n    if (this.router.currentRouteName !== 'master.contents.assignments.show') {\n      return false;\n    }\n\n    const ownerId = this.exerciseOwner?.id;\n    const userId = this.session?.user?.id;\n\n    if (ownerId && ownerId === userId) return true;\n\n    return false;\n  }\n\n  get status() {\n    if (this.localStatus) {\n      return this.localStatus;\n    }\n\n    return this.args.answer?.computedStatus || 'not-started';\n  }\n\n  get isAutoCorrected() {\n    return this.args.exercise?.type === 'exercises';\n  }\n\n  get exerciseLink() {\n    if (this.args.exercise?.isTeacherAssignment) return null;\n    if (this.args.answer?.type === 'diagnosis') return null;\n    return ['nodes', this.args.exercise?.id];\n  }\n\n  get assignmentsOrdered() {\n    return this.args.exercise?.body?.exercise?.assignments?.sortBy('index');\n  }\n\n  get shouldShowDivider() {\n    return showDividerTemplateList.includes(\n      this.assignmentsOrdered?.[0]?.template\n    );\n  }\n\n  get hasMultipleAssignments() {\n    return this.args.exercise?.body?.exercise?.assignments?.length > 1;\n  }\n\n  @cached\n  get exerciseParentProxy() {\n    const promise = resolve(this.args.exercise?.parent);\n    return load(promise, this);\n  }\n\n  get exerciseParent() {\n    if (\n      this.exerciseParentProxy.isPending ||\n      this.exerciseParentProxy.isRejected\n    ) {\n      return null;\n    }\n\n    return this.exerciseParentProxy.value;\n  }\n\n  get exerciseTitle() {\n    const exercise = this.args.exercise;\n\n    if (!exercise) return null;\n\n    let title = exercise.heading || exercise.title;\n\n    if (!exercise.hideAssignmentSortNumbers) {\n      if (this.args.index) {\n        title = `${this.args.index}. ${title}`;\n      } else {\n        title = exercise.sort ? `${exercise.sort}. ${title}` : title;\n      }\n    }\n\n    return htmlEntities(title);\n  }\n\n  @cached\n  get numCommentsProxy() {\n    const userId = this.session?.user?.id;\n\n    let promise = resolve();\n\n    if (this.originalAnswer) {\n      promise = resolve(this.originalAnswer.comments).then((comments) =>\n        all(\n          comments.map(async (comment) => {\n            let user;\n\n            try {\n              user = await resolve(comment.user);\n            } catch (err) {\n              // deleted user is fine\n            }\n\n            if (\n              !comment.isDeleted &&\n              (comment.public === true || user?.id === userId)\n            ) {\n              return comment;\n            }\n\n            return null;\n          })\n        ).then((comments) => comments.filter((x) => x).length)\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get numComments() {\n    return this.numCommentsProxy.isResolved ? this.numCommentsProxy.value : 0;\n  }\n\n  get showTitle() {\n    return this.exerciseTitle && !this.args.exercise?.body?.hide_heading;\n  }\n\n  get showDraftBadge() {\n    return (\n      !this.args.exercise?.teacherAssignment?.public &&\n      this.args.exercise?.owner\n    );\n  }\n\n  @cached\n  get commentsDisabled() {\n    const originalAnswer = this.originalAnswer;\n\n    if (originalAnswer) {\n      return (\n        originalAnswer.versions.length === 0 &&\n        originalAnswer.status === 'not-started'\n      );\n    }\n\n    return true;\n  }\n\n  get shouldResetAnswerStatus() {\n    // When there is only one assignment, it is of type check\n    // and the user has unchecked the checkbox then answers'\n    // status should be reset to \"not-started\". The following\n    // identifies that case.\n\n    if (!this.assignmentsOrdered || this.assignmentsOrdered.length !== 1) {\n      return false;\n    }\n\n    const assignment = this.assignmentsOrdered[0];\n\n    if (assignment.template !== 'check') return false;\n\n    const answer = this.args.answer;\n    const assignmentAnswer = answer?.assignments?.findBy(\n      'uuid',\n      assignment.uuid\n    );\n\n    if (!assignmentAnswer || assignmentAnswer.input !== false) return false;\n\n    return true;\n  }\n\n  @action\n  changeMediaRecordingStatus() {\n    this.mediaIsRecording = !this.mediaIsRecording;\n  }\n\n  @action\n  scrollToComments() {\n    const elem = document.querySelector('.answer-comments');\n\n    if (elem) {\n      elem.scrollIntoView({ behavior: 'smooth' });\n    }\n  }\n\n  @action\n  resetAnswer() {\n    return this.confirmManager\n      .confirm(this.intl.t('components.exerciseView.reset.confirm'))\n      .then(() => this._clearAnswer())\n      .catch(() => {});\n  }\n\n  @action\n  submitAnswer() {\n    return this._submitAnswer();\n  }\n\n  @action\n  handleChange() {\n    return this._onChange();\n  }\n\n  @action\n  handleReset() {\n    return this._clearAnswer();\n  }\n\n  @action\n  removeExerciseFromWorkspace() {\n    const exercise = this.args.exercise;\n\n    return all([\n      exercise.teacherAssignment,\n      this.contextHelper.activeContent,\n    ]).then(([teacherAssignment, currentContent]) => {\n      teacherAssignment.deleteAsEntity(currentContent);\n\n      return this.router\n        .transitionTo('master.contents.assignments')\n        .then(() => resolve(teacherAssignment.contents))\n        .then((contents) => {\n          contents.removeObject(currentContent);\n          return teacherAssignment.save();\n        });\n    });\n  }\n\n  @action\n  handleDidInsertAssignment(index, element) {\n    if (\n      index === 0 &&\n      this.assignmentEvents.focusedExercise === this.args.exercise\n    ) {\n      later(async () => {\n        const candidateElement = element.querySelector(CANDIDATE_SELECTOR);\n\n        if (candidateElement && (await isElementInViewport(candidateElement))) {\n          candidateElement.focus({ preventScroll: true });\n        } else {\n          element.closest(ASSIGNMENT_SELECTOR)?.focus({ preventScroll: true });\n        }\n      });\n    } else {\n      this.assignmentEvents.resetExerciseFocus();\n    }\n  }\n\n  @action\n  handleFileAssignmentAdd(file) {\n    return resolve(this.args.exercise?.book).then((book) => {\n      file.books.pushObject(book);\n\n      return file.save().then(() => {\n        const answer = this.args.answer;\n        return resolve(answer?.files).then((files) => {\n          files.addObject(file);\n          answer.files = files;\n\n          this._onChange();\n        });\n      });\n    });\n  }\n\n  @action\n  handleFileAssignmentRemove(file) {\n    const answer = this.args.answer;\n\n    return resolve(answer?.files).then((files) => {\n      files.removeObject(file);\n      answer.files = files;\n\n      this._onChange();\n    });\n  }\n\n  @action\n  toggleKeyboard() {\n    this.showKeyboard = !this.showKeyboard;\n  }\n\n  _clearAnswer() {\n    this.args.toggleSuggestion?.(false);\n    this.args.toggleKey?.(false);\n\n    return this.assignmentEvents.resetAnswer(\n      this.args.answer,\n      this.args.exercise\n    );\n  }\n\n  _onChange() {\n    const answer = this.args.answer;\n\n    if (this.shouldResetAnswerStatus) {\n      answer.status = 'not-started';\n    } else {\n      answer.status = 'started';\n    }\n\n    this.args.toggleSuggestion?.(false);\n    this.args.toggleKey?.(false);\n\n    this.assignmentEvents.autoSaveAnswer.perform(this, answer);\n  }\n\n  _validateAnswer() {\n    return this.args.answer?.assignments?.every((assignment) => {\n      const assignments = this.args.exercise?.body?.exercise?.assignments;\n      const exerciseAssignment = assignments?.findBy('uuid', assignment.uuid);\n\n      const input = assignment.input;\n\n      if (typeOf(input) === 'boolean') {\n        // Input is boolean for check assignments.\n        // They are considered valid when true (i.e. checked).\n        return input;\n      } else if (typeOf(input) === 'string') {\n        return (\n          isPresent(assignment.input) ||\n          (this.canHaveAttachments && this?.files?.length > 0)\n        );\n      } else if (typeOf(input) === 'array') {\n        if (input.length === 0) {\n          return false;\n        }\n\n        return input.every((item) => {\n          if (typeOf(item) === 'string' || typeOf(item) === 'number') {\n            return true;\n          }\n\n          if ('assigned' in item) {\n            return item.assigned;\n          }\n\n          if ('assignedTo' in item) {\n            if (exerciseAssignment && exerciseAssignment.template === 'sort') {\n              if (exerciseAssignment.content?.groups) {\n                return exerciseAssignment.content.groups.every((group) => {\n                  return input.mapBy('assignedTo').includes(group.uuid);\n                });\n              }\n\n              return true;\n            } else if (exerciseAssignment?.template === 'place-words') {\n              return exerciseAssignment.content?.markers.every((marker) => {\n                if (marker.extra) return true;\n\n                if (input.mapBy('assignedTo').includes(marker.uuid))\n                  return true;\n\n                return input?.rejectBy('extra').findBy('assignedTo', null)\n                  ? false\n                  : true;\n              });\n            } else if (exerciseAssignment?.template === 'place-images') {\n              return exerciseAssignment.content?.markers.every((marker) => {\n                if (marker.extra) return true;\n\n                if (input.mapBy('assignedTo').includes(marker.uuid))\n                  return true;\n\n                return input?.rejectBy('extra').findBy('assignedTo', null)\n                  ? false\n                  : true;\n              });\n            } else {\n              return input.isAny('assignedTo');\n            }\n          }\n\n          if ('value' in item) {\n            return isPresent(item.value);\n          }\n\n          return true;\n        });\n      }\n    });\n  }\n\n  _submitAnswer() {\n    const answer = this.args.answer;\n\n    if (this._validateAnswer()) {\n      const exercise = this.args.exercise;\n\n      if (this.isAutoCorrected) {\n        this.args.toggleSuggestion?.(true);\n        this.args.toggleKey?.(false);\n\n        correctExercise(exercise, answer);\n      } else {\n        answer.status = 'turned-in';\n      }\n\n      this.showResponse.handleResponse(\n        `show-response-${answer.id}`,\n        answer.computedStatus\n      );\n\n      return this.assignmentEvents.submitAnswer\n        .unlinked()\n        .perform(this, answer);\n    } else {\n      answer.status = 'incomplete';\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"file-assignment\\\" ...attributes>\\n  <XMenuButton\\n    @appearance=\\\"link\\\"\\n    @displayArrowIcon={{false}}\\n    @size=\\\"small\\\"\\n    @opacity={{0}}\\n    @items={{this.buttonItems}}\\n    @onChange={{this.handleMenuButtonChange}}\\n  >\\n    <DcIcon @name=\\\"attach\\\" class=\\\"nr1\\\" />\\n    {{t \\\"components.fileAssignment.attachButtonLabel\\\"}}\\n  </XMenuButton>\\n\\n  {{#if @files}}\\n    <AttachmentPreview\\n      @files={{@files}}\\n      @sortable={{false}}\\n      @removeable={{true}}\\n      @onRemoveFile={{@onRemove}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.pendingFile.upload}}\\n    <XUploadProgressModal\\n      @upload={{this.pendingFile.upload}}\\n      @onAbort={{this.handleFileUploadAbort}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.fileChooseModalIsOpen}}\\n    <FileChooseModal\\n      @disabledFiles={{@files}}\\n      @onChoose={{this.handleFileChooseModalChoose}}\\n      @onClose={{this.handleCloseFileChooseModal}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.attachLinkModalIsOpen}}\\n    <AttachLinkModal\\n      @onChoose={{@onAdd}}\\n      @onClose={{this.handleCloseAttachLinkModal}}\\n    />\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"file-assignment\\\" ...attributes>\\n  <XMenuButton\\n    @appearance=\\\"link\\\"\\n    @displayArrowIcon={{false}}\\n    @size=\\\"small\\\"\\n    @opacity={{0}}\\n    @items={{this.buttonItems}}\\n    @onChange={{this.handleMenuButtonChange}}\\n  >\\n    <DcIcon @name=\\\"attach\\\" class=\\\"nr1\\\" />\\n    {{t \\\"components.fileAssignment.attachButtonLabel\\\"}}\\n  </XMenuButton>\\n\\n  {{#if @files}}\\n    <AttachmentPreview\\n      @files={{@files}}\\n      @sortable={{false}}\\n      @removeable={{true}}\\n      @onRemoveFile={{@onRemove}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.pendingFile.upload}}\\n    <XUploadProgressModal\\n      @upload={{this.pendingFile.upload}}\\n      @onAbort={{this.handleFileUploadAbort}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.fileChooseModalIsOpen}}\\n    <FileChooseModal\\n      @disabledFiles={{@files}}\\n      @onChoose={{this.handleFileChooseModalChoose}}\\n      @onClose={{this.handleCloseFileChooseModal}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.attachLinkModalIsOpen}}\\n    <AttachLinkModal\\n      @onChoose={{@onAdd}}\\n      @onClose={{this.handleCloseAttachLinkModal}}\\n    />\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/file-assignment/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-assignment/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport showFilePicker from 'compton/utils/show-file-picker';\n\nexport default class FileAssignmentComponent extends Component {\n  /**\n   * Arguments:\n   * files (array)\n   * onAdd (function)\n   * onRemove (function)\n   */\n\n  @service fileDispatcher;\n  @service store;\n  @service session;\n  @service intl;\n\n  @tracked fileChooseModalIsOpen = false;\n  @tracked attachLinkModalIsOpen = false;\n  @tracked pendingFile = null;\n\n  get buttonItems() {\n    return [\n      {\n        value: 'link',\n        label: this.intl.t('components.fileAssignment.fromLinkButton'),\n      },\n      {\n        value: 'upload',\n        label: this.intl.t('components.fileAssignment.fromDeviceButton'),\n      },\n      {\n        value: 'archive',\n        label: this.intl.t('components.fileAssignment.fromArchiveButton'),\n      },\n    ];\n  }\n\n  @action\n  handleMenuButtonChange(value) {\n    if (value === 'archive') {\n      this.fileChooseModalIsOpen = true;\n    }\n    if (value === 'upload') {\n      return this.openFilePicker();\n    }\n    if (value === 'link') {\n      this.attachLinkModalIsOpen = true;\n    }\n  }\n\n  @action\n  handleFileUploadPerform(fileData) {\n    const pendingFile = this.store.createRecord('file', {\n      name: fileData.name,\n      user: this.session.user,\n    });\n\n    this.pendingFile = pendingFile;\n\n    const onResolve = () => {\n      this.args.onAdd?.(pendingFile);\n    };\n\n    const onFinally = () => {\n      this.pendingFile = null;\n    };\n\n    return this.fileDispatcher\n      .performUpload(pendingFile, fileData)\n      .then(onResolve)\n      .finally(onFinally);\n  }\n\n  @action\n  handleFileUploadAbort() {\n    this.fileDispatcher.abortUpload(this.pendingFile);\n  }\n\n  @action\n  handleCloseAttachLinkModal() {\n    this.attachLinkModalIsOpen = false;\n  }\n\n  @action\n  handleCloseFileChooseModal() {\n    this.fileChooseModalIsOpen = false;\n  }\n\n  @action\n  handleFileChooseModalChoose(files) {\n    files.forEach((file) => {\n      this.args.onAdd?.(file);\n    });\n  }\n\n  @action\n  openFilePicker() {\n    const onChange = (fileOrFiles) => {\n      this.handleFileUploadPerform(fileOrFiles);\n    };\n\n    return showFilePicker({\n      multiple: false,\n      accept: null,\n      capture: null,\n      onChange,\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ChooseModal\\n  data-test-file-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.fileChooseModal.title\\\"}}\\n  @count={{this.pickedFiles.length}}\\n  @width={{if (eq this.mode \\\"grid\\\") \\\"large\\\" \\\"medium\\\"}}\\n  @onChoose={{fn this.onChoose this.pickedFiles}}\\n  @onDelete={{fn this.handleFileDelete this.pickedFiles}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <FileUpload\\n      @file={{this.pendingFile}}\\n      @onPerform={{this.handleFileUploadPeform}}\\n      @onAbort={{this.handleFileUploadAbort}}\\n    />\\n\\n    <AdditionCollator\\n      @additions={{data.files}}\\n      @query={{this.query}}\\n      @mode={{this.mode}}\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.fileChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.fileChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleArchiveCollatorQuery}}\\n      as |collatedFiles|\\n    >\\n\\n      <FilePicker\\n        @mode={{this.mode}}\\n        @files={{collatedFiles}}\\n        @pickedFiles={{this.pickedFiles}}\\n        @disabledFiles={{@disabledFiles}}\\n        @range=\\\"large\\\"\\n        @onPick={{this.handleFilePickerPick}}\\n        @onUnpick={{this.handleFilePickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\", {\"contents\":\"<ChooseModal\\n  data-test-file-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.fileChooseModal.title\\\"}}\\n  @count={{this.pickedFiles.length}}\\n  @width={{if (eq this.mode \\\"grid\\\") \\\"large\\\" \\\"medium\\\"}}\\n  @onChoose={{fn this.onChoose this.pickedFiles}}\\n  @onDelete={{fn this.handleFileDelete this.pickedFiles}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <FileUpload\\n      @file={{this.pendingFile}}\\n      @onPerform={{this.handleFileUploadPeform}}\\n      @onAbort={{this.handleFileUploadAbort}}\\n    />\\n\\n    <AdditionCollator\\n      @additions={{data.files}}\\n      @query={{this.query}}\\n      @mode={{this.mode}}\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.fileChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.fileChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleArchiveCollatorQuery}}\\n      as |collatedFiles|\\n    >\\n\\n      <FilePicker\\n        @mode={{this.mode}}\\n        @files={{collatedFiles}}\\n        @pickedFiles={{this.pickedFiles}}\\n        @disabledFiles={{@disabledFiles}}\\n        @range=\\\"large\\\"\\n        @onPick={{this.handleFilePickerPick}}\\n        @onUnpick={{this.handleFilePickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\",\"moduleName\":\"babel/components/file-choose-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-choose-modal/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { waitFor } from '@ember/test-waiters';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nimport Resource from '../../utils/resource';\n\n/*\n\nimport FileModel from 'babel/models/file';\n\nexport interface FileChooseModalComponentArgs {\n  mode: 'grid' | 'list';\n  disabledFiles: FileModel[];\n  onChoose(pickedFiles: FileModel[]): void;\n  onClose(): void;\n}\n\n*/\nconst QUERY = {\n  bookId: null,\n  search: '',\n  page: 1,\n};\n\nexport default class FileChooseModalComponent extends Component {\n  @service store;\n  @service session;\n  @service fileDispatcher;\n\n  @tracked pickedFiles = [];\n  @tracked pendingFile = null;\n  @tracked query = QUERY;\n\n  resource = new Resource(async () => {\n    return {\n      files: (await this.store.query('file', {}))\n        .filterBy('userId', this.session.user.id)\n        .rejectBy('type', 'external'),\n    };\n  });\n\n  get mode() {\n    const mode = this.args.mode ?? 'grid';\n\n    assert(\n      \"The @mode arg passed to <FileChooseModal> is not valid. Valid values are 'grid' and 'list'.\",\n      ['grid', 'list'].includes(mode)\n    );\n\n    return mode;\n  }\n\n  get onChoose() {\n    const onChoose = this.args.onChoose;\n\n    assert(\n      `The @onChoose arg passed to <FileChooseModal> must be a function. Got ${typeof onChoose}`,\n      typeof onChoose === 'function'\n    );\n\n    return onChoose;\n  }\n\n  @action\n  @waitFor\n  async handleFileUploadPeform(fileData) {\n    this.pendingFile = this.store.createRecord('file', {\n      name: fileData.name,\n      user: this.session.user,\n    });\n\n    try {\n      await this.fileDispatcher.performUpload(this.pendingFile, fileData);\n      await this.resource.load();\n      this.pickedFiles.clear();\n      this.query = QUERY;\n    } finally {\n      this.pendingFile = null;\n    }\n  }\n\n  @action\n  handleFileUploadAbort() {\n    this.fileDispatcher.abortUpload(this.pendingFile);\n    this.pendingFile = null;\n  }\n\n  @action\n  handleArchiveCollatorQuery(query) {\n    this.query = query;\n    this.pickedFiles.clear();\n  }\n\n  @action\n  handleFilePickerPick(file) {\n    this.pickedFiles.addObject(file);\n  }\n\n  @action\n  handleFilePickerUnpick(file) {\n    this.pickedFiles.removeObject(file);\n  }\n\n  @action\n  async handleFileDelete(files) {\n    await this.fileDispatcher.deleteMany(files);\n    this.pickedFiles.clear();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<AdditionGrid @range={{@range}} ...attributes>\\n\\n  {{#each @files as |file|}}\\n\\n    <FilePicker::Grid::Item\\n      @file={{file}}\\n      @pickedFiles={{@pickedFiles}}\\n      @disabledFiles={{@disabledFiles}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionGrid>\", {\"contents\":\"<AdditionGrid @range={{@range}} ...attributes>\\n\\n  {{#each @files as |file|}}\\n\\n    <FilePicker::Grid::Item\\n      @file={{file}}\\n      @pickedFiles={{@pickedFiles}}\\n      @disabledFiles={{@disabledFiles}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionGrid>\",\"moduleName\":\"babel/components/file-picker/grid/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-picker/grid/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"file-picker-grid-item\\\"\\n    (if this.isDisabled \\\"file-picker-grid-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <FileThumbnail class=\\\"nb1\\\" @file={{@file}} />\\n\\n  <span class=\\\"flex justify-space-between\\\">\\n\\n    <span class=\\\"flex-one text-quarternary word-break-all\\\">\\n\\n      {{@file.titleWithFallback}}\\n\\n    </span>\\n\\n    <XCheckbox\\n      class=\\\"flex-shrink\\\"\\n      @checked={{this.isPicked}}\\n      @disabled={{this.isDisabled}}\\n      @twoWay={{false}}\\n      @onChange={{fn (if this.isPicked @onUnpick @onPick) @file}}\\n    />\\n\\n  </span>\\n\\n  <FileType @file={{@file}} />\\n\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"file-picker-grid-item\\\"\\n    (if this.isDisabled \\\"file-picker-grid-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <FileThumbnail class=\\\"nb1\\\" @file={{@file}} />\\n\\n  <span class=\\\"flex justify-space-between\\\">\\n\\n    <span class=\\\"flex-one text-quarternary word-break-all\\\">\\n\\n      {{@file.titleWithFallback}}\\n\\n    </span>\\n\\n    <XCheckbox\\n      class=\\\"flex-shrink\\\"\\n      @checked={{this.isPicked}}\\n      @disabled={{this.isDisabled}}\\n      @twoWay={{false}}\\n      @onChange={{fn (if this.isPicked @onUnpick @onPick) @file}}\\n    />\\n\\n  </span>\\n\\n  <FileType @file={{@file}} />\\n\\n</label>\",\"moduleName\":\"babel/components/file-picker/grid/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-picker/grid/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport FileModel from 'babel/models/file';\n\nexport interface FilePickerGridItemComponentArgs {\n  file: FileModel;\n  pickedFiles: FileModel[];\n  disabledFiles: FileModel[];\n  onPick(file: FileModel): void;\n}\n\n*/\n\nexport default class FilePickerGridItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedFiles.includes(this.args.file);\n  }\n\n  get isDisabled() {\n    const disabledFiles = this.args.disabledFiles;\n\n    return disabledFiles && disabledFiles.includes(this.args.file);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport FileModel from 'babel/models/file';\\n\\nexport interface FilePickerComponentArgs {\\n  mode: 'grid' | 'list';\\n  files: FileModel[];\\n  pickedFiles: FileModel[];\\n  disabledFiles: FileModel[];\\n  range: 'small' | 'medium' | 'large';\\n  onPick(file: File): void;\\n  onUnpick(file: File): void;\\n}\\n\\n}}\\n\\n{{#let (component (concat \\\"file-picker/\\\" (or @mode \\\"grid\\\"))) as |Component|}}\\n\\n  <Component\\n    data-test-file-picker\\n    ...attributes\\n    @files={{@files}}\\n    @pickedFiles={{@pickedFiles}}\\n    @disabledFiles={{@disabledFiles}}\\n    @range={{@range}}\\n    @onPick={{@onPick}}\\n    @onUnpick={{@onUnpick}}\\n  />\\n\\n{{/let}}\", {\"contents\":\"{{!\\n\\nimport FileModel from 'babel/models/file';\\n\\nexport interface FilePickerComponentArgs {\\n  mode: 'grid' | 'list';\\n  files: FileModel[];\\n  pickedFiles: FileModel[];\\n  disabledFiles: FileModel[];\\n  range: 'small' | 'medium' | 'large';\\n  onPick(file: File): void;\\n  onUnpick(file: File): void;\\n}\\n\\n}}\\n\\n{{#let (component (concat \\\"file-picker/\\\" (or @mode \\\"grid\\\"))) as |Component|}}\\n\\n  <Component\\n    data-test-file-picker\\n    ...attributes\\n    @files={{@files}}\\n    @pickedFiles={{@pickedFiles}}\\n    @disabledFiles={{@disabledFiles}}\\n    @range={{@range}}\\n    @onPick={{@onPick}}\\n    @onUnpick={{@onUnpick}}\\n  />\\n\\n{{/let}}\",\"moduleName\":\"babel/components/file-picker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-picker/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<AdditionList ...attributes>\\n\\n  {{#each @files as |file|}}\\n\\n    <FilePicker::List::Item\\n      @file={{file}}\\n      @pickedFiles={{@pickedFiles}}\\n      @disabledFiles={{@disabledFiles}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionList>\", {\"contents\":\"<AdditionList ...attributes>\\n\\n  {{#each @files as |file|}}\\n\\n    <FilePicker::List::Item\\n      @file={{file}}\\n      @pickedFiles={{@pickedFiles}}\\n      @disabledFiles={{@disabledFiles}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionList>\",\"moduleName\":\"babel/components/file-picker/list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-picker/list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"file-picker-list-item\\\"\\n    (if this.isDisabled \\\"file-picker-list-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @file}}\\n  >\\n\\n    {{@file.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"file-picker-list-item\\\"\\n    (if this.isDisabled \\\"file-picker-list-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @file}}\\n  >\\n\\n    {{@file.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n</label>\",\"moduleName\":\"babel/components/file-picker/list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/file-picker/list/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport FileModel from 'babel/models/file';\n\nexport interface FilePickerGridItemComponentArgs {\n  file: FileModel;\n  pickedFiles: FileModel[];\n  disabledFiles: FileModel[];\n  onPick(file: FileModel): void;\n}\n\n*/\n\nexport default class FilePickerGridItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedFiles.includes(this.args.file);\n  }\n\n  get isDisabled() {\n    const disabledFiles = this.args.disabledFiles;\n\n    return disabledFiles && disabledFiles.includes(this.args.file);\n  }\n}\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['file-thumbnail'],\n\n  // PARAMS\n\n  file: null,\n\n  iconName: computed('file.type', function() {\n    switch (this.get('file.type')) {\n      case 'video':\n        return 'play-square';\n      case 'audio':\n        return 'audio';\n      default:\n        return 'content';\n    }\n  })\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (eq this.file.type \\\"image\\\")}}\\n\\n  {{x-image class=\\\"file-thumbnail-image\\\" source=this.file.source cover=true}}\\n\\n{{else}}\\n\\n  <DcIcon @name={{this.iconName}} @size=\\\"xl\\\" />\\n\\n{{/if}}', { moduleName: 'babel/components/file-thumbnail/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['file-type', 'text-small'],\n\n  // PARAMS\n\n  file: null\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{t \\\"components.fileType.item.typeLabel\\\" type=this.file.type}}', { moduleName: 'babel/components/file-type/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"file-upload\\\">\\n  <XUploadButton\\n    class=\\\"mb1\\\"\\n    @onChange={{@onPerform}}\\n  >\\n    <DcIcon @name=\\\"cloud-upload\\\" class=\\\"nr1\\\" />\\n    {{t \\\"components.fileUpload.performButtonLabel\\\"}}\\n  </XUploadButton>\\n\\n  {{#if @file.upload}}\\n    <XUploadProgressModal\\n      @upload={{@file.upload}}\\n      @onAbort={{@onAbort}}\\n    />\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/file-upload/template.hbs' });\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\n\nexport default Component.extend({\n  classNames: ['focus-mode'],\n\n  focusMode: service(),\n\n  classNameBindings: ['focusMode.active:focus-mode-active'],\n\n  actions: {\n    leaveFocus() {\n      this.get('focusMode').turnOff();\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.focusMode.active}}\\n\\n  <div class=\\\"focus-mode-bar\\\">\\n    {{#ui-button appearance=\\\"link\\\" onClick=(action \\\"leaveFocus\\\")}}\\n      {{t \\\"components.focusMode.close\\\"}}\\n    {{/ui-button}}\\n  </div>\\n\\n{{/if}}', { moduleName: 'babel/components/focus-mode/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class FootnoteListItemComponent extends Component {\n  @service footnotes;\n\n  // PROPERTIES\n\n  get index() {\n    return this.footnotes.getIndex(this.args.footnote?.id);\n  }\n\n  get value() {\n    return decodeURIComponent(this.args.footnote?.value);\n  }\n\n  // ACTIONS\n\n  @action handleMouseDown(evt) {\n    evt.preventDefault();\n    window.focus();\n  }\n\n  @action handleClick() {\n    const element = document.getElementById(\n      ['footnote', this.args.footnote?.id].join('-')\n    );\n\n    if (element) {\n      element.focus();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @footnote}}\\n  <div class=\\\"footnote-list-item\\\" ...attributes>\\n    <button\\n      class=\\\"footnote-list-item-button\\\"\\n      type=\\\"button\\\"\\n      id={{@footnote.id}}\\n      {{on \\\"mousedown\\\" this.handleMouseDown}}\\n      {{on \\\"click\\\" this.handleClick}}\\n    >\\n      [{{this.index}}]\\n    </button>\\n\\n    <div>\\n      <TbRenderInline @value={{this.value}} />\\n    </div>\\n  </div>\\n{{/if}}\\n', { moduleName: 'babel/components/footnote-list/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div ...attributes>\\n  <div class=\\\"text-secondary mb1\\\">\\n    {{t \\\"components.footnoteList.headingLabel\\\"}}\\n  </div>\\n\\n  {{#each @footnotes as |footnote|}}\\n    <FootnoteList::Item @footnote={{footnote}} />\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/footnote-list/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class GroupFeatureWelcomeModalComponent extends Component {\n  @service groupsOnboarding;\n\n  @service session;\n\n  get isOpen() {\n    return (\n      this.session?.user?.isTeacher &&\n      this.groupsOnboarding.loaded &&\n      !this.groupsOnboarding.informationSeen\n    );\n  }\n\n  @action\n  dismiss() {\n    this.groupsOnboarding.dismissInformation();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isOpen}}\\n  <XModal\\n    @onClose={{this.dismiss}}\\n    @size={{hash width=\\\"auto\\\" height=\\\"auto\\\"}}\\n    as |modal|\\n  >\\n    <modal.content class=\\\"group-feature-welcome-modal-content\\\">\\n      <img\\n        class=\\\"group-feature-welcome-modal-hero\\\"\\n        alt=\\\"\\\"\\n        src=\\\"/assets/images/BFU.png\\\"\\n      />\\n      <h2 class=\\\"group-feature-welcome-modal-title\\\">\\n        {{t \\\"components.groupFeatureWelcomeModal.title\\\"}}\\n      </h2>\\n      <p class=\\\"group-feature-welcome-modal-body\\\">\\n        {{t \\\"components.groupFeatureWelcomeModal.body\\\"}}\\n      </p>\\n      <a\\n        href=\\\"https://support.nok.se/article/23196\\\"\\n        class=\\\"group-feature-welcome-modal-read-more\\\"\\n      >\\n        {{t \\\"components.groupFeatureWelcomeModal.readMore\\\"}}\\n      </a>\\n      <UiButton\\n        class=\\\"group-feature-welcome-modal-continue\\\"\\n        @variant=\\\"default\\\"\\n        @onClick={{this.dismiss}}\\n      >\\n        {{t \\\"components.groupFeatureWelcomeModal.continue\\\"}}\\n      </UiButton>\\n    </modal.content>\\n  </XModal>\\n{{/if}}', { moduleName: 'babel/components/group-feature-welcome-modal/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<button\\n  class=\\\"header-base-basic-button\\\"\\n  type=\\\"button\\\"\\n  ...attributes\\n  {{on \\\"click\\\" this.handleClick}}\\n>\\n  {{yield}}\\n</button>\", {\"contents\":\"<button\\n  class=\\\"header-base-basic-button\\\"\\n  type=\\\"button\\\"\\n  ...attributes\\n  {{on \\\"click\\\" this.handleClick}}\\n>\\n  {{yield}}\\n</button>\",\"moduleName\":\"babel/components/header/base/basic-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/basic-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class HeaderBasicButton extends Component {\n  get active() {\n    return this.args.active ?? false;\n  }\n\n  @action\n  handleClick() {\n    this.args.onClick?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<a href={{@href}} class=\\\"header-base-basic-link\\\" ...attributes>\\n  {{yield}}\\n</a>\", {\"contents\":\"<a href={{@href}} class=\\\"header-base-basic-link\\\" ...attributes>\\n  {{yield}}\\n</a>\",\"moduleName\":\"babel/components/header/base/basic-link/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/basic-link/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcIcon @name={{@name}} />\", {\"contents\":\"<DcIcon @name={{@name}} />\",\"moduleName\":\"babel/components/header/base/button/icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/button/icon/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (or @id (generate-id)) as |id|}}\\n\\n  <Header::Base::BasicButton\\n    id={{id}}\\n    class=\\\"header-base-button\\\"\\n    aria-label={{@tooltip}}\\n    data-wide={{this.wide}}\\n    data-active={{this.active}}\\n    data-with-icon={{this.withIcon}}\\n    data-with-text={{this.withText}}\\n    ...attributes\\n    @onClick={{@onClick}}\\n  >\\n\\n    {{yield\\n      (hash\\n        Icon=(component \\\"header/base/button/icon\\\")\\n        Label=(component \\\"header/base/button/label\\\")\\n      )\\n    }}\\n\\n  </Header::Base::BasicButton>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\", {\"contents\":\"{{#let (or @id (generate-id)) as |id|}}\\n\\n  <Header::Base::BasicButton\\n    id={{id}}\\n    class=\\\"header-base-button\\\"\\n    aria-label={{@tooltip}}\\n    data-wide={{this.wide}}\\n    data-active={{this.active}}\\n    data-with-icon={{this.withIcon}}\\n    data-with-text={{this.withText}}\\n    ...attributes\\n    @onClick={{@onClick}}\\n  >\\n\\n    {{yield\\n      (hash\\n        Icon=(component \\\"header/base/button/icon\\\")\\n        Label=(component \\\"header/base/button/label\\\")\\n      )\\n    }}\\n\\n  </Header::Base::BasicButton>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/button/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class HeaderButton extends Component {\n  get wide() {\n    return this.args.wide ?? false;\n  }\n\n  get active() {\n    return this.args.active ?? false;\n  }\n\n  get startCircle() {\n    return this.args.startCircle ?? false;\n  }\n\n  get withIcon() {\n    return !!this.args.icon;\n  }\n\n  get withText() {\n    return !!this.args.text;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span class=\\\"header-base-button-label\\\" ...attributes>\\n  {{yield}}\\n</span>\", {\"contents\":\"<span class=\\\"header-base-button-label\\\" ...attributes>\\n  {{yield}}\\n</span>\",\"moduleName\":\"babel/components/header/base/button/label/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/button/label/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcIcon @name={{@name}} ...attributes />\", {\"contents\":\"<DcIcon @name={{@name}} ...attributes />\",\"moduleName\":\"babel/components/header/base/combo-button/button/icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/button/icon/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base::BasicButton\\n  class=\\\"header-base-combo-button-button\\\"\\n  ...attributes\\n  data-wide={{this.wide}}\\n  data-active={{this.active}}\\n  @onClick={{@onClick}}\\n>\\n\\n  {{yield\\n    (hash\\n      Icon=(component \\\"header/base/combo-button/button/icon\\\")\\n      Label=(component \\\"header/base/combo-button/button/label\\\")\\n    )\\n  }}\\n\\n</Header::Base::BasicButton>\", {\"contents\":\"<Header::Base::BasicButton\\n  class=\\\"header-base-combo-button-button\\\"\\n  ...attributes\\n  data-wide={{this.wide}}\\n  data-active={{this.active}}\\n  @onClick={{@onClick}}\\n>\\n\\n  {{yield\\n    (hash\\n      Icon=(component \\\"header/base/combo-button/button/icon\\\")\\n      Label=(component \\\"header/base/combo-button/button/label\\\")\\n    )\\n  }}\\n\\n</Header::Base::BasicButton>\",\"moduleName\":\"babel/components/header/base/combo-button/button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/button/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class HeaderBaseComboButtonButton extends Component {\n  get wide() {\n    return this.args.wide ?? false;\n  }\n\n  get active() {\n    return this.args.active ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span class=\\\"header-base-combo-button-button-label\\\" ...attributes>\\n  {{yield}}\\n</span>\", {\"contents\":\"<span class=\\\"header-base-combo-button-button-label\\\" ...attributes>\\n  {{yield}}\\n</span>\",\"moduleName\":\"babel/components/header/base/combo-button/button/label/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/button/label/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"header-base-combo-button\\\"\\n  data-reverse={{this.reverse}}\\n  ...attributes\\n>\\n\\n  {{yield\\n    (hash\\n      PrimaryButton=(component \\\"header/base/combo-button/primary-button\\\")\\n      SecondaryButton=(component \\\"header/base/combo-button/secondary-button\\\")\\n    )\\n  }}\\n\\n</div>\", {\"contents\":\"<div\\n  class=\\\"header-base-combo-button\\\"\\n  data-reverse={{this.reverse}}\\n  ...attributes\\n>\\n\\n  {{yield\\n    (hash\\n      PrimaryButton=(component \\\"header/base/combo-button/primary-button\\\")\\n      SecondaryButton=(component \\\"header/base/combo-button/secondary-button\\\")\\n    )\\n  }}\\n\\n</div>\",\"moduleName\":\"babel/components/header/base/combo-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class HeaderBaseComboButtonComponent extends Component {\n  get reverse() {\n    return this.args.reverse ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (generate-id) as |id|}}\\n\\n  <Header::Base::ComboButton::Button\\n    id={{id}}\\n    class=\\\"header-base-combo-button-primary-button {{if (eq @variant \\\"link\\\") \\\"header-base-combo-button-primary-button-link\\\"}}\\\"\\n    aria-label={{@tooltip}}\\n    ...attributes\\n    @active={{@active}}\\n    @onClick={{this.handleClick}}\\n    as |button|\\n  >\\n    {{yield button}}\\n  </Header::Base::ComboButton::Button>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\", {\"contents\":\"{{#let (generate-id) as |id|}}\\n\\n  <Header::Base::ComboButton::Button\\n    id={{id}}\\n    class=\\\"header-base-combo-button-primary-button {{if (eq @variant \\\"link\\\") \\\"header-base-combo-button-primary-button-link\\\"}}\\\"\\n    aria-label={{@tooltip}}\\n    ...attributes\\n    @active={{@active}}\\n    @onClick={{this.handleClick}}\\n    as |button|\\n  >\\n    {{yield button}}\\n  </Header::Base::ComboButton::Button>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/combo-button/primary-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/primary-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport scrollToTopIfNeeded from 'babel/utils/scroll-to-top-if-needed';\n\nexport default class HeaderBaseComboButtonPrimaryButtonComponent extends Component {\n  @service router;\n\n  @action handleClick() {\n    scrollToTopIfNeeded(this.router);\n    return this.args.onClick?.(...arguments);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (generate-id) as |id|}}\\n\\n  <Header::Base::ComboButton::Button\\n    id={{id}}\\n    class=\\\"header-base-combo-button-secondary-button\\\"\\n    aria-label={{@tooltip}}\\n    ...attributes\\n    @active={{@active}}\\n    @onClick={{@onClick}}\\n    as |button|\\n  >\\n    {{yield button}}\\n  </Header::Base::ComboButton::Button>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\", {\"contents\":\"{{#let (generate-id) as |id|}}\\n\\n  <Header::Base::ComboButton::Button\\n    id={{id}}\\n    class=\\\"header-base-combo-button-secondary-button\\\"\\n    aria-label={{@tooltip}}\\n    ...attributes\\n    @active={{@active}}\\n    @onClick={{@onClick}}\\n    as |button|\\n  >\\n    {{yield button}}\\n  </Header::Base::ComboButton::Button>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/combo-button/secondary-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/combo-button/secondary-button/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base::Button\\n  ...attributes\\n  class={{if\\n    this.shouldShowNotification\\n    \\\"header-base-course-user-button-notification\\\"\\n  }}\\n  @ariaButtonLabel={{t \\\"components.header.courseUsersButton.ariaButtonLabel\\\"}}\\n  @tooltip={{t \\\"components.header.courseUsersButton.tooltip\\\"}}\\n  @onClick={{set this.helpList \\\"isOpen\\\" true}}\\n  @active={{this.helpList.isOpen}}\\n  as |button|\\n>\\n  <button.Icon @name=\\\"group\\\" />\\n</Header::Base::Button>\", {\"contents\":\"<Header::Base::Button\\n  ...attributes\\n  class={{if\\n    this.shouldShowNotification\\n    \\\"header-base-course-user-button-notification\\\"\\n  }}\\n  @ariaButtonLabel={{t \\\"components.header.courseUsersButton.ariaButtonLabel\\\"}}\\n  @tooltip={{t \\\"components.header.courseUsersButton.tooltip\\\"}}\\n  @onClick={{set this.helpList \\\"isOpen\\\" true}}\\n  @active={{this.helpList.isOpen}}\\n  as |button|\\n>\\n  <button.Icon @name=\\\"group\\\" />\\n</Header::Base::Button>\",\"moduleName\":\"babel/components/header/base/course-users-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/course-users-button/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class CourseUsersButton extends Component {\n  @service session;\n\n  @service helpList;\n\n  get shouldShowNotification() {\n    if (this.session?.user?.school?.get('metadata.external_licenses')) {\n      return false;\n    }\n\n    return (this.args?.activeCourse?.usersMissingLicenses || []).any(\n      (obj) => obj?.numMissing > 0\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<nav class=\\\"header-base-entity-breadcrumb\\\" ...attributes>\\n  <ol class=\\\"header-base-entity-breadcrumb-list\\\">\\n    {{#each @entities as |entity index|}}\\n      <Header::Base::EntityBreadcrumb::Item\\n        @entity={{entity}}\\n        @last={{eq (inc index 1) @entities.length}}\\n      />\\n    {{/each}}\\n  </ol>\\n</nav>\", {\"contents\":\"<nav class=\\\"header-base-entity-breadcrumb\\\" ...attributes>\\n  <ol class=\\\"header-base-entity-breadcrumb-list\\\">\\n    {{#each @entities as |entity index|}}\\n      <Header::Base::EntityBreadcrumb::Item\\n        @entity={{entity}}\\n        @last={{eq (inc index 1) @entities.length}}\\n      />\\n    {{/each}}\\n  </ol>\\n</nav>\",\"moduleName\":\"babel/components/header/base/entity-breadcrumb/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/entity-breadcrumb/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li class=\\\"header-base-entity-breadcrumb-list-item\\\" ...attributes>\\n  <EntityLink\\n    class=\\\"header-base-entity-breadcrumb-item-entity-link\\\"\\n    data-test-header-breadcrumb-link\\n    @entity={{@entity}}\\n    {{on \\\"click\\\" this.handleEntityLinkClick}}\\n  >\\n    {{@entity.title}}\\n  </EntityLink>\\n  {{#unless @last}}\\n    <span class=\\\"header-base-entity-breadcrumb-item-separator\\\" role=\\\"none\\\" />\\n  {{/unless}}\\n</li>\", {\"contents\":\"<li class=\\\"header-base-entity-breadcrumb-list-item\\\" ...attributes>\\n  <EntityLink\\n    class=\\\"header-base-entity-breadcrumb-item-entity-link\\\"\\n    data-test-header-breadcrumb-link\\n    @entity={{@entity}}\\n    {{on \\\"click\\\" this.handleEntityLinkClick}}\\n  >\\n    {{@entity.title}}\\n  </EntityLink>\\n  {{#unless @last}}\\n    <span class=\\\"header-base-entity-breadcrumb-item-separator\\\" role=\\\"none\\\" />\\n  {{/unless}}\\n</li>\",\"moduleName\":\"babel/components/header/base/entity-breadcrumb/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/entity-breadcrumb/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport scrollToTopIfNeeded from 'babel/utils/scroll-to-top-if-needed';\n\nexport default class HeaderBaseEntityBreadcrumbComponent extends Component {\n  @service router;\n\n  @action handleEntityLinkClick() {\n    scrollToTopIfNeeded(this.router);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let\\n  (t\\n    (concat\\n      \\\"components.header.base.helpButton.\\\"\\n      (if\\n        this.session.user.isTeacher\\n        \\\"labelTeacher\\\"\\n        (if this.isAskingForHelp \\\"labelStudentAskingForHelp\\\" \\\"labelStudent\\\")\\n      )\\n    )\\n  )\\n  as |label|\\n}}\\n  <Header::Base::Button\\n    class=\\\"helplist-button\\\"\\n    ...attributes\\n    @id={{@id}}\\n    @tooltip={{label}}\\n    @active={{or this.popupOpen this.isAskingForHelp this.isStudentsInQueue}}\\n    @onClick={{this.handleOpenHelplist}}\\n    {{did-update this.checkUpdate this.placeInQueue}}\\n    as |button|\\n  >\\n    {{#if (and this.session.user.isTeacher @courseHelpList.users.length)}}\\n      <div class=\\\"helplist-badge\\\">\\n        {{@courseHelpList.users.length}}\\n      </div>\\n    {{/if}}\\n    <button.Icon @name=\\\"hand\\\" />\\n  </Header::Base::Button>\\n{{/let}}\\n\\n{{#if this.popupOpen}}\\n  <XPopup\\n    @for={{@id}}\\n    @enableClickThrough={{true}}\\n    @enableScroll={{true}}\\n    @opacity=\\\"0\\\"\\n    @onClose={{set this \\\"popupOpen\\\" false}}\\n  >\\n    {{#if (or this.showQue this.isAskingForHelp)}}\\n      <div class=\\\"help-button-popup flex flex-column\\\">\\n        <div class=\\\"flex flex-start flex-justify\\\">\\n          <h5 class=\\\"mb1\\\">\\n            {{t \\\"components.header.base.helpButton.waitingTitle\\\"}}\\n          </h5>\\n\\n          <UiButton\\n            class=\\\"hide-sm\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{set this \\\"popupOpen\\\" false}}\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" />\\n          </UiButton>\\n        </div>\\n\\n        <div class=\\\"flex flex-center nt1 nb1\\\">\\n          <DcIcon\\n            class=\\\"help-button-popup-icon flex flex-center justify-center mr1\\\"\\n            @name=\\\"hand\\\"\\n          />\\n          <span>\\n            {{t\\n              \\\"components.header.base.helpButton.que\\\"\\n              que=this.placeInQueue\\n              htmlSafe=true\\n            }}\\n          </span>\\n        </div>\\n\\n        <UiButton\\n          class=\\\"flex justify-center mt1\\\"\\n          @variant=\\\"error\\\"\\n          @onClick={{this.handleHelpButtonClick}}\\n        >\\n          {{t \\\"components.header.base.helpButton.cancel\\\"}}\\n        </UiButton>\\n      </div>\\n    {{else}}\\n      <div class=\\\"help-button-popup flex flex-column\\\">\\n        <div class=\\\"flex flex-start flex-justify\\\">\\n          <h5 class=\\\"mb1\\\">\\n            {{t \\\"components.header.base.helpButton.title\\\"}}\\n          </h5>\\n\\n          <UiButton\\n            class=\\\"hide-sm\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{set this \\\"popupOpen\\\" false}}\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" />\\n          </UiButton>\\n        </div>\\n\\n        {{t \\\"components.header.base.helpButton.description\\\"}}\\n        <span class=\\\"text-small text-muted nt1\\\">\\n          {{t \\\"components.header.base.helpButton.info\\\"}}\\n        </span>\\n\\n        <UiButton\\n          class=\\\"flex justify-center mt1\\\"\\n          @onClick={{this.handleHelpButtonClick}}\\n        >\\n          {{t \\\"components.header.base.helpButton.button\\\"}}\\n        </UiButton>\\n      </div>\\n    {{/if}}\\n  </XPopup>\\n{{/if}}\", {\"contents\":\"{{#let\\n  (t\\n    (concat\\n      \\\"components.header.base.helpButton.\\\"\\n      (if\\n        this.session.user.isTeacher\\n        \\\"labelTeacher\\\"\\n        (if this.isAskingForHelp \\\"labelStudentAskingForHelp\\\" \\\"labelStudent\\\")\\n      )\\n    )\\n  )\\n  as |label|\\n}}\\n  <Header::Base::Button\\n    class=\\\"helplist-button\\\"\\n    ...attributes\\n    @id={{@id}}\\n    @tooltip={{label}}\\n    @active={{or this.popupOpen this.isAskingForHelp this.isStudentsInQueue}}\\n    @onClick={{this.handleOpenHelplist}}\\n    {{did-update this.checkUpdate this.placeInQueue}}\\n    as |button|\\n  >\\n    {{#if (and this.session.user.isTeacher @courseHelpList.users.length)}}\\n      <div class=\\\"helplist-badge\\\">\\n        {{@courseHelpList.users.length}}\\n      </div>\\n    {{/if}}\\n    <button.Icon @name=\\\"hand\\\" />\\n  </Header::Base::Button>\\n{{/let}}\\n\\n{{#if this.popupOpen}}\\n  <XPopup\\n    @for={{@id}}\\n    @enableClickThrough={{true}}\\n    @enableScroll={{true}}\\n    @opacity=\\\"0\\\"\\n    @onClose={{set this \\\"popupOpen\\\" false}}\\n  >\\n    {{#if (or this.showQue this.isAskingForHelp)}}\\n      <div class=\\\"help-button-popup flex flex-column\\\">\\n        <div class=\\\"flex flex-start flex-justify\\\">\\n          <h5 class=\\\"mb1\\\">\\n            {{t \\\"components.header.base.helpButton.waitingTitle\\\"}}\\n          </h5>\\n\\n          <UiButton\\n            class=\\\"hide-sm\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{set this \\\"popupOpen\\\" false}}\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" />\\n          </UiButton>\\n        </div>\\n\\n        <div class=\\\"flex flex-center nt1 nb1\\\">\\n          <DcIcon\\n            class=\\\"help-button-popup-icon flex flex-center justify-center mr1\\\"\\n            @name=\\\"hand\\\"\\n          />\\n          <span>\\n            {{t\\n              \\\"components.header.base.helpButton.que\\\"\\n              que=this.placeInQueue\\n              htmlSafe=true\\n            }}\\n          </span>\\n        </div>\\n\\n        <UiButton\\n          class=\\\"flex justify-center mt1\\\"\\n          @variant=\\\"error\\\"\\n          @onClick={{this.handleHelpButtonClick}}\\n        >\\n          {{t \\\"components.header.base.helpButton.cancel\\\"}}\\n        </UiButton>\\n      </div>\\n    {{else}}\\n      <div class=\\\"help-button-popup flex flex-column\\\">\\n        <div class=\\\"flex flex-start flex-justify\\\">\\n          <h5 class=\\\"mb1\\\">\\n            {{t \\\"components.header.base.helpButton.title\\\"}}\\n          </h5>\\n\\n          <UiButton\\n            class=\\\"hide-sm\\\"\\n            @appearance=\\\"none\\\"\\n            @onClick={{set this \\\"popupOpen\\\" false}}\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" />\\n          </UiButton>\\n        </div>\\n\\n        {{t \\\"components.header.base.helpButton.description\\\"}}\\n        <span class=\\\"text-small text-muted nt1\\\">\\n          {{t \\\"components.header.base.helpButton.info\\\"}}\\n        </span>\\n\\n        <UiButton\\n          class=\\\"flex justify-center mt1\\\"\\n          @onClick={{this.handleHelpButtonClick}}\\n        >\\n          {{t \\\"components.header.base.helpButton.button\\\"}}\\n        </UiButton>\\n      </div>\\n    {{/if}}\\n  </XPopup>\\n{{/if}}\",\"moduleName\":\"babel/components/header/base/help-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/help-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class HeaderBaseHelpButton extends Component {\n  @service session;\n\n  @service helpList;\n\n  @tracked popupOpen;\n\n  @tracked showQue = false;\n\n  initialPlaceInQueue = 1;\n\n  @cached\n  get helpListStudentsProxy() {\n    let promise = resolve();\n\n    if (this.args.courseHelpList) {\n      promise = resolve(this.args.courseHelpList.users);\n    }\n\n    return load(promise, this);\n  }\n\n  get helpListStudents() {\n    return this.helpListStudentsProxy.isResolved\n      ? this.helpListStudentsProxy.value\n      : [];\n  }\n\n  get isAskingForHelp() {\n    if (this.helpListStudents) {\n      for (const student of this.helpListStudents) {\n        if (student.id === this.session.user.id) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  get isStudentsInQueue() {\n    return this.session.user.isTeacher && this.helpListStudents?.length > 0;\n  }\n\n  get placeInQueue() {\n    if (this.helpListStudents) {\n      for (const [index, student] of this.helpListStudents.entries()) {\n        if (student.id === this.session.user.id) {\n          return index + 1;\n        }\n      }\n    }\n\n    return this.initialPlaceInQueue;\n  }\n\n  @action\n  async handleHelpButtonClick() {\n    if (!this.isAskingForHelp) {\n      const response = await this.helpList.raiseHand();\n      this.initialPlaceInQueue =\n        response?.data?.relationships?.users?.data?.length ?? 1;\n      this.showQue = true;\n    } else {\n      this.helpList.lowerHand();\n      this.showQue = false;\n      this.popupOpen = false;\n    }\n  }\n\n  @action\n  checkUpdate() {\n    if (!this.helpListStudents) return;\n\n    if (this.placeInQueue && !this.isAskingForHelp) {\n      this.popupOpen = false;\n      this.showQue = false;\n    }\n  }\n\n  @action\n  handleOpenHelplist() {\n    if (this.session.user.isTeacher) {\n      this.helpList.isOpen = !this.helpList.isOpen;\n    } else {\n      this.popupOpen = !this.popupOpen;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<header class=\\\"header-base theme-dark\\\" ...attributes>\\n  {{#let\\n    (hash\\n      Button=(component \\\"header/base/button\\\")\\n      ComboButton=(component \\\"header/base/combo-button\\\")\\n    )\\n    as |base|\\n  }}\\n    <div class=\\\"header-base-start\\\">\\n      {{yield\\n        (merge-hash\\n          base\\n          (hash\\n            LogoLink=(component \\\"header/base/logo-link\\\" href=this.logoHref)\\n            EntityBreadcrumb=(component \\\"header/base/entity-breadcrumb\\\")\\n            MetaButton=(component\\n              \\\"header/base/meta-button\\\"\\n              id=this.metaButtonId\\n              active=this.isMetaPopupOpen\\n              onClick=(set this \\\"isMetaPopupOpen\\\" true)\\n            )\\n          )\\n        )\\n        to=\\\"start\\\"\\n      }}\\n    </div>\\n\\n    <div class=\\\"header-base-end\\\">\\n      {{#if this.showAiChatButton}}\\n        <AiWidget\\n          @isbn={{this.activeIsbn}}\\n          @book={{this.contextHelper.activeBook}}\\n          @course={{this.contextHelper.activeCourse}}\\n          @section={{this.contextHelper.activeSection}}\\n          @area={{this.contextHelper.activeArea}}\\n        />\\n      {{/if}}\\n\\n      {{#if this.showHelpButton}}\\n        <Header::Base::HelpButton\\n          @id={{this.helpButtonId}}\\n          @courseHelpList={{this.courseHelpList}}\\n        />\\n      {{/if}}\\n\\n      {{#if this.session.user.isTeacher}}\\n        <Header::Base::TeacherButton />\\n      {{/if}}\\n\\n      {{#unless this.session.user.isStudent}}\\n        <Header::Base::SupportButton />\\n      {{/unless}}\\n\\n      <Header::Base::UserButton />\\n\\n      {{#if this.showSkolonLogo}}\\n        <div class=\\\"header-base-skolon\\\">\\n          {{! template-lint-disable no-forbidden-elements }}\\n          <script\\n            src=\\\"{{this.skolonEndpoint}}/v1/plugins/menu/button.js\\\"\\n          ></script>\\n          <div class=\\\"skolon-menu-button\\\" data-shadow=\\\"false\\\" />\\n          {{! template-lint-enable no-forbidden-elements }}\\n        </div>\\n      {{/if}}\\n    </div>\\n  {{/let}}\\n</header>\\n\\n{{#if this.isMetaPopupOpen}}\\n  <Header::Base::MetaMenu\\n    @for={{this.metaButtonId}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @entity={{this.contextHelper.activeEntity}}\\n    @exercise={{this.contextHelper.activeExercise}}\\n    @onOpenShareLinkModal={{set this \\\"shareModalOpen\\\" true}}\\n    @onChange={{set this \\\"isMetaPopupOpen\\\" false}}\\n    @onClose={{set this \\\"isMetaPopupOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isUserDrawerOpen}}\\n  <Header::Base::UserDrawer\\n    @user={{this.session.user}}\\n    @onClose={{set this \\\"isUserDrawerOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{set this \\\"shareModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\", {\"contents\":\"<header class=\\\"header-base theme-dark\\\" ...attributes>\\n  {{#let\\n    (hash\\n      Button=(component \\\"header/base/button\\\")\\n      ComboButton=(component \\\"header/base/combo-button\\\")\\n    )\\n    as |base|\\n  }}\\n    <div class=\\\"header-base-start\\\">\\n      {{yield\\n        (merge-hash\\n          base\\n          (hash\\n            LogoLink=(component \\\"header/base/logo-link\\\" href=this.logoHref)\\n            EntityBreadcrumb=(component \\\"header/base/entity-breadcrumb\\\")\\n            MetaButton=(component\\n              \\\"header/base/meta-button\\\"\\n              id=this.metaButtonId\\n              active=this.isMetaPopupOpen\\n              onClick=(set this \\\"isMetaPopupOpen\\\" true)\\n            )\\n          )\\n        )\\n        to=\\\"start\\\"\\n      }}\\n    </div>\\n\\n    <div class=\\\"header-base-end\\\">\\n      {{#if this.showAiChatButton}}\\n        <AiWidget\\n          @isbn={{this.activeIsbn}}\\n          @book={{this.contextHelper.activeBook}}\\n          @course={{this.contextHelper.activeCourse}}\\n          @section={{this.contextHelper.activeSection}}\\n          @area={{this.contextHelper.activeArea}}\\n        />\\n      {{/if}}\\n\\n      {{#if this.showHelpButton}}\\n        <Header::Base::HelpButton\\n          @id={{this.helpButtonId}}\\n          @courseHelpList={{this.courseHelpList}}\\n        />\\n      {{/if}}\\n\\n      {{#if this.session.user.isTeacher}}\\n        <Header::Base::TeacherButton />\\n      {{/if}}\\n\\n      {{#unless this.session.user.isStudent}}\\n        <Header::Base::SupportButton />\\n      {{/unless}}\\n\\n      <Header::Base::UserButton />\\n\\n      {{#if this.showSkolonLogo}}\\n        <div class=\\\"header-base-skolon\\\">\\n          {{! template-lint-disable no-forbidden-elements }}\\n          <script\\n            src=\\\"{{this.skolonEndpoint}}/v1/plugins/menu/button.js\\\"\\n          ></script>\\n          <div class=\\\"skolon-menu-button\\\" data-shadow=\\\"false\\\" />\\n          {{! template-lint-enable no-forbidden-elements }}\\n        </div>\\n      {{/if}}\\n    </div>\\n  {{/let}}\\n</header>\\n\\n{{#if this.isMetaPopupOpen}}\\n  <Header::Base::MetaMenu\\n    @for={{this.metaButtonId}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @entity={{this.contextHelper.activeEntity}}\\n    @exercise={{this.contextHelper.activeExercise}}\\n    @onOpenShareLinkModal={{set this \\\"shareModalOpen\\\" true}}\\n    @onChange={{set this \\\"isMetaPopupOpen\\\" false}}\\n    @onClose={{set this \\\"isMetaPopupOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isUserDrawerOpen}}\\n  <Header::Base::UserDrawer\\n    @user={{this.session.user}}\\n    @onClose={{set this \\\"isUserDrawerOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{set this \\\"shareModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/header/base/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/index.hbs\"}});\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport generateId from 'compton/utils/generate-id';\n\nexport default class HeaderBase extends Component {\n  @service session;\n\n  @service contextHelper;\n\n  @service helpList;\n\n  @tracked isUserDrawerOpen = false;\n\n  @tracked isMetaPopupOpen = false;\n\n  metaButtonId = generateId();\n\n  helpButtonId = generateId();\n\n  get logoHref() {\n    if (config.nokPortalURL && config.nokPortalURL !== 'null') {\n      return `${config.nokPortalURL}/login`;\n    }\n\n    return '/';\n  }\n\n  get skolonEndpoint() {\n    return [\n      'canary',\n      'staging',\n      'dev',\n      'test',\n      'development',\n      'stage',\n      '',\n    ].includes(config.environmentName)\n      ? 'https://api-test.skolon.com'\n      : 'https://api.skolon.com';\n  }\n\n  get showSkolonLogo() {\n    if (this.session.user?.provider === 'skolon') {\n      if (!window.matchMedia('(max-width: 480px)').matches) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  get activeIsbn() {\n    if (this.contextHelper.activeCourse && this.contextHelper.activeBook) {\n      const product = this.contextHelper.activeCourse.products.find(\n        (product) => {\n          return product.books.find((book) => {\n            return book.id === this.contextHelper.activeBook.id;\n          });\n        }\n      );\n      if (product) {\n        return product.id;\n      }\n    }\n    return this.contextHelper.activeProduct?.id;\n  }\n\n  get showAiChatButton() {\n    // Don't show widget during tests\n    if (config.environment === 'test') return false;\n\n    if (!this.activeIsbn) {\n      return false;\n    }\n\n    // ISBN can be available from activeProduct while activeBook is still null\n    // (e.x after browser history transitions). The AI iframe URL requires a book id.\n    if (!this.contextHelper.activeBook?.id) {\n      return false;\n    }\n\n    return true;\n  }\n\n  get courseHelpList() {\n    return this.helpList.activeHelpList;\n  }\n\n  get showHelpButton() {\n    return Boolean(this.helpList.activeHelpList);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcIcon @name={{@name}} />\", {\"contents\":\"<DcIcon @name={{@name}} />\",\"moduleName\":\"babel/components/header/base/link/icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/link/icon/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (or @id (generate-id)) as |id|}}\\n\\n  <Header::Base::BasicLink\\n    id={{id}}\\n    class=\\\"header-base-link\\\"\\n    href={{@href}}\\n    aria-label={{@tooltip}}\\n    data-wide={{this.wide}}\\n    data-active={{this.active}}\\n    data-with-icon={{this.withIcon}}\\n    data-with-text={{this.withText}}\\n    ...attributes\\n  >\\n\\n    {{yield\\n      (hash\\n        Icon=(component \\\"header/base/link/icon\\\")\\n        Label=(component \\\"header/base/link/label\\\")\\n      )\\n    }}\\n\\n  </Header::Base::BasicLink>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\", {\"contents\":\"{{#let (or @id (generate-id)) as |id|}}\\n\\n  <Header::Base::BasicLink\\n    id={{id}}\\n    class=\\\"header-base-link\\\"\\n    href={{@href}}\\n    aria-label={{@tooltip}}\\n    data-wide={{this.wide}}\\n    data-active={{this.active}}\\n    data-with-icon={{this.withIcon}}\\n    data-with-text={{this.withText}}\\n    ...attributes\\n  >\\n\\n    {{yield\\n      (hash\\n        Icon=(component \\\"header/base/link/icon\\\")\\n        Label=(component \\\"header/base/link/label\\\")\\n      )\\n    }}\\n\\n  </Header::Base::BasicLink>\\n\\n  {{#if @tooltip}}\\n    <XTooltip @for={{id}}>\\n      {{@tooltip}}\\n    </XTooltip>\\n  {{/if}}\\n\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/link/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/link/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class HeaderLink extends Component {\n  get wide() {\n    return this.args.wide ?? false;\n  }\n\n  get startCircle() {\n    return this.args.startCircle ?? false;\n  }\n\n  get withIcon() {\n    return !!this.args.icon;\n  }\n\n  get withText() {\n    return !!this.args.text;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span class=\\\"header-base-link-label\\\" ...attributes>\\n  {{yield}}\\n</span>\", {\"contents\":\"<span class=\\\"header-base-link-label\\\" ...attributes>\\n  {{yield}}\\n</span>\",\"moduleName\":\"babel/components/header/base/link/label/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/link/label/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<a\\n  href={{@href}}\\n  title={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n  class=\\\"header-base-logo\\\"\\n  {{on \\\"click\\\" this.handleLogoClick}}\\n  ...attributes\\n  data-test-home-link\\n>\\n  <img\\n    alt={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n    title={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n    src=\\\"/assets/images/digilar/logo.svg\\\"\\n  />\\n</a>\\n\", {\"contents\":\"<a\\n  href={{@href}}\\n  title={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n  class=\\\"header-base-logo\\\"\\n  {{on \\\"click\\\" this.handleLogoClick}}\\n  ...attributes\\n  data-test-home-link\\n>\\n  <img\\n    alt={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n    title={{t \\\"components.header.base.logoLink.logoTitle\\\"}}\\n    src=\\\"/assets/images/digilar/logo.svg\\\"\\n  />\\n</a>\\n\",\"moduleName\":\"babel/components/header/base/logo-link/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/logo-link/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\n\nexport default class HeaderBaseLogoLinkComponent extends Component {\n  @action\n  handleLogoClick() {\n    trackPageHeaderEvent('Logo - Till Nokportalen');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base::Button\\n  @id={{@id}}\\n  @active={{@active}}\\n  @onClick={{@onClick}}\\n  @tooltip={{t \\\"components.header.base.metaButton.tooltip\\\"}}\\n  as |button|\\n>\\n  <button.Icon @name=\\\"menu-dots\\\" />\\n</Header::Base::Button>\", {\"contents\":\"<Header::Base::Button\\n  @id={{@id}}\\n  @active={{@active}}\\n  @onClick={{@onClick}}\\n  @tooltip={{t \\\"components.header.base.metaButton.tooltip\\\"}}\\n  as |button|\\n>\\n  <button.Icon @name=\\\"menu-dots\\\" />\\n</Header::Base::Button>\",\"moduleName\":\"babel/components/header/base/meta-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/meta-button/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @parent}}\\n  <div class=\\\"global-breadcrumb-container\\\">\\n    {{#if @activeCourse}}\\n      <UiLink\\n        @route=\\\"master.courses.show.index\\\"\\n        @model={{@activeCourse.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.header.base.metaMenu.breadcrumb.courseTitle\\\"}}\\n      >\\n        <span>{{@activeCourse.name}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{else if @activeProduct}}\\n      <UiLink\\n        @route=\\\"master.products.index\\\"\\n        @model={{@activeProduct.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.header.base.metaMenu.breadcrumb.productTitle\\\"}}\\n      >\\n        <span>{{@activeProduct.title}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{/if}}\\n\\n    {{#each this.ancestors as |ancestor|}}\\n      {{#if ancestor}}\\n        <EntityLink\\n          @entity={{ancestor}}\\n          @closeMissionHeader={{true}}\\n          @appearance=\\\"inherit\\\"\\n          class=\\\"text-default text-hover-underline global-breadcrumb-link\\\"\\n        >\\n          <span>{{ancestor.title}}</span>\\n          <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n        </EntityLink>\\n      {{/if}}\\n    {{/each}}\\n\\n    <span class=\\\"text-bold global-breadcrumb-active\\\">\\n      {{@parent.title}}\\n    </span>\\n  </div>\\n\\n  <hr class=\\\"divider\\\" />\\n{{/if}}\", {\"contents\":\"{{#if @parent}}\\n  <div class=\\\"global-breadcrumb-container\\\">\\n    {{#if @activeCourse}}\\n      <UiLink\\n        @route=\\\"master.courses.show.index\\\"\\n        @model={{@activeCourse.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.header.base.metaMenu.breadcrumb.courseTitle\\\"}}\\n      >\\n        <span>{{@activeCourse.name}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{else if @activeProduct}}\\n      <UiLink\\n        @route=\\\"master.products.index\\\"\\n        @model={{@activeProduct.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.header.base.metaMenu.breadcrumb.productTitle\\\"}}\\n      >\\n        <span>{{@activeProduct.title}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{/if}}\\n\\n    {{#each this.ancestors as |ancestor|}}\\n      {{#if ancestor}}\\n        <EntityLink\\n          @entity={{ancestor}}\\n          @closeMissionHeader={{true}}\\n          @appearance=\\\"inherit\\\"\\n          class=\\\"text-default text-hover-underline global-breadcrumb-link\\\"\\n        >\\n          <span>{{ancestor.title}}</span>\\n          <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n        </EntityLink>\\n      {{/if}}\\n    {{/each}}\\n\\n    <span class=\\\"text-bold global-breadcrumb-active\\\">\\n      {{@parent.title}}\\n    </span>\\n  </div>\\n\\n  <hr class=\\\"divider\\\" />\\n{{/if}}\",\"moduleName\":\"babel/components/header/base/meta-menu/breadcrumb/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/meta-menu/breadcrumb/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nconst REJECTED_NODE_TYPES = ['root', 'node-imports-root'];\n\nexport default class GlobalBreadcrumb extends Component {\n  @cached get ancestorsProxy() {\n    let promise = resolve();\n    if (this.args.parent) {\n      promise = this.args.parent.getParents().then((parents) =>\n        parents\n          .reject((node) => REJECTED_NODE_TYPES.includes(node.get('type')))\n          .reverse()\n          .addObject(this.node)\n      );\n    }\n    return load(promise, this);\n  }\n\n  get ancestors() {\n    return this.ancestorsProxy.isResolved ? this.ancestorsProxy.value : null;\n  }\n\n  @action scrollToTop() {\n    later(() => {\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.items}}\\n  <XPopup\\n    @for={{@for}}\\n    @opacity={{0}}\\n    @onClose={{@onClose}}\\n    @switchToDialogOnSmallBreakpoint={{false}}\\n  >\\n    <div class=\\\"share-meta-modal\\\">\\n      {{#if @entity}}\\n        <Header::Base::MetaMenu::Breadcrumb\\n          @parent={{@entity}}\\n          @activeProduct={{@activeProduct}}\\n          @activeCourse={{@activeCourse}}\\n          class=\\\"nr1\\\"\\n        />\\n      {{/if}}\\n\\n      {{#let\\n        (component\\n          \\\"x-list\\\"\\n          class=\\\"share-meta-modal-x-list\\\"\\n          items=this.items\\n          multiple=false\\n          autoFocus=true\\n          onChange=this.handleCopyOrShare\\n        )\\n        as |ListComponent|\\n      }}\\n        {{#if (has-block)}}\\n          <ListComponent as |option|>\\n            {{yield option}}\\n          </ListComponent>\\n        {{else}}\\n          {{ListComponent}}\\n        {{/if}}\\n      {{/let}}\\n\\n      {{#if this.infoItems}}\\n        <div>\\n          <hr class=\\\"divider\\\" />\\n          <span class=\\\"text-separator\\\">\\n            {{t \\\"components.header.base.metaMenu.information\\\"}}\\n          </span>\\n\\n          {{#let\\n            (component\\n              \\\"x-list\\\"\\n              class=\\\"share-meta-modal-x-list\\\"\\n              items=this.infoItems\\n              multiple=false\\n              autoFocus=true\\n              onChange=this.handleOpenEntityInspector\\n            )\\n            as |ListComponent|\\n          }}\\n            {{#if (has-block)}}\\n              <ListComponent as |option|>\\n                {{yield option}}\\n              </ListComponent>\\n            {{else}}\\n              {{ListComponent}}\\n            {{/if}}\\n          {{/let}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </XPopup>\\n{{/if}}\\n\\n{{#if this.isUsersDrawerOpen}}\\n  <Header::Base::CourseUsersDrawer\\n    @activeCourse={{@activeCourse}}\\n    @onClose={{set this \\\"isUsersDrawerOpen\\\" false}}\\n    @position=\\\"right\\\"\\n  />\\n{{/if}}\", {\"contents\":\"{{#if this.items}}\\n  <XPopup\\n    @for={{@for}}\\n    @opacity={{0}}\\n    @onClose={{@onClose}}\\n    @switchToDialogOnSmallBreakpoint={{false}}\\n  >\\n    <div class=\\\"share-meta-modal\\\">\\n      {{#if @entity}}\\n        <Header::Base::MetaMenu::Breadcrumb\\n          @parent={{@entity}}\\n          @activeProduct={{@activeProduct}}\\n          @activeCourse={{@activeCourse}}\\n          class=\\\"nr1\\\"\\n        />\\n      {{/if}}\\n\\n      {{#let\\n        (component\\n          \\\"x-list\\\"\\n          class=\\\"share-meta-modal-x-list\\\"\\n          items=this.items\\n          multiple=false\\n          autoFocus=true\\n          onChange=this.handleCopyOrShare\\n        )\\n        as |ListComponent|\\n      }}\\n        {{#if (has-block)}}\\n          <ListComponent as |option|>\\n            {{yield option}}\\n          </ListComponent>\\n        {{else}}\\n          {{ListComponent}}\\n        {{/if}}\\n      {{/let}}\\n\\n      {{#if this.infoItems}}\\n        <div>\\n          <hr class=\\\"divider\\\" />\\n          <span class=\\\"text-separator\\\">\\n            {{t \\\"components.header.base.metaMenu.information\\\"}}\\n          </span>\\n\\n          {{#let\\n            (component\\n              \\\"x-list\\\"\\n              class=\\\"share-meta-modal-x-list\\\"\\n              items=this.infoItems\\n              multiple=false\\n              autoFocus=true\\n              onChange=this.handleOpenEntityInspector\\n            )\\n            as |ListComponent|\\n          }}\\n            {{#if (has-block)}}\\n              <ListComponent as |option|>\\n                {{yield option}}\\n              </ListComponent>\\n            {{else}}\\n              {{ListComponent}}\\n            {{/if}}\\n          {{/let}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </XPopup>\\n{{/if}}\\n\\n{{#if this.isUsersDrawerOpen}}\\n  <Header::Base::CourseUsersDrawer\\n    @activeCourse={{@activeCourse}}\\n    @onClose={{set this \\\"isUsersDrawerOpen\\\" false}}\\n    @position=\\\"right\\\"\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/header/base/meta-menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/meta-menu/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\nimport copyToClipboard from 'babel/utils/copy-to-clipboard';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\n\n/**\n * Arguments:\n * currentCourse\n * activeProduct\n * activeCourse\n * entity\n * exercise\n * withHeader (bool)\n * header (object)\n * value\n * items\n */\n\nexport default class HeaderBaseMetaModal extends Component {\n  @service entityInspector;\n\n  @service contextHelper;\n\n  @service intl;\n\n  @service snackbar;\n\n  @service session;\n\n  @service router;\n\n  get infoItems() {\n    let returnArray = [];\n\n    if (this.args.entity) {\n      returnArray.push({\n        icon: 'info-circle',\n        value: 'entity',\n        label: this.args.entity.title,\n      });\n    }\n\n    if (\n      this.contextHelper.activeExercise &&\n      !this.contextHelper.activeExercise.isTeacherAssignment\n    ) {\n      returnArray.push({\n        icon: 'info-circle',\n        value: 'exercise',\n        label: this.contextHelper.activeExercise.title,\n      });\n    }\n\n    if (\n      this.contextHelper.activeWorkspaceExercise &&\n      !this.contextHelper.activeWorkspaceExercise.isTeacherAssignment\n    ) {\n      returnArray.push({\n        icon: 'info-circle',\n        value: 'workspace',\n        label: this.contextHelper.activeWorkspaceExercise.title,\n      });\n    }\n\n    return returnArray;\n  }\n\n  get returnURL() {\n    return this.router.currentURL;\n  }\n\n  get items() {\n    const returnArray = [\n      {\n        icon: 'link',\n        value: 'copyLink',\n        label: this.intl.t(\n          'components.header.base.metaMenu.breadcrumb.menu.copyLink'\n        ),\n      },\n      {\n        icon: 'share',\n        value: 'share',\n        label: this.intl.t(\n          'components.header.base.metaMenu.breadcrumb.menu.share'\n        ),\n      },\n    ];\n\n    return returnArray;\n  }\n\n  get currentUrl() {\n    return window.location.href;\n  }\n\n  // ACTIONS\n\n  @action\n  handleCopyOrShare(value) {\n    if (value === 'copyLink') {\n      trackPageHeaderEvent('Metameny - Kopiera djuplänk');\n      copyToClipboard(this.currentUrl)\n        .then(() => {\n          this.snackbar.enqueue(\n            this.intl.t(\n              'components.header.base.metaMenu.breadcrumb.locationCopiedToClipboard'\n            ),\n            {\n              variant: 'success',\n              autoDismiss: true,\n            }\n          );\n        })\n        .catch(() => {\n          this.snackbar.enqueue(\n            this.intl.t(\n              'components.header.base.metaMenu.breadcrumb.locationFailedToCopyToClipboard'\n            ),\n            {\n              variant: 'error',\n            }\n          );\n        });\n    } else {\n      trackPageHeaderEvent('Metameny - Dela');\n      this.args.onOpenShareLinkModal();\n    }\n\n    this._close();\n  }\n\n  @action\n  handleOpenEntityInspector(value) {\n    switch (value) {\n      case 'workspace':\n        this.entityInspector.openModal(\n          this.contextHelper.activeWorkspaceExercise\n        );\n        break;\n      case 'exercise':\n        this.entityInspector.openModal(this.contextHelper.activeExercise);\n        break;\n      default:\n        this.entityInspector.openModal(this.args.entity);\n        break;\n    }\n\n    this._close();\n  }\n\n  // PRIVATE\n\n  _change() {\n    this.args.onChange(...arguments);\n  }\n\n  _close() {\n    this.args.onClose();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XDrawer\\n  ...attributes\\n  @title={{this.title}}\\n  @closeOnRouteChange={{false}}\\n  @onClose={{this.close}}\\n>\\n  {{#if @inCourse}}\\n    <UiLink\\n      @route=\\\"master.courses.show.index\\\"\\n      @model={{@activeCourse.id}}\\n      @variant=\\\"inherit\\\"\\n      class={{concat\\n        \\\"p1 flex bb1 flex-shrink \\\"\\n        (if\\n          this.activeCourseElement\\n          \\\"text-color-default-bg-text bg-color-default \\\"\\n          \\\"\\\"\\n        )\\n      }}\\n    >\\n      <DcIcon @name=\\\"home\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.header.base.navigationDrawer.start\\\"}}\\n    </UiLink>\\n    {{#if this.session.user.isTeacher}}\\n      <a\\n        href={{this.courseSettingsURL}}\\n        class=\\\"ui-link ui-link--link--inherit ui-link--medium ui-link--square ember-view p1 flex bb1 flex-shrink\\\"\\n      >\\n        <DcIcon @name=\\\"settings-gear\\\" class=\\\"nr1\\\" />\\n        {{t \\\"components.header.base.navigationDrawer.courseSettings\\\"}}\\n      </a>\\n    {{/if}}\\n  {{/if}}\\n\\n  {{#if (and @activeProduct (not @inCourse))}}\\n    <ProductRoot @product={{@activeProduct}} />\\n  {{/if}}\\n\\n  {{#if this.searchableBooks}}\\n    <EntitySearch @entities={{this.searchableBooks}}>\\n      {{#each this.searchableBooks as |book|}}\\n        <EntityBrowser\\n          @entity={{book}}\\n          @root={{true}}\\n          @expandedEntities={{this.expandedEntities}}\\n          @onExpand={{this.handleEntityBrowserExpand}}\\n          @onCollapse={{this.handleEntityBrowserCollapse}}\\n          @onClose={{@onClose}}\\n        />\\n      {{/each}}\\n    </EntitySearch>\\n  {{/if}}\\n\\n</XDrawer>\", {\"contents\":\"<XDrawer\\n  ...attributes\\n  @title={{this.title}}\\n  @closeOnRouteChange={{false}}\\n  @onClose={{this.close}}\\n>\\n  {{#if @inCourse}}\\n    <UiLink\\n      @route=\\\"master.courses.show.index\\\"\\n      @model={{@activeCourse.id}}\\n      @variant=\\\"inherit\\\"\\n      class={{concat\\n        \\\"p1 flex bb1 flex-shrink \\\"\\n        (if\\n          this.activeCourseElement\\n          \\\"text-color-default-bg-text bg-color-default \\\"\\n          \\\"\\\"\\n        )\\n      }}\\n    >\\n      <DcIcon @name=\\\"home\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.header.base.navigationDrawer.start\\\"}}\\n    </UiLink>\\n    {{#if this.session.user.isTeacher}}\\n      <a\\n        href={{this.courseSettingsURL}}\\n        class=\\\"ui-link ui-link--link--inherit ui-link--medium ui-link--square ember-view p1 flex bb1 flex-shrink\\\"\\n      >\\n        <DcIcon @name=\\\"settings-gear\\\" class=\\\"nr1\\\" />\\n        {{t \\\"components.header.base.navigationDrawer.courseSettings\\\"}}\\n      </a>\\n    {{/if}}\\n  {{/if}}\\n\\n  {{#if (and @activeProduct (not @inCourse))}}\\n    <ProductRoot @product={{@activeProduct}} />\\n  {{/if}}\\n\\n  {{#if this.searchableBooks}}\\n    <EntitySearch @entities={{this.searchableBooks}}>\\n      {{#each this.searchableBooks as |book|}}\\n        <EntityBrowser\\n          @entity={{book}}\\n          @root={{true}}\\n          @expandedEntities={{this.expandedEntities}}\\n          @onExpand={{this.handleEntityBrowserExpand}}\\n          @onCollapse={{this.handleEntityBrowserCollapse}}\\n          @onClose={{@onClose}}\\n        />\\n      {{/each}}\\n    </EntitySearch>\\n  {{/if}}\\n\\n</XDrawer>\",\"moduleName\":\"babel/components/header/base/navigation-drawer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/navigation-drawer/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { all } from 'rsvp';\n\nexport default class NavigationDrawer extends Component {\n  @service router;\n\n  @service intl;\n\n  @service navigationDrawer;\n\n  @service contextHelper;\n\n  @service session;\n\n  // Legacy?\n  // @service entityInspector;\n\n  @tracked expandedEntities = [];\n\n  constructor() {\n    super(...arguments);\n\n    const activeEntity =\n      this.contextHelper.activeExercise ||\n      this.contextHelper.activeSection ||\n      this.contextHelper.activeContent ||\n      this.contextHelper.activeArea ||\n      this.contextHelper.activeBook;\n\n    if (activeEntity) {\n      const ancestors = activeEntity?.ancestors?.toArray() || [];\n      this.expandedEntities = [...ancestors, activeEntity];\n    }\n\n    this.routerRouteDidChange = () => this.close('navigation');\n\n    this.router.on('routeDidChange', this.routerRouteDidChange);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n\n    this.router.off('routeDidChange', this.routerRouteDidChange);\n  }\n\n  get title() {\n    return (\n      this.args?.activeCourse?.name ||\n      this.intl.t('components.header.base.navigationDrawer.fallbackTitle')\n    );\n  }\n\n  get searchableBooks() {\n    if (this.args?.activeCourse?.books) {\n      return this.args.activeCourse.books;\n    }\n\n    if (this.args?.activeProduct?.books) {\n      return this.args.activeProduct.books;\n    }\n\n    if (this.args?.activeBook) {\n      return this.args.activeBook;\n    }\n\n    return null;\n  }\n\n  get activeCourseElement() {\n    const currentRouteName = this.router.currentRouteName;\n    return currentRouteName?.startsWith('master.courses.show');\n  }\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get courseSettingsURL() {\n    return `${this.skolAdminUrl}/courses/${this.args?.activeCourse?.id}`;\n  }\n\n  @action\n  close(initiator) {\n    if (this.args.onClose) {\n      this.args.onClose(initiator);\n    }\n  }\n\n  @action\n  handleEntityBrowserExpand(entity) {\n    this.expandedEntities.addObject(entity);\n    return all([entity.get('children'), entity.get('cat')]);\n  }\n\n  @action\n  handleEntityBrowserCollapse(entity) {\n    this.expandedEntities.removeObject(entity);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (t \\\"components.header.base.supportButton.label\\\") as |label|}}\\n  <Header::Base::Button\\n    ...attributes\\n    @wide={{media \\\"md\\\"}}\\n    @tooltip={{unless (media \\\"md\\\") label}}\\n    @active={{this.imbox.isSupportDrawerOpen}}\\n    @onClick={{this.imbox.onClick}}\\n    as |button|\\n  >\\n\\n    <button.Icon @name=\\\"help\\\" />\\n\\n    {{#if (media \\\"md\\\")}}\\n      <button.Label>\\n        {{label}}\\n      </button.Label>\\n    {{/if}}\\n\\n  </Header::Base::Button>\\n{{/let}}\", {\"contents\":\"{{#let (t \\\"components.header.base.supportButton.label\\\") as |label|}}\\n  <Header::Base::Button\\n    ...attributes\\n    @wide={{media \\\"md\\\"}}\\n    @tooltip={{unless (media \\\"md\\\") label}}\\n    @active={{this.imbox.isSupportDrawerOpen}}\\n    @onClick={{this.imbox.onClick}}\\n    as |button|\\n  >\\n\\n    <button.Icon @name=\\\"help\\\" />\\n\\n    {{#if (media \\\"md\\\")}}\\n      <button.Label>\\n        {{label}}\\n      </button.Label>\\n    {{/if}}\\n\\n  </Header::Base::Button>\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/support-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/support-button/index.hbs\"}});\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class HeaderBaseSupportButtonComponent extends Component {\n  @service imbox;\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.hasMenuItems}}\\n  <div>\\n    {{#let (generate-id \\\"teacher-button\\\") as |id|}}\\n      <Header::Base::Button\\n        ...attributes\\n        @id={{id}}\\n        @tooltip={{t \\\"components.header.base.teacherButton.label\\\"}}\\n        @active={{this.isMenuOpen}}\\n        @wide={{media \\\"md\\\"}}\\n        @onClick={{set this \\\"isMenuOpen\\\" true}}\\n        data-test-teacher-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"apple\\\" />\\n        {{#if (media \\\"md\\\")}}\\n          <button.Label>\\n            {{t \\\"components.header.base.teacherButton.label\\\"}}\\n          </button.Label>\\n        {{/if}}\\n      </Header::Base::Button>\\n\\n      {{#if this.isMenuOpen}}\\n        <ActionMenu\\n          ...attributes\\n          @for={{id}}\\n          @onSelect={{this.selectItem}}\\n          @width=\\\"none\\\"\\n          @onClose={{set this \\\"isMenuOpen\\\" false}}\\n          as |menu|\\n        >\\n          {{#if this.activeGroupName}}\\n            <div class=\\\"teacher-menu-active-group\\\">{{this.activeGroupName}}</div>\\n          {{/if}}\\n\\n          {{#if this.showCreateMissionButton}}\\n            <menu.Item @value=\\\"createMission\\\" @icon=\\\"mission\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.createMission\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionCreateMission\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.showCustomizeButton}}\\n            <menu.Item\\n              @value=\\\"customize\\\"\\n              @icon=\\\"customize\\\"\\n              data-test-mission-customize-button\\n            >\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.customize\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionCustomize\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.auditLink}}\\n            <menu.Item @value=\\\"auditLink\\\" @icon=\\\"results\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.auditLink\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionAuditLink\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.contextHelper.inCourse}}\\n            <menu.Item @value=\\\"studentList\\\" @icon=\\\"group\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.studentList\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionStudentList\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n\\n            <menu.Item @value=\\\"helpList\\\" @icon=\\\"group\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.helpList\\\"}}\\n              </:label>\\n              <:description>\\n                {{t \\\"components.header.base.teacherButton.descriptionHelpList\\\"}}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if (and this.hasItemsBelowDivider (or this.contextHelper.inCourse this.showCustomizeButton))}}\\n            <menu.Divider />\\n          {{/if}}\\n\\n          {{#if this.attachedTeacherGuidance}}\\n            <menu.Item @value=\\\"attachedGuidance\\\" class=\\\"teacher-guidance\\\">\\n              <:label>\\n                <div class=\\\"teacher-guidance-label\\\">\\n                  <div class=\\\"teacher-guidance-product\\\">\\n                    <XImage\\n                      class=\\\"teacher-guidance-image\\\"\\n                      @source={{this.attachedTeacherGuidance.cover.imageUrl}}\\n                      @width=\\\"48\\\"\\n                      @height=\\\"48\\\"\\n                      @mimetype={{this.attachedTeacherGuidance.cover.imageMimetype}}\\n                    />\\n                    {{this.attachedTeacherGuidance.title}}\\n                  </div>\\n                  <DcIcon @name=\\\"external\\\" />\\n                </div>\\n              </:label>\\n            </menu.Item>\\n            {{#if this.showTeacherGuidanceButton}}\\n              <menu.Divider />\\n            {{/if}}\\n          {{/if}}\\n\\n          {{#if this.showTeacherGuidanceButton}}\\n            <menu.Item @value=\\\"guidance\\\" @icon=\\\"guidance\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.guidance\\\"}}\\n              </:label>\\n              <:description>\\n                {{t \\\"components.header.base.teacherButton.descriptionGuidance\\\"}}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n        </ActionMenu>\\n      {{/if}}\\n    {{/let}}\\n  </div>\\n\\n  {{#if this.showLicenseModal}}\\n    <XModal\\n      @onClose={{set this \\\"showLicenseModal\\\" false}}\\n      @size=\\\"expand\\\"\\n      @title={{t \\\"components.header.base.teacherButton.guidance\\\"}}\\n      as |Modal|\\n    >\\n      <Modal.header />\\n\\n      <Modal.content>\\n        <div class=\\\"teacher-guidance-license-modal\\\">\\n          <XImage\\n            class=\\\"teacher-guidance-image\\\"\\n            @source={{this.attachedTeacherGuidance.cover.imageUrl}}\\n            @width=\\\"48\\\"\\n            @height=\\\"48\\\"\\n            @mimetype={{this.attachedTeacherGuidance.cover.imageMimetype}}\\n          />\\n          <div class=\\\"teacher-guidance-license-modal-content\\\">\\n            <span class=\\\"teacher-guidance-license-modal-title\\\">\\n              {{this.attachedTeacherGuidance.title}}\\n            </span>\\n            <span class=\\\"teacher-guidance-license-error\\\">\\n              <DcIcon @name=\\\"t-warning\\\" />\\n              {{t \\\"components.header.base.teacherButton.missingLicense\\\"}}\\n            </span>\\n          </div>\\n        </div>\\n      </Modal.content>\\n    </XModal>\\n  {{/if}}\\n{{/if}}\", {\"contents\":\"{{#if this.hasMenuItems}}\\n  <div>\\n    {{#let (generate-id \\\"teacher-button\\\") as |id|}}\\n      <Header::Base::Button\\n        ...attributes\\n        @id={{id}}\\n        @tooltip={{t \\\"components.header.base.teacherButton.label\\\"}}\\n        @active={{this.isMenuOpen}}\\n        @wide={{media \\\"md\\\"}}\\n        @onClick={{set this \\\"isMenuOpen\\\" true}}\\n        data-test-teacher-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"apple\\\" />\\n        {{#if (media \\\"md\\\")}}\\n          <button.Label>\\n            {{t \\\"components.header.base.teacherButton.label\\\"}}\\n          </button.Label>\\n        {{/if}}\\n      </Header::Base::Button>\\n\\n      {{#if this.isMenuOpen}}\\n        <ActionMenu\\n          ...attributes\\n          @for={{id}}\\n          @onSelect={{this.selectItem}}\\n          @width=\\\"none\\\"\\n          @onClose={{set this \\\"isMenuOpen\\\" false}}\\n          as |menu|\\n        >\\n          {{#if this.activeGroupName}}\\n            <div class=\\\"teacher-menu-active-group\\\">{{this.activeGroupName}}</div>\\n          {{/if}}\\n\\n          {{#if this.showCreateMissionButton}}\\n            <menu.Item @value=\\\"createMission\\\" @icon=\\\"mission\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.createMission\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionCreateMission\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.showCustomizeButton}}\\n            <menu.Item\\n              @value=\\\"customize\\\"\\n              @icon=\\\"customize\\\"\\n              data-test-mission-customize-button\\n            >\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.customize\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionCustomize\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.auditLink}}\\n            <menu.Item @value=\\\"auditLink\\\" @icon=\\\"results\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.auditLink\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionAuditLink\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if this.contextHelper.inCourse}}\\n            <menu.Item @value=\\\"studentList\\\" @icon=\\\"group\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.studentList\\\"}}\\n              </:label>\\n              <:description>\\n                {{t\\n                  \\\"components.header.base.teacherButton.descriptionStudentList\\\"\\n                }}\\n              </:description>\\n            </menu.Item>\\n\\n            <menu.Item @value=\\\"helpList\\\" @icon=\\\"group\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.helpList\\\"}}\\n              </:label>\\n              <:description>\\n                {{t \\\"components.header.base.teacherButton.descriptionHelpList\\\"}}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n\\n          {{#if (and this.hasItemsBelowDivider (or this.contextHelper.inCourse this.showCustomizeButton))}}\\n            <menu.Divider />\\n          {{/if}}\\n\\n          {{#if this.attachedTeacherGuidance}}\\n            <menu.Item @value=\\\"attachedGuidance\\\" class=\\\"teacher-guidance\\\">\\n              <:label>\\n                <div class=\\\"teacher-guidance-label\\\">\\n                  <div class=\\\"teacher-guidance-product\\\">\\n                    <XImage\\n                      class=\\\"teacher-guidance-image\\\"\\n                      @source={{this.attachedTeacherGuidance.cover.imageUrl}}\\n                      @width=\\\"48\\\"\\n                      @height=\\\"48\\\"\\n                      @mimetype={{this.attachedTeacherGuidance.cover.imageMimetype}}\\n                    />\\n                    {{this.attachedTeacherGuidance.title}}\\n                  </div>\\n                  <DcIcon @name=\\\"external\\\" />\\n                </div>\\n              </:label>\\n            </menu.Item>\\n            {{#if this.showTeacherGuidanceButton}}\\n              <menu.Divider />\\n            {{/if}}\\n          {{/if}}\\n\\n          {{#if this.showTeacherGuidanceButton}}\\n            <menu.Item @value=\\\"guidance\\\" @icon=\\\"guidance\\\">\\n              <:label>\\n                {{t \\\"components.header.base.teacherButton.guidance\\\"}}\\n              </:label>\\n              <:description>\\n                {{t \\\"components.header.base.teacherButton.descriptionGuidance\\\"}}\\n              </:description>\\n            </menu.Item>\\n          {{/if}}\\n        </ActionMenu>\\n      {{/if}}\\n    {{/let}}\\n  </div>\\n\\n  {{#if this.showLicenseModal}}\\n    <XModal\\n      @onClose={{set this \\\"showLicenseModal\\\" false}}\\n      @size=\\\"expand\\\"\\n      @title={{t \\\"components.header.base.teacherButton.guidance\\\"}}\\n      as |Modal|\\n    >\\n      <Modal.header />\\n\\n      <Modal.content>\\n        <div class=\\\"teacher-guidance-license-modal\\\">\\n          <XImage\\n            class=\\\"teacher-guidance-image\\\"\\n            @source={{this.attachedTeacherGuidance.cover.imageUrl}}\\n            @width=\\\"48\\\"\\n            @height=\\\"48\\\"\\n            @mimetype={{this.attachedTeacherGuidance.cover.imageMimetype}}\\n          />\\n          <div class=\\\"teacher-guidance-license-modal-content\\\">\\n            <span class=\\\"teacher-guidance-license-modal-title\\\">\\n              {{this.attachedTeacherGuidance.title}}\\n            </span>\\n            <span class=\\\"teacher-guidance-license-error\\\">\\n              <DcIcon @name=\\\"t-warning\\\" />\\n              {{t \\\"components.header.base.teacherButton.missingLicense\\\"}}\\n            </span>\\n          </div>\\n        </div>\\n      </Modal.content>\\n    </XModal>\\n  {{/if}}\\n{{/if}}\",\"moduleName\":\"babel/components/header/base/teacher-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/teacher-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class TeacherButton extends Component {\n  @service router;\n\n  @service session;\n\n  @service entityInspector;\n\n  @service contextHelper;\n\n  @service helpList;\n\n  @service studentList;\n\n  @service store;\n\n  @tracked isMenuOpen = false;\n\n  @tracked showLicenseModal = false;\n\n  get activeGroupName() {\n    return this.contextHelper.activeGroupName ?? null;\n  }\n\n  get hasMenuItems() {\n    return (\n      this.attachedTeacherGuidance ||\n      this.showTeacherGuidanceButton ||\n      this.showCustomizeButton ||\n      this.auditLink ||\n      this.contextHelper.inCourse ||\n      this.showCreateMissionButton\n    );\n  }\n\n  get hasItemsBelowDivider() {\n    return this.attachedTeacherGuidance || this.showTeacherGuidanceButton;\n  }\n\n  get showTeacherGuidanceButton() {\n    return (\n      this.session.user?.isTeacherForSchool &&\n      this.contextHelper.activeEntity?.body?.guidance?.length > 0\n    );\n  }\n\n  get auditLink() {\n    const course = this.contextHelper.activeCourse;\n    if (!course || course.students.length === 0) return null;\n\n    const isbn = this.contextHelper.activeProduct?.id;\n    if (!isbn) return null;\n\n    const contentId = this.contextHelper.activeContent?.id;\n    const mission = this.contextHelper.activeMission;\n\n    const params = new URLSearchParams({ course_id: course.id });\n    if (contentId) params.set('contentId', contentId);\n\n    const path = mission ? `audit/missions/${mission.id}` : 'audit/overview';\n\n    return `/products/${isbn}/${path}?${params.toString()}`;\n  }\n\n  get showCustomizeButton() {\n    if (!this.contextHelper.inMission) return false;\n    if (!this.contextHelper.activeContent) return false;\n    if (this.contextHelper.activeContent.type === 'interactives') return true;\n    if (this.contextHelper.activeContent.type === 'contents') {\n      if (this.contextHelper.activeSection) return true;\n    }\n    return false;\n  }\n\n  get showCreateMissionButton() {\n    return (\n      !this.contextHelper.inMission &&\n      this.contextHelper.activeSection &&\n      this.contextHelper.inCourse\n    );\n  }\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get createCourseUrl() {\n    return `${this.skolAdminUrl}/courses`;\n  }\n\n  get isMissionCustomizerVisible() {\n    return (\n      this.session?.user?.isTeacher &&\n      this.contextHelper.inMission &&\n      (this.contextHelper.activeSection ||\n        (this.contextHelper.activeCustomContent &&\n          this.router.currentRouteName?.includes('interactives')) ||\n        (this.isIncludedEntitiesEmpty &&\n          this.contextHelper?.activeCustomContent?.populated) ||\n        (!this.contextHelper.activeSection &&\n          (this.includedSections?.length === 0 ||\n            this.includedCollections?.length === 0)))\n    );\n  }\n\n  get includedSections() {\n    return this.contextHelper.activeCustomContent?.includedEntities\n      ?.mapBy('type')\n      .filter((type) => type === 'sections');\n  }\n\n  get includedCollections() {\n    return this.contextHelper.activeCustomContent?.includedEntities\n      ?.mapBy('type')\n      .filter((type) => type === 'collections');\n  }\n\n  get isIncludedEntitiesEmpty() {\n    return (\n      this.contextHelper?.activeCustomContent?.includedEntities?.length === 0\n    );\n  }\n\n  @cached\n  get attachedTeacherGuidanceProxy() {\n    const isbn =\n      this.contextHelper.activeProduct?.metadata?.attached_teacher_guidance ||\n      this.contextHelper.activeBook?.products?.firstObject?.metadata\n        ?.attached_teacher_guidance ||\n      this.contextHelper.activeCourse?.books?.firstObject?.products?.firstObject\n        ?.metadata?.attached_teacher_guidance;\n\n    let promise = resolve();\n\n    if (isbn) {\n      promise = this.store.findRecord('product', isbn);\n    }\n\n    return load(promise, this);\n  }\n\n  get attachedTeacherGuidance() {\n    return this.attachedTeacherGuidanceProxy.isResolved\n      ? this.attachedTeacherGuidanceProxy.value\n      : null;\n  }\n\n  @action\n  async selectItem(value) {\n    if (value === 'guidance') {\n      this.entityInspector.openModal(\n        this.contextHelper.activeEntity,\n        'guidance'\n      );\n\n      trackPageHeaderEvent('Lärarmeny - Lärarhandledning');\n    } else if (value === 'customize') {\n      this.entityInspector.openModal(\n        this.contextHelper.activeEntity,\n        'missionCustomizer'\n      );\n\n      trackPageHeaderEvent('Lärarmeny - Anpassa uppdrag');\n    } else if (value === 'helpList') {\n      this.helpList.openModal();\n      trackPageHeaderEvent('Lärarmeny - Hjälplista');\n    } else if (value === 'studentList') {\n      this.studentList.openModal();\n      trackPageHeaderEvent('Lärarmeny - Elevlista');\n    } else if (value === 'auditLink') {\n      trackPageHeaderEvent('Lärarmeny - Uppföljning');\n      location.href = this.auditLink;\n    } else if (value === 'attachedGuidance') {\n      const hasLicense = this.session.user.licenses.content.some(\n        (license) => license.isbn === this.attachedTeacherGuidance.id\n      );\n\n      trackPageHeaderEvent('Lärarmeny - Exterrn lärarhandledning');\n      if (!hasLicense) {\n        this.showLicenseModal = true;\n      } else {\n        window.open('/products/' + this.attachedTeacherGuidance.id, '_blank');\n      }\n    } else if (value === 'createMission') {\n      this.createMission();\n      trackPageHeaderEvent('Lärarmeny - Skapa uppdrag');\n    }\n  }\n\n  @action\n  createMission() {\n    const course = this.contextHelper.activeCourse;\n    const content = this.contextHelper.activeContent;\n\n    if (course && content) {\n      this.router.transitionTo('master.courses.show.missions', course.id, {\n        queryParams: {\n          createMission: true,\n          contentId: content.id,\n          missionTitle: content.title,\n        },\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (t \\\"components.header.base.teacherGuidanceButton.label\\\") as |label|}}\\n  <Header::Base::Button\\n    ...attributes\\n    @tooltip={{unless (media \\\"md\\\") label}}\\n    @active={{this.isActive}}\\n    @wide={{media \\\"md\\\"}}\\n    @onClick={{this.handleButtonClick}}\\n    as |button|\\n  >\\n    <button.Icon @name=\\\"guidance\\\" />\\n\\n    {{#if (media \\\"md\\\")}}\\n      <button.Label>\\n        {{label}}\\n      </button.Label>\\n    {{/if}}\\n\\n  </Header::Base::Button>\\n{{/let}}\", {\"contents\":\"{{#let (t \\\"components.header.base.teacherGuidanceButton.label\\\") as |label|}}\\n  <Header::Base::Button\\n    ...attributes\\n    @tooltip={{unless (media \\\"md\\\") label}}\\n    @active={{this.isActive}}\\n    @wide={{media \\\"md\\\"}}\\n    @onClick={{this.handleButtonClick}}\\n    as |button|\\n  >\\n    <button.Icon @name=\\\"guidance\\\" />\\n\\n    {{#if (media \\\"md\\\")}}\\n      <button.Label>\\n        {{label}}\\n      </button.Label>\\n    {{/if}}\\n\\n  </Header::Base::Button>\\n{{/let}}\",\"moduleName\":\"babel/components/header/base/teacher-guidance-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/teacher-guidance-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class HeaderBaseTeacherGuidanceButtonComponent extends Component {\n  @service session;\n  @service entityInspector;\n\n  get isActive() {\n    return (\n      this.args.activeEntity?.id ===\n        this.entityInspector?.inspectedEntity?.id &&\n      this.entityInspector.modalIsOpen &&\n      this.entityInspector.modalSection === 'guidance'\n    );\n  }\n\n  @action\n  handleButtonClick() {\n    if (this.isActive) {\n      this.entityInspector.closeModal();\n    } else {\n      this.entityInspector.openModal(this.args.activeEntity, 'guidance');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<nok-account logout-url=\\\"/logout\\\" {{did-insert this.passToken}}></nok-account>\\n\", {\"contents\":\"<nok-account logout-url=\\\"/logout\\\" {{did-insert this.passToken}}></nok-account>\\n\",\"moduleName\":\"babel/components/header/base/user-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/user-button/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class UserButton extends Component {\n  @service session;\n\n  @action\n  passToken(nokAccountComponent) {\n    nokAccountComponent.accessToken = () => this.session.accessToken;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XDrawer\\n  ...attributes\\n  @title={{t \\\"components.header.base.userDrawer.account\\\"}}\\n  @position=\\\"right\\\"\\n  @closeOnRouteChange={{true}}\\n  @onClose={{@onClose}}\\n>\\n  <GlobalMenu />\\n</XDrawer>\", {\"contents\":\"<XDrawer\\n  ...attributes\\n  @title={{t \\\"components.header.base.userDrawer.account\\\"}}\\n  @position=\\\"right\\\"\\n  @closeOnRouteChange={{true}}\\n  @onClose={{@onClose}}\\n>\\n  <GlobalMenu />\\n</XDrawer>\",\"moduleName\":\"babel/components/header/base/user-drawer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/base/user-drawer/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n\\n  <:start as |start|>\\n\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.book.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{set this \\\"isNavigationDrawerOpen\\\" true}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n\\n  </:start>\\n\\n  <:end as |end|>\\n\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <end.SupportButton />\\n\\n    <end.UserButton />\\n\\n  </:end>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeBook={{@activeBook}}\\n    @inCourse={{false}}\\n    @onClose={{set this \\\"isNavigationDrawerOpen\\\" false}}\\n  />\\n{{/if}}\", {\"contents\":\"<Header::Base ...attributes>\\n\\n  <:start as |start|>\\n\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.book.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{set this \\\"isNavigationDrawerOpen\\\" true}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n\\n  </:start>\\n\\n  <:end as |end|>\\n\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <end.SupportButton />\\n\\n    <end.UserButton />\\n\\n  </:end>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeBook={{@activeBook}}\\n    @inCourse={{false}}\\n    @onClose={{set this \\\"isNavigationDrawerOpen\\\" false}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/header/book/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/book/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class BookHeader extends Component {\n  @tracked isNavigationDrawerOpen = false;\n\n  get breadcrumbEntities() {\n    const ancestors = this.args.activeEntity?.ancestors?.toArray() || [];\n\n    return [this.args.activeEntity, ...ancestors].filter(Boolean).reverse();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if this.showBackButton}}\\n      <start.Button\\n        @onClick={{this.gotoActiveContent}}\\n        data-test-content-header-back-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"tail-left\\\" />\\n      </start.Button>\\n    {{else}}\\n      <start.Button\\n        @onClick={{@onClose}}\\n        data-test-content-header-close-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"simple-remove\\\" />\\n      </start.Button>\\n    {{/if}}\\n\\n    <div\\n      class=\\\"default-page-header default-page-header--content flex flex-center flex-justify\\\"\\n    >\\n      {{#if this.contextHelper.inMission}}\\n        <span class=\\\"default-page-header-mission-title\\\">\\n          {{@activeMission.title}}\\n        </span>\\n      {{/if}}\\n      <span class=\\\"default-page-header-active-title\\\">\\n        {{@activeEntity.title}}\\n      </span>\\n    </div>\\n\\n    <start.Button\\n      @onClick={{set this \\\"shareModalOpen\\\" true}}\\n      class=\\\"header-base-combo-button-secondary-button header-base-combo-button-secondary-button--darker-in-xs header-base-combo-button-secondary-button--with-label\\\"\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"share\\\" />\\n      <button.Label>\\n        {{t \\\"components.shareMeta.menu.share\\\"}}\\n      </button.Label>\\n    </start.Button>\\n\\n    {{#if this.contextHelper.returnUrl}}\\n      <start.Button\\n        @onClick={{this.gotoReturnUrl}}\\n        data-test-content-header-return-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"corner-left-round\\\" />\\n      </start.Button>\\n    {{/if}}\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\", {\"contents\":\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if this.showBackButton}}\\n      <start.Button\\n        @onClick={{this.gotoActiveContent}}\\n        data-test-content-header-back-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"tail-left\\\" />\\n      </start.Button>\\n    {{else}}\\n      <start.Button\\n        @onClick={{@onClose}}\\n        data-test-content-header-close-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"simple-remove\\\" />\\n      </start.Button>\\n    {{/if}}\\n\\n    <div\\n      class=\\\"default-page-header default-page-header--content flex flex-center flex-justify\\\"\\n    >\\n      {{#if this.contextHelper.inMission}}\\n        <span class=\\\"default-page-header-mission-title\\\">\\n          {{@activeMission.title}}\\n        </span>\\n      {{/if}}\\n      <span class=\\\"default-page-header-active-title\\\">\\n        {{@activeEntity.title}}\\n      </span>\\n    </div>\\n\\n    <start.Button\\n      @onClick={{set this \\\"shareModalOpen\\\" true}}\\n      class=\\\"header-base-combo-button-secondary-button header-base-combo-button-secondary-button--darker-in-xs header-base-combo-button-secondary-button--with-label\\\"\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"share\\\" />\\n      <button.Label>\\n        {{t \\\"components.shareMeta.menu.share\\\"}}\\n      </button.Label>\\n    </start.Button>\\n\\n    {{#if this.contextHelper.returnUrl}}\\n      <start.Button\\n        @onClick={{this.gotoReturnUrl}}\\n        data-test-content-header-return-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"corner-left-round\\\" />\\n      </start.Button>\\n    {{/if}}\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/header/content/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/content/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ContentHeader extends Component {\n  @service router;\n\n  @service contextHelper;\n\n  @tracked shareModalOpen = false;\n\n  get skipCoverPage() {\n    return (\n      this.args?.activeEntity?.type === 'contents' ||\n      (this.args?.activeEntity?.type === 'interactives' &&\n        this.args?.activeEntity?.childrenSum <= 1)\n    );\n  }\n\n  @action\n  gotoReturnUrl() {\n    return this.router.transitionTo(this.contextHelper.returnUrl);\n  }\n\n  get showBackButton() {\n    if (\n      this.contextHelper.inExercise &&\n      this.contextHelper.activeContent?.type === 'interactives' &&\n      this.contextHelper.activeContent?.childrenSum > 1\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  @action\n  gotoActiveContent() {\n    if (this.skipCoverPage) {\n      return;\n    }\n\n    const allowedTypes = ['interactives', 'materials'];\n\n    const type = this.contextHelper.activeContent?.type;\n    if (!allowedTypes.includes(type)) return;\n\n    if (this.router.currentRoute?.queryParams?.section) {\n      return this.router.transitionTo(\n        `master.${type}`,\n        this.contextHelper.activeContent.id,\n        {\n          queryParams: {\n            section: null,\n          },\n        }\n      );\n    }\n\n    return this.router.transitionTo(\n      `master.${type}`,\n      this.contextHelper.activeContent.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.course.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{this.openNavigationDrawer}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if (media \\\"md\\\")}}\\n      {{#if (gt this.session.user.courses.length 1)}}\\n        {{#let (generate-id) as |id|}}\\n          <start.ComboButton as |comboButton|>\\n            <comboButton.PrimaryButton\\n              @onClick={{fn this.handleCourseChange @activeCourse.id}}\\n              as |button|\\n            >\\n              <button.Label>\\n                {{@activeCourse.name}}\\n              </button.Label>\\n            </comboButton.PrimaryButton>\\n\\n            <comboButton.SecondaryButton\\n              id={{id}}\\n              @active={{this.isSwitchCoursePopupOpen}}\\n              @onClick={{set this \\\"isSwitchCoursePopupOpen\\\" true}}\\n              as |button|\\n            >\\n              <button.Icon\\n                class={{class\\n                  (if this.isSwitchCoursePopupOpen \\\"nc-icon-rotate-180\\\")\\n                }}\\n                @name=\\\"small-down\\\"\\n              />\\n            </comboButton.SecondaryButton>\\n          </start.ComboButton>\\n\\n          {{#if this.isSwitchCoursePopupOpen}}\\n            <Header::Course::SwitchCoursePopup\\n              @for={{id}}\\n              @courses={{this.session.user.courses}}\\n              @activeCourse={{@activeCourse}}\\n              @onClose={{set this \\\"isSwitchCoursePopupOpen\\\" false}}\\n              @onSelect={{this.handleCourseChange}}\\n            />\\n          {{/if}}\\n        {{/let}}\\n      {{else}}\\n        <start.Button\\n          @wide={{true}}\\n          @onClick={{fn this.handleCourseChange @activeCourse.id}}\\n          as |button|\\n        >\\n          <button.Label>\\n            {{@activeCourse.name}}\\n          </button.Label>\\n        </start.Button>\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n  </:start>\\n\\n  <:end as |end|>\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <div class=\\\"course-user-button-container\\\">\\n      <end.CourseUsersButton />\\n    </div>\\n\\n    <end.SupportButton />\\n\\n    <end.HelpButton />\\n\\n    <end.UserButton />\\n  </:end>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeProduct={{@activeProduct}}\\n    @activeCourse={{@activeCourse}}\\n    @inCourse={{true}}\\n    @onClose={{this.closeNavigationDrawer}}\\n  />\\n{{/if}}\", {\"contents\":\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.course.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{this.openNavigationDrawer}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if (media \\\"md\\\")}}\\n      {{#if (gt this.session.user.courses.length 1)}}\\n        {{#let (generate-id) as |id|}}\\n          <start.ComboButton as |comboButton|>\\n            <comboButton.PrimaryButton\\n              @onClick={{fn this.handleCourseChange @activeCourse.id}}\\n              as |button|\\n            >\\n              <button.Label>\\n                {{@activeCourse.name}}\\n              </button.Label>\\n            </comboButton.PrimaryButton>\\n\\n            <comboButton.SecondaryButton\\n              id={{id}}\\n              @active={{this.isSwitchCoursePopupOpen}}\\n              @onClick={{set this \\\"isSwitchCoursePopupOpen\\\" true}}\\n              as |button|\\n            >\\n              <button.Icon\\n                class={{class\\n                  (if this.isSwitchCoursePopupOpen \\\"nc-icon-rotate-180\\\")\\n                }}\\n                @name=\\\"small-down\\\"\\n              />\\n            </comboButton.SecondaryButton>\\n          </start.ComboButton>\\n\\n          {{#if this.isSwitchCoursePopupOpen}}\\n            <Header::Course::SwitchCoursePopup\\n              @for={{id}}\\n              @courses={{this.session.user.courses}}\\n              @activeCourse={{@activeCourse}}\\n              @onClose={{set this \\\"isSwitchCoursePopupOpen\\\" false}}\\n              @onSelect={{this.handleCourseChange}}\\n            />\\n          {{/if}}\\n        {{/let}}\\n      {{else}}\\n        <start.Button\\n          @wide={{true}}\\n          @onClick={{fn this.handleCourseChange @activeCourse.id}}\\n          as |button|\\n        >\\n          <button.Label>\\n            {{@activeCourse.name}}\\n          </button.Label>\\n        </start.Button>\\n      {{/if}}\\n    {{/if}}\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n  </:start>\\n\\n  <:end as |end|>\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <div class=\\\"course-user-button-container\\\">\\n      <end.CourseUsersButton />\\n    </div>\\n\\n    <end.SupportButton />\\n\\n    <end.HelpButton />\\n\\n    <end.UserButton />\\n  </:end>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeProduct={{@activeProduct}}\\n    @activeCourse={{@activeCourse}}\\n    @inCourse={{true}}\\n    @onClose={{this.closeNavigationDrawer}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/header/course/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/course/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\n\nexport default class CourseHeaderComponent extends Component {\n  @service router;\n  @service session;\n  @service helpList;\n\n  @tracked isNavigationDrawerOpen = false;\n  @tracked isMetaPopupOpen = false;\n  @tracked isSwitchCoursePopupOpen = false;\n\n  get breadcrumbEntities() {\n    const ancestors = this.args.activeEntity?.ancestors?.toArray() || [];\n\n    return [this.args.activeEntity, ...ancestors].filter(Boolean).reverse();\n  }\n\n  @action\n  handleCourseChange(courseId) {\n    const previousCourseId = this.args?.activeCourse?.id;\n\n    if (courseId !== previousCourseId) {\n      this.helpList.closeModal();\n      trackPageHeaderEvent(\n        'Byt grupp',\n        `från ${previousCourseId} till ${courseId}`\n      );\n    }\n    this.router.transitionTo('master.courses.show.index', courseId);\n  }\n\n  @action\n  openNavigationDrawer() {\n    this.isNavigationDrawerOpen = true;\n\n    trackPageHeaderEvent('Innehållsmeny - Öppna', 'grupp');\n  }\n\n  @action\n  closeNavigationDrawer(initiator) {\n    this.isNavigationDrawerOpen = false;\n\n    if (initiator !== 'navigation') {\n      trackPageHeaderEvent('Innehållsmeny - Stäng', 'grupp');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XPopup\\n  @for={{@for}}\\n  @minWidth={{240}}\\n  @alignment=\\\"start\\\"\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n  <div class=\\\"px1 pb1\\\">\\n    <div class=\\\"header-base-switch-course-popup-header position-sticky text-bold py1\\\">\\n      {{t \\\"components.header.course.switchCoursePopup.switchCourse\\\"}}\\n    </div>\\n\\n    <SelectList as |list|>\\n\\n      {{#each this.filteredAndSortedCourses as |course|}}\\n        <list.Item\\n          @selected={{eq @activeCourse.id course.id}}\\n          @onSelect={{fn @onSelect course.id}}\\n        >\\n          {{course.name}}\\n        </list.Item>\\n      {{/each}}\\n\\n    </SelectList>\\n  </div>\\n</XPopup>\", {\"contents\":\"<XPopup\\n  @for={{@for}}\\n  @minWidth={{240}}\\n  @alignment=\\\"start\\\"\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n  <div class=\\\"px1 pb1\\\">\\n    <div class=\\\"header-base-switch-course-popup-header position-sticky text-bold py1\\\">\\n      {{t \\\"components.header.course.switchCoursePopup.switchCourse\\\"}}\\n    </div>\\n\\n    <SelectList as |list|>\\n\\n      {{#each this.filteredAndSortedCourses as |course|}}\\n        <list.Item\\n          @selected={{eq @activeCourse.id course.id}}\\n          @onSelect={{fn @onSelect course.id}}\\n        >\\n          {{course.name}}\\n        </list.Item>\\n      {{/each}}\\n\\n    </SelectList>\\n  </div>\\n</XPopup>\",\"moduleName\":\"babel/components/header/course/switch-course-popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/course/switch-course-popup/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class CourseHeaderSwitchCoursePopup extends Component {\n  @cached\n  get coursesProxy() {\n    let promise = resolve();\n\n    if (this.args.courses?.length > 0) {\n      promise = all(\n        this.args.courses.map(async (course) => {\n          course = await resolve(course);\n          await resolve(course.allBooks);\n          return course;\n        })\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get courses() {\n    return this.coursesProxy.isResolved ? this.coursesProxy.value : null;\n  }\n\n  get filteredAndSortedCourses() {\n    return (this.courses || [])\n      .filter(\n        (course) => course?.allBooks?.length < 1 || course?.hasInternalBooks\n      )\n      .sort((courseA, courseB) => courseA?.name?.localeCompare(courseB?.name));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base @activeEntity={{@activeEntity}} ...attributes>\\n\\n  <:start as |start|>\\n\\n    <start.LogoLink />\\n\\n    <div class=\\\"default-page-header flex flex-center flex-justify\\\">\\n      <DcIcon class=\\\"nav-icon nr1\\\" @name=\\\"small-right\\\" />\\n\\n      {{@pageTitle}}\\n    </div>\\n\\n  </:start>\\n\\n  <:end as |end|>\\n\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <end.SupportButton />\\n\\n    <end.UserButton />\\n\\n  </:end>\\n</Header::Base>\", {\"contents\":\"<Header::Base @activeEntity={{@activeEntity}} ...attributes>\\n\\n  <:start as |start|>\\n\\n    <start.LogoLink />\\n\\n    <div class=\\\"default-page-header flex flex-center flex-justify\\\">\\n      <DcIcon class=\\\"nav-icon nr1\\\" @name=\\\"small-right\\\" />\\n\\n      {{@pageTitle}}\\n    </div>\\n\\n  </:start>\\n\\n  <:end as |end|>\\n\\n    <end.TeacherGuidanceButton @activeEntity={{@activeEntity}} />\\n\\n    <end.SupportButton />\\n\\n    <end.UserButton />\\n\\n  </:end>\\n</Header::Base>\",\"moduleName\":\"babel/components/header/default/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/default/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if @activeMission}}\\n      <start.ComboButton @reverse={{true}} as |combo|>\\n        <combo.PrimaryButton\\n          @onClick={{this.gotoMission}}\\n          @tooltip={{unless (media \\\"md\\\") @activeMission.title}}\\n          as |button|\\n        >\\n          {{#if (media \\\"md\\\")}}\\n            <button.Label>\\n              {{@activeMission.title}}\\n            </button.Label>\\n          {{else}}\\n            <button.Icon @name=\\\"structure\\\" />\\n          {{/if}}\\n        </combo.PrimaryButton>\\n        <combo.SecondaryButton\\n          @onClick={{@onClose}}\\n          data-test-content-header-close-button\\n          as |button|\\n        >\\n          <button.Icon @name=\\\"simple-remove\\\" />\\n        </combo.SecondaryButton>\\n      </start.ComboButton>\\n    {{else}}\\n      <start.Button\\n        @onClick={{@onClose}}\\n        data-test-content-header-close-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"simple-remove\\\" />\\n      </start.Button>\\n    {{/if}}\\n\\n    <start.ComboButton as |combo|>\\n      <combo.PrimaryButton as |button|>\\n        <button.Label>\\n          {{this.contextHelper.activeEntity.title}}\\n        </button.Label>\\n      </combo.PrimaryButton>\\n\\n      <combo.SecondaryButton\\n        @onClick={{set this \\\"shareModalOpen\\\" true}}\\n        class=\\\"header-base-combo-button-secondary-button--with-label\\\"\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"share\\\" />\\n        <button.Label>\\n          {{t \\\"components.shareMeta.menu.share\\\"}}\\n        </button.Label>\\n      </combo.SecondaryButton>\\n    </start.ComboButton>\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\\n\", {\"contents\":\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if @activeMission}}\\n      <start.ComboButton @reverse={{true}} as |combo|>\\n        <combo.PrimaryButton\\n          @onClick={{this.gotoMission}}\\n          @tooltip={{unless (media \\\"md\\\") @activeMission.title}}\\n          as |button|\\n        >\\n          {{#if (media \\\"md\\\")}}\\n            <button.Label>\\n              {{@activeMission.title}}\\n            </button.Label>\\n          {{else}}\\n            <button.Icon @name=\\\"structure\\\" />\\n          {{/if}}\\n        </combo.PrimaryButton>\\n        <combo.SecondaryButton\\n          @onClick={{@onClose}}\\n          data-test-content-header-close-button\\n          as |button|\\n        >\\n          <button.Icon @name=\\\"simple-remove\\\" />\\n        </combo.SecondaryButton>\\n      </start.ComboButton>\\n    {{else}}\\n      <start.Button\\n        @onClick={{@onClose}}\\n        data-test-content-header-close-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"simple-remove\\\" />\\n      </start.Button>\\n    {{/if}}\\n\\n    <start.ComboButton as |combo|>\\n      <combo.PrimaryButton as |button|>\\n        <button.Label>\\n          {{this.contextHelper.activeEntity.title}}\\n        </button.Label>\\n      </combo.PrimaryButton>\\n\\n      <combo.SecondaryButton\\n        @onClick={{set this \\\"shareModalOpen\\\" true}}\\n        class=\\\"header-base-combo-button-secondary-button--with-label\\\"\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"share\\\" />\\n        <button.Label>\\n          {{t \\\"components.shareMeta.menu.share\\\"}}\\n        </button.Label>\\n      </combo.SecondaryButton>\\n    </start.ComboButton>\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/header/diagnosis/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/diagnosis/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ContentHeader extends Component {\n  @service router;\n\n  @service contextHelper;\n\n  @tracked shareModalOpen = false;\n\n  @action\n  gotoMission() {\n    return this.router.transitionTo(\n      'master.missions',\n      this.args.activeMission.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-forbidden-elements }}\\n<script type=\\\"module\\\" src=\\\"{{this.accountWidgetUrl}}\\\"></script>\\n\\n{{#if this.contextHelper.inActiveDiagnosis}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inMission}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inContent}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inCourse}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inProduct}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inBook}}\\n  <Header::Book\\n    @activeBook={{this.contextHelper.activeBook}}\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n  />\\n{{else}}\\n  <Header::Default @pageTitle={{this.contextHelper.pageTitle}} />\\n{{/if}}\\n\", {\"contents\":\"{{! template-lint-disable no-forbidden-elements }}\\n<script type=\\\"module\\\" src=\\\"{{this.accountWidgetUrl}}\\\"></script>\\n\\n{{#if this.contextHelper.inActiveDiagnosis}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inMission}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inContent}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inCourse}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inProduct}}\\n  <Header::Content\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n    @activeCourse={{this.contextHelper.activeCourse}}\\n    @activeMission={{this.contextHelper.activeMission}}\\n    @activeExercise={{this.contextHelper.activeExercise}}\\n    @activeProduct={{this.contextHelper.activeProduct}}\\n    @returnUrl={{this.contextHelper.returnUrl}}\\n    @onClose={{this.closeContent}}\\n  />\\n{{else if this.contextHelper.inBook}}\\n  <Header::Book\\n    @activeBook={{this.contextHelper.activeBook}}\\n    @activeEntity={{this.contextHelper.activeEntity}}\\n  />\\n{{else}}\\n  <Header::Default @pageTitle={{this.contextHelper.pageTitle}} />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/header/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\nimport { resolve } from 'rsvp';\n\nexport default class Header extends Component {\n  @service router;\n\n  @service contextHelper;\n\n  @service diagnosis;\n\n  accountWidgetUrl = config.accountWidgetUrl;\n\n  @action\n  closeContent() {\n    if (this.contextHelper.inActiveDiagnosis) {\n      return this.diagnosis.done();\n    }\n\n    if (this.contextHelper.inMission) {\n      if (this.contextHelper.hasCloseUrl) {\n        if (\n          !config.redirectToVue &&\n          this.#isEmberRoute(this.contextHelper.closeUrl)\n        ) {\n          return this.router.transitionTo(this.contextHelper.closeUrl);\n        } else {\n          window.location = this.contextHelper.closeUrl;\n          return;\n        }\n      }\n\n      if (this.contextHelper.inCourse) {\n        return this.router.transitionTo(\n          'master.courses.show',\n          this.contextHelper.activeCourse.id\n        );\n      }\n    }\n\n    if (this.contextHelper.closeUrl) {\n      if (\n        !config.redirectToVue &&\n        this.#isEmberRoute(this.contextHelper.closeUrl)\n      ) {\n        return this.router.transitionTo(this.contextHelper.closeUrl);\n      } else {\n        window.location = this.contextHelper.closeUrl;\n        return;\n      }\n    }\n\n    if (this.contextHelper.inContent) {\n      return resolve(this.contextHelper.activeContent.parent).then((parent) => {\n        if (parent.type === 'areas') {\n          return this.router.transitionTo('master.areas', parent.id);\n        } else if (parent.type === 'books') {\n          return this.router.transitionTo('master.books', parent.id);\n        } else {\n          return this.router.transitionTo('master');\n        }\n      });\n    }\n\n    return this.router.transitionTo('master');\n  }\n\n  #isEmberRoute(url) {\n    const routeInfo = this.router.recognize(url);\n    return routeInfo && routeInfo.name !== 'url-resolve';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if this.showBackButton}}\\n      <start.Button\\n        @tooltip={{t \\\"components.header.mission.returnButtonTooltip\\\"}}\\n        @onClick={{this.gotoActiveContent}}\\n        data-test-mission-back-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"tail-left\\\" />\\n      </start.Button>\\n    {{else}}\\n      <start.ComboButton @reverse={{true}} as |comboButton|>\\n        <comboButton.PrimaryButton\\n          @onClick={{this.gotoMission}}\\n          @tooltip={{unless (media \\\"md\\\") @activeMission.title}}\\n          data-test-mission-start-page-link\\n          as |button|\\n        >\\n          {{#if (media \\\"md\\\")}}\\n            <button.Label>\\n              {{@activeMission.title}}\\n            </button.Label>\\n          {{else}}\\n            <button.Icon @name=\\\"structure\\\" />\\n          {{/if}}\\n        </comboButton.PrimaryButton>\\n\\n        <comboButton.SecondaryButton\\n          @tooltip={{t \\\"components.header.mission.leaveMission\\\"}}\\n          @onClick={{this.onClose}}\\n          data-test-mission-close-button\\n          as |button|\\n        >\\n          <button.Icon @name=\\\"simple-remove\\\" />\\n        </comboButton.SecondaryButton>\\n      </start.ComboButton>\\n    {{/if}}\\n\\n    <start.ComboButton as |comboButton|>\\n      {{#if (media \\\"md\\\")}}\\n        {{#if @activeEntity}}\\n          <comboButton.PrimaryButton\\n            @onClick={{this.gotoActiveContent}}\\n            @variant={{if this.skipCoverPage \\\"link\\\"}}\\n            @tooltip={{unless (media \\\"md\\\") @activeEntity.title}}\\n            as |button|\\n          >\\n            <button.Label>\\n              {{@activeEntity.title}}\\n            </button.Label>\\n          </comboButton.PrimaryButton>\\n        {{/if}}\\n      {{/if}}\\n\\n      <comboButton.SecondaryButton\\n        @onClick={{set this \\\"shareModalOpen\\\" true}}\\n        class=\\\"header-base-combo-button-secondary-button--with-label\\\"\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"share\\\" />\\n        <button.Label>\\n          {{t \\\"components.shareMeta.menu.share\\\"}}\\n        </button.Label>\\n      </comboButton.SecondaryButton>\\n    </start.ComboButton>\\n\\n    {{#if this.isReturnButtonVisible}}\\n      <start.Button\\n        @tooltip={{t \\\"components.header.mission.returnButtonTooltip\\\"}}\\n        @onClick={{this.handleReturnButtonClick}}\\n        data-test-content-header-return-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"corner-left-round\\\" />\\n      </start.Button>\\n    {{/if}}\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\\n\", {\"contents\":\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    {{#if this.showBackButton}}\\n      <start.Button\\n        @tooltip={{t \\\"components.header.mission.returnButtonTooltip\\\"}}\\n        @onClick={{this.gotoActiveContent}}\\n        data-test-mission-back-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"tail-left\\\" />\\n      </start.Button>\\n    {{else}}\\n      <start.ComboButton @reverse={{true}} as |comboButton|>\\n        <comboButton.PrimaryButton\\n          @onClick={{this.gotoMission}}\\n          @tooltip={{unless (media \\\"md\\\") @activeMission.title}}\\n          data-test-mission-start-page-link\\n          as |button|\\n        >\\n          {{#if (media \\\"md\\\")}}\\n            <button.Label>\\n              {{@activeMission.title}}\\n            </button.Label>\\n          {{else}}\\n            <button.Icon @name=\\\"structure\\\" />\\n          {{/if}}\\n        </comboButton.PrimaryButton>\\n\\n        <comboButton.SecondaryButton\\n          @tooltip={{t \\\"components.header.mission.leaveMission\\\"}}\\n          @onClick={{this.onClose}}\\n          data-test-mission-close-button\\n          as |button|\\n        >\\n          <button.Icon @name=\\\"simple-remove\\\" />\\n        </comboButton.SecondaryButton>\\n      </start.ComboButton>\\n    {{/if}}\\n\\n    <start.ComboButton as |comboButton|>\\n      {{#if (media \\\"md\\\")}}\\n        {{#if @activeEntity}}\\n          <comboButton.PrimaryButton\\n            @onClick={{this.gotoActiveContent}}\\n            @variant={{if this.skipCoverPage \\\"link\\\"}}\\n            @tooltip={{unless (media \\\"md\\\") @activeEntity.title}}\\n            as |button|\\n          >\\n            <button.Label>\\n              {{@activeEntity.title}}\\n            </button.Label>\\n          </comboButton.PrimaryButton>\\n        {{/if}}\\n      {{/if}}\\n\\n      <comboButton.SecondaryButton\\n        @onClick={{set this \\\"shareModalOpen\\\" true}}\\n        class=\\\"header-base-combo-button-secondary-button--with-label\\\"\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"share\\\" />\\n        <button.Label>\\n          {{t \\\"components.shareMeta.menu.share\\\"}}\\n        </button.Label>\\n      </comboButton.SecondaryButton>\\n    </start.ComboButton>\\n\\n    {{#if this.isReturnButtonVisible}}\\n      <start.Button\\n        @tooltip={{t \\\"components.header.mission.returnButtonTooltip\\\"}}\\n        @onClick={{this.handleReturnButtonClick}}\\n        data-test-content-header-return-button\\n        as |button|\\n      >\\n        <button.Icon @name=\\\"corner-left-round\\\" />\\n      </start.Button>\\n    {{/if}}\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@activeEntity}}\\n    @title={{@activeEntity.title}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/header/mission/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/mission/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackMissionEvent } from 'babel/utils/matomo-events';\n\nexport default class MissionHeaderComponent extends Component {\n  @service contextHelper;\n\n  @service router;\n\n  @service entityInspector;\n\n  @tracked shareModalOpen = false;\n\n  get skipCoverPage() {\n    return (\n      this.args?.activeEntity?.type === 'contents' ||\n      (this.args?.activeEntity?.type === 'interactives' &&\n        this.args?.activeEntity?.childrenSum <= 1)\n    );\n  }\n\n  get isReturnButtonVisible() {\n    const isButtonVisible = !!this.args.returnUrl;\n    if (isButtonVisible) {\n      trackMissionEvent('Bakåtpil - Visas');\n    }\n    return isButtonVisible;\n  }\n\n  @action\n  handleReturnButtonClick() {\n    trackMissionEvent('Bakåtpil - Klick');\n    return this.goto(this.args.returnUrl);\n  }\n\n  @action\n  goto(url) {\n    return this.router.transitionTo(url);\n  }\n\n  @action\n  gotoMission() {\n    return this.router.transitionTo(\n      'master.missions',\n      this.args.activeMission.id\n    );\n  }\n\n  @action\n  gotoActiveContent() {\n    if (this.skipCoverPage) {\n      return;\n    }\n\n    const allowedTypes = ['interactives', 'materials'];\n\n    const type = this.contextHelper.activeContent?.type;\n    if (!allowedTypes.includes(type)) return;\n\n    if (this.router.currentRoute?.queryParams?.section) {\n      return this.router.transitionTo(\n        `master.${type}`,\n        this.contextHelper.activeContent.id,\n        {\n          queryParams: {\n            section: null,\n          },\n        }\n      );\n    }\n\n    return this.router.transitionTo(\n      `master.${type}`,\n      this.contextHelper.activeContent.id\n    );\n  }\n\n  @action\n  onClose() {\n    if (this.entityInspector.modalIsOpen) {\n      this.entityInspector.closeModal();\n    }\n    this.args?.onClose();\n  }\n\n  get showBackButton() {\n    if (\n      this.contextHelper.inExercise &&\n      this.contextHelper.activeContent?.type === 'interactives' &&\n      this.contextHelper.activeContent?.childrenSum > 1\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.product.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{this.openNavigationDrawer}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeProduct={{@activeProduct}}\\n    @activeCourse={{@activeCourse}}\\n    @inCourse={{false}}\\n    @onClose={{this.closeNavigationDrawer}}\\n  />\\n{{/if}}\", {\"contents\":\"<Header::Base ...attributes>\\n  <:start as |start|>\\n    <start.LogoLink />\\n\\n    <start.Button\\n      @tooltip={{t \\\"components.header.product.search\\\"}}\\n      @active={{this.isNavigationDrawerOpen}}\\n      @onClick={{this.openNavigationDrawer}}\\n      as |button|\\n    >\\n      <button.Icon @name=\\\"search-menu\\\" />\\n    </start.Button>\\n\\n    {{#if this.breadcrumbEntities.length}}\\n      <start.EntityBreadcrumb\\n        class=\\\"nx1 hide-sm\\\"\\n        @entities={{this.breadcrumbEntities}}\\n      />\\n    {{/if}}\\n\\n    <start.MetaButton />\\n  </:start>\\n</Header::Base>\\n\\n{{#if this.isNavigationDrawerOpen}}\\n  <Header::Base::NavigationDrawer\\n    @activeProduct={{@activeProduct}}\\n    @activeCourse={{@activeCourse}}\\n    @inCourse={{false}}\\n    @onClose={{this.closeNavigationDrawer}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/header/product/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/header/product/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\n\nexport default class ProductHeader extends Component {\n  @tracked isNavigationDrawerOpen = false;\n\n  get breadcrumbEntities() {\n    const ancestors = this.args.activeEntity?.ancestors?.toArray() || [];\n\n    return [\n      this.args.activeEntity,\n      ...ancestors,\n      this.args.activeProduct?.hasProductPage ? this.args.activeProduct : null,\n    ]\n      .filter(Boolean)\n      .reverse();\n  }\n\n  @action\n  openNavigationDrawer() {\n    this.isNavigationDrawerOpen = true;\n\n    trackPageHeaderEvent('Innehållsmeny - Öppna', 'produkt');\n  }\n\n  @action\n  closeNavigationDrawer(initiator) {\n    this.isNavigationDrawerOpen = false;\n\n    if (initiator !== 'navigation') {\n      trackPageHeaderEvent('Innehållsmeny - Stäng', 'produkt');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div {{did-insert this.helpListActiveStatus}} ...attributes>\\n  <div class=\\\"help-list\\\">\\n    <div class=\\\"help-list-header text-ui\\\">\\n      {{t \\\"components.helpList.title\\\"}}\\n      <UiButton\\n        class=\\\"help-list-close-button\\\"\\n        @appearance=\\\"none\\\"\\n        @onClick={{this.helpList.closeModal}}\\n      >\\n        <DcIcon @name=\\\"simple-remove\\\" @size=\\\"small\\\" />\\n      </UiButton>\\n    </div>\\n    <div class=\\\"help-list-content\\\">\\n      {{#if this.helpListActive}}\\n        {{#if (gt this.helpListStudents.length 0)}}\\n          {{#each this.helpListStudents as |student index|}}\\n            <div class=\\\"help-list-user flex flex-center\\\">\\n              <span class=\\\"text-bold\\\">\\n                {{increment index}}.\\n              </span>\\n              <UserAvatarAndName class=\\\"nl1\\\" @user={{student}} />\\n              <UiButton\\n                class=\\\"help-list-checkmark\\\"\\n                @onClick={{fn this.helpDone student}}\\n                @appearance=\\\"link\\\"\\n              >\\n                <DcIcon @name=\\\"check\\\" @size=\\\"xs\\\" />\\n              </UiButton>\\n            </div>\\n          {{/each}}\\n        {{else}}\\n          <p class=\\\"text-ui m0\\\">\\n            {{t \\\"components.helpList.empty\\\"}}\\n          </p>\\n          <p class=\\\"text-muted text-small m0\\\">\\n            {{t \\\"components.helpList.active\\\"}}\\n          </p>\\n        {{/if}}\\n      {{else}}\\n        <p class=\\\"text-ui m0\\\">\\n          {{t \\\"components.helpList.descriptionInactiveTitle\\\"}}\\n        </p>\\n        <p class=\\\"m0\\\">\\n          {{t \\\"components.helpList.description\\\"}}\\n        </p>\\n        <p class=\\\"text-muted text-small m0 flex\\\">\\n          {{t \\\"components.helpList.info\\\"}}\\n          <div class=\\\"help-list-example\\\">\\n            <DcIcon @name=\\\"hand\\\" @size=\\\"large\\\" />\\n          </div>\\n        </p>\\n      {{/if}}\\n    </div>\\n    <div class=\\\"help-list-footer\\\">\\n      {{#if this.helpListActive}}\\n        <UiButton\\n          @variant=\\\"error\\\"\\n          class=\\\"help-list-button\\\"\\n          @onClick={{this.deactivateHelpList}}\\n        >\\n          {{t \\\"components.helpList.deactivate\\\"}}\\n        </UiButton>\\n      {{else}}\\n        <UiButton class=\\\"help-list-button\\\" @onClick={{this.activateHelpList}}>\\n          {{t \\\"components.helpList.activate\\\"}}\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div {{did-insert this.helpListActiveStatus}} ...attributes>\\n  <div class=\\\"help-list\\\">\\n    <div class=\\\"help-list-header text-ui\\\">\\n      {{t \\\"components.helpList.title\\\"}}\\n      <UiButton\\n        class=\\\"help-list-close-button\\\"\\n        @appearance=\\\"none\\\"\\n        @onClick={{this.helpList.closeModal}}\\n      >\\n        <DcIcon @name=\\\"simple-remove\\\" @size=\\\"small\\\" />\\n      </UiButton>\\n    </div>\\n    <div class=\\\"help-list-content\\\">\\n      {{#if this.helpListActive}}\\n        {{#if (gt this.helpListStudents.length 0)}}\\n          {{#each this.helpListStudents as |student index|}}\\n            <div class=\\\"help-list-user flex flex-center\\\">\\n              <span class=\\\"text-bold\\\">\\n                {{increment index}}.\\n              </span>\\n              <UserAvatarAndName class=\\\"nl1\\\" @user={{student}} />\\n              <UiButton\\n                class=\\\"help-list-checkmark\\\"\\n                @onClick={{fn this.helpDone student}}\\n                @appearance=\\\"link\\\"\\n              >\\n                <DcIcon @name=\\\"check\\\" @size=\\\"xs\\\" />\\n              </UiButton>\\n            </div>\\n          {{/each}}\\n        {{else}}\\n          <p class=\\\"text-ui m0\\\">\\n            {{t \\\"components.helpList.empty\\\"}}\\n          </p>\\n          <p class=\\\"text-muted text-small m0\\\">\\n            {{t \\\"components.helpList.active\\\"}}\\n          </p>\\n        {{/if}}\\n      {{else}}\\n        <p class=\\\"text-ui m0\\\">\\n          {{t \\\"components.helpList.descriptionInactiveTitle\\\"}}\\n        </p>\\n        <p class=\\\"m0\\\">\\n          {{t \\\"components.helpList.description\\\"}}\\n        </p>\\n        <p class=\\\"text-muted text-small m0 flex\\\">\\n          {{t \\\"components.helpList.info\\\"}}\\n          <div class=\\\"help-list-example\\\">\\n            <DcIcon @name=\\\"hand\\\" @size=\\\"large\\\" />\\n          </div>\\n        </p>\\n      {{/if}}\\n    </div>\\n    <div class=\\\"help-list-footer\\\">\\n      {{#if this.helpListActive}}\\n        <UiButton\\n          @variant=\\\"error\\\"\\n          class=\\\"help-list-button\\\"\\n          @onClick={{this.deactivateHelpList}}\\n        >\\n          {{t \\\"components.helpList.deactivate\\\"}}\\n        </UiButton>\\n      {{else}}\\n        <UiButton class=\\\"help-list-button\\\" @onClick={{this.activateHelpList}}>\\n          {{t \\\"components.helpList.activate\\\"}}\\n        </UiButton>\\n      {{/if}}\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/help-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/help-list/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class HelpListComponent extends Component {\n  /**\n   * Arguments:\n   * course (object)\n   */\n  @service helpList;\n\n  @tracked helpListActive = false;\n\n  @tracked currentHelpList;\n\n  @action\n  async helpListActiveStatus() {\n    this.currentHelpList = this.helpList.activeHelpList;\n\n    if (this.currentHelpList) {\n      this.helpListActive = true;\n    } else {\n      this.helpListActive = false;\n    }\n  }\n\n  @cached\n  get helpListStudentsProxy() {\n    const students = resolve(this.helpList.activeHelpList?.users);\n\n    return load(students, this);\n  }\n\n  get helpListStudents() {\n    if (this.helpListStudentsProxy.isResolved) {\n      return this.helpListStudentsProxy.value;\n    }\n\n    // Prevent helplist from flickering when updating\n    if (this.currentHelpList) {\n      return this.currentHelpList.users;\n    }\n\n    return [];\n  }\n\n  @action\n  openLicenseModal(product, user) {\n    this.activeProduct = product;\n    this.activeUser = user;\n    this.licenseModalOpen = true;\n  }\n\n  @action\n  async activateHelpList() {\n    await this.helpList.activateHelpList();\n    await this.helpListActiveStatus();\n  }\n\n  @action\n  async deactivateHelpList() {\n    await this.helpList.deactivateHelpList(this.currentHelpList);\n    await this.helpListActiveStatus();\n  }\n\n  @action\n  helpDone(student) {\n    this.helpList.lowerHand(student);\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class ImageCard extends Component {\n  /**\n   * Arguments:\n   * image (string)\n   * title (string)\n   * icon (string)\n   * materialType (string)\n   * index (string)\n   * searchValue (string)\n   * backgroundColor (string)\n   * imageSize (string)\n   */\n\n  get icon() {\n    if (this.args.materialType === 'links') {\n      return 'external';\n    } else if (this.args.materialType === 'attachments') {\n      return 'cloud-download';\n    } else {\n      return this.args.icon;\n    }\n  }\n  get searchArr() {\n    if (this.args.searchValue) {\n      return this.args.searchValue.split(' ');\n    } else {\n      return null;\n    }\n  }\n\n  get backgroundColor() {\n    return this.args.backgroundColor ?? 'var(--background-shade)';\n  }\n\n  get boxClasses() {\n    const classes = ['image-card-box'];\n\n    if (this.args.imageSize === 'contain') {\n      classes.push('image-card-box--contain');\n    }\n\n    return classes.join(' ');\n  }\n\n  @action setContainerElementBackground(elem) {\n    elem.style.backgroundColor = this.backgroundColor;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"image-card\\\" ...attributes>\\n  <div\\n    class=\\\"image-card-container\\\"\\n    {{did-insert this.setContainerElementBackground}}\\n  >\\n    <div class={{this.boxClasses}}>\\n      <div class=\\\"image-card-image\\\">\\n        <XImage\\n          @source={{@image}}\\n          @width=\\\"640\\\"\\n          @height=\\\"480\\\"\\n          @color={{this.backgroundColor}}\\n          class=\\\"image-card-img\\\"\\n        />\\n\\n        {{#if @index}}\\n          <div class=\\\"image-card-index-wrapper\\\">\\n            <div class=\\\"image-card-index\\\">{{@index}}</div>\\n          </div>\\n        {{/if}}\\n      </div>\\n    </div>\\n  </div>\\n\\n  {{#if @title}}\\n    <div class=\\\"p1\\\">\\n      <div class=\\\"image-card-title text-quarternary\\\">\\n        {{#if this.searchArr}}\\n          <span {{highlight-terms this.searchArr}}>{{@title}}</span>\\n        {{else}}\\n          {{@title}}\\n        {{/if}}\\n\\n        {{#if this.icon}}\\n          <DcIcon @name={{this.icon}} class=\\\"image-card-title-icon nl1\\\" />\\n        {{/if}}\\n      </div>\\n\\n      {{yield to=\\\"subtitle\\\"}}\\n    </div>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/image-card/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class IndexCircleComponent extends Component {\n  /**\n   * Arguments:\n   * content (String)\n   */\n\n  /**\n   * Styles:\n   * Grey\n   * Default\n   */\n\n  get className() {\n    if (this.args.style === 'grey') {\n      return 'index-circle-grey';\n    } else {\n      return 'index-circle-default';\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"item-index-circle flex flex-center justify-center {{this.className}}\\\"\\n>{{@content}}</div>', { moduleName: 'babel/components/index-circle/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XInteractiveImage\\n  ...attributes\\n  @source={{this.source}}\\n  @behavior={{this.behavior}}\\n  @aspectRatio={{this.aspectRatio}}\\n  @invisibleMarkers={{this.invisibleMarkers}}\\n  @legends={{this.legends}}\\n  @copyright={{this.copyright}}\\n  @zoomLayers={{this.zoomLayers}}\\n  @stepLayers={{this.stepLayers}}\\n  @markers={{this.markers}}\\n  @materials={{@material.materials}}\\n  @copyrightedMaterials={{@material.copyrightedMaterials}}\\n  @onLoadMarkerMaterial={{this.onLoadMaterial}}\\n  @onSelectMarker={{this.handleInteractiveImageSelectMarker}}\\n  @onHideMarkerTip={{this.handleHideMarkerTip}}\\n  @onHideZoomTip={{this.handleHideZoomTip}}\\n  @onHideStepTip={{this.handleHideStepTip}}\\n  @showZoomTip={{this.showZoomTip}}\\n  @showStepTip={{this.showStepTip}}\\n  @showMarkerTip={{this.showMarkerTip}}\\n  @onMarkerClick={{this.onMarkerClick}}\\n/>\\n\\n{{#if this.marker}}\\n\\n  <MaterialViewer\\n    @material={{this.meta.material}}\\n    @for={{this.meta.id}}\\n    @behavior={{this.markerBehavior}}\\n    @onClose={{this.handleMaterialViewerClose}}\\n  />\\n\\n{{/if}}\", {\"contents\":\"<XInteractiveImage\\n  ...attributes\\n  @source={{this.source}}\\n  @behavior={{this.behavior}}\\n  @aspectRatio={{this.aspectRatio}}\\n  @invisibleMarkers={{this.invisibleMarkers}}\\n  @legends={{this.legends}}\\n  @copyright={{this.copyright}}\\n  @zoomLayers={{this.zoomLayers}}\\n  @stepLayers={{this.stepLayers}}\\n  @markers={{this.markers}}\\n  @materials={{@material.materials}}\\n  @copyrightedMaterials={{@material.copyrightedMaterials}}\\n  @onLoadMarkerMaterial={{this.onLoadMaterial}}\\n  @onSelectMarker={{this.handleInteractiveImageSelectMarker}}\\n  @onHideMarkerTip={{this.handleHideMarkerTip}}\\n  @onHideZoomTip={{this.handleHideZoomTip}}\\n  @onHideStepTip={{this.handleHideStepTip}}\\n  @showZoomTip={{this.showZoomTip}}\\n  @showStepTip={{this.showStepTip}}\\n  @showMarkerTip={{this.showMarkerTip}}\\n  @onMarkerClick={{this.onMarkerClick}}\\n/>\\n\\n{{#if this.marker}}\\n\\n  <MaterialViewer\\n    @material={{this.meta.material}}\\n    @for={{this.meta.id}}\\n    @behavior={{this.markerBehavior}}\\n    @onClose={{this.handleMaterialViewerClose}}\\n  />\\n\\n{{/if}}\",\"moduleName\":\"babel/components/interactive-image-wrapper/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactive-image-wrapper/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport loadDataFromStore from 'babel/utils/load-data-from-store';\nimport arg from 'compton/utils/arg';\nimport { camelizeKeys } from 'compton/utils/object';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class InteractiveImageWrapper extends Component {\n  @storageFor('interactive-image') interactiveImageStore;\n\n  @service store;\n\n  @service speaker;\n\n  // ARGS\n\n  @arg material;\n\n  @arg fullscreen = false;\n\n  // PROPERTIES\n\n  @tracked marker = null;\n\n  @tracked meta = null;\n\n  @tracked hasMaterialPreview = false;\n\n  get source() {\n    if (this.material.meta?.properties?.svg) {\n      return this.material.meta.svg_url;\n    }\n\n    return this.material.meta.attachment_url;\n  }\n\n  get behavior() {\n    return this.material.metadata.behavior;\n  }\n\n  get aspectRatio() {\n    const { image_width, image_height } = this.material.meta;\n\n    if (image_width != null && image_height != null) {\n      return (image_height / image_width) * 100;\n    }\n\n    return null;\n  }\n\n  get invisibleMarkers() {\n    return this.material.metadata.invisible_markers;\n  }\n\n  get legends() {\n    return camelizeKeys(this.material.metadata.legends);\n  }\n\n  get copyright() {\n    return this.material.metadata.copyright;\n  }\n\n  get zoomLayers() {\n    return camelizeKeys(this.material.metadata.zoom_layers);\n  }\n\n  get stepLayers() {\n    return camelizeKeys(this.material.metadata.step_layers);\n  }\n\n  get markers() {\n    return camelizeKeys(this.material.metadata.markers);\n  }\n\n  get markerBehavior() {\n    if (['articles', 'images'].includes(this.meta.material.type)) {\n      return this.marker.behavior;\n    }\n    return 'modal';\n  }\n\n  get showZoomTip() {\n    return this.interactiveImageStore.get('showZoomTip');\n  }\n\n  get showStepTip() {\n    return this.interactiveImageStore.get('showStepTip');\n  }\n\n  get showMarkerTip() {\n    return this.interactiveImageStore.get('showMarkerTip');\n  }\n\n  // ACTIONS\n\n  @action\n  handleHideMarkerTip() {\n    this.interactiveImageStore.set('showMarkerTip', false);\n  }\n\n  @action\n  handleHideZoomTip() {\n    this.interactiveImageStore.set('showZoomTip', false);\n  }\n\n  @action\n  handleHideStepTip() {\n    this.interactiveImageStore.set('showStepTip', false);\n  }\n\n  @action\n  handleInteractiveImageSelectMarker(marker, meta) {\n    this.marker = marker;\n    this.meta = meta;\n  }\n\n  @action\n  handleMaterialViewerClose() {\n    this.meta.callback?.();\n\n    this.marker = null;\n    this.meta = null;\n  }\n\n  @action\n  onLoadMaterial(id) {\n    return loadDataFromStore('material', id, this.store);\n  }\n\n  @action\n  onMarkerClick(marker) {\n    if (marker.hasPlayback) {\n      this.speaker.pauseOther();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<UiLink\\n  class=\\\"interactives-collection-item\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n\\n      <div class=\\\"interactives-collection-item-subtitle\\\">\\n        {{t\\n          \\\"components.interactives.collectionItem.carousel.numExercises\\\"\\n          count=@exercises.length\\n        }}\\n      </div>\\n    </div>\\n\\n    {{#if this.showBagde}}\\n      <div class=\\\"flex-shrink mx1\\\">\\n        <XBadge @size=\\\"small\\\" @variant={{this.badgeVariant}}>\\n          {{t\\n            \\\"components.interactives.collectionItem.carousel.result\\\"\\n            score=@interactive.score\\n            scoreMax=@interactive.numExercises\\n          }}\\n        </XBadge>\\n      </div>\\n    {{/if}}\\n\\n    {{#if this.canContinue}}\\n      <UiButton @onClick={{this.handleOpenCollection}}>\\n        {{t \\\"components.interactives.collectionItem.carousel.continue\\\"}}\\n      </UiButton>\\n    {{/if}}\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\", {\"contents\":\"<UiLink\\n  class=\\\"interactives-collection-item\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n\\n      <div class=\\\"interactives-collection-item-subtitle\\\">\\n        {{t\\n          \\\"components.interactives.collectionItem.carousel.numExercises\\\"\\n          count=@exercises.length\\n        }}\\n      </div>\\n    </div>\\n\\n    {{#if this.showBagde}}\\n      <div class=\\\"flex-shrink mx1\\\">\\n        <XBadge @size=\\\"small\\\" @variant={{this.badgeVariant}}>\\n          {{t\\n            \\\"components.interactives.collectionItem.carousel.result\\\"\\n            score=@interactive.score\\n            scoreMax=@interactive.numExercises\\n          }}\\n        </XBadge>\\n      </div>\\n    {{/if}}\\n\\n    {{#if this.canContinue}}\\n      <UiButton @onClick={{this.handleOpenCollection}}>\\n        {{t \\\"components.interactives.collectionItem.carousel.continue\\\"}}\\n      </UiButton>\\n    {{/if}}\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\",\"moduleName\":\"babel/components/interactives/collection-item/carousel/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/collection-item/carousel/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class InteractivesCollectionItemCarousel extends Component {\n  /**\n   * Arguments:\n   * collection (object)\n   * exercises (array)\n   * interactive (object)\n   * answers (array)\n   * onOpenCollection (function)\n   */\n\n  get showBagde() {\n    return this.args.interactive?.ended;\n  }\n\n  get canContinue() {\n    return (\n      this.args.interactive?.isStarted && !this.args.interactive?.isCompleted\n    );\n  }\n\n  get badgeVariant() {\n    return this.args.interactive?.score === this.args.interactive?.numExercises\n      ? 'success'\n      : 'error';\n  }\n\n  @action\n  async handleOpenCollection(e) {\n    e?.preventDefault();\n\n    return this.args.onOpenCollection(this.args.interactive.currentExercise);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<UiLink\\n  class=\\\"interactives-collection-item interactives-collection-item-diagnosis\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n\\n      <div class=\\\"interactives-collection-item-subtitle\\\">\\n        {{t\\n          \\\"components.interactives.collectionItem.diagnosis.diagnosisInfo\\\"\\n          count=@exercises.length\\n          time=@collection.timeAllowed\\n          attempts=this.attemptsLeft\\n        }}\\n      </div>\\n    </div>\\n\\n    {{#if this.canContinue}}\\n      <UiButton @onClick={{this.handleOpenCollection}}>\\n        {{t \\\"components.interactives.collectionItem.diagnosis.continue\\\"}}\\n      </UiButton>\\n    {{else if this.showLatestResult}}\\n      <div class=\\\"flex-shrink ml1\\\">\\n        <XBadge @size=\\\"small\\\" @variant={{this.badgeVariant}}>\\n          {{t\\n            \\\"components.interactives.collectionItem.diagnosis.result\\\"\\n            score=this.score\\n            scoreMax=@exercises.length\\n          }}\\n        </XBadge>\\n      </div>\\n    {{/if}}\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\", {\"contents\":\"<UiLink\\n  class=\\\"interactives-collection-item interactives-collection-item-diagnosis\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n\\n      <div class=\\\"interactives-collection-item-subtitle\\\">\\n        {{t\\n          \\\"components.interactives.collectionItem.diagnosis.diagnosisInfo\\\"\\n          count=@exercises.length\\n          time=@collection.timeAllowed\\n          attempts=this.attemptsLeft\\n        }}\\n      </div>\\n    </div>\\n\\n    {{#if this.canContinue}}\\n      <UiButton @onClick={{this.handleOpenCollection}}>\\n        {{t \\\"components.interactives.collectionItem.diagnosis.continue\\\"}}\\n      </UiButton>\\n    {{else if this.showLatestResult}}\\n      <div class=\\\"flex-shrink ml1\\\">\\n        <XBadge @size=\\\"small\\\" @variant={{this.badgeVariant}}>\\n          {{t\\n            \\\"components.interactives.collectionItem.diagnosis.result\\\"\\n            score=this.score\\n            scoreMax=@exercises.length\\n          }}\\n        </XBadge>\\n      </div>\\n    {{/if}}\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\",\"moduleName\":\"babel/components/interactives/collection-item/diagnosis/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/collection-item/diagnosis/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { getNumCorrectAnswers } from 'babel/utils/assignments';\n\nexport default class InteractivesCollectionItemDiagnosis extends Component {\n  @service router;\n\n  get canContinue() {\n    return this.args.interactive?.isActive;\n  }\n\n  get showLatestResult() {\n    return this.args.interactive ? true : false;\n  }\n\n  get score() {\n    return getNumCorrectAnswers(this.args.answers);\n  }\n\n  get attemptsLeft() {\n    const latestAttempt = this.args.interactive?.attempt || 0;\n\n    return Math.max(this.args.collection.allowedAttempts - latestAttempt, 0);\n  }\n\n  get badgeVariant() {\n    return this.score >= this.args.collection?.pointsRequired\n      ? 'success'\n      : 'error';\n  }\n\n  @action\n  handleOpenCollection(e) {\n    e?.preventDefault();\n    e?.stopPropagation();\n    e?.stopImmediatePropagation();\n\n    return this.router.transitionTo(\n      'master.interactives.diagnoses.index',\n      this.args.collection.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @collection.isDiagnosis}}\\n  <Interactives::CollectionItem::Diagnosis\\n    @collection={{@collection}}\\n    @exercises={{this.exercises}}\\n    @interactive={{this.interactive}}\\n    @answers={{this.answers}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{else if @collection.isCarousel}}\\n  <Interactives::CollectionItem::Carousel\\n    @collection={{@collection}}\\n    @exercises={{this.exercises}}\\n    @interactive={{this.interactive}}\\n    @answers={{this.answers}}\\n    @onOpenCollection={{this.handleOpenCollection}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{else}}\\n  <Interactives::CollectionItem::Standard\\n    @collection={{@collection}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{/if}}\\n\", {\"contents\":\"{{#if @collection.isDiagnosis}}\\n  <Interactives::CollectionItem::Diagnosis\\n    @collection={{@collection}}\\n    @exercises={{this.exercises}}\\n    @interactive={{this.interactive}}\\n    @answers={{this.answers}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{else if @collection.isCarousel}}\\n  <Interactives::CollectionItem::Carousel\\n    @collection={{@collection}}\\n    @exercises={{this.exercises}}\\n    @interactive={{this.interactive}}\\n    @answers={{this.answers}}\\n    @onOpenCollection={{this.handleOpenCollection}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{else}}\\n  <Interactives::CollectionItem::Standard\\n    @collection={{@collection}}\\n    @hasImageTemplate={{this.hasImageTemplate}}\\n  />\\n{{/if}}\\n\",\"moduleName\":\"babel/components/interactives/collection-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/collection-item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class InteractivesCollectionItem extends Component {\n  @service router;\n\n  @service assignmentEvents;\n\n  @service missionMode;\n\n  @tracked collection = this.args.collection;\n\n  @cached\n  get interactiveProxy() {\n    const promise = this.assignmentEvents.getOrCreateInteractiveForCollection(\n      this.collection\n    );\n\n    return load(promise, this);\n  }\n\n  get hasImageTemplate() {\n    return this.args.interactive.template.includes('with_images');\n  }\n\n  get interactive() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.interactive\n      : null;\n  }\n\n  get currentExercise() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeExercise\n      : null;\n  }\n\n  get answers() {\n    return this.interactive?.answers || [];\n  }\n\n  @cached\n  get exercisesProxy() {\n    const promise = resolve(this.collection?.children)\n      .then((children) => this.missionMode.allowedEntities(children))\n      .then((exercises) => {\n        if (this.collection?.isTeacherCollection) {\n          exercises = exercises.sortBy('title');\n        }\n\n        return exercises;\n      });\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : [];\n  }\n\n  @action\n  handleOpenCollection(exercise) {\n    return this.router.transitionTo(\n      'master.contents.assignments.show',\n      exercise.id\n    );\n  }\n\n  @action\n  resetCollection() {\n    this.collection = this.args.collection;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<UiLink\\n  class=\\\"interactives-collection-item\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n    </div>\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\", {\"contents\":\"<UiLink\\n  class=\\\"interactives-collection-item\\\"\\n  @route=\\\"nodes\\\"\\n  @model={{@collection}}\\n  ...attributes\\n>\\n  {{#if @hasImageTemplate}}\\n    <Interactives::CollectionItem::Thumbnail\\n      @imageUrl={{@collection.image.imageUrl}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"flex flex-center flex-one {{if @hasImageTemplate 'p1' 'p2'}}\\\">\\n    <EntityProgress @model={{@collection}} class=\\\"flex-shrink mr1\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      {{@collection.title}}\\n    </div>\\n\\n    <CollectionOptions\\n      @collection={{@collection}}\\n      class=\\\"flex-shrink ml1 nr1\\\"\\n    />\\n  </div>\\n</UiLink>\",\"moduleName\":\"babel/components/interactives/collection-item/standard/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/collection-item/standard/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"interactives-collection-item-thumbnail\\\">\\n  <XImage class=\\\"interactives-collection-item-image\\\" @source={{this.imageURL}} />\\n</div>\", {\"contents\":\"<div class=\\\"interactives-collection-item-thumbnail\\\">\\n  <XImage class=\\\"interactives-collection-item-image\\\" @source={{this.imageURL}} />\\n</div>\",\"moduleName\":\"babel/components/interactives/collection-item/thumbnail/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/collection-item/thumbnail/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class InteractivesOneColumnWithImageThumbnail extends Component {\n  get imageURL() {\n    if (this.args.imageUrl) {\n      return `${this.args.imageUrl}&w=240`;\n    }\n\n    return '/assets/images/defaults/image-missing.svg';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"interactives-cover-image-wrapper\\\">\\n  <div class=\\\"interactives-cover-image\\\" style={{this.styleString}}></div>\\n</div>\", {\"contents\":\"<div class=\\\"interactives-cover-image-wrapper\\\">\\n  <div class=\\\"interactives-cover-image\\\" style={{this.styleString}}></div>\\n</div>\",\"moduleName\":\"babel/components/interactives/cover-image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/cover-image/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class InteractivesCoverImage extends Component {\n  get styleString() {\n    const image = this.args.image;\n    const focusPoint = image?.metadata?.focus_point;\n    if (focusPoint) {\n      const x = parseInt(focusPoint.x);\n      const y = parseInt(focusPoint.y);\n      return `--url: url(${image.imageUrl}); --focus-x: ${x}%; --focus-y: ${y}%;`;\n    }\n\n    const url = `url(${image.imageUrl});`;\n    return `--url: ${url}`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"interactives-collection-item-one-col\\\">\\n  {{#each @categoryGroup.entities as |collection|}}\\n    <Interactives::CollectionItem\\n      @interactive={{@interactive}}\\n      @collection={{collection.entity}}\\n    />\\n  {{/each}}\\n</div>\", {\"contents\":\"<div class=\\\"interactives-collection-item-one-col\\\">\\n  {{#each @categoryGroup.entities as |collection|}}\\n    <Interactives::CollectionItem\\n      @interactive={{@interactive}}\\n      @collection={{collection.entity}}\\n    />\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/interactives/one-column/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/one-column/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#each @categoryGroup.entities as |collection index|}}\\n  <DcCard class=\\\"nb1 p025\\\">\\n    <TableOfContentsItem\\n      @item={{collection.entity}}\\n      @index={{increment index}}\\n      @space=\\\"content\\\"\\n      @size=\\\"large\\\"\\n      @isInteractive={{true}}\\n      @showNumberOfAssignments={{true}}\\n    />\\n  </DcCard>\\n{{/each}}\", {\"contents\":\"{{#each @categoryGroup.entities as |collection index|}}\\n  <DcCard class=\\\"nb1 p025\\\">\\n    <TableOfContentsItem\\n      @item={{collection.entity}}\\n      @index={{increment index}}\\n      @space=\\\"content\\\"\\n      @size=\\\"large\\\"\\n      @isInteractive={{true}}\\n      @showNumberOfAssignments={{true}}\\n    />\\n  </DcCard>\\n{{/each}}\",\"moduleName\":\"babel/components/interactives/standard/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/standard/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"interactives-collection-item-two-col\\\">\\n\\n  {{#each @categoryGroup.entities as |collection|}}\\n    <Interactives::CollectionItem\\n      @interactive={{@interactive}}\\n      @collection={{collection.entity}}\\n    />\\n  {{/each}}\\n</div>\", {\"contents\":\"<div class=\\\"interactives-collection-item-two-col\\\">\\n\\n  {{#each @categoryGroup.entities as |collection|}}\\n    <Interactives::CollectionItem\\n      @interactive={{@interactive}}\\n      @collection={{collection.entity}}\\n    />\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/interactives/two-columns/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/interactives/two-columns/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\nimport { trackContentEvent } from 'babel/utils/matomo-events';\n\nexport default Component.extend({\n  courseContext: service(),\n\n  store: service(),\n\n  entities: null,\n\n  pageViews: null,\n\n  course: null,\n\n  isLoaded: false,\n\n  limit: 3,\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n\n    const productViews = this.get('pageViews');\n\n    if (productViews) {\n      this.set('entities', []);\n      productViews.forEach((item, index) => {\n        this.store\n          .findRecord('entity', item.attributes.entity_id)\n          .then((entity) => {\n            // DINO-3717: First item is already shown as continue visited\n            if (index !== 0) {\n              this.get('entities').pushObject({\n                id: item.attributes.entity_id,\n                title: item.attributes.title,\n                selectedMaterial: entity.selectedMaterial?.content,\n              });\n            }\n          });\n      });\n\n      this.set('isLoaded', true);\n    } else {\n      let courseIds = this.get('courseContext').getVisitedContentIds(\n        this.get('course.id')\n      );\n\n      this.set('entities', []);\n\n      if (courseIds && courseIds.length > 0) {\n        courseIds = courseIds.slice(0, this.get('limit'));\n        courseIds.forEach((id) => {\n          this.get('store')\n            .findRecord('entity', id)\n            .then((entity) => {\n              this.get('entities').pushObject(entity);\n              this.set('isLoaded', true);\n            });\n        });\n      }\n    }\n  },\n\n  trackClick: function () {\n    trackContentEvent('Senast besökta');\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (gt this.entities.length 0)}}\\n  <div class=\\\"latest-visited-content mb1\\\">\\n    <span class=\\\"text-bold\\\">\\n      {{t \\\"components.latestVisitedContent.latestVisited\\\"}}\\n    </span>\\n    {{#each this.entities as |entity|}}\\n      <UiLink\\n        class=\\\"latest-visited-content-item\\\"\\n        @route=\\\"nodes\\\"\\n        @click={{this.trackClick}}\\n        @model={{entity.id}}\\n      >\\n        {{entity.title}}\\n        {{#if (eq entity.selectedMaterial.type \\\"links\\\")}}\\n          <DcIcon class=\\\"nl1\\\" @name=\\\"external\\\" />\\n        {{else if (eq entity.selectedMaterial.type \\\"attachments\\\")}}\\n          <DcIcon class=\\\"nl1\\\" @name=\\\"cloud-download\\\" />\\n        {{/if}}\\n      </UiLink>\\n    {{/each}}\\n  </div>\\n{{/if}}', { moduleName: 'babel/components/latest-visited-content/template.hbs' });\n","import Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport { scrollTo } from 'babel/utils/chapter-viewport';\nimport { resolve } from 'rsvp';\n\nexport default Component.extend({\n  // SETUP\n\n  store: service(),\n\n  assignmentEvents: service(),\n\n  missionMode: service(),\n\n  tagName: 'section',\n\n  classNames: ['chapter-part'],\n\n  classNameBindings: ['isActive:chapter-part--active'],\n\n  // PARAMS\n\n  section: null,\n\n  index: null,\n\n  isActive: false,\n\n  hasMultipleSections: false,\n\n  editor: null,\n\n  exercises: null,\n\n  activeExercise: null,\n\n  answers: null,\n\n  activeAnswer: null,\n\n  // OBSERVER\n\n  // eslint-disable-next-line ember/no-observers\n  activeExerciseObserver: observer('exerciseId', 'exercises.[]', function () {\n    if (this.exerciseId && this.exercises) {\n      const exercise = this.exercises.findBy('id', this.exerciseId);\n\n      if (exercise) {\n        this.set('activeExercise', exercise);\n      }\n    }\n  }),\n\n  // eslint-disable-next-line ember/no-on-calls-in-components\n  editorObserver: on(\n    'init',\n    // eslint-disable-next-line ember/no-observers\n    observer('section.contenteditor', function () {\n      this.get('section.contenteditor').then((editor) => {\n        this.set('editor', editor);\n      });\n    })\n  ),\n\n  // eslint-disable-next-line ember/no-on-calls-in-components\n  exerciseObserver: on(\n    'init',\n    // eslint-disable-next-line ember/no-observers\n    observer(\n      'section.children',\n      'missionMode.includedEntities.length',\n      function () {\n        this.get('section.children')\n          .then((exercises) => this.missionMode.allowedEntities(exercises))\n          .then((exercises) => {\n            this.set('exercises', exercises);\n\n            if (exercises.length > 0) {\n              this._setActiveExerciseAndAnswers();\n            }\n          });\n      }\n    )\n  ),\n\n  // HOOKS\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    this._scrollIntoViewIfActiveInNextFrame();\n  },\n\n  _scrollIntoViewIfActiveInNextFrame() {\n    window.requestAnimationFrame(() => {\n      this._scrollIntoViewIfActive();\n    });\n  },\n\n  _scrollIntoViewIfActive() {\n    if (this.get('isActive')) {\n      scrollTo(this.get('element'), 'auto');\n    }\n  },\n\n  async _setActiveExerciseAndAnswers() {\n    const { interactive, activeAnswer, activeExercise } =\n      await this.assignmentEvents.getOrCreateInteractiveForCollection(\n        this.section,\n        this.activeExercise\n      );\n\n    this.set('answers', interactive.answers);\n    this.set('activeExercise', activeExercise);\n    this.set('activeAnswer', activeAnswer);\n  },\n\n  // ACTIONS\n\n  actions: {\n    openExercise(exerciseId) {\n      const exercise = this.get('section.children')?.findBy('id', exerciseId);\n\n      if (exercise) {\n        this.set('activeExercise', exercise);\n        return this._setActiveExerciseAndAnswers()\n      }\n\n      return resolve();\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"chapter-section\\\">\\n  {{#if (eq this.section.type \\\"sections\\\")}}\\n    <ChapterSection\\n      @section={{this.section}}\\n      @heading={{this.section.heading}}\\n      @hasMultipleSections={{this.hasMultipleSections}}\\n      @index={{this.index}}\\n    />\\n\\n    <ContentExercises\\n      @section={{this.section}}\\n      @exerciseId={{this.exerciseId}}\\n    />\\n  {{else if (eq this.section.type \\\"collections\\\")}}\\n    <CollectionView\\n      @withinContent={{true}}\\n      @collection={{this.section}}\\n      @exercises={{this.exercises}}\\n      @activeExercise={{this.activeExercise}}\\n      @answers={{this.answers}}\\n      @activeAnswer={{this.activeAnswer}}\\n      @shortCode={{this.section.book.body.shortcode}}\\n      @digilarRecordedSpeechEnabled={{@content.body.recorded_speech_activated}}\\n      @editor={{this.editor}}\\n      @withoutSpeaker={{true}}\\n      @openExercise={{action \\\"openExercise\\\"}}\\n      class=\\\"mb2\\\"\\n    />\\n\\n  {{/if}}\\n\\n</div>', { moduleName: 'babel/components/master/contents-chapter-scroll/chapter-part/template.hbs' });\n","import Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { debounce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { scrollTo, viewportTop } from 'babel/utils/chapter-viewport';\n\nexport default Component.extend({\n  // SETUP\n\n  footnotesService: service('footnotes'),\n\n  router: service(),\n\n  classNames: ['contents-chapter-scroll'],\n\n  // PROPERTIES\n\n  preventScrollIntoView: false,\n\n  isPrevented: false,\n\n  footnotes: null,\n\n  // EVENTS\n\n  windowScroll() {\n    this._debouncedRouteToClosestSection();\n  },\n\n  // HOOKS\n\n  init() {\n    this._super(...arguments);\n    this.windowScroll = this.windowScroll.bind(this);\n    this.set(\n      'footnotes',\n      this.footnotesService.createIndexContext(this.sections)\n    );\n  },\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    window.addEventListener('scroll', this.windowScroll, {\n      passive: true,\n    });\n  },\n\n  willDestroyElement() {\n    this._super(...arguments);\n\n    window.removeEventListener('scroll', this.windowScroll, {\n      passive: true,\n    });\n  },\n\n  _debouncedRouteToClosestSection() {\n    debounce(this, '_routeToClosestSection', 2);\n  },\n\n  _routeToClosestSection() {\n    if (this.isPrevented) {\n      return;\n    }\n\n    const sectionElements = Array.from(\n      this.element.querySelectorAll('.chapter-part')\n    );\n\n    let closest = null;\n\n    sectionElements.forEach((sectionElement) => {\n      const top =\n        (sectionElement.previousElementSibling ? sectionElement.offsetTop : 0) -\n        window.pageYOffset;\n\n      if (top <= viewportTop()) {\n        closest = sectionElement;\n      }\n    });\n\n    if (closest) {\n      const sectionId = closest.getAttribute('id');\n\n      if (this.get('activeSection.id') !== sectionId) {\n        this.set('preventScrollIntoView', true);\n        this.router.replaceWith({\n          queryParams: { section: sectionId },\n        });\n      }\n    }\n  },\n\n  activeSectionObserver: observer('activeSection', function () {\n    if (!this.preventScrollIntoView) {\n      const element = document.getElementById(this.get('activeSection.id'));\n\n      if (element) {\n        this.set('isPrevented', true);\n\n        scrollTo(element).finally(() => {\n          if (!this.isDestroying && !this.isDestroyed) {\n            this.set('isPrevented', false);\n          }\n        });\n      }\n    }\n    this.set('preventScrollIntoView', false);\n  }),\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.sections as |section index|}}\\n\\n  {{master/contents-chapter-scroll/chapter-part\\n    id=section.id\\n    section=section\\n    isActive=(eq this.activeSection section)\\n    hasMultipleSections=(gt this.sections.length 1)\\n    index=index\\n    exerciseId=this.exerciseId\\n    content=this.content\\n  }}\\n\\n{{/each}}\\n\\n{{#if this.footnotes}}\\n  <FootnoteList @footnotes={{this.footnotes}} />\\n{{/if}}', { moduleName: 'babel/components/master/contents-chapter-scroll/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#unless @model.body.hide_heading}}\\n  <ReadingResolve @readingId={{@model.body.reading_id}} as |readingUrl|>\\n    <ContentPresenter @isContainer={{false}}>\\n      <h1\\n        class=\\\"content-title\\\"\\n        data-id={{@model.document_id}}\\n        data-reading={{readingUrl}}\\n        data-reading-loading={{not readingUrl}}\\n      >\\n        {{!\\n        IMPORTANT!\\n        The span tag around the title is required for the Speaker to work properly.\\n        Otherwise the title can become incorrect in some cases when navigating between different contents.\\n        DO NOT REMOVE!\\n        }}\\n        <span>{{@model.title}}</span>\\n      </h1>\\n    </ContentPresenter>\\n  </ReadingResolve>\\n{{/unless}}\\n', { moduleName: 'babel/components/master/contents-title/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ContentsWorkflowComponent extends Component {\n  @service footnotes;\n\n  @tracked showContentSummary = false;\n\n  @storageFor('read-setting') settings;\n\n  get isSection() {\n    return this.args.model?.type === 'sections';\n  }\n\n  get showDoneButton() {\n    return !this.showContentSummary && this.args.showDoneButton;\n  }\n\n  get showSummary() {\n    return this.showContentSummary && !this.args.hasNextSection;\n  }\n\n  get hasExercises() {\n    return this.args.model.children.length > 0;\n  }\n\n  @cached get modelProxy() {\n    return load(this.args.model, this);\n  }\n\n  get heading() {\n    const model = this.modelProxy.isResolved ? this.modelProxy.value : null;\n\n    if (model?.body?.hide_heading) return null;\n\n    return model ? model.heading : null;\n  }\n\n  @action handleDone() {\n    this.showContentSummary = true;\n  }\n\n  constructor() {\n    super(...arguments);\n    this.footnotes.createIndexContext(this.args.sections);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"contents-workflow\\\">\\n  {{#if this.isSection}}\\n\\n    <ContentPresenter class=\\\"py2 container-md\\\">\\n\\n      {{#if this.heading}}\\n        <h2\\n          class=\\\"section-title\\\"\\n          data-id=\\\"{{@model.document_id}}\\\"\\n        >\\n          {{~this.heading~}}\\n        </h2>\\n      {{/if}}\\n\\n      <TbRender @content={{@model.contenteditor}} />\\n\\n      {{#if @model.footnotes}}\\n        <FootnoteList class=\\\"mt2\\\" @footnotes={{@model.footnotes}} />\\n      {{/if}}\\n\\n    </ContentPresenter>\\n\\n    {{#if @model.body.reading_buddy_activated}}\\n      <ReadingBuddy\\n        @resetOnPageChange={{true}}\\n        @page={{@model.body.reading_buddy_page}}\\n        @endpoint={{@content.body.reading_buddy_url}}\\n        />\\n    {{/if}}\\n\\n    {{#if this.hasExercises}}\\n      <div class=\\\"collection-margin-fix\\\">\\n        <ContentExercises\\n          @section={{@model}}\\n          @exerciseId={{@exerciseId}}\\n        />\\n      </div>\\n    {{/if}}\\n\\n    <div class=\\\"container-md justify-center\\\">\\n      <ContentPaginationSummary\\n        class=\\\"contents-workflow-collection-pagination\\\"\\n        @collections={{@collections}}\\n        @content={{@content}}\\n        @wordlists={{@wordlists}}\\n        @horizontal={{true}}\\n        @simplified={{false}}\\n        @showNextButton={{@hasNextSection}}\\n        @showBackButton={{@hasPreviousSection}}\\n        @showDoneButton={{this.showDoneButton}}\\n        @showSummary={{this.showSummary}}\\n        @onNextSection={{@onNextSection}}\\n        @onPreviousSection={{@onPreviousSection}}\\n        @onDone={{this.handleDone}}\\n        @nextMissionContent={{@nextMissionContent}}\\n      />\\n    </div>\\n\\n    <div class=\\\"workflow-scroll-enabler\\\"></div>\\n\\n  {{else}}\\n\\n    <CollectionView\\n      @withinContent={{true}}\\n      @collection={{@model}}\\n      @exercises={{@exercises}}\\n      @activeExercise={{@activeExercise}}\\n      @answers={{@answers}}\\n      @activeAnswer={{@activeAnswer}}\\n      @shortCode={{@model.book.body.shortcode}}\\n      @digilarRecordedSpeechEnabled={{@content.body.recorded_speech_activated}}\\n      @editor={{@editor}}\\n      @openExercise={{@openExercise}}\\n      as |CollectionViewYield|\\n    >\\n      <CollectionViewYield.Bottom>\\n\\n        <ContentPaginationSummary\\n          class=\\\"contents-workflow-collection-pagination\\\"\\n          @collections={{@collections}}\\n          @content={{@content}}\\n          @wordlists={{@wordlists}}\\n          @horizontal={{true}}\\n          @simplified={{true}}\\n          @showNextButton={{@hasNextSection}}\\n          @showBackButton={{@hasPreviousSection}}\\n          @showDoneButton={{this.showDoneButton}}\\n          @showSummary={{this.showSummary}}\\n          @onNextSection={{@onNextSection}}\\n          @onPreviousSection={{@onPreviousSection}}\\n          @onDone={{this.handleDone}}\\n          @nextMissionContent={{@nextMissionContent}}\\n        />\\n\\n      </CollectionViewYield.Bottom>\\n\\n    </CollectionView>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/master/contents-workflow/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Dialog\\n  ...attributes\\n  @title={{@material.name}}\\n  @fillOnSmallBreakpoint={{true}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  as |dialog|\\n>\\n\\n  <dialog.header>\\n\\n    {{#if @material.copyrightedMaterials}}\\n\\n      <XCopyrightPopupButton\\n        class=\\\"nr1\\\"\\n        @materials={{@material.copyrightedMaterials}}\\n      />\\n\\n    {{/if}}\\n\\n  </dialog.header>\\n\\n  <dialog.content>\\n\\n    <div class=\\\"px2 pt1 position-relative\\\">\\n\\n      <ContentPresenter class=\\\"pb6\\\">\\n\\n        <TbRenderWrapper\\n          @editorId={{@material.metadata.content_editor_id}}\\n          @model={{@material}}\\n        />\\n\\n      </ContentPresenter>\\n\\n    </div>\\n\\n  </dialog.content>\\n\\n</MaterialViewer::Dialog>\", {\"contents\":\"<MaterialViewer::Dialog\\n  ...attributes\\n  @title={{@material.name}}\\n  @fillOnSmallBreakpoint={{true}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  as |dialog|\\n>\\n\\n  <dialog.header>\\n\\n    {{#if @material.copyrightedMaterials}}\\n\\n      <XCopyrightPopupButton\\n        class=\\\"nr1\\\"\\n        @materials={{@material.copyrightedMaterials}}\\n      />\\n\\n    {{/if}}\\n\\n  </dialog.header>\\n\\n  <dialog.content>\\n\\n    <div class=\\\"px2 pt1 position-relative\\\">\\n\\n      <ContentPresenter class=\\\"pb6\\\">\\n\\n        <TbRenderWrapper\\n          @editorId={{@material.metadata.content_editor_id}}\\n          @model={{@material}}\\n        />\\n\\n      </ContentPresenter>\\n\\n    </div>\\n\\n  </dialog.content>\\n\\n</MaterialViewer::Dialog>\",\"moduleName\":\"babel/components/material-viewer/article-dialog/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/article-dialog/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Popup\\n  ...attributes\\n  @for={{@for}}\\n  @material={{@material}}\\n  @onClose={{@onClose}}\\n>\\n  {{! template-lint-disable no-inline-styles }}\\n  <div style=\\\"max-width: 400px; min-width: 60px; min-height: 56px;\\\">\\n\\n    <div class=\\\"flex justify-space-between flex-start p1\\\">\\n      <h3\\n        class=\\\"text-tertiary word-break-all\\\"\\n      >{{@material.nameWithFallback}}</h3>\\n\\n      {{#if @material.copyrightedMaterials}}\\n\\n        <XCopyrightPopupButton\\n          class=\\\"ml1\\\"\\n          @materials={{@material.copyrightedMaterials}}\\n        />\\n\\n      {{/if}}\\n    </div>\\n\\n    <ContentPresenter class=\\\"px1 pb1\\\">\\n\\n      <TbRenderWrapper\\n        @editorId={{@material.metadata.content_editor_id}}\\n        @model={{@material}}\\n      />\\n\\n    </ContentPresenter>\\n\\n  </div>\\n\\n</MaterialViewer::Popup>\", {\"contents\":\"<MaterialViewer::Popup\\n  ...attributes\\n  @for={{@for}}\\n  @material={{@material}}\\n  @onClose={{@onClose}}\\n>\\n  {{! template-lint-disable no-inline-styles }}\\n  <div style=\\\"max-width: 400px; min-width: 60px; min-height: 56px;\\\">\\n\\n    <div class=\\\"flex justify-space-between flex-start p1\\\">\\n      <h3\\n        class=\\\"text-tertiary word-break-all\\\"\\n      >{{@material.nameWithFallback}}</h3>\\n\\n      {{#if @material.copyrightedMaterials}}\\n\\n        <XCopyrightPopupButton\\n          class=\\\"ml1\\\"\\n          @materials={{@material.copyrightedMaterials}}\\n        />\\n\\n      {{/if}}\\n    </div>\\n\\n    <ContentPresenter class=\\\"px1 pb1\\\">\\n\\n      <TbRenderWrapper\\n        @editorId={{@material.metadata.content_editor_id}}\\n        @model={{@material}}\\n      />\\n\\n    </ContentPresenter>\\n\\n  </div>\\n\\n</MaterialViewer::Popup>\",\"moduleName\":\"babel/components/material-viewer/article-popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/article-popup/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Dialog\\n  ...attributes\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  @headerDivider={{false}}\\n  as |dialog|\\n>\\n\\n  <dialog.header class=\\\"pb0\\\" />\\n\\n  <dialog.content class=\\\"px2 pb2 flex-center\\\">\\n\\n    <DcIcon\\n      class=\\\"material-viewer-attachment-dialog-download-icon\\\"\\n      @name=\\\"cloud-download\\\"\\n    />\\n\\n    <h3 class=\\\"text-secondary m0 mt1 nb1\\\">\\n\\n      {{t \\\"components.materialViewer.attachmentDialog.downloadHeadingLabel\\\"}}\\n\\n    </h3>\\n\\n    <div class=\\\"mb1\\\">\\n\\n      {{@material.name}}\\n\\n    </div>\\n\\n    <UiButton @appearance=\\\"link\\\" @onClick={{this.handleRetryButtonClick}}>\\n\\n      {{t \\\"components.materialViewer.attachmentDialog.retryButtonLabel\\\"}}\\n\\n    </UiButton>\\n\\n  </dialog.content>\\n\\n</MaterialViewer::Dialog>\", {\"contents\":\"<MaterialViewer::Dialog\\n  ...attributes\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  @headerDivider={{false}}\\n  as |dialog|\\n>\\n\\n  <dialog.header class=\\\"pb0\\\" />\\n\\n  <dialog.content class=\\\"px2 pb2 flex-center\\\">\\n\\n    <DcIcon\\n      class=\\\"material-viewer-attachment-dialog-download-icon\\\"\\n      @name=\\\"cloud-download\\\"\\n    />\\n\\n    <h3 class=\\\"text-secondary m0 mt1 nb1\\\">\\n\\n      {{t \\\"components.materialViewer.attachmentDialog.downloadHeadingLabel\\\"}}\\n\\n    </h3>\\n\\n    <div class=\\\"mb1\\\">\\n\\n      {{@material.name}}\\n\\n    </div>\\n\\n    <UiButton @appearance=\\\"link\\\" @onClick={{this.handleRetryButtonClick}}>\\n\\n      {{t \\\"components.materialViewer.attachmentDialog.retryButtonLabel\\\"}}\\n\\n    </UiButton>\\n\\n  </dialog.content>\\n\\n</MaterialViewer::Dialog>\",\"moduleName\":\"babel/components/material-viewer/attachment-dialog/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/attachment-dialog/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { openMaterialDownload } from 'babel/utils/material-download';\nimport arg from 'compton/utils/arg';\n\nexport default class MaterialViewerAttachmentDialog extends Component {\n  // SETUP\n\n  @service ajax;\n\n  // ARGS\n\n  @arg material;\n\n  // HOOKS\n\n  constructor() {\n    super(...arguments);\n    this.#downloadAttachment();\n  }\n\n  // ACTIONS\n\n  @action\n  async handleRetryButtonClick() {\n    return this.#downloadAttachment();\n  }\n\n  // PRIVATE\n\n  async #downloadAttachment() {\n    const success = await openMaterialDownload(this.material, this.ajax);\n\n    if (!success) {\n      return Promise.reject();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-audio-lightbox\\\"\\n  ...attributes\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n  <:default>\\n    <DcCard @appearance=\\\"border\\\" as |card|>\\n      <card.content>\\n        <XAudio\\n          @source={{@material.meta.attachment_url}}\\n          @canSpeedUp={{@material.metadata.can_speed_up}}\\n          @canSlowDown={{@material.metadata.can_slow_down}}\\n        />\\n      </card.content>\\n      {{#if @material.copyright}}\\n        <span class=\\\"position-absolute nt1 text-small text-color-inverted\\\">\\n          ©\\n          {{@material.copyright}}\\n        </span>\\n      {{/if}}\\n    </DcCard>\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n</MaterialViewer::Lightbox>\", {\"contents\":\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-audio-lightbox\\\"\\n  ...attributes\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n  <:default>\\n    <DcCard @appearance=\\\"border\\\" as |card|>\\n      <card.content>\\n        <XAudio\\n          @source={{@material.meta.attachment_url}}\\n          @canSpeedUp={{@material.metadata.can_speed_up}}\\n          @canSlowDown={{@material.metadata.can_slow_down}}\\n        />\\n      </card.content>\\n      {{#if @material.copyright}}\\n        <span class=\\\"position-absolute nt1 text-small text-color-inverted\\\">\\n          ©\\n          {{@material.copyright}}\\n        </span>\\n      {{/if}}\\n    </DcCard>\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n</MaterialViewer::Lightbox>\",\"moduleName\":\"babel/components/material-viewer/audio-lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/audio-lightbox/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-canvas\\\"\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n  <CanvasPresentorWrapper @material={{@material}} />\\n</MaterialViewer::Lightbox>\\n\", {\"contents\":\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-canvas\\\"\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n  <CanvasPresentorWrapper @material={{@material}} />\\n</MaterialViewer::Lightbox>\\n\",\"moduleName\":\"babel/components/material-viewer/canvas/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/canvas/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XDialog\\n  ...attributes\\n  @title={{@title}}\\n  @size={{@size}}\\n  @fillOnSmallBreakpoint={{or @fillOnSmallBreakpoint false}}\\n  @headerDivider={{@headerDivider}}\\n  @closeButton={{@closeButton}}\\n  @onClose={{@onClose}}\\n  as |dialog|\\n>\\n\\n  {{yield dialog}}\\n\\n</XDialog>\", {\"contents\":\"<XDialog\\n  ...attributes\\n  @title={{@title}}\\n  @size={{@size}}\\n  @fillOnSmallBreakpoint={{or @fillOnSmallBreakpoint false}}\\n  @headerDivider={{@headerDivider}}\\n  @closeButton={{@closeButton}}\\n  @onClose={{@onClose}}\\n  as |dialog|\\n>\\n\\n  {{yield dialog}}\\n\\n</XDialog>\",\"moduleName\":\"babel/components/material-viewer/dialog/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/dialog/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <iframe\\n      class=\\\"material-viewer-embed-lightbox-embed\\\"\\n      src={{@material.metadata.url}}\\n      title={{@material.name}}\\n      allowfullscreen\\n      frameborder=\\\"0\\\"\\n      {{style-variable\\n        \\\"aspectRatio\\\"\\n        (aspect-ratio @material.metadata.width @material.metadata.height)\\n      }}\\n      {{fit-within-window margin=24}}\\n    ></iframe>\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\", {\"contents\":\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <iframe\\n      class=\\\"material-viewer-embed-lightbox-embed\\\"\\n      src={{@material.metadata.url}}\\n      title={{@material.name}}\\n      allowfullscreen\\n      frameborder=\\\"0\\\"\\n      {{style-variable\\n        \\\"aspectRatio\\\"\\n        (aspect-ratio @material.metadata.width @material.metadata.height)\\n      }}\\n      {{fit-within-window margin=24}}\\n    ></iframe>\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\",\"moduleName\":\"babel/components/material-viewer/embed-lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/embed-lightbox/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    {{#if @material.meta.properties.svg}}\\n      <XImage\\n        class=\\\"material-viewer-image-lightbox-svg-image\\\"\\n        @source={{image-source @material.meta.svg_url}}\\n        @width={{@material.imageWidth}}\\n        @height={{@material.imageHeight}}\\n        @color={{@material.imageColor}}\\n        @mimetype=\\\"image/svg+xml\\\"\\n      />\\n    {{else}}\\n      <XImage\\n        class=\\\"material-viewer-image-lightbox-image\\\"\\n        @source={{image-source @material.imageUrl}}\\n        @width={{@material.imageWidth}}\\n        @height={{@material.imageHeight}}\\n        @color={{@material.imageColor}}\\n        @mimetype={{@material.imageMimetype}}\\n      />\\n    {{/if}}\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\", {\"contents\":\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    {{#if @material.meta.properties.svg}}\\n      <XImage\\n        class=\\\"material-viewer-image-lightbox-svg-image\\\"\\n        @source={{image-source @material.meta.svg_url}}\\n        @width={{@material.imageWidth}}\\n        @height={{@material.imageHeight}}\\n        @color={{@material.imageColor}}\\n        @mimetype=\\\"image/svg+xml\\\"\\n      />\\n    {{else}}\\n      <XImage\\n        class=\\\"material-viewer-image-lightbox-image\\\"\\n        @source={{image-source @material.imageUrl}}\\n        @width={{@material.imageWidth}}\\n        @height={{@material.imageHeight}}\\n        @color={{@material.imageColor}}\\n        @mimetype={{@material.imageMimetype}}\\n      />\\n    {{/if}}\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\",\"moduleName\":\"babel/components/material-viewer/image-lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/image-lightbox/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Popup\\n  ...attributes\\n  @for={{@for}}\\n  @material={{@material}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <div class=\\\"p1\\\">\\n    <XImage\\n      class=\\\"material-viewer-image-popup-image\\\"\\n      @source={{image-source @material.imageUrl}}\\n      @width={{@material.imageWidth}}\\n      @height={{@material.imageHeight}}\\n      @color={{@material.imageColor}}\\n      @mimetype={{@material.imageMimetype}}\\n      {{on \\\"click\\\" (set this \\\"isMaterialViewerOpen\\\" true)}}\\n    />\\n  </div>\\n\\n</MaterialViewer::Popup>\\n\\n{{#if this.isMaterialViewerOpen}}\\n\\n  <MaterialViewer\\n    @material={{@material}}\\n    @onClose={{set this \\\"isMaterialViewerOpen\\\" false}}\\n  />\\n\\n{{/if}}\", {\"contents\":\"<MaterialViewer::Popup\\n  ...attributes\\n  @for={{@for}}\\n  @material={{@material}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <div class=\\\"p1\\\">\\n    <XImage\\n      class=\\\"material-viewer-image-popup-image\\\"\\n      @source={{image-source @material.imageUrl}}\\n      @width={{@material.imageWidth}}\\n      @height={{@material.imageHeight}}\\n      @color={{@material.imageColor}}\\n      @mimetype={{@material.imageMimetype}}\\n      {{on \\\"click\\\" (set this \\\"isMaterialViewerOpen\\\" true)}}\\n    />\\n  </div>\\n\\n</MaterialViewer::Popup>\\n\\n{{#if this.isMaterialViewerOpen}}\\n\\n  <MaterialViewer\\n    @material={{@material}}\\n    @onClose={{set this \\\"isMaterialViewerOpen\\\" false}}\\n  />\\n\\n{{/if}}\",\"moduleName\":\"babel/components/material-viewer/image-popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/image-popup/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MaterialViewerImagePopup extends Component {\n  // PROPERTIES\n\n  @tracked isMaterialViewerOpen = false;\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XOverlay\\n  @opacity={{if (eq this.behavior \\\"modal\\\") 0.9 0.3}}\\n  @blur={{eq this.behavior \\\"modal\\\"}}\\n  @closeOnEscape={{true}}\\n  @onClose={{@onClose}}\\n>\\n\\n  {{! We want the inverse block so invoke x-await with curly brackets. }}\\n\\n  {{#x-await this.load as |model|}}\\n    {{#if model.material}}\\n      {{#let\\n        (material-viewer-component-name model.material behavior=this.behavior)\\n        as |componentName|\\n      }}\\n        {{#let (component componentName) as |Component|}}\\n\\n          <Component\\n            @material={{model.material}}\\n            @size={{model.size}}\\n            @for={{@for}}\\n            @caption={{@caption}}\\n            @onClose={{@onClose}}\\n            as |caption|\\n          >\\n\\n            {{yield caption}}\\n\\n          </Component>\\n\\n        {{/let}}\\n\\n      {{/let}}\\n    {{/if}}\\n  {{else}}\\n\\n    <MaterialViewer::Loading />\\n\\n  {{/x-await}}\\n\\n</XOverlay>\", {\"contents\":\"<XOverlay\\n  @opacity={{if (eq this.behavior \\\"modal\\\") 0.9 0.3}}\\n  @blur={{eq this.behavior \\\"modal\\\"}}\\n  @closeOnEscape={{true}}\\n  @onClose={{@onClose}}\\n>\\n\\n  {{! We want the inverse block so invoke x-await with curly brackets. }}\\n\\n  {{#x-await this.load as |model|}}\\n    {{#if model.material}}\\n      {{#let\\n        (material-viewer-component-name model.material behavior=this.behavior)\\n        as |componentName|\\n      }}\\n        {{#let (component componentName) as |Component|}}\\n\\n          <Component\\n            @material={{model.material}}\\n            @size={{model.size}}\\n            @for={{@for}}\\n            @caption={{@caption}}\\n            @onClose={{@onClose}}\\n            as |caption|\\n          >\\n\\n            {{yield caption}}\\n\\n          </Component>\\n\\n        {{/let}}\\n\\n      {{/let}}\\n    {{/if}}\\n  {{else}}\\n\\n    <MaterialViewer::Loading />\\n\\n  {{/x-await}}\\n\\n</XOverlay>\",\"moduleName\":\"babel/components/material-viewer/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { openMaterialDownload } from 'babel/utils/material-download';\nimport arg from 'compton/utils/arg';\nimport imageSource from 'compton/utils/image-source';\nimport { processSource } from 'compton/utils/interactive-image';\nimport loadImage from 'compton/utils/load-image';\n\nexport default class MaterialViewer extends Component {\n  // SERVICES\n\n  @service ajax;\n\n  // ARGS\n\n  @arg material;\n\n  @arg behavior = 'modal';\n\n  // ACTIONS\n\n  @action\n  async load() {\n    const material = await this.material;\n\n    const model = {\n      material,\n    };\n\n    if (material.type === 'articles' || material.type === 'guidances') {\n      await material.materials;\n    } else if (material.type === 'images') {\n      if (material?.meta?.properties?.svg) {\n        await loadImage(imageSource(material.meta.svg_url));\n      } else {\n        await loadImage(imageSource(material.imageUrl));\n      }\n    } else if (material.type === 'interactive_images') {\n      await Promise.all([\n        material.materials,\n        processSource(material.meta.attachment_url),\n      ]);\n    } else if (material.type === 'videos') {\n      await loadImage(imageSource(material.imageUrl));\n    } else if (material.type === 'links' && this._isNokLink(material)) {\n      window.open(material.metadata.url, '_blank');\n      later(() => {\n        this.args.onClose();\n      });\n      return null;\n    } else if (material.type === 'attachments' && this._isPdf(material)) {\n      await openMaterialDownload(material, this.ajax, false);\n      later(() => {\n        this.args.onClose();\n      });\n      return null;\n    }\n\n    return model;\n  }\n\n  _isNokLink(material) {\n    try {\n      const url = new URL(material.metadata.url);\n      return /nok\\.se|nokportalen\\.se/.test(url.hostname);\n    } catch (error) {\n      return false;\n    }\n  }\n\n  _isPdf(material) {\n    const names = [\n      material.metadata?.filename,\n      material.metadata?.download_name,\n    ];\n    return names.some((name) => name?.toLowerCase().endsWith('.pdf'));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <InteractiveImageWrapper\\n      class=\\\"material-viewer-interactive-image-lightbox-interactive-image\\\"\\n      @material={{@material}}\\n      {{fit-within-window margin=24}}\\n    />\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\", {\"contents\":\"<MaterialViewer::Lightbox\\n  ...attributes\\n  @material={{@material}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <InteractiveImageWrapper\\n      class=\\\"material-viewer-interactive-image-lightbox-interactive-image\\\"\\n      @material={{@material}}\\n      {{fit-within-window margin=24}}\\n    />\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\",\"moduleName\":\"babel/components/material-viewer/interactive-image-lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/interactive-image-lightbox/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<UiButton\\n  class=\\\"material-viewer-close-button\\\"\\n  @appearance=\\\"none\\\"\\n  @onClick={{@onClick}}\\n  ...attributes\\n  data-test-material-viewer-close-button\\n>\\n\\n  {{t \\\"components.materialViewer.lightbox.closeButton.label\\\"}}\\n\\n  <span class=\\\"material-viewer-close-button-circle\\\">\\n    <DcIcon @name=\\\"simple-remove\\\" />\\n  </span>\\n\\n</UiButton>\", {\"contents\":\"<UiButton\\n  class=\\\"material-viewer-close-button\\\"\\n  @appearance=\\\"none\\\"\\n  @onClick={{@onClick}}\\n  ...attributes\\n  data-test-material-viewer-close-button\\n>\\n\\n  {{t \\\"components.materialViewer.lightbox.closeButton.label\\\"}}\\n\\n  <span class=\\\"material-viewer-close-button-circle\\\">\\n    <DcIcon @name=\\\"simple-remove\\\" />\\n  </span>\\n\\n</UiButton>\",\"moduleName\":\"babel/components/material-viewer/lightbox/close-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/lightbox/close-button/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"material-viewer-lightbox\\\" ...attributes>\\n\\n  <MaterialViewer::Lightbox::CloseButton @onClick={{@onClose}} />\\n\\n  <div class=\\\"material-viewer-lightbox-content\\\">\\n\\n    {{yield}}\\n\\n    {{#let @material.metadata.copyright @caption as |copyright caption|}}\\n\\n      {{#if (or caption copyright)}}\\n        <div class={{concat \\\"material-viewer-lightbox-detail\\\" (if this.isNarrow \\\" material-viewer-lightbox-detail--narrow\\\")}}>\\n\\n          {{#if caption}}\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <p\\n              class=\\\"m0 text-italic\\\"\\n              {{on \\\"click\\\" this.handleCaptionParagraphClick}}\\n            >\\n\\n              {{#if (has-block \\\"caption\\\")}}\\n                {{yield caption to=\\\"caption\\\"}}\\n              {{else}}\\n                {{caption}}\\n              {{/if}}\\n\\n            </p>\\n            {{! template-lint-enable no-invalid-interactive }}\\n          {{/if}}\\n\\n          {{#if copyright}}\\n            {{! template-lint-disable no-bare-strings }}\\n            <p class=\\\"m0 text-small\\\">\\n              ©\\n              {{copyright}}\\n            </p>\\n\\n            {{! template-lint-enable no-bare-strings }}\\n          {{/if}}\\n\\n        </div>\\n\\n      {{/if}}\\n\\n    {{/let}}\\n\\n  </div>\\n\\n</div>\", {\"contents\":\"<div class=\\\"material-viewer-lightbox\\\" ...attributes>\\n\\n  <MaterialViewer::Lightbox::CloseButton @onClick={{@onClose}} />\\n\\n  <div class=\\\"material-viewer-lightbox-content\\\">\\n\\n    {{yield}}\\n\\n    {{#let @material.metadata.copyright @caption as |copyright caption|}}\\n\\n      {{#if (or caption copyright)}}\\n        <div class={{concat \\\"material-viewer-lightbox-detail\\\" (if this.isNarrow \\\" material-viewer-lightbox-detail--narrow\\\")}}>\\n\\n          {{#if caption}}\\n            {{! template-lint-disable no-invalid-interactive }}\\n            <p\\n              class=\\\"m0 text-italic\\\"\\n              {{on \\\"click\\\" this.handleCaptionParagraphClick}}\\n            >\\n\\n              {{#if (has-block \\\"caption\\\")}}\\n                {{yield caption to=\\\"caption\\\"}}\\n              {{else}}\\n                {{caption}}\\n              {{/if}}\\n\\n            </p>\\n            {{! template-lint-enable no-invalid-interactive }}\\n          {{/if}}\\n\\n          {{#if copyright}}\\n            {{! template-lint-disable no-bare-strings }}\\n            <p class=\\\"m0 text-small\\\">\\n              ©\\n              {{copyright}}\\n            </p>\\n\\n            {{! template-lint-enable no-bare-strings }}\\n          {{/if}}\\n\\n        </div>\\n\\n      {{/if}}\\n\\n    {{/let}}\\n\\n  </div>\\n\\n</div>\",\"moduleName\":\"babel/components/material-viewer/lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/lightbox/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport arg from 'compton/utils/arg';\n\nconst DATA_FOOTNOTE_ATTRIBUTE = 'data-footnote';\n\nexport default class MaterialViewerLightbox extends Component {\n  // ARGS\n\n  @arg onClose;\n\n  // ACTIONS\n\n  get isNarrow() {\n    return this.args.material?.meta?.image_width < 240;\n  }\n\n  @action async handleCaptionParagraphClick(evt) {\n    if (evt.target.hasAttribute(DATA_FOOTNOTE_ATTRIBUTE)) {\n      this.#close();\n    }\n  }\n\n  // PRIVATE\n\n  #close() {\n    this.onClose?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Dialog\\n  ...attributes\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @closeButton={{false}}\\n  @onClose={{@onClose}}\\n  @title={{t \\\"components.materialViewer.linkDialog.title\\\"}}\\n  as |dialog|\\n>\\n\\n  <dialog.header />\\n\\n  <dialog.content class=\\\"p2\\\">\\n\\n    <p class=\\\"m0\\\">\\n      {{! template-lint-disable no-triple-curlies }}\\n      {{{t\\n        \\\"components.materialViewer.linkDialog.message\\\"\\n        contactUrl=\\\"https://support.nok.se\\\"\\n      }}}\\n      {{! template-lint-enable no-triple-curlies }}\\n    </p>\\n    <XExternalLink @href={{this.material.metadata.url}} class=\\\"mt1\\\" />\\n\\n  </dialog.content>\\n\\n  <dialog.footer class=\\\"flex justify-flex-end\\\">\\n\\n    <div>\\n      <UiButton @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.materialViewer.linkDialog.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton\\n        class=\\\"ml1\\\"\\n        @autofocus={{true}}\\n        @onClick={{this.handleContinueButtonClick}}\\n        data-test-follow-link-button\\n      >\\n        {{t \\\"components.materialViewer.linkDialog.continueButtonLabel\\\"}}\\n      </UiButton>\\n    </div>\\n\\n  </dialog.footer>\\n\\n</MaterialViewer::Dialog>\", {\"contents\":\"<MaterialViewer::Dialog\\n  ...attributes\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @closeButton={{false}}\\n  @onClose={{@onClose}}\\n  @title={{t \\\"components.materialViewer.linkDialog.title\\\"}}\\n  as |dialog|\\n>\\n\\n  <dialog.header />\\n\\n  <dialog.content class=\\\"p2\\\">\\n\\n    <p class=\\\"m0\\\">\\n      {{! template-lint-disable no-triple-curlies }}\\n      {{{t\\n        \\\"components.materialViewer.linkDialog.message\\\"\\n        contactUrl=\\\"https://support.nok.se\\\"\\n      }}}\\n      {{! template-lint-enable no-triple-curlies }}\\n    </p>\\n    <XExternalLink @href={{this.material.metadata.url}} class=\\\"mt1\\\" />\\n\\n  </dialog.content>\\n\\n  <dialog.footer class=\\\"flex justify-flex-end\\\">\\n\\n    <div>\\n      <UiButton @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.materialViewer.linkDialog.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton\\n        class=\\\"ml1\\\"\\n        @autofocus={{true}}\\n        @onClick={{this.handleContinueButtonClick}}\\n        data-test-follow-link-button\\n      >\\n        {{t \\\"components.materialViewer.linkDialog.continueButtonLabel\\\"}}\\n      </UiButton>\\n    </div>\\n\\n  </dialog.footer>\\n\\n</MaterialViewer::Dialog>\",\"moduleName\":\"babel/components/material-viewer/link-dialog/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/link-dialog/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport arg from 'compton/utils/arg';\n\nexport default class MaterialViewerLinkDialog extends Component {\n  // ARGS\n\n  @arg material;\n\n  @arg onClose;\n\n  @action handleContinueButtonClick() {\n    if (this.material.metadata?.url) {\n      window.open(this.material.metadata.url);\n    }\n    this.#close();\n  }\n\n  // PRIVATE\n\n  #close() {\n    this.onClose?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"material-viewer-loading\\\" ...attributes>\\n  <DcLoader @size=\\\"large\\\" @variant=\\\"pulse\\\" />\\n</div>\", {\"contents\":\"<div class=\\\"material-viewer-loading\\\" ...attributes>\\n  <DcLoader @size=\\\"large\\\" @variant=\\\"pulse\\\" />\\n</div>\",\"moduleName\":\"babel/components/material-viewer/loading/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/loading/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XPopup\\n  @for={{@for}}\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n\\n  {{yield}}\\n\\n</XPopup>\", {\"contents\":\"<XPopup\\n  @for={{@for}}\\n  @switchToDialogOnSmallBreakpoint={{false}}\\n  @onClose={{@onClose}}\\n>\\n\\n  {{yield}}\\n\\n</XPopup>\",\"moduleName\":\"babel/components/material-viewer/popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/popup/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-video-lightbox\\\"\\n  ...attributes\\n  @material={{hash metadata=(hash copyright=@material.metadata.copyright)}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <div class=\\\"material-viewer-video-lightbox-inner\\\">\\n\\n      <XVideo\\n        @source={{@material.meta.attachment_url}}\\n        @poster={{@material.meta.image_url}}\\n        @subtitles={{@material.metadata.subtitles}}\\n      />\\n\\n    </div>\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\", {\"contents\":\"<MaterialViewer::Lightbox\\n  class=\\\"material-viewer-video-lightbox\\\"\\n  ...attributes\\n  @material={{hash metadata=(hash copyright=@material.metadata.copyright)}}\\n  @caption={{@caption}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <:default>\\n\\n    <div class=\\\"material-viewer-video-lightbox-inner\\\">\\n\\n      <XVideo\\n        @source={{@material.meta.attachment_url}}\\n        @poster={{@material.meta.image_url}}\\n        @subtitles={{@material.metadata.subtitles}}\\n      />\\n\\n    </div>\\n\\n  </:default>\\n\\n  <:caption as |caption|>\\n    {{yield caption}}\\n  </:caption>\\n\\n</MaterialViewer::Lightbox>\",\"moduleName\":\"babel/components/material-viewer/video-lightbox/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/material-viewer/video-lightbox/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @width=\\\"medium\\\"\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"new\\\">\\n    <:label>\\n      {{t \\\"components.missionAddActionMenu.items.new.label\\\"}}\\n    </:label>\\n    <:description>\\n      {{t \\\"components.missionAddActionMenu.items.new.description\\\"}}\\n    </:description>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"copy\\\">\\n    <:label>\\n      {{t \\\"components.missionAddActionMenu.items.copy.label\\\"}}\\n    </:label>\\n    <:description>\\n      {{t \\\"components.missionAddActionMenu.items.copy.description\\\"}}\\n    </:description>\\n  </menu.Item>\\n</ActionMenu>\", {\"contents\":\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @width=\\\"medium\\\"\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"new\\\">\\n    <:label>\\n      {{t \\\"components.missionAddActionMenu.items.new.label\\\"}}\\n    </:label>\\n    <:description>\\n      {{t \\\"components.missionAddActionMenu.items.new.description\\\"}}\\n    </:description>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"copy\\\">\\n    <:label>\\n      {{t \\\"components.missionAddActionMenu.items.copy.label\\\"}}\\n    </:label>\\n    <:description>\\n      {{t \\\"components.missionAddActionMenu.items.copy.description\\\"}}\\n    </:description>\\n  </menu.Item>\\n</ActionMenu>\",\"moduleName\":\"babel/components/mission-add-action-menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-add-action-menu/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class MissionAddActionMenu extends Component {\n  get includeActivate() {\n    return this.args.includeActivate ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-browser\\\"\\n  ...attributes\\n  {{sortable-group\\n    groupName=this.groupName\\n    disabled=(not @sortable)\\n    onChange=(optional @onSort)\\n  }}\\n>\\n  {{#each @missions as |mission|}}\\n    <MissionBrowser::Item\\n      @mission={{mission}}\\n      @groupName={{this.groupName}}\\n      @sortable={{this.sortable}}\\n      @students={{@students}}\\n      @displayDetails={{this.displayDetails}}\\n      @onEdit={{@onEdit}}\\n      @onCopy={{@onCopy}}\\n      @onShare={{@onShare}}\\n      @onToggleActivation={{@onToggleActivation}}\\n      @onSchedule={{@onSchedule}}\\n      @onCancelSchedule={{@onCancelSchedule}}\\n      @onHide={{@onHide}}\\n      @onEditCustomContent={{@onEditCustomContent}}\\n    />\\n  {{/each}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"mission-browser\\\"\\n  ...attributes\\n  {{sortable-group\\n    groupName=this.groupName\\n    disabled=(not @sortable)\\n    onChange=(optional @onSort)\\n  }}\\n>\\n  {{#each @missions as |mission|}}\\n    <MissionBrowser::Item\\n      @mission={{mission}}\\n      @groupName={{this.groupName}}\\n      @sortable={{this.sortable}}\\n      @students={{@students}}\\n      @displayDetails={{this.displayDetails}}\\n      @onEdit={{@onEdit}}\\n      @onCopy={{@onCopy}}\\n      @onShare={{@onShare}}\\n      @onToggleActivation={{@onToggleActivation}}\\n      @onSchedule={{@onSchedule}}\\n      @onCancelSchedule={{@onCancelSchedule}}\\n      @onHide={{@onHide}}\\n      @onEditCustomContent={{@onEditCustomContent}}\\n    />\\n  {{/each}}\\n</div>\",\"moduleName\":\"babel/components/mission-browser/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-browser/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport generateId from 'compton/utils/generate-id';\n\n/*\n\nimport CustomContentModel from 'babel/models/custom-content';\nimport MissionModel from 'babel/models/mission';\nimport UserModel from 'babel/models/user';\n\ninterface MissionBrowserSignature {\n  Args: {\n    missions: MissionModel[];\n    students: UserModel[];\n    sortable?: boolean;\n    displayDetails?: boolean;\n    onSort?(missions: MissionModel[]): void;\n    onEdit(mission: MissionModel): void;\n    onCopy?(mission: MissionModel): void;\n    onShare(mission: MissionModel): void;\n    onToggleActivation?(mission: MissionModel): void;\n    onSchedule?(mission: MissionModel): void;\n    onCancelSchedule?(mission: MissionModel): void;\n    onHide(mission: MissionModel): void;\n    onEditCustomContent(customContent: CustomContentModel): void;\n  };\n  Element: HTMLDivElement;\n}\n\n*/\n\nexport default class MissionBrowserComponent extends Component {\n  groupName = generateId();\n\n  get sortable() {\n    return this.args.sortable ?? false;\n  }\n\n  get displayDetails() {\n    return this.args.displayDetails ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-browser-item\\\"\\n  ...attributes\\n  data-highlighted={{this.isHighlighted}}\\n  data-hiding={{this.isHiding}}\\n  {{sortable-item model=@mission groupName=@groupName}}\\n>\\n  <div class=\\\"mission-browser-item-content {{if @sortable 'mission-browser-item-content--sortable'}}\\\">\\n    <div class=\\\"flex flex-center justify-space-between\\\">\\n      {{#if @sortable }}\\n        <div class=\\\"flex-auto text-secondary word-break-all\\\">\\n          {{@mission.title}}\\n        </div>\\n        <div class=\\\"ml1 handle\\\" {{sortable-handle}}>\\n          <DcIcon @name=\\\"drag\\\" />\\n        </div>\\n      {{else}}\\n        <div>\\n          <div class=\\\"flex-auto snb1 mr1 text-secondary word-break-all\\\">\\n            {{@mission.title}}\\n\\n            {{#if this.hasHiddenBadge}}\\n              <XBadge class=\\\"nl1\\\" @size=\\\"small\\\">\\n                {{t \\\"components.missionBrowser.item.hiddenLabel\\\"}}\\n              </XBadge>\\n            {{/if}}\\n          </div>\\n\\n          <div class=\\\"flex flex-center nt1\\\">\\n            {{#if (and this.session.user.isTeacher @mission.isScheduled (not @mission.hasStarted))}}\\n              <span class=\\\"text-small\\\">\\n                {{t\\n                  \\\"components.missionBrowser.item.startBadgeLabel\\\"\\n                  daysUntil=@mission.daysUntil\\n                }}\\n              </span>\\n            {{/if}}\\n\\n            {{#if this.hasEndBadge}}\\n              <span class=\\\"text-small\\\">\\n                {{t\\n                  \\\"components.missionBrowser.item.endBadgeLabel\\\"\\n                  daysLeft=@mission.daysLeft\\n                }}\\n              </span>\\n            {{/if}}\\n          </div>\\n        </div>\\n\\n        <div class=\\\"flex flex-center\\\">\\n          {{#if (and this.session.user.isTeacher @mission.isTargeted)}}\\n            <XBadge class=\\\"mr1\\\" @size=\\\"small\\\">\\n              {{t \\\"components.missionBrowser.item.targetedBadgeLabel\\\"}}\\n            </XBadge>\\n          {{/if}}\\n\\n          {{#if this.canBeOpened}}\\n            <UiLink\\n              class=\\\"nr1 mission-browser-item-content-expand-link\\\"\\n              @route=\\\"master.missions\\\"\\n              @model={{@mission.id}}\\n              @query={{hash closeUrl=this.router.currentURL}}\\n              data-test-mission-browser-item-open-link\\n            >\\n              <DcIcon @name=\\\"expand\\\" />\\n            </UiLink>\\n          {{/if}}\\n\\n          {{#if this.session.user.isTeacher}}\\n            {{#let\\n              (generate-id) (t \\\"components.missionOptionsButton.label\\\")\\n              as |id label|\\n            }}\\n              <UiButton\\n                id={{id}}\\n                class=\\\"mission-browser-item-content-option-button\\\"\\n                aria-label={{label}}\\n                @appearance=\\\"circle\\\"\\n                @onClick={{set this \\\"isMissionOptionsActionMenuOpen\\\" true}}\\n              >\\n                <DcIcon @name=\\\"menu-dots\\\" />\\n              </UiButton>\\n\\n              <XTooltip @for={{id}}>\\n                {{label}}\\n              </XTooltip>\\n\\n              {{#if this.isMissionOptionsActionMenuOpen}}\\n                <MissionOptionsActionMenu\\n                  @for={{id}}\\n                  @onSelect={{this.handleMissionOptionsActionMenuSelect}}\\n                  @onClose={{set this \\\"isMissionOptionsActionMenuOpen\\\" false}}\\n                  @hasAuditLink={{(and this.hasAuditLink (gt @students.length 0))}}\\n                  @isActive={{(or @mission.active @mission.isOngoing)}}\\n                  @isScheduled={{@mission.isScheduled}}\\n                />\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </div>\\n\\n  {{#unless @sortable}}\\n    <MissionContent\\n      @mission={{@mission}}\\n      @onEditCustomContent={{@onEditCustomContent}}\\n      class=\\\"mission-browser-item-mission-content\\\"\\n    />\\n  {{/unless}}\\n</div>\\n\\n{{#if this.isScheduleDetailModalOpen}}\\n  <ScheduleDetailModal\\n    @startDate={{@mission.startDate}}\\n    @endDate={{@mission.endDate}}\\n    @onSchedule={{fn @onSchedule @mission}}\\n    @onClose={{set this \\\"isScheduleDetailModalOpen\\\" false}}\\n  />\\n{{/if}}\", {\"contents\":\"<div\\n  class=\\\"mission-browser-item\\\"\\n  ...attributes\\n  data-highlighted={{this.isHighlighted}}\\n  data-hiding={{this.isHiding}}\\n  {{sortable-item model=@mission groupName=@groupName}}\\n>\\n  <div class=\\\"mission-browser-item-content {{if @sortable 'mission-browser-item-content--sortable'}}\\\">\\n    <div class=\\\"flex flex-center justify-space-between\\\">\\n      {{#if @sortable }}\\n        <div class=\\\"flex-auto text-secondary word-break-all\\\">\\n          {{@mission.title}}\\n        </div>\\n        <div class=\\\"ml1 handle\\\" {{sortable-handle}}>\\n          <DcIcon @name=\\\"drag\\\" />\\n        </div>\\n      {{else}}\\n        <div>\\n          <div class=\\\"flex-auto snb1 mr1 text-secondary word-break-all\\\">\\n            {{@mission.title}}\\n\\n            {{#if this.hasHiddenBadge}}\\n              <XBadge class=\\\"nl1\\\" @size=\\\"small\\\">\\n                {{t \\\"components.missionBrowser.item.hiddenLabel\\\"}}\\n              </XBadge>\\n            {{/if}}\\n          </div>\\n\\n          <div class=\\\"flex flex-center nt1\\\">\\n            {{#if (and this.session.user.isTeacher @mission.isScheduled (not @mission.hasStarted))}}\\n              <span class=\\\"text-small\\\">\\n                {{t\\n                  \\\"components.missionBrowser.item.startBadgeLabel\\\"\\n                  daysUntil=@mission.daysUntil\\n                }}\\n              </span>\\n            {{/if}}\\n\\n            {{#if this.hasEndBadge}}\\n              <span class=\\\"text-small\\\">\\n                {{t\\n                  \\\"components.missionBrowser.item.endBadgeLabel\\\"\\n                  daysLeft=@mission.daysLeft\\n                }}\\n              </span>\\n            {{/if}}\\n          </div>\\n        </div>\\n\\n        <div class=\\\"flex flex-center\\\">\\n          {{#if (and this.session.user.isTeacher @mission.isTargeted)}}\\n            <XBadge class=\\\"mr1\\\" @size=\\\"small\\\">\\n              {{t \\\"components.missionBrowser.item.targetedBadgeLabel\\\"}}\\n            </XBadge>\\n          {{/if}}\\n\\n          {{#if this.canBeOpened}}\\n            <UiLink\\n              class=\\\"nr1 mission-browser-item-content-expand-link\\\"\\n              @route=\\\"master.missions\\\"\\n              @model={{@mission.id}}\\n              @query={{hash closeUrl=this.router.currentURL}}\\n              data-test-mission-browser-item-open-link\\n            >\\n              <DcIcon @name=\\\"expand\\\" />\\n            </UiLink>\\n          {{/if}}\\n\\n          {{#if this.session.user.isTeacher}}\\n            {{#let\\n              (generate-id) (t \\\"components.missionOptionsButton.label\\\")\\n              as |id label|\\n            }}\\n              <UiButton\\n                id={{id}}\\n                class=\\\"mission-browser-item-content-option-button\\\"\\n                aria-label={{label}}\\n                @appearance=\\\"circle\\\"\\n                @onClick={{set this \\\"isMissionOptionsActionMenuOpen\\\" true}}\\n              >\\n                <DcIcon @name=\\\"menu-dots\\\" />\\n              </UiButton>\\n\\n              <XTooltip @for={{id}}>\\n                {{label}}\\n              </XTooltip>\\n\\n              {{#if this.isMissionOptionsActionMenuOpen}}\\n                <MissionOptionsActionMenu\\n                  @for={{id}}\\n                  @onSelect={{this.handleMissionOptionsActionMenuSelect}}\\n                  @onClose={{set this \\\"isMissionOptionsActionMenuOpen\\\" false}}\\n                  @hasAuditLink={{(and this.hasAuditLink (gt @students.length 0))}}\\n                  @isActive={{(or @mission.active @mission.isOngoing)}}\\n                  @isScheduled={{@mission.isScheduled}}\\n                />\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </div>\\n\\n  {{#unless @sortable}}\\n    <MissionContent\\n      @mission={{@mission}}\\n      @onEditCustomContent={{@onEditCustomContent}}\\n      class=\\\"mission-browser-item-mission-content\\\"\\n    />\\n  {{/unless}}\\n</div>\\n\\n{{#if this.isScheduleDetailModalOpen}}\\n  <ScheduleDetailModal\\n    @startDate={{@mission.startDate}}\\n    @endDate={{@mission.endDate}}\\n    @onSchedule={{fn @onSchedule @mission}}\\n    @onClose={{set this \\\"isScheduleDetailModalOpen\\\" false}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/mission-browser/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-browser/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackMissionEvent } from 'babel/utils/matomo-events';\n\nfunction delay(ms) {\n  return new Promise((resolve) => later(resolve, ms));\n}\n\nconst SCHEDULING_MENU_BUTTON_ITEMS = {\n  cancel: 'cancel',\n  edit: 'edit',\n};\n\nconst SCHEDULE = {\n  until: 'until',\n  infinite: 'infinite',\n  ended: 'ended',\n  equal: 'equal',\n  between: 'between',\n  from: 'from',\n};\n\nfunction dateIsEqual(x, y) {\n  return (\n    x.getFullYear() === y.getFullYear() &&\n    x.getMonth() === y.getMonth() &&\n    x.getDate() === y.getDate()\n  );\n}\n\n/*\n\nimport CustomContentModel from 'babel/models/custom-content';\nimport MissionModel from 'babel/models/mission';\nimport UserModel from 'babel/models/user';\n\ninterface MissionBrowserItemSignature {\n  Args: {\n    mission: MissionModel;\n    groupName: string;\n    students?: UserModel[];\n    sortable: boolean;\n    displayDetails: boolean;\n    onEdit(mission: MissionModel): void;\n    onCopy(mission: MissionModel): void;\n    onToggleActivation?(mission: MissionModel): void;\n    onSchedule?(mission: MissionModel): void;\n    onCancelSchedule?(mission: MissionModel): void;\n    onHide(mission: MissionModel): void;\n    onEditCustomContent(customContent: CustomContentModel): void;\n  };\n  Element: HTMLDivElement;\n}\n\n*/\n\nexport default class MissionBrowserItemComponent extends Component {\n  @service router;\n  @service session;\n  @service missionDispatcher;\n\n  @tracked isExpanding = false;\n  @tracked isTogglingVisibility = false;\n  @tracked isHiding = false;\n  @tracked isMissionOptionsActionMenuOpen = false;\n  @tracked isScheduleDetailModalOpen = false;\n\n  get canBeOpened() {\n    const mission = this.args.mission;\n\n    if (mission.hasDescription) return true;\n    if (mission.customContents.length > 0) return true;\n    if (mission.linkedEntities.length > 0) return true;\n    if (mission.files.length > 0) return true;\n\n    return false;\n  }\n\n  get hasEndBadge() {\n    const { daysLeft } = this.args.mission;\n\n    if (daysLeft === null) {\n      return false;\n    }\n\n    return this.args.mission.daysLeft <= 10;\n  }\n\n  get hasHiddenBadge() {\n    const mission = this.args.mission;\n\n    if (!this.session.user.isTeacher || !this.args.displayDetails) return false;\n\n    return !mission.active && !mission.isOngoing;\n  }\n\n  get schedule() {\n    const { mission } = this.args;\n\n    if (mission.isScheduled) {\n      if (mission.isOngoing) {\n        if (mission.endDate) {\n          return SCHEDULE.until;\n        } else {\n          return SCHEDULE.infinite;\n        }\n      } else if (mission.hasEnded) {\n        return SCHEDULE.ended;\n      }\n\n      if (mission.startDate && mission.endDate) {\n        if (dateIsEqual(mission.startDate, mission.endDate)) {\n          return SCHEDULE.equal;\n        }\n        return SCHEDULE.between;\n      }\n      return SCHEDULE.from;\n    }\n\n    return null;\n  }\n\n  get hasAuditLink() {\n    return (\n      this.session.user.isTeacher &&\n      this.args.mission.hasCustomContents &&\n      this.args.mission.canBeAudited\n    );\n  }\n\n  get isHighlighted() {\n    return this.missionDispatcher.highlightedMissions.includes(\n      this.args.mission\n    );\n  }\n\n  @action\n  handleMissionOptionsActionMenuSelect(value) {\n    switch (value) {\n      case 'copy':\n        this.#copy();\n        trackMissionEvent('Kopiera');\n        break;\n      case 'share':\n        this.#share();\n        trackMissionEvent('Dela');\n        break;\n      case 'edit':\n        this.#edit();\n        trackMissionEvent('Redigera');\n        break;\n      case 'audit':\n        this.#audit();\n        trackMissionEvent('Uppföljning av uppdrag');\n        break;\n      case 'hide':\n        if (this.router.currentRouteName === 'master.courses.show.missions') {\n          trackMissionEvent(\n            `${this.args.mission?.active ? 'Dölj från' : 'Visa på'} översikten`\n          );\n          this.#toggleActivation();\n        } else {\n          this.#hide();\n          trackMissionEvent('Dölj från översikten');\n        }\n        break;\n      case 'schedule':\n        this.isScheduleDetailModalOpen = true;\n        trackMissionEvent('Schemalägg');\n        break;\n      case 'delete':\n        this.missionDispatcher.delete(this.args.mission);\n        trackMissionEvent('Ta bort uppdrag');\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  async handleToggleVisiblitySwitchChange() {\n    this.#toggleActivation();\n  }\n\n  @action\n  handleSchedulingMenuButtonChange(value) {\n    switch (value) {\n      case SCHEDULING_MENU_BUTTON_ITEMS.edit:\n        this.isScheduleDetailModalOpen = true;\n        break;\n      case SCHEDULING_MENU_BUTTON_ITEMS.cancel:\n        this.#cancelSchedule();\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  async handleSchedulePopupSchedule({ startDate, endDate }) {\n    await this.#schedule(startDate, endDate);\n    this.isScheduleDetailModalOpen = false;\n  }\n\n  @action\n  handleHideButtonClick() {\n    this.#hide();\n  }\n\n  async #schedule(startDate, endDate) {\n    return this.args.onSchedule?.(this.args.mission, startDate, endDate);\n  }\n\n  #share() {\n    return this.args.onShare(this.args.mission);\n  }\n\n  #copy() {\n    return this.args.onCopy(this.args.mission);\n  }\n\n  #edit() {\n    return this.args.onEdit(this.args.mission);\n  }\n\n  #audit() {\n    this.router.transitionTo(\n      'master.courses.show.audit.missions.show',\n      this.args.mission.id\n    );\n  }\n\n  async #hide() {\n    this.isHiding = true;\n    try {\n      // Add a slight delay to let the fade out transition finnish. There's a\n      // better way to solve this with transition modifiers but this works for\n      // now.\n      await delay(500);\n      await this.args.onHide(this.args.mission);\n    } finally {\n      this.isHiding = false;\n    }\n  }\n\n  async #toggleActivation() {\n    this.isTogglingVisibility = true;\n    try {\n      await this.args.onToggleActivation?.(this.args.mission);\n    } finally {\n      // Add a slight delay to prevent the switch from being toogled back and\n      // forth too quickly.\n      await delay(1000);\n      this.isTogglingVisibility = false;\n    }\n  }\n\n  async #cancelSchedule() {\n    return this.args.onCancelSchedule?.(this.args.mission);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"mission-collator\\\" data-test-mission-collator ...attributes>\\n  <UiForm class=\\\"mb1\\\" @onSubmit={{this.handleSearchFormSubmit}}>\\n\\n    {{#let (generate-id) as |id|}}\\n      <UiLabel\\n        data-test-mission-collator-search-input-label\\n        @for={{id}}\\n        class=\\\"nb1\\\"\\n      >\\n        {{t \\\"components.missionCollator.searchInputLabel\\\"}}\\n      </UiLabel>\\n\\n      <div class=\\\"flex\\\">\\n        <UiInput\\n          class=\\\"flex-expand nr1\\\"\\n          data-test-mission-collator-search-input\\n          @controlId={{id}}\\n          @value={{this.search}}\\n          @placeholder={{t \\\"components.missionCollator.searchInputPlaceholder\\\"}}\\n          @clearable={{true}}\\n          @onClear={{this.handleSearchClear}}\\n        />\\n\\n        <UiButton\\n          data-test-mission-collator-search-button\\n          class=\\\"flex-none\\\"\\n          @onClick={{this.handleSearchFormSubmit}}>\\n          <DcIcon @name=\\\"search\\\" />\\n        </UiButton>\\n      </div>\\n    {{/let}}\\n\\n  </UiForm>\\n\\n  <div>\\n    {{#if @missions}}\\n\\n      {{yield @missions}}\\n\\n      <XPagination\\n        class=\\\"mt1 justify-space-between\\\"\\n        data-test-mission-collator-pagination\\n        @routed={{false}}\\n        @showFirstLast={{false}}\\n        @page={{@missions.meta.page}}\\n        @totalPages={{@missions.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    {{else}}\\n      <XAlert data-test-mission-collator-result-alert>\\n        {{t\\n          \\\"components.missionCollator.resultAlertMessage\\\"\\n          hasSearch=this.hasSearch\\n        }}\\n      </XAlert>\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"mission-collator\\\" data-test-mission-collator ...attributes>\\n  <UiForm class=\\\"mb1\\\" @onSubmit={{this.handleSearchFormSubmit}}>\\n\\n    {{#let (generate-id) as |id|}}\\n      <UiLabel\\n        data-test-mission-collator-search-input-label\\n        @for={{id}}\\n        class=\\\"nb1\\\"\\n      >\\n        {{t \\\"components.missionCollator.searchInputLabel\\\"}}\\n      </UiLabel>\\n\\n      <div class=\\\"flex\\\">\\n        <UiInput\\n          class=\\\"flex-expand nr1\\\"\\n          data-test-mission-collator-search-input\\n          @controlId={{id}}\\n          @value={{this.search}}\\n          @placeholder={{t \\\"components.missionCollator.searchInputPlaceholder\\\"}}\\n          @clearable={{true}}\\n          @onClear={{this.handleSearchClear}}\\n        />\\n\\n        <UiButton\\n          data-test-mission-collator-search-button\\n          class=\\\"flex-none\\\"\\n          @onClick={{this.handleSearchFormSubmit}}>\\n          <DcIcon @name=\\\"search\\\" />\\n        </UiButton>\\n      </div>\\n    {{/let}}\\n\\n  </UiForm>\\n\\n  <div>\\n    {{#if @missions}}\\n\\n      {{yield @missions}}\\n\\n      <XPagination\\n        class=\\\"mt1 justify-space-between\\\"\\n        data-test-mission-collator-pagination\\n        @routed={{false}}\\n        @showFirstLast={{false}}\\n        @page={{@missions.meta.page}}\\n        @totalPages={{@missions.meta.totalPages}}\\n        @onChange={{this.handlePaginationChange}}\\n      />\\n    {{else}}\\n      <XAlert data-test-mission-collator-result-alert>\\n        {{t\\n          \\\"components.missionCollator.resultAlertMessage\\\"\\n          hasSearch=this.hasSearch\\n        }}\\n      </XAlert>\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/mission-collator/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-collator/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { isPresent } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MissionCollator extends Component {\n  @tracked search = '';\n\n  get hasSearch() {\n    return isPresent(this.search);\n  }\n\n  @action\n  handleSearchFormSubmit() {\n    this.#search();\n  }\n\n  @action\n  handlePaginationChange(page) {\n    this.args.onChange({ page });\n  }\n\n  @action\n  handleSearchClear() {\n    this.search = '';\n    this.#search();\n  }\n\n  #search() {\n    this.args.onChange({ search: this.search });\n  }\n}\n","import { service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class MissionContentComponent extends Component {\n  /**\n   * Arguments:\n   * mission (object)\n   * onEditCustomContent (function)\n   */\n\n  @service session;\n\n  get hasContent() {\n    const mission = this.args.mission;\n\n    if (mission.hasDescription) return true;\n    if (mission.linkedEntities.length > 0) return true;\n    if (mission.files.length > 0) return true;\n\n    return false;\n  }\n\n  get isEmpty() {\n    if (this.hasContent) return false;\n    if (this.args.mission.customContents.length > 0) return false;\n\n    return true;\n  }\n\n  get showContent() {\n    return this.hasContent || this.isEmpty;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-content-custom-content-list\\n    {{if this.showAll 'mission-content-custom-content-list-full' ''}}\\n    {{if this.expanded 'mission-content-custom-content-list-expanded' ''}}\\\"\\n  ...attributes\\n  role=\\\"list\\\"\\n>\\n  {{#each @customContents as |customContent|}}\\n    <MissionContent::CustomContentList::Item\\n      @customContent={{customContent}}\\n      @mission={{@mission}}\\n      @onEdit={{@onEdit}}\\n    />\\n  {{/each}}\\n\\n  {{#if this.canBeExpanded}}\\n    <div class=\\\"mission-content-custom-content-list-expand\\\">\\n      <UiButton\\n        class=\\\"mission-content-custom-content-list-expand-button\\\"\\n        @shape=\\\"rounded\\\"\\n        @onClick={{fn (mut this.expanded) (not this.expanded)}}\\n      >\\n        {{#if this.expanded}}\\n          <DcIcon class=\\\"nr1\\\" @name=\\\"small-up\\\" />\\n          {{t \\\"components.missionContent.customContentList.collapseLabel\\\"}}\\n        {{else}}\\n          <DcIcon class=\\\"nr1\\\" @name=\\\"small-down\\\" />\\n          {{t \\\"components.missionContent.customContentList.expandLabel\\\"}}\\n        {{/if}}\\n      </UiButton>\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div\\n  class=\\\"mission-content-custom-content-list\\n    {{if this.showAll 'mission-content-custom-content-list-full' ''}}\\n    {{if this.expanded 'mission-content-custom-content-list-expanded' ''}}\\\"\\n  ...attributes\\n  role=\\\"list\\\"\\n>\\n  {{#each @customContents as |customContent|}}\\n    <MissionContent::CustomContentList::Item\\n      @customContent={{customContent}}\\n      @mission={{@mission}}\\n      @onEdit={{@onEdit}}\\n    />\\n  {{/each}}\\n\\n  {{#if this.canBeExpanded}}\\n    <div class=\\\"mission-content-custom-content-list-expand\\\">\\n      <UiButton\\n        class=\\\"mission-content-custom-content-list-expand-button\\\"\\n        @shape=\\\"rounded\\\"\\n        @onClick={{fn (mut this.expanded) (not this.expanded)}}\\n      >\\n        {{#if this.expanded}}\\n          <DcIcon class=\\\"nr1\\\" @name=\\\"small-up\\\" />\\n          {{t \\\"components.missionContent.customContentList.collapseLabel\\\"}}\\n        {{else}}\\n          <DcIcon class=\\\"nr1\\\" @name=\\\"small-down\\\" />\\n          {{t \\\"components.missionContent.customContentList.expandLabel\\\"}}\\n        {{/if}}\\n      </UiButton>\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"babel/components/mission-content/custom-content-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-content/custom-content-list/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\n/*\nimport CustomContentModel from 'babel/models/custom-content';\n\ninterface MissionContentCustomContentSignature {\n  Args: {\n    customContents: CustomContentModel[];\n    showAll?: boolean;\n  };\n  Element: HTMLDivElement;\n}\n*/\n\nexport default class MissionContentCustomContentList extends Component {\n  @tracked expanded = false;\n\n  get canBeExpanded() {\n    if (this.showAll) return false;\n\n    return (this.args.customContents?.length ?? 0) > 2;\n  }\n\n  get showAll() {\n    return this.args.showAll ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XAwait @value={{this.routePromise}} as |routeInfo|>\\n  <XAwait @value={{this.entityPromise}} as |result|>\\n    {{! template-lint-disable require-context-role }}\\n    {{#if result.entity}}\\n      <UiLink\\n        @route={{routeInfo.route}}\\n        @model={{routeInfo.model}}\\n        @query={{routeInfo.query}}\\n        class=\\\"mission-content-custom-content-list-item\\\"\\n        ...attributes\\n        data-highlighted={{this.isHighlighted}}\\n        role=\\\"listitem\\\"\\n        data-test-custom-content-list-item-link\\n      >\\n        <div class=\\\"mission-content-custom-content-list-item-content\\\">\\n          <MissionContent::CustomContentList::Item::Thumbnail\\n            @entity={{result.entity}}\\n          />\\n\\n          {{@customContent.titleWithFallback}}\\n        </div>\\n\\n        {{#if this.session.user.isTeacher}}\\n          {{#let\\n            (generate-id)\\n            (t\\n              \\\"components.missionContent.customContentList.item.customizeButtonLabel\\\"\\n            )\\n            as |id label|\\n          }}\\n            <UiButton\\n              id={{id}}\\n              @appearance=\\\"link\\\"\\n              @onClick={{this.handleEditButtonClick}}\\n            >\\n              <DcIcon class=\\\"nr1\\\" @name=\\\"customize\\\" />\\n              <span class=\\\"hide-sm\\\">\\n                {{label}}\\n              </span>\\n            </UiButton>\\n\\n            <XTooltip @for={{id}} @disabled={{(not (media \\\"sm\\\"))}}>\\n              {{label}}\\n            </XTooltip>\\n          {{/let}}\\n        {{/if}}\\n      </UiLink>\\n    {{else}}\\n      <XAlert\\n        class=\\\"mission-content-custom-content-list-item--error flex-expand\\\"\\n        @variant=\\\"error\\\"\\n      >\\n        {{#if result.notFound}}\\n          {{t\\n            \\\"components.missionContent.customContentList.item.rejectedAlertMessage\\\"\\n          }}\\n        {{else}}\\n          {{t\\n            \\\"components.missionContent.customContentList.item.invalidAlertMessage\\\"\\n          }}\\n        {{/if}}\\n      </XAlert>\\n    {{/if}}\\n  </XAwait>\\n</XAwait>\", {\"contents\":\"<XAwait @value={{this.routePromise}} as |routeInfo|>\\n  <XAwait @value={{this.entityPromise}} as |result|>\\n    {{! template-lint-disable require-context-role }}\\n    {{#if result.entity}}\\n      <UiLink\\n        @route={{routeInfo.route}}\\n        @model={{routeInfo.model}}\\n        @query={{routeInfo.query}}\\n        class=\\\"mission-content-custom-content-list-item\\\"\\n        ...attributes\\n        data-highlighted={{this.isHighlighted}}\\n        role=\\\"listitem\\\"\\n        data-test-custom-content-list-item-link\\n      >\\n        <div class=\\\"mission-content-custom-content-list-item-content\\\">\\n          <MissionContent::CustomContentList::Item::Thumbnail\\n            @entity={{result.entity}}\\n          />\\n\\n          {{@customContent.titleWithFallback}}\\n        </div>\\n\\n        {{#if this.session.user.isTeacher}}\\n          {{#let\\n            (generate-id)\\n            (t\\n              \\\"components.missionContent.customContentList.item.customizeButtonLabel\\\"\\n            )\\n            as |id label|\\n          }}\\n            <UiButton\\n              id={{id}}\\n              @appearance=\\\"link\\\"\\n              @onClick={{this.handleEditButtonClick}}\\n            >\\n              <DcIcon class=\\\"nr1\\\" @name=\\\"customize\\\" />\\n              <span class=\\\"hide-sm\\\">\\n                {{label}}\\n              </span>\\n            </UiButton>\\n\\n            <XTooltip @for={{id}} @disabled={{(not (media \\\"sm\\\"))}}>\\n              {{label}}\\n            </XTooltip>\\n          {{/let}}\\n        {{/if}}\\n      </UiLink>\\n    {{else}}\\n      <XAlert\\n        class=\\\"mission-content-custom-content-list-item--error flex-expand\\\"\\n        @variant=\\\"error\\\"\\n      >\\n        {{#if result.notFound}}\\n          {{t\\n            \\\"components.missionContent.customContentList.item.rejectedAlertMessage\\\"\\n          }}\\n        {{else}}\\n          {{t\\n            \\\"components.missionContent.customContentList.item.invalidAlertMessage\\\"\\n          }}\\n        {{/if}}\\n      </XAlert>\\n    {{/if}}\\n  </XAwait>\\n</XAwait>\",\"moduleName\":\"babel/components/mission-content/custom-content-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-content/custom-content-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { trackMissionEvent } from 'babel/utils/matomo-events';\nimport { all } from 'rsvp';\n\nexport default class MissionContentCustomContentListItem extends Component {\n  @service router;\n  @service session;\n  @service customContentDispatcher;\n  @service entityInspector;\n  @service missionDispatcher;\n  @service contextHelper;\n\n  get isHighlighted() {\n    return (\n      this.customContentDispatcher.highlightedCustomContent ===\n      this.args.customContent\n    );\n  }\n\n  get routePromise() {\n    return this.missionDispatcher\n      .getRoute(this.args.mission, this.args.customContent)\n      .then((routeArgs) => ({\n        route: routeArgs?.[0],\n        model: routeArgs?.[1],\n        query: routeArgs?.[2]?.queryParams,\n      }))\n      .catch(() => {});\n  }\n\n  get entityPromise() {\n    return all([this.args.customContent?.entity, this.args.mission?.course])\n      .then(([entity, course]) =>\n        all([entity?.book, course.allBooks]).then(([book, allowedBooks]) => {\n          if (book && allowedBooks && !allowedBooks.includes(book)) {\n            return { entity: null, notFound: false, invalid: true };\n          }\n\n          return { entity, notFound: false, invalid: false };\n        })\n      )\n      .catch(() => ({ entity: null, notFound: true, invalid: false }));\n  }\n\n  @action\n  async handleEditButtonClick(evt) {\n    evt.stopImmediatePropagation();\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    trackMissionEvent('Anpassa innehållet');\n\n    const entity = await this.args.customContent.entity;\n    const book = await entity.book;\n\n    let entities;\n\n    if (this.args.customContent.populated) {\n      const includedEntities = await this.args.customContent.includedEntities;\n      entities = includedEntities;\n    } else {\n      entities = await entity.children;\n    }\n\n    const categoryId = this.session.user.getPreferredTextVersion(book.id);\n\n    const sections = entities\n      .toArray()\n      .filter((entity) => {\n        if (entity.type === 'sections') {\n          return categoryId ? entity.category?.id === categoryId : true;\n        }\n        return false;\n      })\n      .sortBy('sort');\n\n    const section = sections.at(0);\n\n    const [route, model, query] = await this.missionDispatcher.getRoute(\n      this.args.mission,\n      this.args.customContent\n    );\n\n    this.router.transitionTo(route, model, {\n      queryParams: { ...query.queryParams, section: section?.id },\n    });\n\n    this.router.on('routeDidChange', this.afterRouteChange);\n  }\n\n  @action\n  async afterRouteChange() {\n    this.router.off('routeDidChange', this.afterRouteChange);\n\n    // We should open the modal if we reached a custom content.\n    if (this.contextHelper.inCustomContent) {\n      const entity = await this.args.customContent.entity;\n      this.entityInspector.openModal(entity, 'missionCustomizer');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-content-custom-content-list-item-thumbnail\\\"\\n  data-with-image={{@image}}\\n  ...attributes\\n>\\n\\n  <XImage\\n    class=\\\"mission-content-custom-content-list-item-thumbnail-image\\\"\\n    @source={{this.imageSource}}\\n    @width={{@image.imageWidth}}\\n    @height={{@image.imageHeight}}\\n    @color={{@image.imageColor}}\\n    @mimetype={{@image.imageMimetype}}\\n    @alt={{@image.alt}}\\n    @cover={{true}}\\n  />\\n\\n</div>\", {\"contents\":\"<div\\n  class=\\\"mission-content-custom-content-list-item-thumbnail\\\"\\n  data-with-image={{@image}}\\n  ...attributes\\n>\\n\\n  <XImage\\n    class=\\\"mission-content-custom-content-list-item-thumbnail-image\\\"\\n    @source={{this.imageSource}}\\n    @width={{@image.imageWidth}}\\n    @height={{@image.imageHeight}}\\n    @color={{@image.imageColor}}\\n    @mimetype={{@image.imageMimetype}}\\n    @alt={{@image.alt}}\\n    @cover={{true}}\\n  />\\n\\n</div>\",\"moduleName\":\"babel/components/mission-content/custom-content-list/item/thumbnail/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-content/custom-content-list/item/thumbnail/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport imageSource from 'compton/utils/image-source';\n\nexport default class MissionContentCustomContentListItemThumbnail extends Component {\n  get imageSource() {\n    const url = this.args.entity.imageUrl ?? this.args.entity.featuredImage;\n\n    const settings = {\n      width: 132,\n      height: 132,\n      embed: true,\n    };\n\n    if (this.image?.metadata?.focus_point) {\n      settings.x = this.image.metadata.focus_point.x;\n      settings.y = this.image.metadata.focus_point.y;\n    }\n\n    return imageSource(url, settings);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.showContent}}\\n  <div class=\\\"mission-content\\\" ...attributes>\\n    {{#if this.isEmpty}}\\n      <div class=\\\"mission-content-description\\\">\\n        {{t\\n          \\\"components.missionContent.emptyMessage\\\"\\n          isTeacher=this.session.user.isTeacher\\n        }}\\n      </div>\\n    {{/if}}\\n\\n    {{#if @mission.hasDescription}}\\n      <div class=\\\"mission-content-description\\\">\\n        <EditorPreview @content={{@mission.description}} />\\n      </div>\\n    {{/if}}\\n\\n    {{#if (or @mission.files @mission.linkedEntities)}}\\n      <AttachmentPreview\\n        class=\\\"mt1 nb1\\\"\\n        @entities={{@mission.linkedEntities}}\\n        @allowedBooks={{@mission.course.allBooks}}\\n        @session={{this.session}}\\n        @files={{@mission.files}}\\n        @sortable={{false}}\\n        @removeable={{false}}\\n      />\\n    {{/if}}\\n  </div>\\n{{/if}}\\n\\n{{#if (gt @mission.sortedCustomContents.length 0)}}\\n  <MissionContent::CustomContentList\\n    @customContents={{@mission.sortedCustomContents}}\\n    @mission={{@mission}}\\n    @onEdit={{@onEditCustomContent}}\\n    @showAll={{@showAll}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/mission-content/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-detail-modal-custom-content-list\\\"\\n  ...attributes\\n  {{sortable-group onChange=@onSort}}\\n>\\n\\n  {{#each @customContents as |customContent index|}}\\n    <MissionDetailModal::CustomContentList::Item\\n      @mission={{@mission}}\\n      @customContent={{customContent}}\\n      @index={{index}}\\n      @onRemove={{@onRemove}}\\n      @canSort={{gte @customContents.length 2}}\\n    />\\n  {{/each}}\\n\\n</div>\", {\"contents\":\"<div\\n  class=\\\"mission-detail-modal-custom-content-list\\\"\\n  ...attributes\\n  {{sortable-group onChange=@onSort}}\\n>\\n\\n  {{#each @customContents as |customContent index|}}\\n    <MissionDetailModal::CustomContentList::Item\\n      @mission={{@mission}}\\n      @customContent={{customContent}}\\n      @index={{index}}\\n      @onRemove={{@onRemove}}\\n      @canSort={{gte @customContents.length 2}}\\n    />\\n  {{/each}}\\n\\n</div>\",\"moduleName\":\"babel/components/mission-detail-modal/custom-content-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-detail-modal/custom-content-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<UiButton\\n  class=\\\"mission-detail-modal-custom-content-list-item-action-button\\\"\\n  ...attributes\\n  data-active={{this.active}}\\n  @appearance=\\\"none\\\"\\n  @onClick={{@onClick}}\\n>\\n  {{yield}}\\n</UiButton>\", {\"contents\":\"<UiButton\\n  class=\\\"mission-detail-modal-custom-content-list-item-action-button\\\"\\n  ...attributes\\n  data-active={{this.active}}\\n  @appearance=\\\"none\\\"\\n  @onClick={{@onClick}}\\n>\\n  {{yield}}\\n</UiButton>\",\"moduleName\":\"babel/components/mission-detail-modal/custom-content-list/item/action-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-detail-modal/custom-content-list/item/action-button/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class MissionDetailModalCustomContentListItemActionButtonComponent extends Component {\n  get active() {\n    return this.args.active ?? false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"mission-detail-modal-custom-content-list-item\\\"\\n  ...attributes\\n  {{sortable-item model=@customContent}}\\n>\\n  <XAwait @value={{this.entityPromise}} as |result|>\\n    {{#if result.entity}}\\n      <div class=\\\"flex flex-column\\\">\\n        <div class=\\\"text-ui\\\">\\n          {{increment @index}}.\\n          {{@customContent.titleWithFallback}}\\n        </div>\\n      </div>\\n    {{else}}\\n      <XAlert class=\\\"flex-expand mr1\\\" @variant=\\\"error\\\">\\n        {{#if result.notFound}}\\n          {{t\\n            \\\"components.missionDetailModal.customContentList.item.rejectedAlertMessage\\\"\\n          }}\\n        {{else}}\\n          {{t\\n            \\\"components.missionDetailModal.customContentList.item.invalidAlertMessage\\\"\\n          }}\\n        {{/if}}\\n      </XAlert>\\n    {{/if}}\\n  </XAwait>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    {{#let (generate-id) as |id|}}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        class=\\\"mr1\\\"\\n        id={{id}}\\n        @active={{this.isPathPopupOpen}}\\n        @onClick={{this.handlePathButtonClick}}\\n      >\\n        <DcIcon @name=\\\"Path\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n\\n      {{#if this.isPathPopupOpen}}\\n        <XPopup\\n          @for={{id}}\\n          @onClose={{set this \\\"isPathPopupOpen\\\"}}\\n          @class=\\\"z-index1\\\"\\n        >\\n          <XBreadcrumb class=\\\"p1\\\" as |breadcrumb|>\\n            {{#each this.parents as |parent|}}\\n              <breadcrumb.item @active={{true}}>\\n                {{parent.title}}\\n              </breadcrumb.item>\\n            {{/each}}\\n          </XBreadcrumb>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n\\n    {{#if @canSort}}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        class=\\\"mission-detail-modal-custom-content-list-item-drag-button mr1\\\"\\n        @appearance=\\\"none\\\"\\n        {{sortable-handle}}\\n      >\\n        <DcIcon @name=\\\"drag\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n    {{/if}}\\n\\n    {{#let\\n      (generate-id)\\n      (t\\n        \\\"components.missionDetailModal.customContentList.item.removeButtonLabel\\\"\\n      )\\n      as |id label|\\n    }}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        id={{id}}\\n        class=\\\"text-muted\\\"\\n        aria-label={{label}}\\n        @appearance=\\\"none\\\"\\n        @onClick={{fn @onRemove @customContent}}\\n      >\\n        <DcIcon @name=\\\"remove-circle\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n\\n      <XTooltip @for={{id}}>{{label}}</XTooltip>\\n    {{/let}}\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"mission-detail-modal-custom-content-list-item\\\"\\n  ...attributes\\n  {{sortable-item model=@customContent}}\\n>\\n  <XAwait @value={{this.entityPromise}} as |result|>\\n    {{#if result.entity}}\\n      <div class=\\\"flex flex-column\\\">\\n        <div class=\\\"text-ui\\\">\\n          {{increment @index}}.\\n          {{@customContent.titleWithFallback}}\\n        </div>\\n      </div>\\n    {{else}}\\n      <XAlert class=\\\"flex-expand mr1\\\" @variant=\\\"error\\\">\\n        {{#if result.notFound}}\\n          {{t\\n            \\\"components.missionDetailModal.customContentList.item.rejectedAlertMessage\\\"\\n          }}\\n        {{else}}\\n          {{t\\n            \\\"components.missionDetailModal.customContentList.item.invalidAlertMessage\\\"\\n          }}\\n        {{/if}}\\n      </XAlert>\\n    {{/if}}\\n  </XAwait>\\n\\n  <div class=\\\"flex flex-center\\\">\\n    {{#let (generate-id) as |id|}}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        class=\\\"mr1\\\"\\n        id={{id}}\\n        @active={{this.isPathPopupOpen}}\\n        @onClick={{this.handlePathButtonClick}}\\n      >\\n        <DcIcon @name=\\\"Path\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n\\n      {{#if this.isPathPopupOpen}}\\n        <XPopup\\n          @for={{id}}\\n          @onClose={{set this \\\"isPathPopupOpen\\\"}}\\n          @class=\\\"z-index1\\\"\\n        >\\n          <XBreadcrumb class=\\\"p1\\\" as |breadcrumb|>\\n            {{#each this.parents as |parent|}}\\n              <breadcrumb.item @active={{true}}>\\n                {{parent.title}}\\n              </breadcrumb.item>\\n            {{/each}}\\n          </XBreadcrumb>\\n        </XPopup>\\n      {{/if}}\\n    {{/let}}\\n\\n    {{#if @canSort}}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        class=\\\"mission-detail-modal-custom-content-list-item-drag-button mr1\\\"\\n        @appearance=\\\"none\\\"\\n        {{sortable-handle}}\\n      >\\n        <DcIcon @name=\\\"drag\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n    {{/if}}\\n\\n    {{#let\\n      (generate-id)\\n      (t\\n        \\\"components.missionDetailModal.customContentList.item.removeButtonLabel\\\"\\n      )\\n      as |id label|\\n    }}\\n      <MissionDetailModal::CustomContentList::Item::ActionButton\\n        id={{id}}\\n        class=\\\"text-muted\\\"\\n        aria-label={{label}}\\n        @appearance=\\\"none\\\"\\n        @onClick={{fn @onRemove @customContent}}\\n      >\\n        <DcIcon @name=\\\"remove-circle\\\" />\\n      </MissionDetailModal::CustomContentList::Item::ActionButton>\\n\\n      <XTooltip @for={{id}}>{{label}}</XTooltip>\\n    {{/let}}\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/mission-detail-modal/custom-content-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-detail-modal/custom-content-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { all } from 'rsvp';\n\nexport default class MissionDetailModalCustomContentListItemComponent extends Component {\n  @tracked parents = null;\n\n  @tracked isPathPopupOpen = false;\n\n  get entityPromise() {\n    return all([this.args.customContent?.entity, this.args.mission?.course])\n      .then(([entity, course]) =>\n        all([entity.book, course.allBooks]).then(([book, allowedBooks]) => {\n          if (book && allowedBooks && !allowedBooks.includes(book)) {\n            return { entity: null, notFound: false, invalid: true };\n          }\n\n          return { entity, notFound: false, invalid: false };\n        })\n      )\n      .catch(() => ({ entity: null, notFound: true, invalid: false }));\n  }\n\n  @action\n  async handlePathButtonClick() {\n    if (!this.parents) {\n      const entity = await this.args.customContent.entity;\n      this.parents = (await entity.getParents()).toArray().reverse();\n    }\n\n    this.isPathPopupOpen = true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t \\\"components.missionDetailModal.title\\\" isNew=this.isNew}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  @onClose={{@onClose}}\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <UiFormFor\\n    @object={{@mission}}\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @onSubmit={{this.handleFormSubmit}}\\n    {{ref (set this \\\"formElement\\\")}}\\n    as |form|\\n  >\\n    <modal.content class=\\\"p1\\\">\\n      <WaitFor @resource={{this.resource}}>\\n        <div class=\\\"mb1\\\">\\n          <form.label\\n            @key=\\\"title\\\"\\n            @content={{t \\\"components.missionDetailModal.titleInputLabel\\\"}}\\n          />\\n\\n          <form.input\\n            @key=\\\"title\\\"\\n            @autofocus={{this.isNew}}\\n            @placeholder={{t\\n              \\\"components.missionDetailModal.titleInputPlaceholder\\\"\\n            }}\\n          />\\n        </div>\\n\\n        <div class=\\\"mb1\\\">\\n          <form.label\\n            @key=\\\"description\\\"\\n            @content={{t\\n              \\\"components.missionDetailModal.descriptionEditorLabel\\\"\\n            }}\\n          />\\n\\n          <XEditor\\n            @value={{@mission.description}}\\n            @capabilities={{this.descriptionEditorCapabilities}}\\n            @onChange={{set @mission \\\"description\\\"}}\\n          />\\n\\n          <XMenuButton\\n            @class=\\\"mt1\\\"\\n            @appearance=\\\"link\\\"\\n            @displayArrowIcon={{false}}\\n            @size=\\\"small\\\"\\n            @items={{this.attachMenuButtonItems}}\\n            @onChange={{this.handleAttachMenuButtonChange}}\\n          >\\n            <DcIcon @name=\\\"attach\\\" class=\\\"nr1\\\" />\\n            {{t \\\"components.missionDetailModal.attachMenuButtonLabel\\\"}}\\n          </XMenuButton>\\n        </div>\\n\\n        {{#if (or @mission.linkedEntities @mission.files)}}\\n          <AttachmentPreview\\n            class=\\\"mb1\\\"\\n            @files={{@mission.files}}\\n            @entities={{@mission.linkedEntities}}\\n            @allowedBooks={{@mission.course.allBooks}}\\n            @session={{this.session}}\\n            @sortable={{false}}\\n            @removeable={{true}}\\n            @onRemoveEntity={{this.handleLinkAttachmentRemove}}\\n            @onRemoveFile={{this.handleFilesPreviewerRemove}}\\n          />\\n        {{/if}}\\n\\n        <div class=\\\"mb1\\\">\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.customContentList.headingLabel\\\"}}\\n          </div>\\n\\n          <XAlert class=\\\"nb1\\\">\\n            <div class=\\\"flex flex-center\\\">\\n              <DcIcon class=\\\"mr1\\\" @name=\\\"customize\\\" />\\n\\n              {{t \\\"components.missionDetailModal.customizeInfo\\\"}}\\n            </div>\\n          </XAlert>\\n\\n          <UiButton\\n            @active={{this.isContentEntityImportModalOpen}}\\n            @onClick={{set this \\\"isContentEntityImportModalOpen\\\" true}}\\n          >\\n            <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n            {{t\\n              \\\"components.missionDetailModal.customContentList.addNewButtonLabel\\\"\\n            }}\\n          </UiButton>\\n\\n          {{#if @mission.sortedCustomContents}}\\n            {{#if this.isNew}}\\n              <div class=\\\"text-small my1\\\">\\n                {{t\\n                  \\\"components.missionDetailModal.customContentList.customizeMessage\\\"\\n                }}\\n              </div>\\n            {{/if}}\\n\\n            <MissionDetailModal::CustomContentList\\n              class=\\\"mt1\\\"\\n              @mission={{@mission}}\\n              @customContents={{@mission.sortedCustomContents}}\\n              @onSort={{this.handleCustomContentListSort}}\\n              @onRemove={{this.handleCustomContentListRemove}}\\n            />\\n          {{/if}}\\n        </div>\\n\\n        <div class=\\\"mb1\\\">\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.optionsHeadingLabel\\\"}}\\n          </div>\\n\\n          <div>\\n            <XCheckbox\\n              class=\\\"nb1\\\"\\n              @checked={{@mission.hasReceivers}}\\n              @onChange={{this.handleTargetIndividualReceiversCheckboxChange}}\\n            >\\n              {{t\\n                \\\"components.missionDetailModal.targetIndividualReceiversCheckboxLabel\\\"\\n              }}\\n            </XCheckbox>\\n          </div>\\n\\n          {{#if @mission.hasReceivers}}\\n            <UserSelect\\n              class=\\\"nt1 nb1\\\"\\n              @users={{@mission.course.students}}\\n              @selected={{@mission.receivers}}\\n            />\\n          {{/if}}\\n\\n          <div>\\n            <XCheckbox @checked={{@mission.hideSolutions}}>\\n              {{t \\\"components.missionDetailModal.hideSolutionsCheckboxLabel\\\"}}\\n            </XCheckbox>\\n          </div>\\n        </div>\\n\\n        <div>\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.visibilityHeadingLabel\\\"}}\\n          </div>\\n\\n          <UiRadioButtonGroup\\n            @elementId=\\\"groupAppearance\\\"\\n            @groupValue={{this.visibility}}\\n            @options={{this.visibilityOptions}}\\n            @twoWay={{false}}\\n            @onChange={{this.handleVisibilityRadioButtonGroupChange}}\\n          />\\n\\n          {{#if (eq this.visibility \\\"scheduled\\\")}}\\n            <ScheduleFormPart\\n              class=\\\"mt1\\\"\\n              @startDate={{@mission.startDate}}\\n              @endDate={{@mission.endDate}}\\n              @onSetStartDate={{set @mission \\\"startDate\\\"}}\\n              @onSetEndDate={{set @mission \\\"endDate\\\"}}\\n              {{ref (set this \\\"scheduleFormPartElement\\\")}}\\n            />\\n          {{/if}}\\n        </div>\\n      </WaitFor>\\n    </modal.content>\\n\\n    <modal.footer\\n      class={{class (if this.isNew \\\"justify-flex-end\\\" \\\"justify-space-between\\\")}}\\n    >\\n      {{#unless this.isNew}}\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          @variant=\\\"error\\\"\\n          @disabled={{this.resource.isPending}}\\n          @onClick={{@onDelete}}\\n        >\\n          {{t \\\"components.missionDetailModal.deleteButtonLabel\\\"}}\\n        </UiButton>\\n      {{/unless}}\\n\\n      <div class=\\\"flex-none\\\">\\n        <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n          {{t \\\"components.missionDetailModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n\\n        <form.submit @disabled={{this.resource.isPending}}>\\n          {{t \\\"components.missionDetailModal.saveButtonLabel\\\"}}\\n        </form.submit>\\n      </div>\\n    </modal.footer>\\n  </UiFormFor>\\n</XModal>\\n\\n{{#if this.isFileChooseModalOpen}}\\n  <FileChooseModal\\n    @disabledFiles={{@mission.files}}\\n    @onChoose={{this.handleFileChooseModalChoose}}\\n    @onClose={{set this \\\"isFileChooseModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isAttachLinkModalOpen}}\\n  <AttachLinkModal\\n    @onChoose={{this.handleAttachLinkModalChoose}}\\n    @onClose={{set this \\\"isAttachLinkModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isEntityImportModalOpen}}\\n  <EntityImportModal\\n    @entity={{this.firstBook}}\\n    @books={{@mission.course.books}}\\n    @expandedEntities={{this.expandedEntities}}\\n    @disabledEntities={{@mission.linkedEntities}}\\n    @multiple={{true}}\\n    @onExpand={{this.handleEntityImportModalExpand}}\\n    @onCollapse={{this.handleEntityImportModalCollapse}}\\n    @onImport={{this.handleEntityImportModalImport}}\\n    @onClose={{set this \\\"isEntityImportModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isContentEntityImportModalOpen}}\\n  <EntityImportModal\\n    @books={{@mission.course.books}}\\n    @expandedEntities={{this.expandedContentEntities}}\\n    @disabledEntities={{@mission.entities}}\\n    @importableTypes={{array \\\"contents\\\" \\\"interactives\\\"}}\\n    @multiple={{true}}\\n    @onExpand={{this.handleContentEntityImportModalExpand}}\\n    @onCollapse={{this.handleContentEntityImportModalCollapse}}\\n    @onImport={{this.handleContentEntityImportModalImport}}\\n    @onClose={{set this \\\"isContentEntityImportModalOpen\\\" false}}\\n  />\\n{{/if}}\", {\"contents\":\"<XModal\\n  @title={{t \\\"components.missionDetailModal.title\\\" isNew=this.isNew}}\\n  @size={{hash width=\\\"medium\\\" height=\\\"large\\\"}}\\n  @locked={{true}}\\n  @closeButton={{false}}\\n  @onClose={{@onClose}}\\n  as |modal|\\n>\\n  <modal.header />\\n\\n  <UiFormFor\\n    @object={{@mission}}\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @onSubmit={{this.handleFormSubmit}}\\n    {{ref (set this \\\"formElement\\\")}}\\n    as |form|\\n  >\\n    <modal.content class=\\\"p1\\\">\\n      <WaitFor @resource={{this.resource}}>\\n        <div class=\\\"mb1\\\">\\n          <form.label\\n            @key=\\\"title\\\"\\n            @content={{t \\\"components.missionDetailModal.titleInputLabel\\\"}}\\n          />\\n\\n          <form.input\\n            @key=\\\"title\\\"\\n            @autofocus={{this.isNew}}\\n            @placeholder={{t\\n              \\\"components.missionDetailModal.titleInputPlaceholder\\\"\\n            }}\\n          />\\n        </div>\\n\\n        <div class=\\\"mb1\\\">\\n          <form.label\\n            @key=\\\"description\\\"\\n            @content={{t\\n              \\\"components.missionDetailModal.descriptionEditorLabel\\\"\\n            }}\\n          />\\n\\n          <XEditor\\n            @value={{@mission.description}}\\n            @capabilities={{this.descriptionEditorCapabilities}}\\n            @onChange={{set @mission \\\"description\\\"}}\\n          />\\n\\n          <XMenuButton\\n            @class=\\\"mt1\\\"\\n            @appearance=\\\"link\\\"\\n            @displayArrowIcon={{false}}\\n            @size=\\\"small\\\"\\n            @items={{this.attachMenuButtonItems}}\\n            @onChange={{this.handleAttachMenuButtonChange}}\\n          >\\n            <DcIcon @name=\\\"attach\\\" class=\\\"nr1\\\" />\\n            {{t \\\"components.missionDetailModal.attachMenuButtonLabel\\\"}}\\n          </XMenuButton>\\n        </div>\\n\\n        {{#if (or @mission.linkedEntities @mission.files)}}\\n          <AttachmentPreview\\n            class=\\\"mb1\\\"\\n            @files={{@mission.files}}\\n            @entities={{@mission.linkedEntities}}\\n            @allowedBooks={{@mission.course.allBooks}}\\n            @session={{this.session}}\\n            @sortable={{false}}\\n            @removeable={{true}}\\n            @onRemoveEntity={{this.handleLinkAttachmentRemove}}\\n            @onRemoveFile={{this.handleFilesPreviewerRemove}}\\n          />\\n        {{/if}}\\n\\n        <div class=\\\"mb1\\\">\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.customContentList.headingLabel\\\"}}\\n          </div>\\n\\n          <XAlert class=\\\"nb1\\\">\\n            <div class=\\\"flex flex-center\\\">\\n              <DcIcon class=\\\"mr1\\\" @name=\\\"customize\\\" />\\n\\n              {{t \\\"components.missionDetailModal.customizeInfo\\\"}}\\n            </div>\\n          </XAlert>\\n\\n          <UiButton\\n            @active={{this.isContentEntityImportModalOpen}}\\n            @onClick={{set this \\\"isContentEntityImportModalOpen\\\" true}}\\n          >\\n            <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n            {{t\\n              \\\"components.missionDetailModal.customContentList.addNewButtonLabel\\\"\\n            }}\\n          </UiButton>\\n\\n          {{#if @mission.sortedCustomContents}}\\n            {{#if this.isNew}}\\n              <div class=\\\"text-small my1\\\">\\n                {{t\\n                  \\\"components.missionDetailModal.customContentList.customizeMessage\\\"\\n                }}\\n              </div>\\n            {{/if}}\\n\\n            <MissionDetailModal::CustomContentList\\n              class=\\\"mt1\\\"\\n              @mission={{@mission}}\\n              @customContents={{@mission.sortedCustomContents}}\\n              @onSort={{this.handleCustomContentListSort}}\\n              @onRemove={{this.handleCustomContentListRemove}}\\n            />\\n          {{/if}}\\n        </div>\\n\\n        <div class=\\\"mb1\\\">\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.optionsHeadingLabel\\\"}}\\n          </div>\\n\\n          <div>\\n            <XCheckbox\\n              class=\\\"nb1\\\"\\n              @checked={{@mission.hasReceivers}}\\n              @onChange={{this.handleTargetIndividualReceiversCheckboxChange}}\\n            >\\n              {{t\\n                \\\"components.missionDetailModal.targetIndividualReceiversCheckboxLabel\\\"\\n              }}\\n            </XCheckbox>\\n          </div>\\n\\n          {{#if @mission.hasReceivers}}\\n            <UserSelect\\n              class=\\\"nt1 nb1\\\"\\n              @users={{@mission.course.students}}\\n              @selected={{@mission.receivers}}\\n            />\\n          {{/if}}\\n\\n          <div>\\n            <XCheckbox @checked={{@mission.hideSolutions}}>\\n              {{t \\\"components.missionDetailModal.hideSolutionsCheckboxLabel\\\"}}\\n            </XCheckbox>\\n          </div>\\n        </div>\\n\\n        <div>\\n          <div class=\\\"text-tertiary nb1\\\">\\n            {{t \\\"components.missionDetailModal.visibilityHeadingLabel\\\"}}\\n          </div>\\n\\n          <UiRadioButtonGroup\\n            @elementId=\\\"groupAppearance\\\"\\n            @groupValue={{this.visibility}}\\n            @options={{this.visibilityOptions}}\\n            @twoWay={{false}}\\n            @onChange={{this.handleVisibilityRadioButtonGroupChange}}\\n          />\\n\\n          {{#if (eq this.visibility \\\"scheduled\\\")}}\\n            <ScheduleFormPart\\n              class=\\\"mt1\\\"\\n              @startDate={{@mission.startDate}}\\n              @endDate={{@mission.endDate}}\\n              @onSetStartDate={{set @mission \\\"startDate\\\"}}\\n              @onSetEndDate={{set @mission \\\"endDate\\\"}}\\n              {{ref (set this \\\"scheduleFormPartElement\\\")}}\\n            />\\n          {{/if}}\\n        </div>\\n      </WaitFor>\\n    </modal.content>\\n\\n    <modal.footer\\n      class={{class (if this.isNew \\\"justify-flex-end\\\" \\\"justify-space-between\\\")}}\\n    >\\n      {{#unless this.isNew}}\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          @variant=\\\"error\\\"\\n          @disabled={{this.resource.isPending}}\\n          @onClick={{@onDelete}}\\n        >\\n          {{t \\\"components.missionDetailModal.deleteButtonLabel\\\"}}\\n        </UiButton>\\n      {{/unless}}\\n\\n      <div class=\\\"flex-none\\\">\\n        <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n          {{t \\\"components.missionDetailModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n\\n        <form.submit @disabled={{this.resource.isPending}}>\\n          {{t \\\"components.missionDetailModal.saveButtonLabel\\\"}}\\n        </form.submit>\\n      </div>\\n    </modal.footer>\\n  </UiFormFor>\\n</XModal>\\n\\n{{#if this.isFileChooseModalOpen}}\\n  <FileChooseModal\\n    @disabledFiles={{@mission.files}}\\n    @onChoose={{this.handleFileChooseModalChoose}}\\n    @onClose={{set this \\\"isFileChooseModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isAttachLinkModalOpen}}\\n  <AttachLinkModal\\n    @onChoose={{this.handleAttachLinkModalChoose}}\\n    @onClose={{set this \\\"isAttachLinkModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isEntityImportModalOpen}}\\n  <EntityImportModal\\n    @entity={{this.firstBook}}\\n    @books={{@mission.course.books}}\\n    @expandedEntities={{this.expandedEntities}}\\n    @disabledEntities={{@mission.linkedEntities}}\\n    @multiple={{true}}\\n    @onExpand={{this.handleEntityImportModalExpand}}\\n    @onCollapse={{this.handleEntityImportModalCollapse}}\\n    @onImport={{this.handleEntityImportModalImport}}\\n    @onClose={{set this \\\"isEntityImportModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isContentEntityImportModalOpen}}\\n  <EntityImportModal\\n    @books={{@mission.course.books}}\\n    @expandedEntities={{this.expandedContentEntities}}\\n    @disabledEntities={{@mission.entities}}\\n    @importableTypes={{array \\\"contents\\\" \\\"interactives\\\"}}\\n    @multiple={{true}}\\n    @onExpand={{this.handleContentEntityImportModalExpand}}\\n    @onCollapse={{this.handleContentEntityImportModalCollapse}}\\n    @onImport={{this.handleContentEntityImportModalImport}}\\n    @onClose={{set this \\\"isContentEntityImportModalOpen\\\" false}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/mission-detail-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-detail-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport Resource from 'babel/utils/resource';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\nimport showFilePicker from 'compton/utils/show-file-picker';\n\nconst ATTACH_MENU_BUTTON_ITEMS = {\n  internalLink: 'internal_link',\n  link: 'link',\n  fromDevice: 'from_device',\n  fromArchive: 'from_archive',\n};\n\nconst VISIBILITY = {\n  visible: 'visible',\n  hidden: 'hidden',\n  scheduled: 'scheduled',\n};\n\nasync function scrollFirstInvalidInputElementIntoViewIfNeeded(formElement) {\n  // FIXME This is a temporary selector.\n  const inputElement = formElement.querySelector('.ui-input--error input');\n\n  if (inputElement) {\n    scrollIntoViewIfNeeded(inputElement, {\n      behavior: 'smooth',\n      block: 'end',\n    });\n  }\n}\n\nfunction getIntialVisibility(mission) {\n  if (mission.startDate) {\n    return VISIBILITY.scheduled;\n  } else if (mission.active) {\n    return VISIBILITY.visible;\n  }\n  return VISIBILITY.hidden;\n}\n\nexport default class MissionDetailModalComponent extends Component {\n  @service intl;\n  @service store;\n  @service session;\n  @service fileDispatcher;\n\n  @tracked expandedEntities = [];\n  @tracked isContentEntityImportModalOpen = false;\n  @tracked isEntityImportModalOpen = false;\n  @tracked isFileChooseModalOpen = false;\n  @tracked isAttachLinkModalOpen = false;\n\n  @tracked visibility = getIntialVisibility(this.args.mission);\n\n  @tracked expandedContentEntities = [];\n\n  isNew = this.args.mission.isNew;\n\n  formElement = null;\n\n  scheduleFormPartElement = null;\n\n  descriptionEditorToolbarOptions = [\n    'heading',\n    'bold',\n    'italic',\n    'strikethrough',\n    'underline',\n    'subscript',\n    'superscript',\n    'bulletedList',\n    'numberedList',\n    'insertTable',\n  ];\n\n  descriptionEditorCapabilities = {\n    textFormats: [\n      'bold',\n      'italic',\n      'strikethrough',\n      'underline',\n      'subscript',\n      'superscript',\n    ],\n    textColors: false,\n    headings: [1, 2, 3],\n    lists: true,\n    links: false,\n    tables: true,\n    equations: false,\n  };\n\n  get attachMenuButtonItems() {\n    return Object.entries(ATTACH_MENU_BUTTON_ITEMS).map(([key, value]) => {\n      return {\n        label: this.intl.t(\n          `components.missionDetailModal.attachMenuButtonItems.${key}`\n        ),\n        value,\n      };\n    });\n  }\n\n  get visibilityOptions() {\n    return Object.entries(VISIBILITY).map(([key, value]) => {\n      return {\n        label: this.intl.t(\n          `components.missionDetailModal.visibilityOptions.${key}`\n        ),\n        value,\n      };\n    });\n  }\n\n  get firstBook() {\n    return this.args.mission.course.get('books.firstObject');\n  }\n\n  resource = new Resource(async () => {\n    const { mission } = this.args;\n\n    const [customContents] = await Promise.all([\n      mission.customContents,\n      mission.files,\n      mission.linkedEntities,\n      mission.receivers,\n    ]);\n\n    await Promise.all(\n      customContents.map((customContent) => customContent.entity)\n    );\n  });\n\n  @action\n  handleVisibilityRadioButtonGroupChange(value) {\n    this.visibility = value;\n\n    switch (value) {\n      case VISIBILITY.visible:\n        this.args.mission.active = true;\n        this.args.mission.startDate = null;\n        this.args.mission.endDate = null;\n        break;\n      case VISIBILITY.hidden:\n        this.args.mission.active = false;\n        this.args.mission.startDate = null;\n        this.args.mission.endDate = null;\n        break;\n      case VISIBILITY.scheduled:\n        this.args.mission.active = false;\n        // eslint-disable-next-line ember/no-incorrect-calls-with-inline-anonymous-functions\n        scheduleOnce('afterRender', this, () => {\n          scrollIntoViewIfNeeded(this.scheduleFormPartElement, {\n            behavior: 'smooth',\n            block: 'end',\n          });\n        });\n\n        break;\n      default:\n    }\n  }\n\n  @action\n  handleTargetIndividualReceiversCheckboxChange(value) {\n    if (!value) {\n      this.args.mission.receivers.clear();\n    }\n  }\n\n  @action\n  handleAttachMenuButtonChange(value) {\n    switch (value) {\n      case ATTACH_MENU_BUTTON_ITEMS.fromArchive:\n        this.isFileChooseModalOpen = true;\n        break;\n      case ATTACH_MENU_BUTTON_ITEMS.fromDevice:\n        this.#showFilePicker();\n        break;\n      case ATTACH_MENU_BUTTON_ITEMS.link:\n        this.isAttachLinkModalOpen = true;\n        break;\n      case ATTACH_MENU_BUTTON_ITEMS.internalLink:\n        this.isEntityImportModalOpen = true;\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  handleFormSubmit() {\n    if (this.args.mission.validate()) {\n      return this.args.onSave();\n    } else {\n      scheduleOnce(\n        'afterRender',\n        this,\n        scrollFirstInvalidInputElementIntoViewIfNeeded,\n        this.formElement\n      );\n    }\n  }\n\n  @action\n  async handleContentEntityImportModalImport(entities) {\n    await Promise.all(\n      entities.map(async (entity) => {\n        const customContent = await this.args.mission.addNewCustomContent({\n          entity,\n        });\n        return customContent.save();\n      })\n    );\n  }\n\n  @action\n  handleCustomContentListSort(customContents) {\n    this.args.mission.sortedCustomContentIds = customContents.map(\n      (customContent) => customContent.id\n    );\n  }\n\n  @action\n  handleContentEntityImportModalExpand(entity) {\n    this.expandedContentEntities.addObject(entity);\n  }\n\n  @action\n  handleContentEntityImportModalCollapse(entity) {\n    this.expandedContentEntities.removeObject(entity);\n  }\n\n  @action\n  handleCustomContentListRemove(customContent) {\n    this.args.mission.removeCustomContent(customContent);\n  }\n\n  @action\n  handleFileChooseModalChoose(files) {\n    this.args.mission.files.addObjects(files);\n  }\n\n  @action\n  handleAttachLinkModalChoose(file) {\n    this.args.mission.files.addObject(file);\n  }\n\n  @action\n  handleFilesPreviewerRemove(file) {\n    this.args.mission.files.removeObject(file);\n  }\n\n  @action\n  handleEntityImportModalImport(entities) {\n    this.args.mission.linkedEntities.addObjects(entities);\n  }\n\n  @action\n  handleLinkAttachmentRemove(entity) {\n    this.args.mission.linkedEntities.removeObject(entity);\n  }\n\n  @action\n  handleEntityImportModalExpand(entity) {\n    this.expandedEntities.addObject(entity);\n  }\n\n  @action\n  handleEntityImportModalCollapse(entity) {\n    this.expandedEntities.removeObject(entity);\n  }\n\n  @action\n  handleFileUploadPerform(fileData) {\n    const pendingFile = this.store.createRecord('file', {\n      name: fileData.name,\n      user: this.session.user,\n    });\n\n    this.pendingFile = pendingFile;\n\n    const onResolve = () => {\n      this.handleFileAttachmentAdd?.(pendingFile);\n    };\n\n    const onFinally = () => {\n      this.pendingFile = null;\n    };\n\n    return this.fileDispatcher\n      .performUpload(pendingFile, fileData)\n      .then(onResolve)\n      .finally(onFinally);\n  }\n\n  #showFilePicker() {\n    const onChange = (fileData) => {\n      this.#fileUpload(fileData);\n    };\n\n    return showFilePicker({\n      multiple: false,\n      accept: null,\n      capture: null,\n      onChange,\n    });\n  }\n\n  async #fileUpload(fileData) {\n    const file = await this.args.onFileUpload(fileData);\n    this.args.mission.files.addObject(file);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"mission-intro-icon\\\" ...attributes>\\n  <DcIcon @name=\\\"mission\\\" @size=\\\"lg\\\" />\\n</div>\", {\"contents\":\"<div class=\\\"mission-intro-icon\\\" ...attributes>\\n  <DcIcon @name=\\\"mission\\\" @size=\\\"lg\\\" />\\n</div>\",\"moduleName\":\"babel/components/mission-intro-card/icon/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-intro-card/icon/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<DcCard class=\\\"mission-intro-card\\\" ...attributes>\\n\\n  <MissionIntroCard::Icon />\\n\\n  <div>\\n    <h4>{{yield to=\\\"heading\\\"}}</h4>\\n    <div>\\n      {{yield to=\\\"content\\\"}}\\n    </div>\\n  </div>\\n\\n</DcCard>\", {\"contents\":\"<DcCard class=\\\"mission-intro-card\\\" ...attributes>\\n\\n  <MissionIntroCard::Icon />\\n\\n  <div>\\n    <h4>{{yield to=\\\"heading\\\"}}</h4>\\n    <div>\\n      {{yield to=\\\"content\\\"}}\\n    </div>\\n  </div>\\n\\n</DcCard>\",\"moduleName\":\"babel/components/mission-intro-card/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-intro-card/index.hbs\"}});\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class MissionIntroCardComponent extends Component {\n  @service session;\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul class=\\\"mission-list\\\" data-test-mission-list ...attributes>\\n  {{#each @missions as |mission|}}\\n    <MissionList::Item\\n      @mission={{mission}}\\n      @selectedMissions={{@selectedMissions}}\\n      @disabledMissions={{this.disabledMissions}}\\n      @onSelect={{@onSelect}}\\n      @onDeselect={{@onDeselect}}\\n    />\\n  {{/each}}\\n</ul>\", {\"contents\":\"<ul class=\\\"mission-list\\\" data-test-mission-list ...attributes>\\n  {{#each @missions as |mission|}}\\n    <MissionList::Item\\n      @mission={{mission}}\\n      @selectedMissions={{@selectedMissions}}\\n      @disabledMissions={{this.disabledMissions}}\\n      @onSelect={{@onSelect}}\\n      @onDeselect={{@onDeselect}}\\n    />\\n  {{/each}}\\n</ul>\",\"moduleName\":\"babel/components/mission-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-list/index.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class MissionList extends Component {\n  get disabledMissions() {\n    return this.args.disabledMissions ?? [];\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li\\n  class=\\\"mission-list-item\\\"\\n  data-test-mission-list-item\\n  data-disabled={{this.isDisabled}}\\n  ...attributes\\n>\\n  <XCheckbox\\n    data-test-mission-list-item-checkbox\\n    @checked={{this.isSelected}}\\n    @twoWay={{false}}\\n    @disabled={{this.isDisabled}}\\n    @onChange={{this.handleCheckboxChange}}\\n  />\\n\\n  <div class=\\\"mission-list-item-inner\\\">\\n    <div class=\\\"mission-list-item-title\\\" data-test-mission-list-item-title>\\n      {{@mission.title}}\\n    </div>\\n\\n    <div\\n      class=\\\"mission-list-item-contents\\\"\\n      data-test-mission-list-item-contents\\n    >\\n      {{#let (compact @mission.entities) as |entities|}}\\n        {{#if entities}}\\n          <span class=\\\"text-bold\\\">\\n            {{t \\\"components.missionList.item.contentLabel\\\"}}\\n          </span>\\n\\n          {{join \\\", \\\" (map-by \\\"title\\\" entities)}}\\n        {{else}}\\n          {{t \\\"components.missionList.item.noContentMessage\\\"}}\\n        {{/if}}\\n      {{/let}}\\n    </div>\\n  </div>\\n</li>\", {\"contents\":\"<li\\n  class=\\\"mission-list-item\\\"\\n  data-test-mission-list-item\\n  data-disabled={{this.isDisabled}}\\n  ...attributes\\n>\\n  <XCheckbox\\n    data-test-mission-list-item-checkbox\\n    @checked={{this.isSelected}}\\n    @twoWay={{false}}\\n    @disabled={{this.isDisabled}}\\n    @onChange={{this.handleCheckboxChange}}\\n  />\\n\\n  <div class=\\\"mission-list-item-inner\\\">\\n    <div class=\\\"mission-list-item-title\\\" data-test-mission-list-item-title>\\n      {{@mission.title}}\\n    </div>\\n\\n    <div\\n      class=\\\"mission-list-item-contents\\\"\\n      data-test-mission-list-item-contents\\n    >\\n      {{#let (compact @mission.entities) as |entities|}}\\n        {{#if entities}}\\n          <span class=\\\"text-bold\\\">\\n            {{t \\\"components.missionList.item.contentLabel\\\"}}\\n          </span>\\n\\n          {{join \\\", \\\" (map-by \\\"title\\\" entities)}}\\n        {{else}}\\n          {{t \\\"components.missionList.item.noContentMessage\\\"}}\\n        {{/if}}\\n      {{/let}}\\n    </div>\\n  </div>\\n</li>\",\"moduleName\":\"babel/components/mission-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class MissionListItem extends Component {\n  get isSelected() {\n    return this.args.selectedMissions.includes(this.args.mission);\n  }\n\n  get isDisabled() {\n    return this.args.disabledMissions.includes(this.args.mission);\n  }\n\n  @action\n  handleCheckboxChange() {\n    if (this.isSelected) {\n      this.args.onDeselect(this.args.mission);\n    } else {\n      this.args.onSelect(this.args.mission);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @width=\\\"small\\\"\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"share\\\" @icon=\\\"share\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.share.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"copy\\\" @icon=\\\"copy-paste\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.copy.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"edit\\\" @icon=\\\"pen\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.edit.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  {{#if @hasAuditLink}}\\n    <menu.Item @value=\\\"audit\\\" @icon=\\\"results\\\">\\n      <:label>\\n        {{t \\\"components.missionOptionsActionMenu.items.audit.label\\\"}}\\n      </:label>\\n    </menu.Item>\\n  {{/if}}\\n\\n  <menu.Item @value=\\\"schedule\\\" @icon=\\\"time-clock\\\">\\n    <:label>\\n      {{#if @isScheduled}}\\n        {{t \\\"components.missionOptionsActionMenu.items.scheduled.label\\\"}}\\n      {{else}}\\n        {{t \\\"components.missionOptionsActionMenu.items.schedule.label\\\"}}\\n      {{/if}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Divider />\\n\\n  <menu.Item @value=\\\"hide\\\">\\n    <:label>\\n      {{#if @isActive}}\\n        {{t \\\"components.missionOptionsActionMenu.items.hide.label\\\"}}\\n      {{else}}\\n        {{t \\\"components.missionOptionsActionMenu.items.show.label\\\"}}\\n      {{/if}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"delete\\\" @destructive={{true}}>\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.delete.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n</ActionMenu>\", {\"contents\":\"<ActionMenu\\n  ...attributes\\n  @for={{@for}}\\n  @width=\\\"small\\\"\\n  @onSelect={{@onSelect}}\\n  @onClose={{@onClose}}\\n  as |menu|\\n>\\n  <menu.Item @value=\\\"share\\\" @icon=\\\"share\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.share.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"copy\\\" @icon=\\\"copy-paste\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.copy.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"edit\\\" @icon=\\\"pen\\\">\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.edit.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n\\n  {{#if @hasAuditLink}}\\n    <menu.Item @value=\\\"audit\\\" @icon=\\\"results\\\">\\n      <:label>\\n        {{t \\\"components.missionOptionsActionMenu.items.audit.label\\\"}}\\n      </:label>\\n    </menu.Item>\\n  {{/if}}\\n\\n  <menu.Item @value=\\\"schedule\\\" @icon=\\\"time-clock\\\">\\n    <:label>\\n      {{#if @isScheduled}}\\n        {{t \\\"components.missionOptionsActionMenu.items.scheduled.label\\\"}}\\n      {{else}}\\n        {{t \\\"components.missionOptionsActionMenu.items.schedule.label\\\"}}\\n      {{/if}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Divider />\\n\\n  <menu.Item @value=\\\"hide\\\">\\n    <:label>\\n      {{#if @isActive}}\\n        {{t \\\"components.missionOptionsActionMenu.items.hide.label\\\"}}\\n      {{else}}\\n        {{t \\\"components.missionOptionsActionMenu.items.show.label\\\"}}\\n      {{/if}}\\n    </:label>\\n  </menu.Item>\\n\\n  <menu.Item @value=\\\"delete\\\" @destructive={{true}}>\\n    <:label>\\n      {{t \\\"components.missionOptionsActionMenu.items.delete.label\\\"}}\\n    </:label>\\n  </menu.Item>\\n</ActionMenu>\",\"moduleName\":\"babel/components/mission-options-action-menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-options-action-menu/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (generate-id) (t \\\"components.missionOptionsButton.label\\\") as |id label|}}\\n\\n  <UiButton\\n    id={{id}}\\n    class=\\\"mission-share-button\\\"\\n    aria-label={{label}}\\n    @appearance=\\\"circle\\\"\\n    @onClick={{set this \\\"isShareLinkModalOpen\\\" true}}\\n    ...attributes\\n  >\\n    <DcIcon @name=\\\"share\\\" />\\n  </UiButton>\\n\\n  <XTooltip @for={{id}}>\\n    {{label}}\\n  </XTooltip>\\n\\n{{/let}}\\n\\n{{#if this.isShareLinkModalOpen}}\\n  <ShareLinkModal\\n    @onClose={{set this \\\"isShareLinkModalOpen\\\" false}}\\n    @link={{this.link}}\\n    @modalTitle={{t \\\"components.missionShareLinkModal.title\\\"}}\\n  />\\n{{/if}}\", {\"contents\":\"{{#let (generate-id) (t \\\"components.missionOptionsButton.label\\\") as |id label|}}\\n\\n  <UiButton\\n    id={{id}}\\n    class=\\\"mission-share-button\\\"\\n    aria-label={{label}}\\n    @appearance=\\\"circle\\\"\\n    @onClick={{set this \\\"isShareLinkModalOpen\\\" true}}\\n    ...attributes\\n  >\\n    <DcIcon @name=\\\"share\\\" />\\n  </UiButton>\\n\\n  <XTooltip @for={{id}}>\\n    {{label}}\\n  </XTooltip>\\n\\n{{/let}}\\n\\n{{#if this.isShareLinkModalOpen}}\\n  <ShareLinkModal\\n    @onClose={{set this \\\"isShareLinkModalOpen\\\" false}}\\n    @link={{this.link}}\\n    @modalTitle={{t \\\"components.missionShareLinkModal.title\\\"}}\\n  />\\n{{/if}}\",\"moduleName\":\"babel/components/mission-share-button/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-share-button/index.hbs\"}});\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MissionShareButtonComponent extends Component {\n  @service router;\n\n  @tracked isShareLinkModalOpen = false;\n\n  get link() {\n    const url = this.router.urlFor('master.missions', this.args.mission.id);\n    return window.location.origin + url;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ShareLinkModal\\n  ...attributes\\n  @link={{@mission.shareableLink}}\\n  @modalTitle={{t \\\"components.missionShareLinkModal.title\\\"}}\\n  @onClose={{@onClose}}\\n/>\", {\"contents\":\"<ShareLinkModal\\n  ...attributes\\n  @link={{@mission.shareableLink}}\\n  @modalTitle={{t \\\"components.missionShareLinkModal.title\\\"}}\\n  @onClose={{@onClose}}\\n/>\",\"moduleName\":\"babel/components/mission-share-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/mission-share-modal/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"mission-start-page\\\">\\n  <DcCard as |Card|>\\n    <Card.content class=\\\"mission-start-page-card\\\">\\n      <div class=\\\"mission-start-page-title\\\">\\n        <div class=\\\"flex-auto text-primary\\\">{{@mission.title}}</div>\\n        <MissionShareButton @mission={{@mission}} />\\n      </div>\\n\\n      <MissionContent\\n        @mission={{@mission}}\\n        @showAll={{true}}\\n        class=\\\"mission-start-page-mission-content\\\"\\n      />\\n    </Card.content>\\n  </DcCard>\\n</div>', { moduleName: 'babel/components/mission-start-page/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @model.isRejected}}\\n  <DcCard class=\\\"p1\\\">\\n    {{t \\\"components.modelRejection.other\\\"}}\\n  </DcCard>\\n{{/if}}\\n', { moduleName: 'babel/components/model-rejection/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport Component from '@glimmer/component';\n\nconst EDIT = 'edit';\nconst UNLINK = 'unlink';\nconst DELETE = 'delete';\n\nexport default class NoteBrowserComponent extends Component {\n  /**\n   * Arguments:\n   * note\n   * mode\n   * range\n   * unlinkable\n   * showRouteName\n   * onPerform\n   */\n\n  @service intl;\n\n  get mode() {\n    return this.args.mode ?? 'list';\n  }\n\n  get performMenuButtonItems() {\n    const t = (value) => {\n      return this.intl.t(\n        [\n          'components',\n          'noteBrowser',\n          'performMenuButtonItems',\n          camelize(value),\n        ].join('.')\n      );\n    };\n\n    const items = [];\n\n    items.addObject({ value: EDIT, label: t(EDIT) });\n\n    if (this.args.unlinkable) {\n      items.addObject({ value: UNLINK, label: t(UNLINK), variant: 'error' });\n    }\n\n    items.addObject({ value: DELETE, label: t(DELETE), variant: 'error' });\n\n    return items;\n  }\n}\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  // PARAMS\n\n  notes: null,\n\n  narrow: null,\n\n  showRouteName: null,\n\n  performMenuButtonItems: null,\n\n  onPerform: null,\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { service } from '@ember/service';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\n\nexport default Component.extend({\n  // SETUP\n\n  noteDispatcher: service(),\n\n  classNames: ['note-browser-grid-item'],\n\n  classNameBindings: [\n    'isHighlighted:note-browser-grid-item--highlighted',\n    'isDisabled:note-browser-grid-item--disabled',\n  ],\n\n  // PARAMS\n\n  note: null,\n\n  showRouteName: null,\n\n  performMenuButtonItems: null,\n\n  onPerform: null,\n\n  // PROPERTIES\n\n  isHighlighted: computed(\n    'noteDispatcher.highlightedNotes.[]',\n    'note',\n    function () {\n      return this.noteDispatcher.highlightedNotes.includes(this.note);\n    }\n  ),\n\n  isDisabled: readOnly('note.isDeleted'),\n\n  // HOOKS\n\n  didRender() {\n    this._super(...arguments);\n    if (this.isHighlighted) {\n      scrollIntoViewIfNeeded(this.element);\n    }\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<UiLink\\n  @route={{this.showRouteName}}\\n  @model={{this.note.id}}\\n  class=\\\"note-browser-grid-item-backdrop-link\\\"\\n>\\n  {{this.note.title}}\\n</UiLink>\\n\\n<div class=\\\"flex justify-flex-end\\\">\\n  <XMenuButton\\n    @appearance=\\\"bulb\\\"\\n    @displayArrowIcon={{false}}\\n    @disabled={{or this.isDisabled this.isDeleted}}\\n    @items={{this.performMenuButtonItems}}\\n    @onChange={{action this.onPerform this.note}}\\n  >\\n    <DcIcon @name=\\\"menu-dots\\\" />\\n  </XMenuButton>\\n</div>\\n\\n<div class=\\\"text-quarternary word-break-all nb1\\\">\\n  {{this.note.title}}\\n</div>\\n\\n<NoteContent @note={{this.note}} />', { moduleName: 'babel/components/note-browser/grid/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#addition-grid range=this.range}}\\n\\n  {{#each this.notes key=\\\"id\\\" as |note|}}\\n\\n    {{note-browser/grid/item\\n      note=note\\n      showRouteName=this.showRouteName\\n      performMenuButtonItems=this.performMenuButtonItems\\n      onPerform=(action this.onPerform)\\n    }}\\n\\n  {{/each}}\\n\\n{{/addition-grid}}', { moduleName: 'babel/components/note-browser/grid/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  // PARAMS\n\n  notes: null,\n\n  showRouteName: null,\n\n  performMenuButtonItems: null,\n\n  onPerform: null,\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { service } from '@ember/service';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\n\nexport default Component.extend({\n  // SETUP\n\n  noteDispatcher: service(),\n  classNames: ['note-browser-list-item'],\n\n  classNameBindings: ['isHighlighted:note-browser-list-item--highlighted'],\n\n  // PARAMS\n\n  note: null,\n\n  highlightedNote: null,\n\n  showRouteName: null,\n\n  performMenuButtonItems: null,\n\n  onPerform: null,\n\n  // PROPERTIES\n\n  isHighlighted: computed(\n    'noteDispatcher.highlightedNotes.[]',\n    'note',\n    function () {\n      return this.noteDispatcher.highlightedNotes.includes(this.note);\n    }\n  ),\n\n  // HOOKS\n\n  didRender() {\n    this._super(...arguments);\n    if (this.isHighlighted) {\n      scrollIntoViewIfNeeded(this.element);\n    }\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<UiLink\\n  @route={{this.showRouteName}}\\n  @model={{this.note.id}}\\n  class=\\\"text-quarternary word-break-all\\\"\\n>\\n\\n  {{this.note.title}}\\n\\n</UiLink>\\n\\n{{#x-menu-button\\n  class=\\\"ml1 text-color-default\\\"\\n  appearance=\\\"bulb\\\"\\n  displayArrowIcon=false\\n  disabled=(or this.isDisabled this.isDeleted)\\n  items=this.performMenuButtonItems\\n  onChange=(action this.onPerform this.note)\\n}}\\n\\n  <DcIcon @name=\\\"menu-dots\\\" />\\n\\n{{/x-menu-button}}', { moduleName: 'babel/components/note-browser/list/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#addition-list}}\\n\\n  {{#each this.notes key=\\\"id\\\" as |note|}}\\n\\n    {{note-browser/list/item\\n      note=note\\n      showRouteName=this.showRouteName\\n      performMenuButtonItems=this.performMenuButtonItems\\n      onPerform=(action this.onPerform)\\n    }}\\n\\n  {{/each}}\\n\\n{{/addition-list}}', { moduleName: 'babel/components/note-browser/list/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"note-browser\\\" ...attributes>\\n  {{#let (component (concat \\\"note-browser/\\\" this.mode)) as |NoteBrowserType|}}\\n    <NoteBrowserType\\n      @notes={{@notes}}\\n      @range={{@range}}\\n      @showRouteName={{@showRouteName}}\\n      @performMenuButtonItems={{this.performMenuButtonItems}}\\n      @onPerform={{@onPerform}}\\n    />\\n  {{/let}}\\n</div>', { moduleName: 'babel/components/note-browser/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ChooseModal\\n  data-test-note-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.noteChooseModal.title\\\"}}\\n  @width={{if (eq this.mode \\\"grid\\\") \\\"large\\\" \\\"medium\\\"}}\\n  @count={{this.pickedNotes.length}}\\n  @onChoose={{fn this.onChoose this.pickedNotes}}\\n  @onDelete={{fn this.handleDelete this.pickedNotes}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.notes}}\\n      @query={{this.query}}\\n      @mode={{this.mode}}\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.noteChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.noteChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedNotes|\\n    >\\n\\n      <NotePicker\\n        @notes={{collatedNotes}}\\n        @pickedNotes={{this.pickedNotes}}\\n        @disabledNotes={{@disabledNotes}}\\n        @mode={{this.mode}}\\n        @range=\\\"large\\\"\\n        @onPick={{this.handleNotePickerPick}}\\n        @onUnpick={{this.handleNotePickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\", {\"contents\":\"<ChooseModal\\n  data-test-note-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.noteChooseModal.title\\\"}}\\n  @width={{if (eq this.mode \\\"grid\\\") \\\"large\\\" \\\"medium\\\"}}\\n  @count={{this.pickedNotes.length}}\\n  @onChoose={{fn this.onChoose this.pickedNotes}}\\n  @onDelete={{fn this.handleDelete this.pickedNotes}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.notes}}\\n      @query={{this.query}}\\n      @mode={{this.mode}}\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.noteChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.noteChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedNotes|\\n    >\\n\\n      <NotePicker\\n        @notes={{collatedNotes}}\\n        @pickedNotes={{this.pickedNotes}}\\n        @disabledNotes={{@disabledNotes}}\\n        @mode={{this.mode}}\\n        @range=\\\"large\\\"\\n        @onPick={{this.handleNotePickerPick}}\\n        @onUnpick={{this.handleNotePickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\",\"moduleName\":\"babel/components/note-choose-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-choose-modal/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nimport Resource from '../../utils/resource';\n\n/*\n\nimport NoteModel from 'babel/models/note';\n\nexport interface NoteChooseModalComponentArgs {\n  mode: 'grid' | 'list';\n  disabledNotes: NoteModel[];\n  onChoose(pickedNotes: NoteModel[]): void;\n  onClose(): void;\n}\n\n*/\nconst QUERY = {\n  bookId: null,\n  search: '',\n  page: 1,\n};\n\nexport default class NoteChooseModalComponent extends Component {\n  @service store;\n  @service session;\n  @service noteDispatcher;\n\n  @tracked pickedNotes = [];\n  @tracked query = QUERY;\n\n  resource = new Resource(async () => {\n    return {\n      notes: (await this.store.query('note', {}))\n        .filterBy('userId', this.session.user.id)\n        .toArray(),\n    };\n  });\n\n  get mode() {\n    const mode = this.args.mode ?? 'grid';\n\n    assert(\n      \"The @mode arg passed to <NoteChooseModal> is not valid. Valid values are 'grid' and 'list'.\",\n      ['grid', 'list'].includes(mode)\n    );\n\n    return mode;\n  }\n\n  get onChoose() {\n    const onChoose = this.args.onChoose;\n\n    assert(\n      `The @onChoose arg passed to <NoteChooseModal> must be a function. Got ${typeof onChoose}`,\n      typeof onChoose === 'function'\n    );\n\n    return onChoose;\n  }\n\n  @action\n  handleAdditionCollatorQuery(query) {\n    this.query = query;\n    this.pickedNotes.clear();\n  }\n\n  @action\n  handleNotePickerPick(file) {\n    this.pickedNotes.addObject(file);\n  }\n\n  @action\n  handleNotePickerUnpick(file) {\n    this.pickedNotes.removeObject(file);\n  }\n\n  @action\n  async handleDelete(notes) {\n    await this.noteDispatcher.deleteMany(notes);\n    this.pickedNotes.clear();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport NoteModel from 'babel/models/note';\\n\\nexport interface NoteContentComponentArgs {\\n  note: NoteModel;\\n}\\n\\n}}\\n\\n<div class=\\\"note-content\\\" ...attributes>\\n  <EditorPreview @content={{@note.content}} />\\n</div>\", {\"contents\":\"{{!\\n\\nimport NoteModel from 'babel/models/note';\\n\\nexport interface NoteContentComponentArgs {\\n  note: NoteModel;\\n}\\n\\n}}\\n\\n<div class=\\\"note-content\\\" ...attributes>\\n  <EditorPreview @content={{@note.content}} />\\n</div>\",\"moduleName\":\"babel/components/note-content/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-content/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { service } from '@ember/service';\n\nexport default Component.extend({\n  // SETUP\n\n  colorTheme: service(),\n\n  classNames: ['note-detail'],\n\n  // PARAMS\n\n  note: null,\n\n  indexRouteName: null,\n\n  unlinkable: false,\n\n  hasBreadcrumb: true,\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-locked-scope active=this.note.isDeleted}}\\n  {{#if this.hasBreadcrumb}}\\n    <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n      <breadcrumb.item as |item|>\\n        <item.link @route={{this.indexRouteName}}>\\n          {{t \\\"components.noteDetail.indexBreadcrumbItemLabel\\\"}}\\n        </item.link>\\n      </breadcrumb.item>\\n\\n      <breadcrumb.item @active={{true}}>\\n        <span class=\\\"line-height-base\\\">\\n          {{#if this.note.isNew}}\\n            {{t \\\"components.noteDetail.activeBreadcrumbItemLabel\\\" isNew=true}}\\n          {{else}}\\n            {{this.note.title}}\\n          {{/if}}\\n        </span>\\n      </breadcrumb.item>\\n    </XBreadcrumb>\\n  {{/if}}\\n\\n  {{#archive-form\\n    model=this.note\\n    routed=true\\n    cancelRouteParams=(array this.indexRouteName)\\n    onUnlink=(action (optional this.onUnlink))\\n    onDelete=(action (optional this.onDelete))\\n    onCancel=(action (optional this.onCancel))\\n    onSave=(action this.onSave)\\n    as |form|\\n  }}\\n    <div class=\\\"mb1\\\">\\n      {{form.label \\\"title\\\" (t \\\"components.noteDetail.titleInputLabel\\\")}}\\n\\n      {{form.input \\\"title\\\" autofocus=(unbound this.note.isNew)}}\\n    </div>\\n\\n    {{form.label \\\"content\\\" (t \\\"components.noteDetail.contentInputLabel\\\")}}\\n\\n    <XEditor\\n      @value={{this.note.content}}\\n      @theme={{this.colorTheme.currentTheme}}\\n      @onChange={{set this.note \\\"content\\\"}}\\n    />\\n  {{/archive-form}}\\n{{/x-locked-scope}}', { moduleName: 'babel/components/note-detail/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<AdditionGrid @range={{@range}} ...attributes>\\n\\n  {{#each @notes as |note|}}\\n\\n    <NotePicker::Grid::Item\\n      @note={{note}}\\n      @pickedNotes={{@pickedNotes}}\\n      @disabledNotes={{@disabledNotes}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionGrid>\", {\"contents\":\"<AdditionGrid @range={{@range}} ...attributes>\\n\\n  {{#each @notes as |note|}}\\n\\n    <NotePicker::Grid::Item\\n      @note={{note}}\\n      @pickedNotes={{@pickedNotes}}\\n      @disabledNotes={{@disabledNotes}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionGrid>\",\"moduleName\":\"babel/components/note-picker/grid/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-picker/grid/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"note-picker-grid-item\\\"\\n    (if this.isDisabled \\\"note-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <span class=\\\"flex justify-space-between mb1\\\">\\n\\n    <span class=\\\"flex-one text-quarternary word-break-all\\\">\\n\\n      {{@note.titleWithFallback}}\\n\\n    </span>\\n\\n    <XCheckbox\\n      class=\\\"flex-shrink\\\"\\n      @checked={{this.isPicked}}\\n      @disabled={{this.isDisabled}}\\n      @twoWay={{false}}\\n      @onChange={{fn (if this.isPicked @onUnpick @onPick) @note}}\\n    />\\n\\n  </span>\\n\\n  <NoteContent @note={{@note}} />\\n\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"note-picker-grid-item\\\"\\n    (if this.isDisabled \\\"note-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <span class=\\\"flex justify-space-between mb1\\\">\\n\\n    <span class=\\\"flex-one text-quarternary word-break-all\\\">\\n\\n      {{@note.titleWithFallback}}\\n\\n    </span>\\n\\n    <XCheckbox\\n      class=\\\"flex-shrink\\\"\\n      @checked={{this.isPicked}}\\n      @disabled={{this.isDisabled}}\\n      @twoWay={{false}}\\n      @onChange={{fn (if this.isPicked @onUnpick @onPick) @note}}\\n    />\\n\\n  </span>\\n\\n  <NoteContent @note={{@note}} />\\n\\n</label>\",\"moduleName\":\"babel/components/note-picker/grid/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-picker/grid/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport NoteModel from 'babel/models/note';\n\nexport interface NotePickerGridItemComponentArgs {\n  note: NoteModel;\n  pickedNotes: NoteModel[];\n  disabledNotes: NoteModel[];\n  onPick(note: NoteModel): void;\n}\n\n*/\n\nexport default class NotePickerGridItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedNotes.includes(this.args.note);\n  }\n\n  get isDisabled() {\n    const disabledNotes = this.args.disabledNotes;\n\n    return disabledNotes && disabledNotes.includes(this.args.note);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport NoteModel from 'babel/models/note';\\n\\nexport interface NotePickerComponentArgs {\\n  mode: 'grid' | 'list';\\n  notes: NoteModel[];\\n  pickedNotes: NoteModel[];\\n  disabledNotes: NoteModel[];\\n  range: 'small' | 'medium' | 'large';\\n  onPick(note: Note): void;\\n  onUnpick(note: Note): void;\\n}\\n\\n}}\\n\\n{{#let (component (concat \\\"note-picker/\\\" (or @mode \\\"grid\\\"))) as |Component|}}\\n\\n  <Component\\n    data-test-note-picker\\n    ...attributes\\n    @notes={{@notes}}\\n    @pickedNotes={{@pickedNotes}}\\n    @disabledNotes={{@disabledNotes}}\\n    @range={{@range}}\\n    @onPick={{@onPick}}\\n    @onUnpick={{@onUnpick}}\\n  />\\n\\n{{/let}}\", {\"contents\":\"{{!\\n\\nimport NoteModel from 'babel/models/note';\\n\\nexport interface NotePickerComponentArgs {\\n  mode: 'grid' | 'list';\\n  notes: NoteModel[];\\n  pickedNotes: NoteModel[];\\n  disabledNotes: NoteModel[];\\n  range: 'small' | 'medium' | 'large';\\n  onPick(note: Note): void;\\n  onUnpick(note: Note): void;\\n}\\n\\n}}\\n\\n{{#let (component (concat \\\"note-picker/\\\" (or @mode \\\"grid\\\"))) as |Component|}}\\n\\n  <Component\\n    data-test-note-picker\\n    ...attributes\\n    @notes={{@notes}}\\n    @pickedNotes={{@pickedNotes}}\\n    @disabledNotes={{@disabledNotes}}\\n    @range={{@range}}\\n    @onPick={{@onPick}}\\n    @onUnpick={{@onUnpick}}\\n  />\\n\\n{{/let}}\",\"moduleName\":\"babel/components/note-picker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-picker/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<AdditionList ...attributes>\\n\\n  {{#each @notes as |note|}}\\n\\n    <NotePicker::List::Item\\n      @note={{note}}\\n      @pickedNotes={{@pickedNotes}}\\n      @disabledNotes={{@disabledNotes}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionList>\", {\"contents\":\"<AdditionList ...attributes>\\n\\n  {{#each @notes as |note|}}\\n\\n    <NotePicker::List::Item\\n      @note={{note}}\\n      @pickedNotes={{@pickedNotes}}\\n      @disabledNotes={{@disabledNotes}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</AdditionList>\",\"moduleName\":\"babel/components/note-picker/list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-picker/list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"note-picker-list-item\\\"\\n    (if this.isDisabled \\\"note-picker-list-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @note}}\\n  >\\n\\n    {{@note.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"note-picker-list-item\\\"\\n    (if this.isDisabled \\\"note-picker-list-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @note}}\\n  >\\n\\n    {{@note.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n</label>\",\"moduleName\":\"babel/components/note-picker/list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/note-picker/list/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport NoteModel from 'babel/models/note';\n\nexport interface NotePickerGridItemComponentArgs {\n  note: NoteModel;\n  pickedNotes: NoteModel[];\n  disabledNotes: NoteModel[];\n  onPick(note: NoteModel): void;\n}\n\n*/\n\nexport default class NotePickerGridItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedNotes.includes(this.args.note);\n  }\n\n  get isDisabled() {\n    const disabledNotes = this.args.disabledNotes;\n\n    return disabledNotes && disabledNotes.includes(this.args.note);\n  }\n}\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\n\nexport default Component.extend({\n  notice: service(),\n\n  tagName: ''\n});\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  classNames: ['maintenance-message'],\n\n  model: null,\n\n  modalOpen: true,\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    const elem = this.get('element');\n\n    if (elem) {\n      document.documentElement.style.setProperty(\n        '--top-message-height',\n        elem.offsetHeight + 'px'\n      );\n    }\n  },\n\n  willDestroyElement() {\n    this._super(...arguments);\n\n    document.documentElement.style.setProperty('--top-message-height', '0px');\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex-expand mt1 mb1\\\">\\n\\n  {{#ui-button appearance=\\\"none\\\" onClick=(action (mut this.modalOpen) true)}}\\n    {{this.model.title}}\\n  {{/ui-button}}\\n\\n</div>\\n\\n{{#if this.modalOpen}}\\n\\n  {{#x-modal\\n    closebutton=false\\n    locked=true\\n    size=(hash width=\\\"small\\\" height=\\\"auto\\\")\\n    as |modal|\\n  }}\\n\\n    {{#modal.content class=\\\"p1\\\"}}\\n\\n      <div class=\\\"flex justify-center flex-shrink my2\\\">\\n        <img\\n          alt=\\\"Illustration\\\"\\n          src=\\\"/assets/images/maintenance/cloud-refresh.svg\\\"\\n        />\\n      </div>\\n\\n      <div class=\\\"text-secondary mb1\\\">{{this.model.title}}</div>\\n\\n      <div>{{this.model.message}}</div>\\n\\n    {{/modal.content}}\\n\\n    {{#modal.footer class=\\\"justify-flex-end\\\"}}\\n      {{#ui-button onClick=(action (mut this.modalOpen) false)}}\\n        {{t \\\"components.noticeManager.maintenanceMessage.buttonText\\\"}}\\n      {{/ui-button}}\\n    {{/modal.footer}}\\n\\n  {{/x-modal}}\\n\\n{{/if}}', { moduleName: 'babel/components/notice-manager/maintenance-message/template.hbs' });\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\nimport { writeCookie } from 'babel/utils/handle-cookies';\n\nexport default Component.extend({\n  tagName: '',\n\n  cookies: service(),\n\n  snackbar: service(),\n\n  notice: service(),\n\n  intl: service(),\n\n  model: null,\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n\n    const model = this.get('model');\n    const savedShown = this.get('notice.shownSnacks') || [];\n    const shown = [];\n\n    savedShown.forEach((snackId) => {\n      if (!model || model.mapBy('id').indexOf(snackId) === -1) {\n        this.get('snackbar').dismissById(snackId, { animate: false });\n      } else {\n        shown.push(snackId);\n      }\n    });\n\n    this.set('notice.shownSnacks', shown);\n\n    if (model && model.length > 0) {\n      model.forEach((notice) => {\n        const buttons = [];\n\n        if (notice.get('body.action.label')) {\n          buttons.push({\n            label: notice.get('body.action.label'),\n            position: 'left',\n            dismissOnClick: true,\n            onClick: () => {\n              if (notice.get('body.action.target')) {\n                window.open(notice.get('body.action.target'));\n              }\n\n              writeCookie(this.cookies, `digi-closedNotice_${notice.id}`, true);\n              this.get('notice').markAsRead(notice.id);\n            },\n          });\n        }\n\n        buttons.push({\n          label: this.get('intl').t('components.noticeManager.snacks.close'),\n          position: 'left',\n          appearance: buttons.length === 0 ? 'button' : 'soft',\n          dismissOnClick: true,\n          onClick: () => {\n            writeCookie(this.cookies, `digi-closedNotice_${notice.id}`, true);\n            this.get('notice').markAsRead(notice.id);\n          },\n        });\n\n        const snack = {\n          id: notice.get('id'),\n          title: notice.get('title'),\n          message: notice.get('message'),\n          displayIcon: false,\n          displayDismissButton: false,\n          actionButtons: buttons,\n        };\n\n        if (shown.indexOf(notice.get('id')) !== -1) {\n          return this.get('snackbar').update(notice.get('id'), snack);\n        }\n\n        shown.push(notice.get('id'));\n\n        this.set('notice.shownSnacks', shown);\n\n        this.get('snackbar').enqueue(snack);\n      });\n    }\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.notice.maintenanceMessage}}\\n\\n  {{notice-manager/maintenance-message model=this.notice.maintenanceMessage}}\\n\\n{{/if}}\\n\\n{{#if this.notice.topMessage}}\\n\\n  {{notice-manager/top-message model=this.notice.topMessage}}\\n\\n{{/if}}\\n\\n{{notice-manager/snacks model=this.notice.snacks}}', { moduleName: 'babel/components/notice-manager/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { writeCookie } from 'babel/utils/handle-cookies';\n\nexport default Component.extend({\n  cookies: service(),\n\n  notice: service(),\n\n  classNames: ['top-message'],\n\n  model: null,\n\n  htmlSafeMessage: computed('model.message', function () {\n    return htmlSafe(this.get('model.message'));\n  }),\n\n  didInsertElement() {\n    this._super(...arguments);\n\n    const elem = this.get('element');\n\n    if (elem) {\n      document.documentElement.style.setProperty(\n        '--top-message-height',\n        elem.offsetHeight + 'px'\n      );\n    }\n  },\n\n  willDestroyElement() {\n    this._super(...arguments);\n\n    document.documentElement.style.setProperty('--top-message-height', '0px');\n  },\n\n  actions: {\n    openTarget(target) {\n      window.open(target);\n    },\n\n    close() {\n      writeCookie(this.cookies, `digi-closedNotice_${this.model.id}`, true);\n      this.get('notice').markAsRead(this.model.id);\n\n      this.set('model', null);\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex-expand mt1 mb1\\\">\\n\\n  {{#if this.model.title}}\\n\\n    <strong>{{this.model.title}}</strong>\\n\\n  {{/if}}\\n\\n  {{this.htmlSafeMessage}}\\n\\n</div>\\n\\n{{#if this.model.body.action.target}}\\n\\n  {{#ui-button\\n    onClick=(action \\\"openTarget\\\" this.model.body.action.target)\\n    class=\\\"flex-shrink ml1\\\"\\n  }}\\n\\n    {{this.model.body.action.label}}\\n\\n  {{/ui-button}}\\n\\n{{/if}}\\n\\n{{#ui-button\\n  class=\\\"flex-shrink notice-close flex flex-center justify-center ml1 mt1 mb1\\\"\\n  appearance=\\\"link\\\"\\n  variant=\\\"inherit\\\"\\n  onClick=(action \\\"close\\\")\\n}}\\n  <DcIcon @name=\\\"simple-remove\\\" />\\n  <span class=\\\"hide-from-sm nl1\\\">\\n    {{t \\\"components.noticeManager.topMessage.close\\\"}}\\n  </span>\\n{{/ui-button}}', { moduleName: 'babel/components/notice-manager/top-message/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nexport default class PageContentMenu extends Component {\n  @service session;\n\n  @service router;\n\n  @tracked navOpen = false;\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get courseSettingsURL() {\n    return `${this.skolAdminUrl}/courses/${this.args.model.id}`;\n  }\n\n  get menuItems() {\n    return this.args.items.filter((item) => !item.teacherMenuItems);\n  }\n\n  get teacherMenuItems() {\n    if (!this.session.user?.isTeacher) return [];\n    return this.args.items.filter((item) => item.teacherMenuItems);\n  }\n\n  @action\n  openNav() {\n    this.navOpen = true;\n  }\n\n  @action\n  closeNav() {\n    this.navOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<li class={{@class}}>\\n  {{#each @items as |item|}}\\n    {{#if @model}}\\n      <UiLink\\n        @route={{item.route}}\\n        @model={{@model.id}}\\n        class=\\\"page-nav-item\\\"\\n        @disabled={{item.disabled}}\\n        @current-when={{item.currentWhen}}\\n        data-test-page-content-menu-item\\n      >\\n        <DcIcon @name={{item.icon}} @size=\\\"sm\\\" class=\\\"mr1\\\" />\\n        <span class=\\\"text-ui\\\">{{item.title}}</span>\\n      </UiLink>\\n    {{else}}\\n      <UiLink\\n        @route={{item.route}}\\n        class=\\\"page-nav-item\\\"\\n        @disabled={{item.disabled}}\\n        @current-when={{item.currentWhen}}\\n      >\\n        <DcIcon @name={{item.icon}} @size=\\\"sm\\\" class=\\\"mr1\\\" />\\n        <span class=\\\"text-ui\\\">{{item.title}}</span>\\n      </UiLink>\\n    {{/if}}\\n  {{/each}}\\n</li>', { moduleName: 'babel/components/page-content-menu/items/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<nav>\\n  <ul>\\n    <PageContentMenu::Items\\n      @items={{@menuItems}}\\n      @onClick={{@onCloseNav}}\\n      @model={{@model}}\\n    />\\n  </ul>\\n  {{#if @teacherItems}}\\n    <hr />\\n    <ul>\\n      <PageContentMenu::Items\\n        @items={{@teacherItems}}\\n        @onClick={{@onCloseNav}}\\n        @model={{@model}}\\n      />\\n    </ul>\\n  {{/if}}\\n  {{#if (and @isTeacher (eq @type \\\"course\\\"))}}\\n    <div class=\\\"page-content-menu-menu-course-administration\\\">\\n      <a\\n        href={{@courseSettingsURL}}\\n        class=\\\"ui-link ui-link--link--default ui-link--medium\\\"\\n      >\\n        {{t \\\"components.pageContentMenu.courseAdministrationLinkLabel\\\"}}\\n      </a>\\n      <p>\\n        {{t\\n          \\\"components.pageContentMenu.courseAdministrationDescriptionMessage\\\"\\n        }}\\n      </p>\\n    </div>\\n  {{/if}}\\n</nav>\", {\"contents\":\"<nav>\\n  <ul>\\n    <PageContentMenu::Items\\n      @items={{@menuItems}}\\n      @onClick={{@onCloseNav}}\\n      @model={{@model}}\\n    />\\n  </ul>\\n  {{#if @teacherItems}}\\n    <hr />\\n    <ul>\\n      <PageContentMenu::Items\\n        @items={{@teacherItems}}\\n        @onClick={{@onCloseNav}}\\n        @model={{@model}}\\n      />\\n    </ul>\\n  {{/if}}\\n  {{#if (and @isTeacher (eq @type \\\"course\\\"))}}\\n    <div class=\\\"page-content-menu-menu-course-administration\\\">\\n      <a\\n        href={{@courseSettingsURL}}\\n        class=\\\"ui-link ui-link--link--default ui-link--medium\\\"\\n      >\\n        {{t \\\"components.pageContentMenu.courseAdministrationLinkLabel\\\"}}\\n      </a>\\n      <p>\\n        {{t\\n          \\\"components.pageContentMenu.courseAdministrationDescriptionMessage\\\"\\n        }}\\n      </p>\\n    </div>\\n  {{/if}}\\n</nav>\",\"moduleName\":\"babel/components/page-content-menu/menu/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/page-content-menu/menu/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"page-nav\\\">\\n  <UiButton @size=\\\"large\\\" @onClick={{this.openNav}} id=\\\"toggle-page-nav\\\">\\n    <DcIcon @name=\\\"menu\\\" class=\\\"nr1\\\" />\\n    {{@buttonLabel}}\\n  </UiButton>\\n  {{#if this.navOpen}}\\n    <XPopup\\n      @switchToDialogOnSmallBreakpoint={{false}}\\n      @for=\\\"toggle-page-nav\\\"\\n      @onClose={{this.closeNav}}\\n    >\\n      <div class=\\\"page-nav p1\\\">\\n        <PageContentMenu::Menu\\n          @menuItems={{this.menuItems}}\\n          @teacherItems={{this.teacherMenuItems}}\\n          @model={{@model}}\\n          @onCloseNav={{this.closeNav}}\\n          @isTeacher={{this.session.user.isTeacher}}\\n          @type={{@type}}\\n          @courseSettingsURL={{this.courseSettingsURL}}\\n        />\\n      </div>\\n    </XPopup>\\n  {{/if}}\\n  <div class=\\\"page-nav-standard\\\">\\n    <PageContentMenu::Menu\\n      @menuItems={{this.menuItems}}\\n      @teacherItems={{this.teacherMenuItems}}\\n      @model={{@model}}\\n      @onCloseNav={{this.closeNav}}\\n      @isTeacher={{this.session.user.isTeacher}}\\n      @type={{@type}}\\n      @courseSettingsURL={{this.courseSettingsURL}}\\n    />\\n  </div>\\n</div>', { moduleName: 'babel/components/page-content-menu/template.hbs' });\n","import { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport imageSource from 'compton/utils/image-source';\n\nexport default class PageHeaderComponent extends Component {\n  /**\n   * Arguments:\n   * small (bool)\n   * model (object)\n   */\n\n  get withLogo() {\n    return this.args.model?.body?.use_logo ?? false;\n  }\n\n  get backgroundType() {\n    if (this.args.model?.backgroundType === 'color') {\n      return 'color';\n    }\n\n    if (this.args.model?.featuredImage) {\n      return 'image';\n    }\n\n    return null;\n  }\n\n  get cssClasses() {\n    const classes = ['page-header'];\n\n    if (this.args.small) {\n      classes.push('page-header--small');\n    }\n\n    if (this.withLogo) {\n      classes.push('page-header--with-logo');\n    }\n\n    if (this.backgroundType === 'image') {\n      classes.push('page-header--image');\n    } else if (this.backgroundType === 'color') {\n      classes.push('page-header--color');\n    } else {\n      classes.push('page-header--none');\n    }\n\n    return classes.join(' ');\n  }\n\n  get imageUrl() {\n    if (!this.args.model?.featuredImage) return null;\n    return imageSource(this.args.model.featuredImage, { preset: 'landscape' });\n  }\n\n  get backgroundColor() {\n    const backgroundColor = this.args.model?.backgroundColor || '#000000';\n    return htmlSafe(`background-color: ${backgroundColor}`);\n  }\n\n  get textColor() {\n    const textColor = this.args.model?.textColor || '#ffffff';\n    return htmlSafe(`color: ${textColor}`);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class={{this.cssClasses}}\\n  style={{if (eq this.backgroundType \\\"color\\\") this.backgroundColor}}\\n  ...attributes\\n>\\n  {{#if (eq this.backgroundType \\\"image\\\")}}\\n    <div class=\\\"page-header-image-background\\\" style=\\\"background-image: url({{this.imageUrl}});\\\" alt=\\\"\\\" role=\\\"presentation\\\"/>\\n  {{/if}}\\n\\n  <div class=\\\"page-header-effect\\\">\\n    <div\\n      class=\\\"container\\\"\\n      style={{if (eq this.backgroundType \\\"color\\\") this.textColor}}\\n    >\\n      {{yield}}\\n    </div>\\n  </div>\\n</div>\\n', { moduleName: 'babel/components/page-header/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class PreviewActionsComponent extends Component {\n  @service session;\n  @service contextHelper;\n\n  @tracked isMoving = false;\n  @tracked ref = null;\n  @tracked initialX = 0;\n  @tracked initialY = 0;\n\n  get canAccessCMSNode() {\n    if (!this.contextHelper || !this.session) {\n      return false;\n    }\n\n    const { activeBook } = this.contextHelper;\n    const { hasCMSAccess, accesses } = this.session;\n\n    if (!hasCMSAccess || !accesses) {\n      return false;\n    }\n\n    if (!activeBook || !activeBook.id) {\n      return false;\n    }\n\n    if (accesses.length === 0) {\n      // Empty access list means access to all nodes\n      return true;\n    }\n\n    return accesses.includes(activeBook.id);\n  }\n\n  @action\n  mouseDown(event) {\n    event.preventDefault();\n\n    this.initialX = event.clientX;\n    this.initialY = event.clientY;\n\n    window.addEventListener('mousemove', this.mouseMove);\n  }\n\n  @action\n  mouseUp(event) {\n    event.preventDefault();\n\n    this.ref.style.removeProperty('transform');\n    this.ref.style.removeProperty('left');\n    this.ref.style.removeProperty('top');\n\n    window.removeEventListener('mousemove', this.mouseMove);\n  }\n\n  @action\n  mouseMove(event) {\n    const currentX = event.clientX;\n    const currentY = event.clientY;\n\n    const right = currentX - this.initialX;\n    const left = this.initialX - currentX;\n    const up = this.initialY - currentY;\n    const down = currentY - this.initialY;\n\n    if (right > 20 || left > 20 || up > 20 || down > 20) {\n      this.isMoving = true;\n    }\n\n    if (this.isMoving) {\n      this.ref.style.transform = 'translate(-50%, -50%)';\n      this.ref.style.left = currentX + 'px';\n      this.ref.style.top = currentY + 'px';\n\n      let moved = false;\n      const positionY = up > 50 ? 'top' : down > 50 ? 'bottom' : '';\n      const positionX = right > 50 ? 'right' : left > 50 ? 'left' : '';\n\n      if (right > 150 || left > 150 || up > 150 || down > 150) {\n        this._move(positionX, positionY);\n        moved = true;\n      }\n\n      if (moved) {\n        window.removeEventListener('mousemove', this.mouseMove);\n        this.ref.style.removeProperty('transform');\n        this.ref.style.removeProperty('left');\n        this.ref.style.removeProperty('top');\n        this.isMoving = false;\n      }\n    }\n  }\n\n  _move(x, y) {\n    if (x === 'left') {\n      this.ref.classList.remove('positioned-right');\n      this.ref.classList.add('positioned-left');\n    } else if (x === 'right') {\n      this.ref.classList.remove('positioned-left');\n      this.ref.classList.add('positioned-right');\n    }\n\n    if (y === 'top') {\n      this.ref.classList.remove('positioned-bottom');\n      this.ref.classList.add('positioned-top');\n    } else if (y === 'bottom') {\n      this.ref.classList.remove('positioned-top');\n      this.ref.classList.add('positioned-bottom');\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{! template-lint-disable no-invalid-interactive }}\\n{{! template-lint-disable no-pointer-down-event-binding }}\\n<div\\n  class=\\\"preview-actions\\\"\\n  {{on \\\"mousedown\\\" this.mouseDown}}\\n  {{on \\\"mouseup\\\" this.mouseUp}}\\n  {{ref (set this \\\"ref\\\")}}\\n  ...attributes\\n>\\n  <PreviewIcon />\\n  {{#if this.canAccessCMSNode}}\\n    <EditPenIcon />\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/preview-actions/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class PreviewIcon extends Component {\n  @service session;\n\n  @action\n  togglePreview() {\n    const urlSearchParams = new URLSearchParams(window.location.search);\n\n    if (this.session.inPreviewMode) {\n      this.session.inPreviewMode = false;\n      urlSearchParams.delete('preview');\n    } else {\n      urlSearchParams.set('preview', 'true');\n    }\n\n    window.location.href = `//${window.location.host}${\n      window.location.pathname\n    }?${urlSearchParams.toString()}`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<button\\n  type=\\\"button\\\"\\n  {{on \\\"click\\\" this.togglePreview}}\\n  ...attributes\\n  class=\\\"preview-icon {{if this.session.inPreviewMode \\'preview-icon--active\\'}}\\\"\\n>\\n  {{#if this.session.inPreviewMode}}\\n    <DcIcon @name=\\\"eye-open\\\" />\\n  {{else}}\\n    <DcIcon @name=\\\"eye-ban\\\" />\\n  {{/if}}\\n</button>', { moduleName: 'babel/components/preview-icon/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"product-root-container\\\">\\n  <UiLink\\n    @route=\\\"master.products\\\"\\n    @model={{@product.id}}\\n    class=\\\"text-tertiary product-link\\\"\\n  >\\n    <span class=\\\"image-wrapper mr1 flex-shrink\\\">\\n      <XImage\\n        alt={{@product.title}}\\n        class=\\\"br0\\\"\\n        @source={{image-source\\n          (or @product.coverImage.imageUrl @product.cover.imageUrl)\\n          width=166\\n          height=166\\n          embed=true\\n        }}\\n      />\\n    </span>\\n\\n    {{@product.title}}\\n  </UiLink>\\n</div>\\n\", {\"contents\":\"<div class=\\\"product-root-container\\\">\\n  <UiLink\\n    @route=\\\"master.products\\\"\\n    @model={{@product.id}}\\n    class=\\\"text-tertiary product-link\\\"\\n  >\\n    <span class=\\\"image-wrapper mr1 flex-shrink\\\">\\n      <XImage\\n        alt={{@product.title}}\\n        class=\\\"br0\\\"\\n        @source={{image-source\\n          (or @product.coverImage.imageUrl @product.cover.imageUrl)\\n          width=166\\n          height=166\\n          embed=true\\n        }}\\n      />\\n    </span>\\n\\n    {{@product.title}}\\n  </UiLink>\\n</div>\\n\",\"moduleName\":\"babel/components/product-root/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/product-root/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if @continueVisited}}\\n  <h2 class=\\\"text-secondary mb1\\\">\\n    {{t \\\"components.products.productActivityList.continueWhereIwas\\\"}}\\n  </h2>\\n  {{continue-content continueVisited=@continueVisited}}\\n{{/if}}\\n\\n\\n{{latest-visited-content pageViews=@lastVisited continueVisited=@continueVisited}}\\n\\n{{#if @product.userBooks}}\\n\\n  <h2 class=\\\"text-secondary mb1\\\">\\n    {{t \\\"components.products.productActivityList.welcomeProducts\\\"}}\\n  </h2>\\n\\n  {{book-browser books=@product.userBooks product=@product range=\\\"medium\\\"}}\\n\\n{{/if}}\", {\"contents\":\"{{#if @continueVisited}}\\n  <h2 class=\\\"text-secondary mb1\\\">\\n    {{t \\\"components.products.productActivityList.continueWhereIwas\\\"}}\\n  </h2>\\n  {{continue-content continueVisited=@continueVisited}}\\n{{/if}}\\n\\n\\n{{latest-visited-content pageViews=@lastVisited continueVisited=@continueVisited}}\\n\\n{{#if @product.userBooks}}\\n\\n  <h2 class=\\\"text-secondary mb1\\\">\\n    {{t \\\"components.products.productActivityList.welcomeProducts\\\"}}\\n  </h2>\\n\\n  {{book-browser books=@product.userBooks product=@product range=\\\"medium\\\"}}\\n\\n{{/if}}\",\"moduleName\":\"babel/components/products/product-activity-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/products/product-activity-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { alias, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport imageSource from 'compton/utils/image-source';\n\nexport default Component.extend({\n  classNames: ['product-header'],\n\n  // EXTERNAL\n\n  session: service(),\n\n  ajax: service(),\n\n  store: service(),\n\n  product: null,\n\n  coverImage: alias('product.cover'),\n\n  image: alias('product.image'),\n\n  backgroundType: alias('product.metadata.background_type'),\n\n  hasColorBackground: equal('backgroundType', 'color'),\n\n  imageUrl: computed(\n    'image.imageUrl',\n    'product.metadata.image_uploaded',\n    function () {\n      const image = this.get('image');\n\n      return this.get('product.metadata.image_uploaded')\n        ? image.get('imageUrl')\n        : imageSource(image.get('imageUrl'), { preset: 'landscape' });\n    }\n  ),\n\n  imageThumbnail: computed('coverImage.imageUrl', function () {\n    const image = this.get('coverImage');\n\n    return (\n      image &&\n      image.get('imageUrl') &&\n      `background-image: url(${imageSource(image.get('imageUrl'), {\n        width: '248',\n        height: '248',\n        embed: true,\n      })})`\n    );\n  }),\n\n  backgroundColor: computed('product.metadata.color', function () {\n    const backgroundColor = this.get('product.metadata.color') || '#000000';\n    return htmlSafe(`background-color: ${backgroundColor}`);\n  }),\n\n  textColor: computed('product.metadata.text_color', function () {\n    const textColor = this.get('product.metadata.text_color') || '#ffffff';\n    return htmlSafe(`color: ${textColor}`);\n  }),\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"product-header-cover\\\"\\n  style={{if this.hasColorBackground this.backgroundColor}}\\n>\\n\\n  {{#unless this.hasColorBackground}}\\n    <div\\n      class=\\\"product-header-image-background\\\"\\n      style=\\\"background-image: url({{this.imageUrl}});\\\"\\n    ></div>\\n  {{/unless}}\\n\\n  <div\\n    class=\\\"product-header-effect{{if\\n        this.hasColorBackground\\n        \\' product-header-no-effect\\'\\n      }}\\\"\\n  >\\n\\n    <div class=\\\"container\\\">\\n      <div class=\\\"product-header-container\\\">\\n\\n        <div class=\\\"product-image mr1\\\" style=\\\"{{this.imageThumbnail}}\\\"></div>\\n\\n        <div\\n          class={{unless this.hasColorBackground \\\"text-color-inverted\\\"}}\\n          style={{if this.hasColorBackground this.textColor}}\\n        >\\n\\n          <h1\\n            class=\\\"product-header-name text-jumbo snb1\\\"\\n          >{{this.product.title}}</h1>\\n\\n        </div>\\n      </div>\\n    </div>\\n\\n  </div>\\n</div>', { moduleName: 'babel/components/products/product-header/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // EXTERNAL\n\n  product: null,\n\n  continueVisited: null,\n\n  // COMPUTED\n\n  // HOOKS\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{products/product-activity-list\\n  product=this.product\\n  continueVisited=this.continueVisited\\n  lastVisited=this.lastVisited\\n}}\\n', { moduleName: 'babel/components/products/product-index/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nexport default class PageHeaderComponent extends Component {\n  @service intl;\n\n  get productMenuItems() {\n    const menu_items = ['books', 'myResults'];\n\n    const menu_icons = {\n      books: 'home',\n      myResults: 'log',\n    };\n\n    const menu_routes = {\n      books: 'master.products.index',\n      myResults: 'master.products.my-results',\n    };\n\n    let items = [];\n\n    for (let i = 0; i < menu_items.length; i++) {\n      items.addObject({\n        title: this.intl.t('components.products.productMain.' + menu_items[i]),\n        icon: menu_icons[menu_items[i]],\n        route: menu_routes[menu_items[i]],\n        disabled: false,\n      });\n    }\n\n    return items;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Products::ProductHeader @product={{@product}} />\\n\\n<div class=\\\"container\\\" ...attributes>\\n  <div class=\\\"product-main\\\">\\n    <div class=\\\"flex-shrink mr2-sm\\\">\\n\\n      <PageContentMenu\\n        @buttonLabel={{t \\\"components.products.productMain.pages\\\"}}\\n        @items={{this.productMenuItems}}\\n        @model={{@product}}\\n        @type=\\\"product\\\"\\n      />\\n\\n    </div>\\n\\n    <div class=\\\"flex-auto\\\">\\n\\n      {{yield}}\\n\\n    </div>\\n  </div>\\n</div>', { moduleName: 'babel/components/products/product-main/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{{ this.svg }}}\", {\"contents\":\"{{{ this.svg }}}\",\"moduleName\":\"babel/components/qr-code-image/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/qr-code-image/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport QRCode from 'qrcode';\n\nexport default class QrCodeImageComponent extends Component {\n  @tracked svg = '';\n\n  constructor() {\n    super(...arguments);\n\n    QRCode.toString(\n      this.args.text,\n      { type: 'svg', errorCorrectionLevel: 'high' },\n      (error, svg) => {\n        if (error) {\n          console.error(error);\n          return;\n        }\n\n        this.svg = svg;\n      }\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @fullscreen={{true}}\\n  @closeOnEscape={{true}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n>\\n\\n  {{#let\\n    (generate-id) (t \\\"components.qrCodeModal.closeButtonLabel\\\")\\n    as |id label|\\n  }}\\n\\n    <UiButton\\n      id={{id}}\\n      class=\\\"qr-code-modal-close-button\\\"\\n      aria-label={{label}}\\n      @appearance=\\\"bulb\\\"\\n      @onClick={{@onClose}}\\n    >\\n      <DcIcon @name=\\\"simple-remove\\\" />\\n    </UiButton>\\n\\n    <XTooltip @for={{id}}>\\n      {{label}}\\n    </XTooltip>\\n\\n  {{/let}}\\n\\n  <div class=\\\"qr-code-modal-container\\\">\\n    <QrCodeImage @text={{@text}} />\\n  </div>\\n\\n</XModal>\", {\"contents\":\"<XModal\\n  @fullscreen={{true}}\\n  @closeOnEscape={{true}}\\n  @onClose={{@onClose}}\\n  ...attributes\\n>\\n\\n  {{#let\\n    (generate-id) (t \\\"components.qrCodeModal.closeButtonLabel\\\")\\n    as |id label|\\n  }}\\n\\n    <UiButton\\n      id={{id}}\\n      class=\\\"qr-code-modal-close-button\\\"\\n      aria-label={{label}}\\n      @appearance=\\\"bulb\\\"\\n      @onClick={{@onClose}}\\n    >\\n      <DcIcon @name=\\\"simple-remove\\\" />\\n    </UiButton>\\n\\n    <XTooltip @for={{id}}>\\n      {{label}}\\n    </XTooltip>\\n\\n  {{/let}}\\n\\n  <div class=\\\"qr-code-modal-container\\\">\\n    <QrCodeImage @text={{@text}} />\\n  </div>\\n\\n</XModal>\",\"moduleName\":\"babel/components/qr-code-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/qr-code-modal/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { storageFor } from 'ember-local-storage';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  settings: storageFor('read-setting')\n});\n","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { bool, equal } from '@ember/object/computed';\nimport { cancel, later } from '@ember/runloop';\n\nconst OFFSET_STYLE_VARIABLE_NAME = '--read-ruler-offset';\nconst SPACE_STYLE_VARIABLE_NAME = '--read-ruler-space';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['read-ruler-portal'],\n\n  classNameBindings: [\n    'isPerforming:read-ruler-portal--performing',\n    'isMoving:read-ruler-portal--moving',\n    'isResizing:read-ruler-portal--resizing'\n  ],\n\n  // PARAMS\n\n  space: null,\n\n  offset: null,\n\n  onClose: null,\n\n  onResize: null,\n\n  onMove: null,\n\n  // PROPERTIES\n\n  performDelay: 60,\n\n  minSpace: 28,\n\n  height: null,\n\n  method: null,\n\n  lasty: 0,\n\n  _resizeTimeout: null,\n\n  _moveTimeout: null,\n\n  isMoving: equal('method', 'move'),\n\n  isResizing: equal('method', 'resize'),\n\n  isPerforming: bool('method'),\n\n  closeButtonId: computed('elementId', function() {\n    return [this.get('elementId'), 'close-button'];\n  }),\n\n  moveButtonId: computed('elementId', function() {\n    return [this.get('elementId'), 'move-button'];\n  }),\n\n  resizeButtonId: computed('elementId', function() {\n    return [this.get('elementId'), 'resize-button'];\n  }),\n\n  // ACTIONS\n\n  actions: {\n    handleCloseButtonClick(evt) {\n      evt.preventDefault();\n      this.get('onClose')();\n    },\n\n    handleMoveButtonTouchStart(evt) {\n      evt.preventDefault();\n      document.addEventListener('touchend', this.documentTouchEnd);\n      this._resizeTimeout = later(() => {\n        this.set('method', 'move');\n        this.set('lasty', evt.changedTouches[0].clientY);\n        document.addEventListener('touchmove', this.documentTouchMove);\n      }, this.get('performDelay'));\n    },\n\n    handleMoveButtonMouseDown(evt) {\n      evt.preventDefault();\n      document.addEventListener('mouseup', this.documentMouseUp);\n      this._resizeTimeout = later(() => {\n        this.set('method', 'move');\n        document.addEventListener('mousemove', this.documentMouseMove);\n      }, this.get('performDelay'));\n    },\n\n    handleResizeButtonTouchStart(evt) {\n      evt.preventDefault();\n      document.addEventListener('touchend', this.documentTouchEnd);\n      this._resizeTimeout = later(() => {\n        this.set('method', 'resize');\n        this.set('lasty', evt.changedTouches[0].clientY);\n        document.addEventListener('touchmove', this.documentTouchMove);\n      }, this.get('performDelay'));\n    },\n\n    handleResizeButtonMouseDown(evt) {\n      evt.preventDefault();\n      document.addEventListener('mouseup', this.documentMouseUp);\n      this._resizeTimeout = later(() => {\n        this.set('method', 'resize');\n        document.addEventListener('mousemove', this.documentMouseMove);\n      }, this.get('performDelay'));\n    }\n  },\n\n  // EVENTS\n\n  windowResize() {\n    this._calculateHeight();\n  },\n\n  documentTouchEnd() {\n    this.set('method', null);\n    document.removeEventListener('touchend', this.documentTouchEnd);\n    document.removeEventListener('touchmove', this.documentTouchMove);\n    cancel(this._resizeTimeout);\n  },\n\n  documentMouseUp() {\n    this.set('method', null);\n    document.removeEventListener('mouseup', this.documentMouseUp);\n    document.removeEventListener('mousemove', this.documentMouseMove);\n    cancel(this._resizeTimeout);\n  },\n\n  documentTouchMove(evt) {\n    const clientY = evt.changedTouches[0].clientY;\n    const movementY = clientY - this.get('lasty');\n    this.set('lasty', clientY);\n    switch (this.get('method')) {\n      case 'move':\n        this._move(movementY);\n        break;\n      case 'resize':\n        this._resize(movementY);\n        break;\n    }\n  },\n\n  documentMouseMove({ movementY }) {\n    switch (this.get('method')) {\n      case 'move':\n        this._move(movementY);\n        break;\n      case 'resize':\n        this._resize(movementY);\n        break;\n    }\n  },\n\n  // HOOKS\n\n  init() {\n    this._super(...arguments);\n    this.windowResize = this.windowResize.bind(this);\n    this.documentTouchEnd = this.documentTouchEnd.bind(this);\n    this.documentTouchMove = this.documentTouchMove.bind(this);\n    this.documentMouseUp = this.documentMouseUp.bind(this);\n    this.documentMouseMove = this.documentMouseMove.bind(this);\n  },\n\n  didInsertElement() {\n    this._super(...arguments);\n    this._calculateHeight();\n    this._setStyleVariable(SPACE_STYLE_VARIABLE_NAME, this.get('space') + 'px');\n    this._setStyleVariable(\n      OFFSET_STYLE_VARIABLE_NAME,\n      this.get('offset') + 'px'\n    );\n    window.addEventListener('resize', this.windowResize);\n  },\n\n  didDestroyElement() {\n    window.removeEventListener('resize', this.windowResize);\n  },\n\n  // OBSERVERS\n\n  spaceObserver: observer('space', function() {\n    this._setStyleVariable(SPACE_STYLE_VARIABLE_NAME, this.get('space') + 'px');\n  }),\n\n  offsetObserver: observer('offset', function() {\n    this._setStyleVariable(\n      OFFSET_STYLE_VARIABLE_NAME,\n      this.get('offset') + 'px'\n    );\n  }),\n\n  // PRIVATE\n\n  _move(amount) {\n    let newAmount = parseInt(\n      this._getStyleVariable(OFFSET_STYLE_VARIABLE_NAME)\n    );\n    newAmount -= amount;\n    const limit =\n      this.get('height') / 2 - this.get('space') / 2 - this.get('minSpace');\n\n    newAmount = Math.min(newAmount, limit);\n    newAmount = Math.max(newAmount, -limit);\n    this.get('onMove')(newAmount);\n  },\n\n  _resize(amount) {\n    let newAmount = parseInt(this._getStyleVariable(SPACE_STYLE_VARIABLE_NAME));\n    newAmount += amount;\n    newAmount = Math.max(newAmount, this.get('minSpace'));\n    newAmount = Math.min(\n      newAmount,\n      this.get('height') + this.get('minSpace') * 2\n    );\n    this.get('onResize')(newAmount);\n  },\n\n  _calculateHeight() {\n    const { height } = this.get('element').getBoundingClientRect();\n\n    this.set('height', height);\n  },\n\n  _getStyleVariable(key) {\n    return getComputedStyle(this.get('element')).getPropertyValue(key);\n  },\n\n  _setStyleVariable(key, value) {\n    this.get('element').style.setProperty(key, value);\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"read-ruler-portal-top-overlay\\\">\\n\\n  <div class=\\\"read-ruler-portal-top-overlay-actions\\\">\\n    {{#ui-button\\n      id=this.closeButtonId\\n      class=\\\"read-ruler-portal-close-button flex flex-center justify-center\\\"\\n      onClick=(action \\\"handleCloseButtonClick\\\")\\n      variant=\\\"inherit\\\"\\n    }}\\n      <DcIcon @name=\\\"simple-remove\\\" />\\n    {{/ui-button}}\\n\\n    {{x-tooltip\\n      content=\\\"Close\\\"\\n      for=this.closeButtonId\\n      disabled=this.isPerforming\\n    }}\\n\\n  </div>\\n\\n</div>\\n\\n<div class=\\\"read-ruler-portal-bottom-overlay\\\">\\n\\n  <div class=\\\"read-ruler-portal-bottom-overlay-actions\\\">\\n\\n    <button\\n      id={{this.moveButtonId}}\\n      class=\\\"read-ruler-portal-move-button\\\"\\n      ontouchstart={{action \\\"handleMoveButtonTouchStart\\\"}}\\n      onmousedown={{action \\\"handleMoveButtonMouseDown\\\"}}\\n    >\\n      <DcIcon @name=\\\"swap-vertical\\\" />\\n    </button>\\n\\n    {{x-tooltip\\n      content=\\\"Move\\\"\\n      for=this.moveButtonId\\n      disabled=this.isPerforming\\n    }}\\n\\n    <button\\n      id={{this.resizeButtonId}}\\n      class=\\\"read-ruler-portal-resize-button\\\"\\n      ontouchstart={{action \\\"handleResizeButtonTouchStart\\\"}}\\n      onmousedown={{action \\\"handleResizeButtonMouseDown\\\"}}\\n    >\\n      <DcIcon @name=\\\"resize-v\\\" />\\n    </button>\\n\\n    {{x-tooltip\\n      content=\\\"Resize\\\"\\n      for=this.resizeButtonId\\n      disabled=this.isPerforming\\n    }}\\n  </div>\\n\\n</div>', { moduleName: 'babel/components/read-ruler/portal/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.settings.readRulerIsOpen}}\\n\\n  {{#ui-portal}}\\n\\n    {{read-ruler/portal\\n      space=this.settings.readRulerSpace\\n      offset=this.settings.readRulerOffset\\n      onClose=(action (mut this.settings.readRulerIsOpen) false)\\n      onResize=(action (mut this.settings.readRulerSpace))\\n      onMove=(action (mut this.settings.readRulerOffset))\\n    }}\\n\\n  {{/ui-portal}}\\n\\n{{/if}}', { moduleName: 'babel/components/read-ruler/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div ...attributes class=\\\"read-settings\\\">\\n  {{#if this.showBrowseOrScrollOption}}\\n    <UiLabel @for=\\\"read-settings-mode-select\\\">\\n      {{t \\\"components.readSettings.behavior\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-mode-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"modeSelect\\\"\\n      @groupValue={{this.settings.mode}}\\n      @options={{this.modeOptions}}\\n      @onChange={{this.setMode}}\\n    />\\n  {{/if}}\\n  {{#if this.showFontSizeOption}}\\n    <UiLabel @for=\\\"read-settings-font-size-select\\\">\\n      {{t \\\"components.readSettings.fontsize\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-font-size-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"fontSizeSelect\\\"\\n      @groupValue={{this.textSize}}\\n      @options={{this.fontSizeOptions}}\\n      @onChange={{this.setFontSize}}\\n    />\\n  {{/if}}\\n  {{#if this.showLineHeightOption}}\\n    <UiLabel @for=\\\"read-settings-line-height-select\\\">\\n      {{t \\\"components.readSettings.lineHeight\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-line-height-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"lineHeightSelect\\\"\\n      @groupValue={{this.settings.lineHeight}}\\n      @options={{this.lineHeightOptions}}\\n      @onChange={{this.setLineHeight}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.showFontFaceOption}}\\n    <UiLabel @for=\\\"read-settings-font-family-select\\\">\\n      {{t \\\"components.readSettings.font\\\"}}\\n    </UiLabel>\\n    <div class=\\\"mb1\\\">\\n      <XSelect\\n        id=\\\"read-settings-font-family-select\\\"\\n        @stretch={{true}}\\n        @items={{this.fonts}}\\n        @onChange={{this.setFontFamily}}\\n        @value={{this.settings.fontfamily}}\\n        @placeholder={{t \\\"components.readSettings.font\\\"}}\\n      />\\n    </div>\\n  {{/if}}\\n  {{#if this.showThemeOption}}\\n    <ThemeSwitch />\\n  {{/if}}\\n  {{#if this.showMarkingOption}}\\n    <UiLabel @for=\\\"read-settings-marking-select\\\">\\n      {{t \\\"components.readSettings.marking\\\"}}\\n    </UiLabel>\\n    <div class=\\\"mb1\\\">\\n      <XSelect\\n        id=\\\"read-settings-marking-select\\\"\\n        @stretch={{true}}\\n        @value={{this.settings.marking}}\\n        @items={{this.markingOptions}}\\n        @onChange={{this.setMarking}}\\n      />\\n    </div>\\n  {{/if}}\\n  {{#if (or this.showReadRulerOption this.showOnlyTextOption)}}\\n    <div class=\\\"text-separator text-bordered-left mt1 mb1\\\">\\n      {{t \\\"components.readSettings.tools\\\"}}\\n    </div>\\n  {{/if}}\\n  {{#if this.showOnlyImageOption}}\\n    <XSwitch\\n      @onChange={{this.setOnlyImage}}\\n      @content={{t \\\"components.readSettings.onlyImage\\\"}}\\n      class=\\\"nb1\\\"\\n      @checked={{this.settings.onlyImage}}\\n    />\\n  {{/if}}\\n  {{#if this.showReadRulerOption}}\\n    <XSwitch\\n      @onChange={{this.setReadRuler}}\\n      @content={{t \\\"components.readSettings.readingRuler\\\"}}\\n      class=\\\"nb1\\\"\\n      @checked={{this.settings.readRulerIsOpen}}\\n    />\\n  {{/if}}\\n  {{#if this.showOnlyTextOption}}\\n    <XSwitch\\n      @onChange={{this.setOnlyText}}\\n      @content={{t \\\"components.readSettings.onlyText\\\"}}\\n      class=\\\"mt1 mb1\\\"\\n      @checked={{this.settings.onlytext}}\\n    />\\n  {{/if}}\\n  <div class=\\\"flex\\\">\\n    <div class=\\\"text-ui flex-grow\\\">\\n      {{t \\\"components.readSettings.title\\\"}}\\n    </div>\\n    <UiButton @appearance=\\\"link\\\" @onClick={{this.enterFocus}}>\\n      {{t \\\"components.readSettings.action\\\"}}\\n    </UiButton>\\n  </div>\\n  <div class=\\\"flex justify-center mt1 bradius translation-link\\\">\\n    <a\\n      href=\\\"https://support.nok.se/article/4130\\\"\\n      class=\\\"ui-link ui-link--link--default n1\\\"\\n      target=\\\"_blank\\\"\\n      rel=\\\"noopener noreferrer\\\"\\n    >\\n      {{t \\\"components.readSettings.translationLink\\\"}}\\n      <DcIcon @name=\\\"external\\\" @size=\\\"xs\\\" class=\\\"nl1\\\" />\\n    </a>\\n  </div>\\n</div>\", {\"contents\":\"<div ...attributes class=\\\"read-settings\\\">\\n  {{#if this.showBrowseOrScrollOption}}\\n    <UiLabel @for=\\\"read-settings-mode-select\\\">\\n      {{t \\\"components.readSettings.behavior\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-mode-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"modeSelect\\\"\\n      @groupValue={{this.settings.mode}}\\n      @options={{this.modeOptions}}\\n      @onChange={{this.setMode}}\\n    />\\n  {{/if}}\\n  {{#if this.showFontSizeOption}}\\n    <UiLabel @for=\\\"read-settings-font-size-select\\\">\\n      {{t \\\"components.readSettings.fontsize\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-font-size-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"fontSizeSelect\\\"\\n      @groupValue={{this.textSize}}\\n      @options={{this.fontSizeOptions}}\\n      @onChange={{this.setFontSize}}\\n    />\\n  {{/if}}\\n  {{#if this.showLineHeightOption}}\\n    <UiLabel @for=\\\"read-settings-line-height-select\\\">\\n      {{t \\\"components.readSettings.lineHeight\\\"}}\\n    </UiLabel>\\n    <UiRadioButtonGroup\\n      id=\\\"read-settings-line-height-select\\\"\\n      class=\\\"mb1\\\"\\n      @direction=\\\"horizontal\\\"\\n      @namespace=\\\"lineHeightSelect\\\"\\n      @groupValue={{this.settings.lineHeight}}\\n      @options={{this.lineHeightOptions}}\\n      @onChange={{this.setLineHeight}}\\n    />\\n  {{/if}}\\n\\n  {{#if this.showFontFaceOption}}\\n    <UiLabel @for=\\\"read-settings-font-family-select\\\">\\n      {{t \\\"components.readSettings.font\\\"}}\\n    </UiLabel>\\n    <div class=\\\"mb1\\\">\\n      <XSelect\\n        id=\\\"read-settings-font-family-select\\\"\\n        @stretch={{true}}\\n        @items={{this.fonts}}\\n        @onChange={{this.setFontFamily}}\\n        @value={{this.settings.fontfamily}}\\n        @placeholder={{t \\\"components.readSettings.font\\\"}}\\n      />\\n    </div>\\n  {{/if}}\\n  {{#if this.showThemeOption}}\\n    <ThemeSwitch />\\n  {{/if}}\\n  {{#if this.showMarkingOption}}\\n    <UiLabel @for=\\\"read-settings-marking-select\\\">\\n      {{t \\\"components.readSettings.marking\\\"}}\\n    </UiLabel>\\n    <div class=\\\"mb1\\\">\\n      <XSelect\\n        id=\\\"read-settings-marking-select\\\"\\n        @stretch={{true}}\\n        @value={{this.settings.marking}}\\n        @items={{this.markingOptions}}\\n        @onChange={{this.setMarking}}\\n      />\\n    </div>\\n  {{/if}}\\n  {{#if (or this.showReadRulerOption this.showOnlyTextOption)}}\\n    <div class=\\\"text-separator text-bordered-left mt1 mb1\\\">\\n      {{t \\\"components.readSettings.tools\\\"}}\\n    </div>\\n  {{/if}}\\n  {{#if this.showOnlyImageOption}}\\n    <XSwitch\\n      @onChange={{this.setOnlyImage}}\\n      @content={{t \\\"components.readSettings.onlyImage\\\"}}\\n      class=\\\"nb1\\\"\\n      @checked={{this.settings.onlyImage}}\\n    />\\n  {{/if}}\\n  {{#if this.showReadRulerOption}}\\n    <XSwitch\\n      @onChange={{this.setReadRuler}}\\n      @content={{t \\\"components.readSettings.readingRuler\\\"}}\\n      class=\\\"nb1\\\"\\n      @checked={{this.settings.readRulerIsOpen}}\\n    />\\n  {{/if}}\\n  {{#if this.showOnlyTextOption}}\\n    <XSwitch\\n      @onChange={{this.setOnlyText}}\\n      @content={{t \\\"components.readSettings.onlyText\\\"}}\\n      class=\\\"mt1 mb1\\\"\\n      @checked={{this.settings.onlytext}}\\n    />\\n  {{/if}}\\n  <div class=\\\"flex\\\">\\n    <div class=\\\"text-ui flex-grow\\\">\\n      {{t \\\"components.readSettings.title\\\"}}\\n    </div>\\n    <UiButton @appearance=\\\"link\\\" @onClick={{this.enterFocus}}>\\n      {{t \\\"components.readSettings.action\\\"}}\\n    </UiButton>\\n  </div>\\n  <div class=\\\"flex justify-center mt1 bradius translation-link\\\">\\n    <a\\n      href=\\\"https://support.nok.se/article/4130\\\"\\n      class=\\\"ui-link ui-link--link--default n1\\\"\\n      target=\\\"_blank\\\"\\n      rel=\\\"noopener noreferrer\\\"\\n    >\\n      {{t \\\"components.readSettings.translationLink\\\"}}\\n      <DcIcon @name=\\\"external\\\" @size=\\\"xs\\\" class=\\\"nl1\\\" />\\n    </a>\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/read-settings/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/read-settings/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackPresentationEvent } from 'babel/utils/matomo-events';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ReadSettingsComponent extends Component {\n  @service contextHelper;\n\n  @service intl;\n\n  @service focusMode;\n\n  @service speaker;\n\n  @storageFor('read-setting') settings;\n\n  @tracked textSize = '2';\n\n  constructor() {\n    super(...arguments);\n\n    const template = this.args.template;\n\n    this.showFontSizeOption = true;\n    this.showFontFaceOption = true;\n    this.showMarkingOption = true;\n    this.showThemeOption = true;\n    this.showReadRulerOption = true;\n    this.showLineHeightOption = true;\n\n    if (template === 'chapter') {\n      this.showBrowseOrScrollOption = true;\n      this.showOnlyTextOption = true;\n    } else if (template === 'workflow') {\n      this.showOnlyTextOption = true;\n    }\n\n    if (this.contextHelper.activeBook?.adaptUiFor === 1) {\n      this.showFontSizeOption = false;\n    }\n\n    if (this.settings.get('textsize') === '3') {\n      this.textSize = '3';\n    }\n  }\n\n  get themeOptions() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.colorSchemes.standard'),\n        value: 'light',\n      },\n      {\n        label: this.intl.t('components.readSettings.colorSchemes.dark'),\n        value: 'dark',\n      },\n      {\n        label: this.intl.t('components.readSettings.colorSchemes.dyslexi'),\n        value: 'dyslexi',\n      },\n    ];\n  }\n\n  get markingOptions() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.markings.discreet'),\n        value: 'discreet',\n      },\n      {\n        label: this.intl.t('components.readSettings.markings.underlined'),\n        value: 'underlined',\n      },\n      {\n        label: this.intl.t('components.readSettings.markings.colored'),\n        value: 'colored',\n      },\n    ];\n  }\n\n  get fontSizeOptions() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.fontsizes.medium'),\n        value: '2',\n      },\n      {\n        label: this.intl.t('components.readSettings.fontsizes.large'),\n        value: '3',\n      },\n    ];\n  }\n\n  get modeOptions() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.scroll'),\n        value: 'scroll',\n      },\n      {\n        label: this.intl.t('components.readSettings.browse'),\n        value: 'step',\n      },\n    ];\n  }\n\n  get lineHeightOptions() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.lineHeights.medium'),\n        value: 'standard',\n      },\n      {\n        label: this.intl.t('components.readSettings.lineHeights.large'),\n        value: 'large',\n      },\n    ];\n  }\n\n  get fonts() {\n    return [\n      {\n        label: this.intl.t('components.readSettings.defaultFont'),\n        value: 'system-font',\n      },\n      { label: 'Georgia', value: 'georgia' },\n      { label: 'Times New Roman', value: 'times' },\n      { label: 'Helvetica', value: 'helvetica' },\n      { label: 'Verdana', value: 'verdana' },\n      { label: 'Dyslexie', value: 'dyslexie' },\n    ];\n  }\n\n  @action\n  enterFocus() {\n    this.args.onChange?.('focus');\n    this.focusMode.turnOn();\n  }\n\n  @action\n  setMode(value) {\n    trackPresentationEvent(\n      `Ändra beteende - ${value === 'scroll' ? 'Skrolla' : 'Bläddra'}`\n    );\n\n    this.settings.set('mode', value);\n    this.args.onChange?.('mode');\n  }\n\n  @action\n  setFontFamily(value) {\n    trackPresentationEvent('Ändra typsnitt', value);\n\n    this.settings.set('fontfamily', value);\n    this.args.onChange?.('fontFamily');\n  }\n\n  @action\n  setFontSize(value) {\n    trackPresentationEvent(\n      `Ändra textstorlek - ${value === '2' ? 'Förval' : 'Större'}`\n    );\n\n    this.settings.set('textsize', value);\n    this.args.onChange?.('fontSize');\n  }\n\n  @action\n  setLineHeight(value) {\n    trackPresentationEvent(\n      `Ändra radavstånd - ${value === 'standard' ? 'Förval' : 'Större'}`\n    );\n\n    this.settings.set('lineHeight', value);\n    this.args.onChange?.('lineHeight');\n  }\n\n  @action\n  setReadRuler(value) {\n    trackPresentationEvent(`Ändra läslinjal - ${value ? 'På' : 'Av'}`);\n\n    this.settings.set('readRulerIsOpen', value);\n    this.args.onChange?.('readRuler');\n  }\n\n  @action\n  setOnlyText(value) {\n    trackPresentationEvent(`Ändra endast text - ${value ? 'På' : 'Av'}`);\n\n    this.settings.set('onlytext', value);\n    this.args.onChange?.('textOnly');\n  }\n\n  @action\n  setMarking(value) {\n    trackPresentationEvent(`Ändra färgmarkering i text`, value);\n\n    this.settings.set('marking', value);\n    this.args.onChange?.('marking');\n  }\n}\n","import { action } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport babelEnv from 'babel/config/environment';\nimport { scrollTo } from 'babel/utils/chapter-viewport';\nimport { trackReadingBuddyEvent } from 'babel/utils/matomo-events';\nimport { storageFor } from 'ember-local-storage';\n\nconst STATES = {\n  paused: 'paused',\n  listening: 'listening',\n  speaking: 'speaking',\n  notStarted: 'notStarted',\n  ended: 'ended',\n};\n\nexport default class ReadingBuddyComponent extends Component {\n  azureApiTokenEndpoint = babelEnv.talkamatic?.azureApiTokenEndpoint;\n  speechRecognitionEndpointId =\n    babelEnv.talkamatic?.speechRecognitionEndpointId;\n  rootURL = babelEnv.rootURL;\n\n  sendInitialTurnPage = true;\n  subscription = null;\n\n  @service intl;\n\n  @service speaker;\n\n  @tracked currentState = STATES.notStarted;\n  @tracked ttsLexicon =\n    'https://cvoiceprodneu.blob.core.windows.net/acc-public-files/33867cc7d3ce43b9a040dc16212a025e/9f6c85e1-4fe9-4268-b337-24015d30b46c.xml';\n  @tracked isActivated = false;\n  @tracked isLoading = false;\n  @tracked isMinimized = false;\n  @tracked intervalId = null;\n\n  @storageFor('reading-buddy') settings;\n\n  get avatar() {\n    return `/assets/images/reading-buddy/dog_${this.currentState}.svg`;\n  }\n\n  get displayText() {\n    return this.intl.t(`components.readingBuddy.states.${this.currentState}`);\n  }\n\n  get readingBuddyClass() {\n    return this.inPauseState ? 'reading-buddy-paused' : 'reading-buddy-playing';\n  }\n\n  get readingBuddyActiveClass() {\n    return this.isActivated ? ' reading-buddy-activated' : '';\n  }\n\n  get inPauseState() {\n    return this.isPaused || !this.isActivated;\n  }\n\n  get isListening() {\n    return this.currentState === STATES.listening;\n  }\n\n  get isSpeaking() {\n    return this.currentState === STATES.speaking;\n  }\n\n  get isPaused() {\n    return this.currentState === STATES.paused;\n  }\n\n  get isEnded() {\n    return this.currentState === STATES.ended;\n  }\n\n  // Actions\n\n  @action\n  handleMinimize() {\n    this.reset();\n    this.isMinimized = true;\n    this.settings.set('isMinimized', true);\n    trackReadingBuddyEvent('Minimera');\n  }\n\n  @action\n  handleMaximize() {\n    this.isMinimized = false;\n    this.settings.set('isMinimized', false);\n    trackReadingBuddyEvent('Maximera');\n\n    scheduleOnce('afterRender', this, this.#scrollToReadingBuddyIfNeeded);\n  }\n\n  @action\n  handleRestart() {\n    // This will also be called from stopped event in state listener, no idea why we need both\n    this.reset();\n  }\n\n  @action\n  handleClick() {\n    this.isLoading = true;\n    this.speaker.pauseOther(this.dispatchPause);\n\n    if (!this.isActivated || this.isEnded) {\n      this.activate();\n    } else {\n      this.isPaused ? this.activate() : this.dispatchPause();\n    }\n  }\n\n  @action\n  end() {\n    this.currentState = STATES.ended;\n    this.isActivated = false;\n  }\n\n  @action\n  resetPage() {\n    this.dispatchTurnPage();\n    if (this.args.resetOnPageChange) this.reset();\n  }\n\n  // Functions\n\n  #scrollToReadingBuddyIfNeeded() {\n    const elem = document.querySelector('.reading-buddy-container');\n\n    if (elem && !elem.classList.contains('reading-buddy-activated')) {\n      scrollTo(elem, 'smooth');\n    }\n  }\n\n  dispatchPause() {\n    trackReadingBuddyEvent('Paus');\n    window.TalaSpeech.send({ type: 'CONTROL' });\n  }\n\n  dispatchActivate() {\n    trackReadingBuddyEvent('Aktivera');\n    this.isPaused\n      ? window.TalaSpeech.send({ type: 'CONTROL' })\n      : window.TalaSpeech.send({ type: 'START' });\n  }\n\n  dispatchPrepare() {\n    window.TalaSpeech.send({ type: 'PREPARE' });\n  }\n\n  dispatchStop() {\n    trackReadingBuddyEvent('Stop');\n    window.TalaSpeech.send({ type: 'STOP' });\n  }\n\n  dispatchTurnPage() {\n    this.isLoading = true;\n    if (this.isActivated) {\n      this.dispatchStop();\n      this.isActivated = false;\n    }\n    trackReadingBuddyEvent('Vänd blad');\n    window.TalaSpeech.send({ type: 'TURN_PAGE', value: this.args.page });\n  }\n\n  activate() {\n    this.isActivated = true;\n    this.dispatchActivate();\n  }\n\n  reset() {\n    if (this.isActivated) {\n      this.dispatchStop();\n      this.isActivated = false;\n    }\n\n    this.sendInitialTurnPage = true;\n\n    this.setup();\n    this.currentState = STATES.notStarted;\n    this.isLoading = false;\n  }\n\n  @action\n  stateListener(snapshot) {\n    switch (window.TalaSpeechUIState) {\n      case 'before-prepare':\n        this.dispatchPrepare();\n        break;\n      case 'speaking':\n        this.isActivated = true;\n        this.currentState = STATES.speaking;\n        this.isLoading = false;\n        break;\n      case 'ready':\n        if (snapshot.context?.segment === 'cover' && this.sendInitialTurnPage) {\n          this.isLoading = true;\n          this.dispatchTurnPage();\n          this.sendInitialTurnPage = false;\n          break;\n        }\n        this.isLoading = false;\n        break;\n      case 'recognising-paused':\n      case 'speaking-paused':\n        this.currentState = STATES.paused;\n        this.isLoading = false;\n        break;\n      case 'recognising':\n        this.currentState = STATES.listening;\n        this.isLoading = false;\n        break;\n      case 'end':\n        this.end();\n        break;\n      case 'stopped':\n        this.reset();\n        break;\n      case 'initiating':\n        this.isLoading = true;\n        break;\n      default:\n        console.log('Unknown state', window.TalaSpeechUIState);\n    }\n  }\n\n  setup() {\n    if (!this.subscription) {\n      return;\n    }\n\n    window.TalaSpeech.send({\n      type: 'SETUP',\n      value: {\n        deviceID: 'digilar-production-20230124',\n        endpoint: this.args.endpoint,\n        azureCredentials: this.azureApiTokenEndpoint,\n        azureRegion: 'northeurope',\n        locale: 'sv-SE',\n        speechRecognitionEndpointId: this.speechRecognitionEndpointId,\n        ttsDefaultVoice: 'sv-SE-SofieNeural',\n      },\n    });\n    this.isLoading = true;\n  }\n\n  waitForTalkomatic() {\n    if (this.intervalID) {\n      return;\n    }\n\n    this.intervalID = setInterval(() => {\n      if (window.TalaSpeech) {\n        clearInterval(this.intervalID);\n        this.subscription = window.TalaSpeech.subscribe(this.stateListener);\n        this.setup();\n      }\n    }, 100);\n  }\n\n  // Life cycle hooks\n\n  constructor() {\n    super(...arguments);\n    this.waitForTalkomatic();\n    this.isMinimized = this.settings.get('isMinimized') ?? false;\n    trackReadingBuddyEvent('Visas');\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.dispatchStop();\n    this.subscription?.unsubscribe();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isMinimized}}\\n  <UiButton\\n    @appearance=\\\"link\\\"\\n    @onClick={{this.handleMaximize}}\\n    class=\\\"reading-buddy-minimized-container\\\"\\n  >\\n    <img\\n      alt={{t \\\"components.readingBuddy.avatarImageAlt\\\"}}\\n      class=\\\"reading-buddy-minimized-avatar\\\"\\n      src={{this.avatar}}\\n    />\\n  </UiButton>\\n{{else}}\\n  <div\\n    class=\\\"reading-buddy-container container-md position-relative\\n      {{this.readingBuddyActiveClass}}\\\"\\n  >\\n    <UiButton\\n      @appearance=\\\"bulb\\\"\\n      @onClick={{this.handleMinimize}}\\n      class=\\\"reading-buddy-close-button\\\"\\n    >\\n      <DcIcon @name=\\\"small-down\\\" />\\n    </UiButton>\\n    <DcCard class=\\\"reading-buddy\\\" {{did-update this.resetPage @page}}>\\n      <div class=\\\"reading-buddy-meta\\\">\\n        <div class=\\\"reading-buddy-avatar-container\\\">\\n          <img\\n            alt={{t \\\"components.readingBuddy.avatarImageAlt\\\"}}\\n            class=\\\"reading-buddy-avatar\\\"\\n            src={{this.avatar}}\\n          />\\n        </div>\\n        {{#if this.isPaused}}\\n          <UiButton\\n            class=\\\"reading-buddy-restart-button\\\"\\n            @appearance=\\\"link\\\"\\n            @size=\\\"small\\\"\\n            @onClick={{this.handleRestart}}\\n          >\\n            {{t \\\"components.readingBuddy.restartButton\\\"}}\\n          </UiButton>\\n        {{/if}}\\n      </div>\\n      <div class=\\\"reading-buddy-widget-container\\\">\\n        <div class=\\\"reading-buddy-widget {{this.readingBuddyClass}}\\\">\\n          <div class=\\\"reading-buddy-text-bar\\\">\\n            <div class=\\\"reading-buddy-text text-ui\\\">\\n              {{this.displayText}}\\n            </div>\\n            <div class=\\\"reading-buddy-status\\\">\\n              {{#if this.isListening}}\\n                <span class=\\\"reading-buddy-status-listening\\\"></span>\\n              {{else if this.isSpeaking}}\\n                <ul class=\\\"reading-buddy-status-speaking\\\">\\n                  <li></li>\\n                  <li></li>\\n                  <li></li>\\n                </ul>\\n              {{/if}}\\n            </div>\\n          </div>\\n\\n          <UiButton\\n            class=\\\"reading-buddy-interact-button\\\"\\n            @variant=\\\"default\\\"\\n            @shape=\\\"rounded\\\"\\n            @loading={{this.isLoading}}\\n            @size=\\\"small\\\"\\n            @disabled={{this.isLoading}}\\n            @onClick={{this.handleClick}}\\n          >\\n            {{#if this.inPauseState}}\\n              <DcIcon @name=\\\"button-play\\\" />\\n            {{else}}\\n              <DcIcon @name=\\\"button-pause\\\" />\\n            {{/if}}\\n          </UiButton>\\n        </div>\\n      </div>\\n    </DcCard>\\n  </div>\\n{{/if}}\\n{{! template-lint-disable no-forbidden-elements }}\\n<script\\n  src=\\\"https://unpkg.com/tala-speech@2.15.0/dist/browser/index.js\\\"\\n></script>', { moduleName: 'babel/components/reading-buddy/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class ReadingResolveComponent extends Component {\n  /**\n   * Arguments:\n   * readingId (string)\n   */\n\n  @service store;\n\n  @cached get readingProxy() {\n    const readingId = this.args.readingId;\n    const promise = readingId\n      ? this.store.findRecord('material', readingId)\n      : resolve();\n\n    return load(promise, this);\n  }\n\n  get reading() {\n    return this.readingProxy.isResolved ? this.readingProxy.value : null;\n  }\n\n  get readingUrl() {\n    if (this.readingProxy.isResolved) {\n      return this.reading?.meta?.attachment_url || 'none';\n    } else {\n      return null;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{yield this.readingUrl}}\\n', { moduleName: 'babel/components/reading-resolve/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XModal\\n  @title={{t \\\"components.scheduleDetailModal.title\\\"}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  as |modal|\\n>\\n\\n  <modal.header />\\n\\n  <UiFormFor\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @object={{this.schedule}}\\n    @onSubmit={{this.handleFormSubmit}}\\n    as |form|\\n  >\\n\\n    <modal.content class=\\\"py1\\\">\\n\\n      <p class=\\\"mb0 mx1\\\">\\n        {{t \\\"components.scheduleDetailModal.message\\\"}}\\n      </p>\\n\\n      <ScheduleFormPart\\n        class=\\\"mt1 nx1\\\"\\n        @startDate={{this.schedule.startDate}}\\n        @endDate={{this.schedule.endDate}}\\n        @onSetStartDate={{set this.schedule \\\"startDate\\\"}}\\n        @onSetEndDate={{set this.schedule \\\"endDate\\\"}}\\n      />\\n\\n    </modal.content>\\n\\n    <modal.footer class=\\\"flex justify-flex-end\\\">\\n\\n      <div>\\n        <UiButton\\n          class=\\\"mr1\\\"\\n          @appearance=\\\"link\\\"\\n          @autofocus={{true}}\\n          @onClick={{@onClose}}\\n        >\\n          {{t \\\"components.scheduleDetailModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n        <form.submit @disabled={{this.schedule.isInvalid}} @variant=\\\"success\\\">\\n          {{t \\\"components.scheduleDetailModal.scheduleButtonLabel\\\"}}\\n        </form.submit>\\n      </div>\\n\\n    </modal.footer>\\n\\n  </UiFormFor>\\n\\n</XModal>\", {\"contents\":\"<XModal\\n  @title={{t \\\"components.scheduleDetailModal.title\\\"}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @onClose={{@onClose}}\\n  as |modal|\\n>\\n\\n  <modal.header />\\n\\n  <UiFormFor\\n    class=\\\"flex flex-column flex-one overflow-auto\\\"\\n    @object={{this.schedule}}\\n    @onSubmit={{this.handleFormSubmit}}\\n    as |form|\\n  >\\n\\n    <modal.content class=\\\"py1\\\">\\n\\n      <p class=\\\"mb0 mx1\\\">\\n        {{t \\\"components.scheduleDetailModal.message\\\"}}\\n      </p>\\n\\n      <ScheduleFormPart\\n        class=\\\"mt1 nx1\\\"\\n        @startDate={{this.schedule.startDate}}\\n        @endDate={{this.schedule.endDate}}\\n        @onSetStartDate={{set this.schedule \\\"startDate\\\"}}\\n        @onSetEndDate={{set this.schedule \\\"endDate\\\"}}\\n      />\\n\\n    </modal.content>\\n\\n    <modal.footer class=\\\"flex justify-flex-end\\\">\\n\\n      <div>\\n        <UiButton\\n          class=\\\"mr1\\\"\\n          @appearance=\\\"link\\\"\\n          @autofocus={{true}}\\n          @onClick={{@onClose}}\\n        >\\n          {{t \\\"components.scheduleDetailModal.cancelButtonLabel\\\"}}\\n        </UiButton>\\n        <form.submit @disabled={{this.schedule.isInvalid}} @variant=\\\"success\\\">\\n          {{t \\\"components.scheduleDetailModal.scheduleButtonLabel\\\"}}\\n        </form.submit>\\n      </div>\\n\\n    </modal.footer>\\n\\n  </UiFormFor>\\n\\n</XModal>\",\"moduleName\":\"babel/components/schedule-detail-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/schedule-detail-modal/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nclass Schedule {\n  @tracked startDate = null;\n  @tracked endDate = null;\n\n  constructor({ startDate, endDate = null } = {}) {\n    this.startDate = startDate;\n    this.endDate = endDate;\n  }\n\n  get isInvalid() {\n    return !this.startDate && !this.endDate;\n  }\n}\n\nexport default class SchedulePopup extends Component {\n  @tracked schedule = new Schedule({\n    startDate: this.args.startDate,\n    endDate: this.args.endDate,\n  });\n\n  @action\n  async handleFormSubmit() {\n    await this.args.onSchedule(this.schedule);\n    this.args.onClose();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"grid\\\" ...attributes>\\n  <div class=\\\"col-6 col-xs-12\\\">\\n\\n    {{#let (generate-id) as |id|}}\\n\\n      <UiLabel for={{id}}>\\n        {{t \\\"components.missionScheduleFormPart.startDateDatepickerLabel\\\"}}\\n      </UiLabel>\\n\\n      <XDatepicker\\n        id={{id}}\\n        @value={{@startDate}}\\n        @onChange={{@onSetStartDate}}\\n      />\\n\\n    {{/let}}\\n  </div>\\n\\n  <div class=\\\"col-6 col-xs-12\\\">\\n\\n    {{#let (generate-id) as |id|}}\\n\\n      <UiLabel for={{id}}>\\n        {{t \\\"components.missionScheduleFormPart.endDateDatepickerLabel\\\"}}\\n      </UiLabel>\\n\\n      <XDatepicker\\n        id={{id}}\\n        @value={{@endDate}}\\n        @min={{@startDate}}\\n        @onChange={{@onSetEndDate}}\\n      />\\n\\n    {{/let}}\\n\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"grid\\\" ...attributes>\\n  <div class=\\\"col-6 col-xs-12\\\">\\n\\n    {{#let (generate-id) as |id|}}\\n\\n      <UiLabel for={{id}}>\\n        {{t \\\"components.missionScheduleFormPart.startDateDatepickerLabel\\\"}}\\n      </UiLabel>\\n\\n      <XDatepicker\\n        id={{id}}\\n        @value={{@startDate}}\\n        @onChange={{@onSetStartDate}}\\n      />\\n\\n    {{/let}}\\n  </div>\\n\\n  <div class=\\\"col-6 col-xs-12\\\">\\n\\n    {{#let (generate-id) as |id|}}\\n\\n      <UiLabel for={{id}}>\\n        {{t \\\"components.missionScheduleFormPart.endDateDatepickerLabel\\\"}}\\n      </UiLabel>\\n\\n      <XDatepicker\\n        id={{id}}\\n        @value={{@endDate}}\\n        @min={{@startDate}}\\n        @onChange={{@onSetEndDate}}\\n      />\\n\\n    {{/let}}\\n\\n  </div>\\n</div>\",\"moduleName\":\"babel/components/schedule-form-part/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/schedule-form-part/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { task, timeout } from 'ember-concurrency';\n\nconst DEBOUNCE_TIME = 500;\n\nexport default Component.extend({\n  classNames: ['search-bar', 'flex'],\n\n  searchValue: null,\n\n  autofocus: false,\n\n  onClear() {},\n\n  onSearch() {},\n\n  updateSearch: task(function*() {\n    yield timeout(DEBOUNCE_TIME);\n\n    this.get('onSearch')(this.get('searchValue'));\n  }).drop(),\n\n  actions: {\n    clearSearch() {\n      this.get('onClear')();\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{ui-input\\n  clearable=this.clearable\\n  placeholder=this.placeholder\\n  value=this.value\\n  onClear=this.onClear\\n  onEnter=this.onEnter\\n  class=\\\"flex flex-expand search-bar-input\\\"\\n  ariaLabel=this.ariaLabel\\n  autofocus=this.autofocus\\n  inputSize=\\\"large\\\"\\n}}\\n\\n{{#ui-button\\n  class=\\\"search-bar-submit\\\"\\n  size=\\\"large\\\"\\n  appearance=\\\"none\\\"\\n  onClick=this.onClick\\n}}\\n\\n  <DcIcon @name=\\\"search\\\" @size=\\\"lg\\\" />\\n\\n{{/ui-button}}', { moduleName: 'babel/components/search-bar/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul class=\\\"select-list\\\" ...attributes>\\n  {{yield (hash Item=(component \\\"select-list/item\\\"))}}\\n</ul>\", {\"contents\":\"<ul class=\\\"select-list\\\" ...attributes>\\n  {{yield (hash Item=(component \\\"select-list/item\\\"))}}\\n</ul>\",\"moduleName\":\"babel/components/select-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/select-list/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li\\n  class=\\\"select-list-item\\\"\\n  data-selected={{this.selected}}\\n  ...attributes\\n  {{did-insert this.handleDidInsert}}\\n>\\n  <UiButton\\n    class=\\\"select-list-item-button\\\"\\n    @appearance=\\\"link\\\"\\n    @onClick={{@onSelect}}\\n    @disabled={{@disabled}}\\n  >\\n\\n    {{#if this.selected}}\\n      <DcIcon class=\\\"select-list-item-button-icon\\\" @name=\\\"check\\\" @size=\\\"xs\\\" />\\n    {{/if}}\\n\\n    {{yield}}\\n\\n  </UiButton>\\n</li>\", {\"contents\":\"<li\\n  class=\\\"select-list-item\\\"\\n  data-selected={{this.selected}}\\n  ...attributes\\n  {{did-insert this.handleDidInsert}}\\n>\\n  <UiButton\\n    class=\\\"select-list-item-button\\\"\\n    @appearance=\\\"link\\\"\\n    @onClick={{@onSelect}}\\n    @disabled={{@disabled}}\\n  >\\n\\n    {{#if this.selected}}\\n      <DcIcon class=\\\"select-list-item-button-icon\\\" @name=\\\"check\\\" @size=\\\"xs\\\" />\\n    {{/if}}\\n\\n    {{yield}}\\n\\n  </UiButton>\\n</li>\",\"moduleName\":\"babel/components/select-list/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/select-list/item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\n\nexport default class SelectListItem extends Component {\n  get selected() {\n    return this.args.selected ?? false;\n  }\n\n  @action\n  handleDidInsert(element) {\n    if (this.selected) {\n      scrollIntoViewIfNeeded(element);\n    }\n  }\n}\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport copyToClipboard from 'babel/utils/copy-to-clipboard';\nimport { trackPageHeaderEvent } from 'babel/utils/matomo-events';\nimport QRCode from 'qrcode';\n\nfunction downloadSource(source, filename) {\n  const link = document.createElement('a');\n  link.download = filename;\n  link.href = source;\n  document.body.appendChild(link);\n  link.click();\n  document.body.removeChild(link);\n}\n\nexport default Component.extend({\n  session: service(),\n\n  modalTitle: null,\n\n  entity: null,\n\n  fullLink: null,\n\n  title: null,\n\n  body: null,\n\n  hideOptions: false,\n\n  snackbar: service(),\n\n  intl: service(),\n\n  qrModalIsOpen: false,\n\n  includeProvider: true,\n\n  link: null,\n\n  finalLink: computed(\n    'includeProvider',\n    'link',\n    'session.user.provider',\n    function () {\n      const url = new URL(this.link || window.location.href);\n\n      const provider = this.session.user.provider;\n\n      if (provider && this.includeProvider) {\n        url.searchParams.set('provider', provider);\n      } else {\n        url.searchParams.delete('provider');\n      }\n\n      return url.toString();\n    }\n  ),\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n    if (!this.fullLink) {\n      this.set(\n        'title',\n        this.intl.t('components.shareLinkModal.message.title', {\n          title: this.get('entity.title'),\n        })\n      );\n\n      this.set(\n        'body',\n        this.intl.t('components.shareLinkModal.message.body', {\n          title: this.get('entity.title'),\n        })\n      );\n    }\n  },\n\n  actions: {\n    selectAll(input) {\n      input.setSelectionRange(0, input.value.length);\n    },\n\n    async handleDownloadQrCodeButtonClick() {\n      // eslint-disable-next-line no-undef\n      const qrCode = await QRCode.toDataURL(this.finalLink, {\n        type: 'image/png',\n        width: 512,\n        errorCorrectionLevel: 'high',\n      });\n\n      downloadSource(qrCode, 'qr-code.png');\n    },\n    handleCopyToClipboard(value) {\n      trackPageHeaderEvent('Metamodal - Kopiera länk');\n      copyToClipboard(value)\n        .then(() => {\n          this.snackbar.enqueue(\n            this.intl.t('components.shareLinkModal.locationCopiedToClipboard'),\n            {\n              variant: 'success',\n              autoDismiss: true,\n            }\n          );\n        })\n        .catch(() => {\n          this.snackbar.enqueue(\n            this.intl.t(\n              'components.shareLinkModal.locationFailedToCopyToClipboard'\n            ),\n            {\n              variant: 'error',\n            }\n          );\n        });\n    },\n  },\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n  classNames: ['share-link-modal-options'],\n\n  encodedLinkToShare: computed('linkToShare', function() {\n    return encodeURIComponent(this.get('linkToShare'));\n  })\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<a\\n  class=\\\"flex flex-center mr1 mb1 text-color-default text-ui\\\"\\n  href=\\\"https://classroom.google.com/share?url={{this.encodedLinkToShare}}&title={{this.title}}&body={{this.body}}\\\"\\n  target=\\\"_blank\\\"\\n  rel=\\\"noopener noreferrer\\\"\\n>\\n  <DcIcon @name=\\\"classroom\\\" @size=\\\"lg\\\" class=\\\"nr1\\\" />\\n  Google Classroom\\n</a>\\n\\n<a\\n  class=\\\"flex flex-center mr1 mb1 text-color-default text-ui\\\"\\n  href=\\\"https://teams.microsoft.com/share?href={{this.encodedLinkToShare}}&amp;referrer=digi.nokportalen.se&assignTitle={{this.title}}&msgText={{this.body}}\\\"\\n  target=\\\"_blank\\\"\\n  rel=\\\"noopener noreferrer\\\"\\n>\\n  <DcIcon @name=\\\"teams\\\" @size=\\\"lg\\\" class=\\\"nr1\\\" />\\n  Microsoft Teams\\n</a>\\n\\n<a\\n  class=\\\"flex flex-center mb1 text-color-default text-ui\\\"\\n  href=\\\"mailto:?subject={{this.title}}&amp;body={{this.body}}%0D%0A%0D%0A{{this.encodedLinkToShare}}\\\"\\n  target=\\\"_blank\\\"\\n>\\n  <DcIcon @name=\\\"mail\\\" @size=\\\"lg\\\" class=\\\"nr1\\\" />\\n  Via e-post\\n</a>', { moduleName: 'babel/components/share-link-modal/options/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-modal\\n  size=(hash width=\\\"small\\\" height=\\\"auto\\\")\\n  title=(or this.modalTitle (t \\\"components.shareLinkModal.title\\\"))\\n  onClose=(action this.onClose)\\n}}\\n\\n  <div class=\\\"p1\\\" data-test-share-link-modal-content>\\n\\n    <p class=\\\"mb1\\\">\\n      {{t \\\"components.shareLinkModal.shareMessage\\\"}}\\n    </p>\\n\\n    {{#if this.session.user.provider}}\\n\\n      <label\\n        for={{concat this.elementId \\\"-copy-link\\\"}}\\n        class=\\\"text-ui block nb1\\\"\\n      >{{t \\\"components.shareLinkModal.copyLink\\\"}}</label>\\n\\n      <label class=\\\"flex flex-center nb1\\\">\\n        <XSwitch class=\\\"nr1\\\" @checked={{this.includeProvider}} />\\n        {{t\\n          \\\"components.shareLinkModal.includeProviderSwitchLabel\\\"\\n          provider=this.session.user.serviceProvider.name\\n        }}\\n      </label>\\n\\n    {{/if}}\\n\\n    {{ui-input\\n      id=(concat this.elementId \\\"-copy-link\\\")\\n      onClick=(action \\\"selectAll\\\")\\n      class=\\\"nb1\\\"\\n      value=this.finalLink\\n      showButton=true\\n      buttonLabel=(t \\\"components.shareLinkModal.copy\\\")\\n      onButtonClick=(action \\\"handleCopyToClipboard\\\")\\n    }}\\n\\n    <div class=\\\"mb1\\\">\\n      <UiButton\\n        class=\\\"nr1\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{action \\\"handleDownloadQrCodeButtonClick\\\"}}\\n      >\\n        <DcIcon @name=\\\"cloud-download\\\" class=\\\"nr1\\\" />\\n        {{t \\\"components.shareLinkModal.downloadQrCodeButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton @appearance=\\\"link\\\" @onClick={{set this \\\"qrModalIsOpen\\\" true}}>\\n        <DcIcon @name=\\\"expand\\\" class=\\\"nr1\\\" />\\n        {{t \\\"components.shareLinkModal.showQrCodeButtonLabel\\\"}}\\n      </UiButton>\\n    </div>\\n\\n    {{#unless this.hideOptions}}\\n      <div class=\\\"mb1 text-ui\\\">{{t \\\"components.shareLinkModal.shareTo\\\"}}</div>\\n\\n      {{share-link-modal/options\\n        title=this.title\\n        body=this.body\\n        linkToShare=this.finalLink\\n      }}\\n    {{/unless}}\\n\\n  </div>\\n\\n{{/x-modal}}\\n\\n{{#if this.qrModalIsOpen}}\\n  <QrCodeModal\\n    @text={{this.finalLink}}\\n    @onClose={{set this \\\"qrModalIsOpen\\\" false}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/share-link-modal/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\n/**\n * Arguments:\n * activeProduct\n * currentCourse\n * disabled\n * displayArrowIcon\n * entity\n * exercise\n * items\n * shape\n * variant\n * opacity (int)\n * onChange\n * onClose\n * onOpen\n */\n\nexport default class ShareMetaMenu extends Component {\n  @tracked menuIsOpen = false;\n\n  @tracked menuMouseDragMode = false;\n\n  // ACTIONS\n\n  @action\n  handleButtonLongPress(evt) {\n    this._openMenu(true, evt);\n  }\n\n  @action handleButtonClick(evt) {\n    this._openMenu(false, evt);\n  }\n\n  @action handleMenuClose(evt) {\n    this._closeMenu(evt);\n  }\n\n  // PRIVATE\n\n  _change() {\n    this.args.onChange(...arguments);\n  }\n\n  _openMenu(menuMouseDragMode, evt) {\n    this.menuMouseDragMode = true;\n    this.menuIsOpen = true;\n\n    this.args.onOpen(evt);\n  }\n\n  _closeMenu(evt) {\n    this.menuMouseDragMode = false;\n    this.menuIsOpen = false;\n\n    this.args.onClose(evt);\n  }\n}\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nconst REJECTED_NODE_TYPES = ['root', 'node-imports-root'];\n\nexport default class GlobalBreadcrumb extends Component {\n  @cached get ancestorsProxy() {\n    let promise = resolve();\n    if (this.args.parent) {\n      promise = this.args.parent.getParents().then((parents) =>\n        parents\n          .reject((node) => REJECTED_NODE_TYPES.includes(node.get('type')))\n          .reverse()\n          .addObject(this.node)\n      );\n    }\n    return load(promise, this);\n  }\n\n  get ancestors() {\n    return this.ancestorsProxy.isResolved ? this.ancestorsProxy.value : null;\n  }\n\n  @action scrollToTop() {\n    later(() => {\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @parent}}\\n  <div class=\\\"global-breadcrumb-container\\\">\\n    {{#if @currentCourse}}\\n      <UiLink\\n        @route=\\\"master.courses.show.index\\\"\\n        @model={{@currentCourse.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.shareMetaMenu.modal.breadcrumb.courseTitle\\\"}}\\n      >\\n        <span>{{@currentCourse.name}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{else if @activeProduct}}\\n      <UiLink\\n        @route=\\\"master.products.index\\\"\\n        @model={{@activeProduct.id}}\\n        @query={{hash customContentId=null missionId=null}}\\n        @variant=\\\"inherit\\\"\\n        class=\\\"header-nav-root text-default global-breadcrumb-link\\\"\\n        title={{t \\\"components.shareMetaMenu.modal.breadcrumb.productTitle\\\"}}\\n      >\\n        <span>{{@activeProduct.title}}</span>\\n        <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n      </UiLink>\\n    {{/if}}\\n\\n    {{#each this.ancestors as |ancestor|}}\\n      {{#if ancestor}}\\n        <EntityLink\\n          @entity={{ancestor}}\\n          @closeMissionHeader={{true}}\\n          @appearance=\\\"inherit\\\"\\n          class=\\\"text-default text-hover-underline global-breadcrumb-link\\\"\\n        >\\n          <span>{{ancestor.title}}</span>\\n          <DcIcon @name=\\\"small-right\\\" class=\\\"nx1\\\" />\\n        </EntityLink>\\n      {{/if}}\\n    {{/each}}\\n\\n    <span class=\\\"text-bold global-breadcrumb-active\\\">\\n      {{@parent.title}}\\n    </span>\\n  </div>\\n\\n  <hr class=\\\"divider\\\" />\\n{{/if}}', { moduleName: 'babel/components/share-meta-menu/modal/breadcrumb/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport config from 'babel/config/environment';\n\n/**\n * Arguments:\n * currentCourse\n * activeProduct\n * activeCourse\n * entity\n * exercise\n * withHeader (bool)\n * header (object)\n * value\n * items\n * multiple (bool)\n * opacity (int)\n * flip (bool)\n * arrow (bool)\n * minWidth (number)\n * placementOffset\n * alignmentOffset\n * mouseDragMode (bool)\n * stickToTarget (bool)\n * appearance\n * scrollToSelected (bool)\n */\n\nexport default class ShareMetaMenuModal extends Component {\n  @service entityInspector;\n\n  @service contextHelper;\n\n  @service router;\n\n  get infoItems() {\n    let returnArray = [];\n\n    if (this.args.entity) {\n      returnArray.push({\n        icon: 'info-circle',\n        value: 'entity',\n        label: this.args.entity.title,\n      });\n    }\n\n    if (\n      this.contextHelper.activeExercise &&\n      !this.contextHelper.activeExercise.isTeacherAssignment\n    ) {\n      returnArray.push({\n        icon: 'info-circle',\n        value: 'exercise',\n        label: this.contextHelper.activeExercise.title,\n      });\n    }\n\n    return returnArray;\n  }\n\n  get hasSkolAdminUrl() {\n    return config.skolAdminUrl && config.skolAdminUrl !== 'null';\n  }\n\n  get skolAdminUrl() {\n    return this.hasSkolAdminUrl ? config.skolAdminUrl : '';\n  }\n\n  get createCourseUrl() {\n    return `${this.skolAdminUrl}/courses`;\n  }\n\n  // ACTIONS\n\n  @action\n  handleListChange() {\n    this._change(...arguments);\n\n    if (!this.args.multiple) {\n      this._close();\n    }\n  }\n\n  @action\n  handleOpenEntityInspector(value) {\n    if (value === 'exercise') {\n      this.entityInspector.openModal(this.contextHelper.activeExercise);\n    } else {\n      this.entityInspector.openModal(this.args.entity);\n    }\n    this._close();\n  }\n\n  // PRIVATE\n\n  _change() {\n    this.args.onChange(...arguments);\n  }\n\n  _close() {\n    this.args.onClose();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @items}}\\n\\n  {{#let (generate-id \\\"menu\\\") as |id|}}\\n\\n    <XOverlay\\n      @id={{id}}\\n      @tabMode=\\\"prevent\\\"\\n      @opacity={{@opacity}}\\n      @closeOnEscape={{true}}\\n      @closeOnWindowResize={{true}}\\n      @closeOnWindowBlur={{true}}\\n      @closeOnRouteChange={{true}}\\n      @mouseDragMode={{@mouseDragMode}}\\n      @onClose={{@onClose}}\\n    >\\n\\n      <XAttachment\\n        @style={{style minWidth=@minWidth}}\\n        @for={{@for}}\\n        @containerId={{id}}\\n        @placement={{@placement}}\\n        @alignment={{@alignment}}\\n        @flip={{@flip}}\\n        @arrow={{@arrow}}\\n        @stickToTarget={{@stickToTarget}}\\n        @placementOffset={{@placementOffset}}\\n        @alignmentOffset={{@alignmentOffset}}\\n        @componentParams={{@attachmentOptions}}\\n        @appearance={{@appearance}}\\n        @shadowClass={{@shadowClass}}\\n      >\\n        <div class=\\\"share-meta-modal\\\">\\n          {{#if (and @activeProduct (not @activeCourse))}}\\n            <a\\n              href={{this.createCourseUrl}}\\n              class=\\\"create-course-link ui-link ui-link--link--default ui-link--medium ui-link--square\\\"\\n            >\\n              <DcIcon @name=\\\"create-course\\\" class=\\\"nr1\\\" />\\n              {{t \\\"components.shareMetaMenu.modal.createCourse\\\"}}\\n            </a>\\n            <hr class=\\\"divider mb1\\\" />\\n          {{/if}}\\n          {{#if @entity}}\\n            <ShareMetaMenu::Modal::Breadcrumb\\n              @parent={{@entity}}\\n              @activeProduct={{@activeProduct}}\\n              @currentCourse={{@currentCourse}}\\n              class=\\\"nr1\\\"\\n            />\\n          {{/if}}\\n          <XScrollView @autoScroll={{@mouseDragMode}}>\\n\\n            {{#if @withHeader}}\\n              {{#if (has-block)}}\\n                {{yield @header}}\\n              {{/if}}\\n            {{/if}}\\n\\n            {{#let\\n              (component\\n                \\\"x-list\\\"\\n                class=\\\"share-meta-modal-x-list\\\"\\n                value=@value\\n                items=@items\\n                multiple=@multiple\\n                autoFocus=true\\n                onChange=this.handleListChange\\n                scrollToSelected=@scrollToSelected\\n              )\\n              as |ListComponent|\\n            }}\\n\\n              {{#if (has-block)}}\\n\\n                <ListComponent as |option|>\\n\\n                  {{yield option}}\\n\\n                </ListComponent>\\n\\n              {{else}}\\n\\n                {{ListComponent}}\\n\\n              {{/if}}\\n\\n            {{/let}}\\n\\n            {{#if this.infoItems}}\\n              <div>\\n                <hr class=\\\"divider\\\" />\\n                <span class=\\\"text-separator\\\">\\n                  {{t \\\"components.shareMetaMenu.modal.information\\\"}}\\n                </span>\\n\\n                {{#let\\n                  (component\\n                    \\\"x-list\\\"\\n                    class=\\\"share-meta-modal-x-list\\\"\\n                    value=@value\\n                    items=this.infoItems\\n                    multiple=@multiple\\n                    autoFocus=true\\n                    onChange=this.handleOpenEntityInspector\\n                    scrollToSelected=@scrollToSelected\\n                  )\\n                  as |ListComponent|\\n                }}\\n\\n                  {{#if (has-block)}}\\n\\n                    <ListComponent as |option|>\\n\\n                      {{yield option}}\\n\\n                    </ListComponent>\\n\\n                  {{else}}\\n\\n                    {{ListComponent}}\\n\\n                  {{/if}}\\n\\n                {{/let}}\\n\\n              </div>\\n            {{/if}}\\n          </XScrollView>\\n        </div>\\n      </XAttachment>\\n\\n    </XOverlay>\\n\\n  {{/let}}\\n\\n{{/if}}', { moduleName: 'babel/components/share-meta-menu/modal/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let (or @id (generate-id \\\"menu-button\\\")) as |id|}}\\n  <UiButton\\n    @id={{id}}\\n    @class={{@class}}\\n    @active={{this.menuIsOpen}}\\n    @appearance={{@appearance}}\\n    @variant={{@variant}}\\n    @shape={{@shape}}\\n    @size={{@size}}\\n    @disabled={{@disabled}}\\n    @onLongPress={{this.handleButtonLongPress}}\\n    @onClick={{this.handleButtonClick}}\\n  >\\n\\n    {{yield (hash menuIsOpen=this.menuIsOpen)}}\\n\\n    {{#if @displayArrowIcon}}\\n\\n      <DcIcon @name=\\\"small-down\\\" class={{if (has-block) \\\"nl1\\\"}} />\\n\\n    {{/if}}\\n\\n  </UiButton>\\n  {{#if this.menuIsOpen}}\\n    <ShareMetaMenu::Modal\\n      @activeProduct={{@activeProduct}}\\n      @activeCourse={{@activeCourse}}\\n      @currentCourse={{@currentCourse}}\\n      @entity={{@entity}}\\n      @exercise={{@exercise}}\\n      @value={{@value}}\\n      @items={{@items}}\\n      @for={{id}}\\n      @opacity={{@opacity}}\\n      @mouseDragMode={{@menuMouseDragMode}}\\n      @placement={{@placement}}\\n      @alignment={{@alignment}}\\n      @arrow={{true}}\\n      @flip={{true}}\\n      @onChange={{@onChange}}\\n      @onClose={{this.handleMenuClose}}\\n    />\\n  {{/if}}\\n\\n{{/let}}', { moduleName: 'babel/components/share-meta-menu/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport copyToClipboard from 'babel/utils/copy-to-clipboard';\n\nexport default class ShareMetaComponent extends Component {\n  @service intl;\n\n  @service snackbar;\n\n  @tracked shareModalOpen = false;\n\n  onOpen() {}\n\n  onClose() {}\n\n  get shareMetaItems() {\n    const returnArray = [\n      {\n        icon: 'link',\n        value: 'copyLink',\n        label: this.intl.t('components.shareMeta.menu.copyLink'),\n      },\n      {\n        icon: 'share',\n        value: 'share',\n        label: this.intl.t('components.shareMeta.menu.share'),\n      },\n    ];\n\n    return returnArray;\n  }\n\n  get currentUrl() {\n    return window.location.href;\n  }\n\n  @action handleOpenInspector(value) {\n    if (value === 'copyLink') {\n      copyToClipboard(this.currentUrl)\n        .then(() => {\n          this.snackbar.enqueue(\n            this.intl.t('components.shareMeta.locationCopiedToClipboard'),\n            {\n              variant: 'success',\n              autoDismiss: true,\n            }\n          );\n        })\n        .catch(() => {\n          this.snackbar.enqueue(\n            this.intl.t('components.shareMeta.locationFailedToCopyToClipboard'),\n            {\n              variant: 'error',\n            }\n          );\n        });\n    } else {\n      this.shareModalOpen = true;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ShareMetaMenu\\n  @items={{this.shareMetaItems}}\\n  @appearance=\\\"button\\\"\\n  @variant=\\\"alternative\\\"\\n  @shape=\\\"rounded\\\"\\n  @opacity={{0}}\\n  @class={{@classNames}}\\n  @onChange={{this.handleOpenInspector}}\\n  @displayArrowIcon={{false}}\\n  @disabled={{this.disabled}}\\n  @onOpen={{this.onOpen}}\\n  @onClose={{this.onClose}}\\n  @entity={{@entity}}\\n  @exercise={{@exercise}}\\n  @activeProduct={{@activeProduct}}\\n  @currentCourse={{@currentCourse}}\\n>\\n  <DcIcon @name=\\\"menu-dots\\\" />\\n</ShareMetaMenu>\\n{{#if this.shareModalOpen}}\\n  <ShareLinkModal\\n    @entity={{@entity}}\\n    @title={{@title}}\\n    @body={{@body}}\\n    @modalTitle={{@modalTitle}}\\n    @onClose={{fn (mut this.shareModalOpen) false}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/share-meta/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class ShowResponseComponent extends Component {\n  @service showResponse;\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"show-response\\\" ...attributes>\\n  {{#if this.showResponse.imgSrc}}\\n    <img\\n      class=\\\"response-img response-img--{{this.showResponse.mode}}\\\"\\n      style={{this.showResponse.imgStyle}}\\n      src={{this.showResponse.imgSrc}}\\n      alt=\\\"\\\"\\n      role=\\\"presentation\\\"\\n    />\\n  {{/if}}\\n\\n  {{#if this.showResponse.audioSrc}}\\n    <audio class=\\\"show-response-audio hidden\\\" autoplay>\\n      <source src=\\\"{{this.showResponse.audioSrc}}\\\" type=\\\"audio/mp3\\\">\\n    </audio>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/show-response/template.hbs' });\n","import Component from '@ember/component';\nimport { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport DigilarLanguageUtil from 'babel/utils/speaker/DigilarLanguageUtil';\nimport DigilarPollyProviderFactory from 'babel/utils/speaker/DigilarPollyProviderFactory';\nimport DigilarSpeakerConfig from 'babel/utils/speaker/DigilarSpeakerConfig';\nimport digilarGeneralRuleSet from 'babel/utils/speaker/text-processing-rule-sets/digilar-general';\nimport { task } from 'ember-concurrency';\nimport { storageFor } from 'ember-local-storage';\nimport {\n  SpeakerTextProcessor,\n  SpeakerTextProcessorRuleSet,\n  SpeakerTtsTextConverter,\n} from 'speaker';\n\nexport default Component.extend({\n  classNames: ['simple-speech-player'],\n\n  value: null,\n\n  lang: null,\n\n  player: null,\n\n  playing: false,\n\n  ajax: service(),\n\n  // LOCAL STORAGE\n  speakerSettings: storageFor('play-settings'),\n\n  init() {\n    this._super(...arguments);\n    this.set('player', new Audio());\n\n    this.digilarSpeakerConfig = new DigilarSpeakerConfig({\n      getContextData: () => {\n        return {};\n      },\n      getSpeakerSettings: () => this.get('speakerSettings'),\n    });\n  },\n\n  /**\n   * Get provider-independent text processing rule sets to include in text processing based on content type etcetera.\n   * (Note: Some standard rule sets will always be applied by SpeakerContext.)\n   */\n  _getDigilarTextProcessingRuleSets(language) {\n    let ruleSets = [\n      // Add a Digilär specific rule set, shared for all TTS providers\n      new SpeakerTextProcessorRuleSet(digilarGeneralRuleSet(language, {})),\n    ];\n\n    return ruleSets;\n  },\n\n  _play(text, lang, isLastItemToPlay = true) {\n    if (typeof text === 'object') {\n      text = text?.string || '';\n    }\n\n    return new Promise((resolve, reject) => {\n      let language = null;\n\n      if (lang) {\n        language = DigilarLanguageUtil.parseLanguage(lang);\n      } else {\n        if (this.get('lang')) {\n          language = DigilarLanguageUtil.parseLanguage(this.get('lang'));\n        }\n      }\n\n      // Use Swedish as default if language parsing didn't succeed\n      if (!language) {\n        language = 'sv_SE';\n      }\n\n      const selectedVoice = this.digilarSpeakerConfig.preferredVoice(language);\n\n      // Use text processor to remove everything html related from the text before making TTS request\n      const textProcessor = new SpeakerTextProcessor(text);\n      textProcessor.removeHtmlComments();\n      textProcessor.removeHtmlTags();\n      textProcessor.replaceHtmlEntities();\n      text = textProcessor.getProcessedText();\n\n      let plugin = null;\n\n      plugin = DigilarPollyProviderFactory.newPollyPlugin({\n        pollyProxyParams: {\n          apiBaseUrl: config.endpoint,\n          ajax: this.get('ajax'),\n        },\n        speechSpeed: 1.0,\n        generalDigilarTextProcessingRuleSets:\n          this._getDigilarTextProcessingRuleSets.bind(this),\n      });\n\n      // For Polly, some text processing is required to apply correct SSML\n      const textConverter = new SpeakerTtsTextConverter(\n        text,\n        plugin.getSyntaxPlugin(),\n        plugin.getTextProcessingRuleSets()\n      );\n\n      text = textConverter.getProcessedText();\n\n      // Disable bookmarks (not implemented anyway...)\n      const bookmarks = null;\n\n      plugin\n        .textToSpeech(text, bookmarks, language, selectedVoice)\n        .then(({ audioUrl }) => {\n          let audio = this.get('player');\n\n          audio.src = audioUrl.replace('http://', 'https://');\n          audio.load();\n          audio.play();\n\n          if (this.isDestroying || this.isDestroyed) {\n            return;\n          }\n          this.set('playing', true);\n\n          audio.onended = () => {\n            if (this.isDestroying || this.isDestroyed) {\n              return;\n            }\n            // Only change the playing state to false for the last item.\n            // Otherwise the icon will auto-toggle between playing/paused when playing a playlist\n            if (isLastItemToPlay) {\n              this.set('playing', false);\n            }\n            return resolve();\n          };\n        })\n        .catch(() => {\n          return reject();\n        });\n    });\n  },\n\n  startPlayList: task(function* () {\n    for (let [index, item] of this.get('playlist').entries()) {\n      const isLastItem = index === this.get('playlist').length - 1;\n      yield this._play(item.text, item.language, isLastItem);\n    }\n  }),\n\n  actions: {\n    play(text) {\n      if (this.get('playlist')) {\n        this.startPlayList.perform();\n      } else {\n        this._play(text);\n      }\n    },\n    pause() {\n      this.set('playing', false);\n\n      let audio = this.get('player');\n      audio.pause();\n      audio.currentTime = 0;\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#unless this.playing}}\\n  <div\\n    id=\\\"speech-controls\\\"\\n    class=\\\"speech-controls\\\"\\n    {{action \\\"play\\\" this.value}}\\n  >\\n    <DcIcon @name=\\\"soundwave\\\" />\\n  </div>\\n\\n  {{#x-tooltip for=\\\"speech-controls\\\"}}\\n    {{t \\\"components.simpleSpeechPlayer.listen\\\"}}\\n  {{/x-tooltip}}\\n{{else}}\\n  <div\\n    class=\\\"speech-controls speech-controls--playing\\\"\\n    {{action \\\"pause\\\" this.value}}\\n  >\\n    <DcIcon @name=\\\"soundwave\\\" />\\n  </div>\\n{{/unless}}', { moduleName: 'babel/components/simple-speech-player/template.hbs' });\n","import Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport babelEnv from 'babel/config/environment';\nimport {\n  elemOffset,\n  scrollTo,\n  viewportBottom,\n  viewportTop,\n} from 'babel/utils/chapter-viewport';\nimport Poller from 'babel/utils/Poller';\nimport DigilarAudioSourceHandler from 'babel/utils/speaker/DigilarAudioSourceHandler';\nimport DigilarDomHelper from 'babel/utils/speaker/DigilarDomHelper';\nimport digilarDomSpeakerEventHandler from 'babel/utils/speaker/digilarDomSpeakerEventHandler';\nimport DigilarLanguageUtil from 'babel/utils/speaker/DigilarLanguageUtil';\nimport DigilarPollyProviderFactory from 'babel/utils/speaker/DigilarPollyProviderFactory';\nimport DigilarRecordedSpeechProvider from 'babel/utils/speaker/DigilarRecordedSpeechProvider';\nimport DigilarSpeakerConfig from 'babel/utils/speaker/DigilarSpeakerConfig';\nimport digilarSpeakerControls from 'babel/utils/speaker/digilarSpeakerControls';\nimport digilarSpeakerOptions from 'babel/utils/speaker/digilarSpeakerOptions';\nimport DigilarSpeakerType from 'babel/utils/speaker/DigilarSpeakerType';\nimport IltApi from 'babel/utils/speaker/ilt/IltApi';\nimport IltDataParser from 'babel/utils/speaker/ilt/IltDataParser';\nimport IltRecordedSpeechProvider from 'babel/utils/speaker/ilt/IltRecordedSpeechProvider';\nimport digilarGeneralRuleSet from 'babel/utils/speaker/text-processing-rule-sets/digilar-general';\nimport digilarGeneralRuleSetSv from 'babel/utils/speaker/text-processing-rule-sets/digilar-general-sv';\nimport { storageFor } from 'ember-local-storage';\nimport {\n  SpeakerAdapter,\n  SpeakerContext,\n  SpeakerDomHandler,\n  SpeakerTextProcessorRuleSet,\n  TtsProviders,\n  WebPageTranslationDetector,\n} from 'speaker';\n\nexport default Component.extend({\n  classNames: ['speaker-context-component'],\n\n  // INJECT SERVICES\n  ajax: service(),\n  speakerService: service('speaker'),\n  speakerSession: service(),\n  languages: service(),\n\n  // Set to true to require a user interaction to start playing. Needed especially on Safari/iOS when autoplay fails.\n  requireUserInteraction: false,\n  // And set this to a function to get called after the required user interaction happens.\n  onRequiredUserInteraction: null,\n\n  actions: {\n    onRequiredUserInteraction() {\n      this.set('requireUserInteraction', false);\n\n      if (this.onRequiredUserInteraction) {\n        this.onRequiredUserInteraction();\n      }\n    },\n    onCancelRequiredUserInteraction() {\n      this.set('requireUserInteraction', false);\n\n      if (this.onCancelRequiredUserInteraction) {\n        this.onCancelRequiredUserInteraction();\n      }\n    },\n  },\n\n  init() {\n    this._super(...arguments);\n\n    // Keep track of which providers are initialized\n    this._recordedSpeechProviderId = null;\n    this._textToSpeechProviderId = null;\n\n    // State variable to handle special cases when a speaker should autoplay when initialized\n    this._autoplaySpeakerOnLoad = {\n      [DigilarSpeakerType.MAIN]: this.get('speakerService.autoplay'),\n      [DigilarSpeakerType.POPUP]: false,\n    };\n\n    // A Digilär specific extension of the default speakerConfig.\n    this._digilarSpeakerConfig = new DigilarSpeakerConfig({\n      getContextData: () => {\n        let contextData = {\n          contentType: this.get('contentType'),\n          autoplay: this.get('speakerService.autoplay'),\n          digilarRecordedSpeechEnabled:\n            (\n              !!this.get('contentInfo.digilarRecordedSpeechEnabled') ||\n              (\n                !!this.get('speakerService.digilarRecordedSpeechEnabled') &&\n                !this.get('contentInfo.iltRecordedSpeechEnabled')\n              )\n            ) &&\n            !this.get('speakerSettings.preferSpeechSynthesis'),\n          iltRecordedSpeechEnabled:\n            !!this.get('contentInfo.iltRecordedSpeechEnabled') &&\n            !this.get('speakerSettings.preferSpeechSynthesis'),\n        };\n        return contextData;\n      },\n      getSpeakerSettings: () => this.get('speakerSettings'),\n    });\n\n    this._domHelper = new DigilarDomHelper({\n      speakerConfig: this._digilarSpeakerConfig,\n\n      /**\n       * Compile an object with properties that will be used by some of the DOM helper's functions\n       * This is necessary because Ember's didRender() will be called several times before the html is fully loaded,\n       * so we must be able to detect if content is ready to initialize the speaker.\n       */\n      getContextData: () => {\n        let exercise = this.get('exercise');\n\n        // TODO: Maybe try to break this contextData object apart since it right now contains more data than always necessary.\n        let contextData = {\n          sections: this.get('sections'),\n          section: this.get('section'),\n          exercise,\n          exerciseType: exercise ? exercise.get('body.exercise_type') : null,\n          mode: this.get('readSettings.mode'),\n          contentType: this.get('contentType'),\n          contentTitle: this.get('contentInfo.contentTitle'),\n          onlyImages: this.get('speakerService.storyCinemaMode'),\n          isPageTranslated: WebPageTranslationDetector.isTranslated(),\n\n          // Util functions required to scroll to text blocks\n          viewportUtils: {\n            viewportTop,\n            viewportBottom,\n            elemOffset,\n            scrollTo,\n          },\n        };\n\n        return contextData;\n      },\n\n      getSingleRecordedSpeechAudioSourceConfig:\n        this._getSingleRecordedSpeechAudioSourceConfig.bind(this),\n    });\n\n    // SpeakerContext is the class that holds all the speaker functionality together.\n    this._speakerContext = new SpeakerContext({\n      // speakerConfig is the general customizable configuration for the entire SpeakerContext.\n      speakerConfig: this._digilarSpeakerConfig,\n\n      // Not to be confused with speakerConfig, getSpeakerOptions() returns an object used when initializing the actual Speaker instance\n      getSpeakerOptions: this._getSpeakerOptions.bind(this),\n\n      // Customize the control functions for clicks on text block and play/pause buttons\n      // We do it to be able to resume a suspended Web Audio API context on user interaction\n      speakerControls: this._getSpeakerControls.bind(this),\n\n      speakerTypes: Object.values(DigilarSpeakerType),\n      defaultSpeakerType: () => DigilarSpeakerType.MAIN,\n\n      getContentLanguage: this._getContentLanguage.bind(this),\n\n      handleSpeakerEvent: this._handleSpeakerEvent.bind(this),\n\n      checkIfReadyToInitializeSpeaker:\n        this._checkIfReadyToInitializeSpeaker.bind(this),\n\n      // The SpeakerAdapter is the glue between SpeakerContext and the actual Speaker instance\n      newSpeakerAdapter: this._newSpeakerAdapter.bind(this),\n\n      // The DOM handler is responsible for everything that has to do with the DOM\n      newDomHandler: this._newDomHandler.bind(this),\n\n      // Optional function that will get called after the SpeakerContext has been successfully initialized.\n      // The param audioSources contains information about all the initialized audio sources.\n      onInit: (audioSources) => {\n        // Apply custom logic here if necessary.\n        // IMPORTANT NOTE: Do not change the html of the text blocks here.\n        // That should be done after an audio source has loaded and text meta data has been applied.\n        // Otherwise the word highlighting will most likely break.\n        // Instead, add custom 'load' event handling to digilarDomSpeakerEventHandler if the html of text blocks needs to be modified.\n        this._afterSpeakerContextInit(audioSources);\n      },\n\n      // Handling of focus for SpeakerContext, to prevent more than one SpeakerContext from having focus at a time.\n      onContextFocusChange: (contextUuid, hasFocus) => {\n        if (hasFocus) {\n          // Change value in service to notify other speaker-contexts about the focus change and thereby disable them in speakerContextUuidObserver()\n          this.set('speakerService.activeSpeakerContextUuid', contextUuid);\n        }\n      },\n\n      // esline-disable-next-line no-unused-vars\n      onSpeakerActive: (speakerType, speakerContext, speakerAdapter) => {\n        // To avoid pitch changes when playback rate changes, the user's speech speed setting does not always have an effect.\n        // Let the speaker service know this, for example to allow the \"Adapt\" menu to hide/disable the playback speed options.\n        // Note that we only want to do this if the context actually has focus\n        if (speakerContext.hasContextFocus()) {\n          this._updateSpeechSpeedSetting();\n\n          // Set (or reset) current recorded speech provider when context receives focus. This will be used to display different graphics (icon) depending on provider\n          this.set(\n            'speakerService.activeRecordedSpeechProvider',\n            this._recordedSpeechProviderId\n          );\n        }\n      },\n\n      initialContextFocus: () => !!this.get('focus'),\n      pauseOnContextFocusLost: () => {\n        // Instead of auto-pausing as soon as focus is lost, we handle pausing manually when another context has started playing.\n        // By doing this, we allow the user to click around within other speaker contexts without always pausing the speaker context that is currently playing.\n        // (Note: A click within a speaker context always gives focus to that context, see click handler in didInsertElement())\n        //\n        // For implementation, see lastPlayingSpeakerContextUuidObserver() and _handleSpeakerEvent()\n        return false;\n      },\n    });\n\n    this.set('speakerService.activeSpeakerAdapter', this._speakerContext._speakerSandboxes.main.speakerAdapter);\n\n    this.get('speakerService').registerSpeakerContext(\n      this._speakerContext\n    );\n\n    this._updateTextHighlightingOptions();\n    this._initObservedProperties();\n  },\n\n  // LOCAL STORAGE\n  speakerSettings: storageFor('play-settings'),\n  readSettings: storageFor('read-setting'),\n\n  _updateSpeechSpeedSetting() {\n    const speechSpeedSettingHasEffect =\n      // For HTML audio the speech speed always has an effect because the pitch remains the same even if playback speed changes,\n      // (unlike Web Audio API where pitch changes along with playback rate).\n      this._getSpeakerOptions().forceHtml5Audio ||\n      // On Web Audio API, we require that TTS is used (i.e. no recorded speech provider) AND that the TTS provider's speed is used instead of using playback rate on the audio source.\n      (!this.get('speakerService.activeRecordedSpeechProvider') &&\n        this._digilarSpeakerConfig.useTtsSpeechSpeed());\n\n    try {\n      this.set(\n        'speakerService.speechSpeedSettingHasEffectForActiveSpeaker',\n        speechSpeedSettingHasEffect\n      );\n    } catch (err) {\n      // We catch any error just to suppress the error message in case the speakerService object has been destroyed before the onSpeakerActive callback happens.\n    }\n  },\n\n  _afterSpeakerContextInit(audioSources) {\n    let currentRecordedSpeechProviderId = null;\n    let currentTextToSpeechProviderId = null;\n\n    if (audioSources) {\n      // It's enough to find a single recorded speech audio source to find a provider since we never mix providers\n      const recordedSpeechAudioSource = audioSources.find(\n        (src) =>\n          src.isRecordedSpeech &&\n          src.recordedSpeechConfig &&\n          // ILT sources can be marked as invalid so if provider data is specified we need to check that audio is valid\n          (!src.recordedSpeechConfig.recordedSpeechProviderData ||\n            !src.recordedSpeechConfig.recordedSpeechProviderData.invalid)\n      );\n\n      if (recordedSpeechAudioSource) {\n        currentRecordedSpeechProviderId =\n          recordedSpeechAudioSource.recordedSpeechConfig\n            .recordedSpeechProviderId;\n      }\n\n      // Same for TTS, it's enough to find a single TTS audio source to find a provider since we never mix providers\n      const textToSpeechAudioSource = audioSources.find(\n        (src) => !src.isRecordedSpeech\n      );\n\n      if (\n        textToSpeechAudioSource &&\n        textToSpeechAudioSource.textToSpeechConfig\n      ) {\n        currentTextToSpeechProviderId =\n          textToSpeechAudioSource.textToSpeechConfig.textToSpeechProviderId;\n      }\n    }\n\n    // Remember which providers are used for later settings such as speech speed\n    this._recordedSpeechProviderId = currentRecordedSpeechProviderId;\n    this._textToSpeechProviderId = currentTextToSpeechProviderId;\n\n    // Update playback speed immediately now that we know the providers\n    this._updatePlaybackSpeed();\n\n    // Set (or reset) current recorded speech provider if the context has focus. This will be used to display different graphics (icon) depending on provider\n    if (this._speakerContext.hasContextFocus()) {\n      this.set(\n        'speakerService.activeRecordedSpeechProvider',\n        currentRecordedSpeechProviderId\n      );\n    }\n\n    // Now we can also update some settings regarding speech when we know what audio sources have been initialized\n    this._updateSpeechSpeedSetting();\n  },\n\n  _getContentLanguage() {\n    const defaultLanguage = 'sv_SE';\n    let contentLanguage = this.get('languages.contentLanguage');\n\n    // When in exercise context, the language of the exercise has priority over the content language.\n    if (this.get('contentType') === 'practice') {\n      const exercise = this.get('exercise');\n      if (exercise && exercise.get('body.language')) {\n        contentLanguage = exercise.get('body.language');\n        // console.debug(`Exercise language: ${contentLanguage}`);\n      }\n    }\n\n    return DigilarLanguageUtil.parseLanguage(\n      contentLanguage || defaultLanguage\n    );\n  },\n\n  _getSpeakerControls(speakerContext, speakerAdapter) {\n    // Function that dynamically creates a promise that must resolve before normal click functionality (play/pause) is executed.\n    const getOnClickPromise = () => {\n      if (this.get('requireUserInteraction')) {\n        return this._resumeAfterAutoplayError(speakerAdapter, {\n          autoplay: false,\n        });\n      } else {\n        return Promise.resolve();\n      }\n    };\n    return digilarSpeakerControls(\n      speakerContext,\n      this._digilarSpeakerConfig,\n      speakerAdapter,\n      getOnClickPromise\n    );\n  },\n\n  _getSpeakerOptions(speakerType) {\n    return digilarSpeakerOptions(this._digilarSpeakerConfig, {\n      getSelectedSpeechSpeed: this._getSelectedSpeechSpeed.bind(this),\n    });\n  },\n\n  _newDomHandler({ speakerType, speakerUuid }) {\n    let domHandler = new SpeakerDomHandler({\n      speakerType,\n      speakerUuid,\n\n      // Inject the Digilär specific DOM helper to the generic DOM handler\n      domHelper: this._domHelper,\n\n      speakerConfig: this._digilarSpeakerConfig,\n\n      // Returning true will allow default event handling in dom handler to execute, false will prevent it.\n      // Note: customSpeakerEventHandler is always executed before default event handling.\n      //\n      // TODO: If needed to perform custom event handling _after_ default event handling,\n      // a possible simple solution could be to return a function instead of true/false when delayed execution is necessary.\n      customSpeakerEventHandler: (domHandler, event, params) => {\n        let contextData = {\n          mode: this.get('readSettings.mode'),\n          contentType: this.get('contentType'),\n          onlyImages: this.get('speakerService.storyCinemaMode'),\n        };\n        return digilarDomSpeakerEventHandler(\n          domHandler,\n          event,\n          params,\n          contextData,\n          this._domHelper\n        );\n      },\n\n      //\n      // Makes it possible to extend and/or prevent default text block markup to handle special cases\n      // Returning true will allow default speaker markup to be applied, false will prevent it\n      //\n      applyCustomSpeakerMarkup: (\n        speakerSandbox,\n        language,\n        initializedAudioSources,\n        speakerControls\n      ) => {\n        return this._domHelper.applyCustomSpeakerMarkup(\n          speakerSandbox,\n          language,\n          initializedAudioSources,\n          speakerControls\n        );\n      },\n\n      // When a new text block starts playing, this functions is called to find out if the text block should be scrolled into view.\n      // The actual scrolling implementation is located in the custom dom helper class injected to SpeakerDomHandler.\n      shouldFollowText: (speakerType) => {\n        return !!this.get('speakerSettings.followText');\n      },\n\n      getTextHighlightingOptions: (speakerType) => {\n        // Example: { words: true, sentences: true }\n        return this.get('speakerSettings.highlighting');\n      },\n\n      // Called when the DOM handler detects breaking changes to the DOM, such as initialized text blocks that don't exist anymore.\n      onBreakingDomChange: (domHandler, { message }) => {\n        // console.debug(`!!! Breaking DOM change detected! Will reset speaker \"${speakerType}\" ${speakerUuid}: ${message}`);\n\n        // Reset speaker context with default options\n        let options = {};\n        this._speakerContext.reset(\n          speakerType,\n          domHandler.getSpeakerContextDomElement(),\n          options\n        );\n      },\n    });\n\n    return domHandler;\n  },\n\n  _getSingleRecordedSpeechAudioSourceConfig() {\n    let config = null;\n\n    if (this.get('contentType') === 'story') {\n      // Content nodes have a setting that states if legacy audio file (one file per section) should be used instead of component-level audio.\n      const useLegacyFile = !!this.get(\n        'contentInfo.useLegacyRecordedSpeechForStory'\n      );\n\n      if (useLegacyFile) {\n        let sectionId = this.get('section').document_id;\n\n        config = {\n          // We use the sectionId as audio source id to be able to distinguish it from regular text blocks IDs.\n          id: sectionId,\n          recordedSpeechUrl: `${this._digilarSpeakerConfig.recordedSpeechBaseUrl()}/${sectionId}`,\n\n          // The provider ID is necessary for the speaker to know which provider plugin to use for the audio source\n          recordedSpeechProviderId: 'digilar',\n\n          recordedSpeechProviderData: {},\n        };\n      }\n    }\n\n    return config;\n  },\n\n  _newDigilarRecordedSpeechProvider() {\n    let singleRecordedSpeechConfig =\n      this._getSingleRecordedSpeechAudioSourceConfig();\n\n    let params = {\n      recordedSpeechBaseUrl: this._digilarSpeakerConfig.recordedSpeechBaseUrl(),\n    };\n    if (singleRecordedSpeechConfig !== null) {\n      params.singleRecordedSpeechConfig = singleRecordedSpeechConfig;\n      params.prioritizeSingleRecordedSpeechAudioSource =\n        this._digilarSpeakerConfig.alwaysUseSingleRecordedSpeechFileForStory();\n    }\n\n    return new DigilarRecordedSpeechProvider(params);\n  },\n\n  _newIltRecordedSpeechProvider() {\n    //console.debug('sections = ', this.get('sections'));\n\n    // Helper function to get a different set of article IDs depending on content type\n    const getArticleIds = () => {\n      // TODO: Exclude sections that have not been synched to ILT.\n\n      let articleIds = [];\n      const contentType = this.get('contentType');\n      const readMode = this.get('readSettings.mode');\n\n      if (contentType === 'chapter' && readMode === 'scroll') {\n        // In chapter+scroll mode, article data must be fetched for all sections to be able to init speaker correctly with ILT support\n        articleIds = this.get('sections').map((section) => section.id);\n      } else {\n        // For remaining cases, just need to fetch article data for a single section\n        const section = this.get('section');\n        if (section) {\n          articleIds.push(section.get('id'));\n        }\n      }\n\n      // console.debug(`articleIds:`, articleIds);\n\n      return articleIds;\n    };\n\n    const speakerSession = this.get('speakerSession');\n\n    let params = {\n      enablePlayNextOnLoadError:\n        this._getSpeakerOptions().enablePlayNextOnLoadError,\n\n      articleIds: getArticleIds(),\n\n      // Note: Injecting api + data parser to enable mocking.\n      // Change to use IltMockApi and IltMockDataParser to bypass ILT communication during development. See commented out code below.\n      iltApi: new IltApi({\n        apiBaseUrl: babelEnv.speaker.ilt.apiBaseUrl,\n        reportListeningsDisabled: babelEnv.speaker.ilt.reportListeningsDisabled,\n      }),\n      iltDataParser: new IltDataParser(),\n\n      // iltApi: new IltMockApi({\n      //   sentenceGroupId: '123',\n      // }),\n      // iltDataParser: new IltMockDataParser({\n      //   sentenceGroupId: '123',\n      // }),\n\n      iltError: () => {\n        return speakerSession.get('iltError').call(speakerSession);\n      },\n\n      // Inject function to get JWT\n      getJwt: () => {\n        return speakerSession.get('getJwt').call(speakerSession);\n      },\n    };\n\n    return new IltRecordedSpeechProvider(params);\n  },\n\n  _newSpeakerAdapter() {\n    const _newAudioSourceHandler = () => {\n      // For a story, there is currently a single recorded speech file for the whole section rather than one for each text block component.\n      // Pass the config for that audio source as an extra param, and let the SpeakerAdapter handle the logic for which audio sources to initialize.\n      // Note: In the future there will probably be stories with one recorded speech file per component, so we must be able to handle both cases which is done below.\n\n      let singleRecordedSpeechConfig =\n        this._getSingleRecordedSpeechAudioSourceConfig();\n\n      let params = {};\n      if (singleRecordedSpeechConfig !== null) {\n        params.prioritizeSingleRecordedSpeechAudioSource =\n          this._digilarSpeakerConfig.alwaysUseSingleRecordedSpeechFileForStory();\n      }\n      params.recordedSpeechProviderPriority =\n        this._digilarSpeakerConfig.recordedSpeechProviderPriority();\n\n      return new DigilarAudioSourceHandler(params);\n    };\n\n    return new SpeakerAdapter({\n      speakerConfig: this._digilarSpeakerConfig,\n\n      // Factory method to get recorded speech plugins for all providers that should be supported\n      getRecordedSpeechProviderPlugins: () => {\n        const selectedPlugins = {};\n\n        const pluginFactoryFunctions = {\n          digilar: this._newDigilarRecordedSpeechProvider.bind(this),\n          ilt: this._newIltRecordedSpeechProvider.bind(this),\n        };\n\n        this._digilarSpeakerConfig\n          .recordedSpeechProviderPriority()\n          .forEach((providerId) => {\n            if (pluginFactoryFunctions[providerId]) {\n              selectedPlugins[providerId] =\n                pluginFactoryFunctions[providerId]();\n            }\n          });\n\n        // console.debug('Selected recorded speech plugins:', selectedPlugins);\n\n        return selectedPlugins;\n      },\n\n      // Specify the priority order of recorded speech providers. Highest priority first in array.\n      recordedSpeechProviderPriority:\n        this._digilarSpeakerConfig.recordedSpeechProviderPriority,\n\n      // Factory method to get TTS provider plugins for all TTS providers that should be supported\n      getTextToSpeechProviderPlugins: () => {\n\n        const newPollyPlugin = () => {\n          const pollyProxyParams = {\n            apiBaseUrl: babelEnv.endpoint,\n            ajax: this.get('ajax'),\n          };\n\n          return DigilarPollyProviderFactory.newPollyPlugin({\n            pollyProxyParams,\n            speechSpeed: this._digilarSpeakerConfig.useTtsSpeechSpeed()\n              ? this._getSelectedSpeechSpeed('polly')\n              : 1.0,\n            generalDigilarTextProcessingRuleSets:\n              this._getDigilarTextProcessingRuleSets.bind(this),\n          });\n        };\n\n        // Return an object of plugins, indexed by TTS provider id.\n        return {\n          [TtsProviders.Polly.id()]: newPollyPlugin()\n        };\n      },\n\n      // Inject a factory method to create a customizable audio source handler,\n      // used for example to look up recorded speech audio sources and to handle special cases during speaker initialization\n      // Using factory method to be able to initialize it with different context params every time it is needed.\n      getAudioSourceHandler: () => _newAudioSourceHandler(),\n\n      // Custom function that can invalidate a text for one or all TTS providers depending on the text content.\n      // Return true for valid text, false for invalid text.\n      isValidTtsText: (ttsProviderId, rawText) => {\n        return this._domHelper.isValidTtsElem(rawText);\n      },\n    });\n  },\n\n  /**\n   * Custom checks to know if we can initialize the speaker, for example by checking if we have all params necessary.\n   * NOTE! Do not check any html/dom here, that is the work of the DOM handler.\n   * @param {*} speakerSandbox\n   */\n  _checkIfReadyToInitializeSpeaker(speakerSandbox) {\n    if (this._domHelper.hasUnresolvedTextBlocks(this.element)) {\n      return {\n        ready: false,\n        message: 'Speaker blocks not resolved',\n      };\n    }\n    if (!this.get('speakerService.active')) {\n      return {\n        ready: false,\n        message: 'Speaker functionality not activated',\n      };\n    }\n\n    if (this.get('speakerService.disabled')) {\n      return {\n        ready: false,\n        message: 'Speaker functionality temporarily disabled',\n      };\n    }\n\n    let sections = this.get('sections');\n    let exercise = this.get('exercise');\n    let contentType = this.get('contentType');\n\n    // Check that necessary data exists for different content types\n    if (['story', 'chapter', 'workflow'].includes(contentType)) {\n      if (!sections || sections.length === 0) {\n        return {\n          ready: false,\n          message: 'No sections to render',\n        };\n      }\n    } else if (contentType === 'practice') {\n      if (!exercise) {\n        return {\n          ready: false,\n          message: 'No exercise exists',\n        };\n      }\n    } else {\n      return {\n        ready: false,\n        message: `Unknown content type \"${contentType}\"`,\n      };\n    }\n\n    // Ok to go ahead an initialize speaker\n    return {\n      ready: true,\n    };\n  },\n\n  _resumeAfterAutoplayError(speakerAdapter, { autoplay }) {\n    return speakerAdapter\n      .resumeAfterAutoplayError({ autoplay })\n      .then(() => {\n        // console.debug(`Successfully resumed suspended context with autoplay = ${autoplay}`);\n      })\n      .catch((error) => {\n        // console.debug(`Error resuming suspended context with autoplay = ${autoplay}`, error);\n      });\n  },\n\n  /**\n   * If the generic event handling implemented in SpeakerContext is not enough, additional logic should be implemented here.\n   *\n   * Note! This event handler should only handle pure speaker functionality\n   * Anyhing concerning the DOM should be done in the customSpeakerEventHandler injected into SpeakerDomHandler\n   *\n   * @return false to prevent normal event handler in SpeakerContext to execute\n   */\n  _handleSpeakerEvent(event, speakerSandbox) {\n    let { speakerType, speakerAdapter, domHandler } = speakerSandbox;\n\n    // Handle autoplay errors (mostly Safari/iOS) to be able to show a \"click to start playing\" info box to the user\n    if (event.type === 'autoPlayError') {\n      // console.debug('autoPlayError event =', event);\n\n      this.set('requireUserInteraction', true);\n\n      // After an autoplay error, allow the SpeakerAdapter to handle resuming any existing Web Audio API Context.\n      // Note: Calling play directly (without resume) may have unwanted consequences depending on the platform/browser and if Web Audio API is used instead of HTML5 audio.\n      // Note: The callback functions are setup here to have access to the correct speakerAdapter.\n      this.onRequiredUserInteraction = () => {\n        // Resume+play\n        this._resumeAfterAutoplayError(speakerAdapter, { autoplay: true });\n      };\n      this.onCancelRequiredUserInteraction = () => {\n        // Resume only\n        this._resumeAfterAutoplayError(speakerAdapter, { autoplay: false });\n      };\n    }\n\n    if (speakerType === DigilarSpeakerType.MAIN) {\n      // When receiving an 'end' event, we want to auto-switch content under some circumstances\n      if (event.type === 'end') {\n        // Goto next section if in step mode or story, and the last text block finished playing\n        let mode = this.get('readSettings.mode');\n        let contentType = this.get('contentType');\n\n        let shouldGotoNextSection =\n          event.isLastAudioSource &&\n          contentType !== 'workflow' &&\n          contentType === 'story';\n\n        if (shouldGotoNextSection) {\n          let nextSection = this.get('nextSection');\n\n          if (nextSection) {\n            const success = nextSection();\n            // Enable autoplay on successful section change, disable otherwise\n            this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] = success;\n          }\n        }\n      } else if (event.type === 'play') {\n        // When speaker is playing we want to autoplay for example when changing section.\n        this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] = true;\n\n        // Also reset the require user interaction flag, just in case the info dialog is open...\n        this.set('requireUserInteraction', false);\n      } else if (event.type === 'pause') {\n        this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] = false;\n      }\n    }\n\n    // Always report to service when this context has started playing\n    if (event.type === 'play') {\n      if (\n        this.get('speakerService.lastPlayingSpeakerContextUuid') !==\n        this._speakerContext.getUuid()\n      ) {\n        this.set(\n          'speakerService.lastPlayingSpeakerContextUuid',\n          this._speakerContext.getUuid()\n        );\n      }\n    }\n\n    if (event.type === 'load') {\n      // console.debug('load event:', event);\n\n      // For load events, check that meta data have been applied properly. Else reset speaker.\n      // This might happen for example if Ember rerenders the page after the speaker(s) have already added their html attributes to the text blocks.\n      // The rerender causes all speaker attributes to disappear, forcing us to start over with speaker initialization.\n      if (event.textMetaDataError) {\n        console.warn(\n          `Text meta data error in load event. Will attempt to reset speaker: ${event.textMetaDataError}`\n        );\n        let options = {}; // Use default options\n        this._speakerContext\n          .reset(speakerType, domHandler.getSpeakerContextDomElement(), options)\n          .then(() => {\n            // If we get a textMetaDataError and the page is translated\n            // assume that we've reached a textblock that contains\n            // untranslated text. Chrome only translates text that is currently visible\n            // but the speaker finds all textblocks on the page including untranslated text.\n            // In that case force the speaker to play next text block.\n            if (WebPageTranslationDetector.isTranslated())\n              this._speakerContext.withSpeaker(\n                speakerType,\n                (speakerSandbox) => {\n                  const { speakerAdapter } = speakerSandbox;\n                  // Can't use speakerAdatper.next(), need to force the speaker to autoplay\n                  // therefore using _speaker.next(true, true)\n                  speakerAdapter._speaker.next(true, true);\n                }\n              );\n          });\n      }\n    }\n\n    // Allow SpeakerContext event handler to execute\n    return true;\n  },\n\n  /**\n   * Get provider-independent text processing rule sets to include in text processing based on content type etcetera.\n   * (Note: Some standard rule sets will always be applied by SpeakerContext.)\n   */\n  _getDigilarTextProcessingRuleSets(language) {\n    let ruleSets = [\n      // Add a Digilär specific rule set, shared for all TTS providers\n      new SpeakerTextProcessorRuleSet(\n        digilarGeneralRuleSet(language, {\n          htmlElementsToPauseAfter:\n            this._domHelper.getHtmlElementsToPauseAfter(),\n          htmlElementsToRemove:\n            this._domHelper.getHtmlElementsToRemoveFromTextProcessing(),\n        })\n      ),\n    ];\n\n    const getLanguageSpecificRuleSet = (language) => {\n      const languageRuleSets = {\n        sv: digilarGeneralRuleSetSv,\n      };\n\n      return languageRuleSets[language]\n        ? new SpeakerTextProcessorRuleSet(languageRuleSets[language]())\n        : null;\n    };\n\n    // Check if there is any language specific rule set for the current language\n    const languageSpecificRuleSet = getLanguageSpecificRuleSet(language);\n    if (languageSpecificRuleSet) {\n      ruleSets.push(languageSpecificRuleSet);\n    }\n\n    return ruleSets;\n  },\n\n  _getSelectedSpeechSpeed(providerId) {\n    // Note: speechSpeedSetting will be a value [0-3] matching an index of this._digilarSpeakerConfig.speechSpeedValues()\n    // +1 is a fix for localstorage after adding very slow speed\n    let speechSpeedSetting = this.get('speakerSettings.speechSpeed') + 1;\n\n    // Map selected setting to an actual speed value\n    let playbackSpeed =\n      this._digilarSpeakerConfig.speechSpeedValues(providerId)[\n        speechSpeedSetting\n      ];\n\n    return playbackSpeed || 1.0;\n  },\n\n  /**\n   * This seems to be necessary to make observers fire on changes for properties that are not used elsewhere\n   */\n  _initObservedProperties() {\n    this.get('readSettings');\n    this.get('section');\n  },\n\n  /**\n   * This observer will either activate or deactivate the SpeakerContext when a new \"context UUID\" is observed from the speaker service\n   */\n  speakerContextUuidObserver: observer(\n    'speakerService.activeSpeakerContextUuid',\n    function () {\n      const hasFocus =\n        this.get('speakerService.activeSpeakerContextUuid') ===\n        this._speakerContext.getUuid();\n      this._speakerContext.setContextFocus(hasFocus);\n    }\n  ),\n\n  /**\n   * This observer will pause all speakers within this context as soon as another context has started playing.\n   */\n  lastPlayingSpeakerContextUuidObserver: observer(\n    'speakerService.lastPlayingSpeakerContextUuid',\n    function () {\n      const isThisContextPlaying =\n        this.get('speakerService.lastPlayingSpeakerContextUuid') ===\n        this._speakerContext.getUuid();\n\n      // Pause all speakers within this context if another context has started playing\n      if (!isThisContextPlaying) {\n        this._speakerContext.forEachSpeaker(({ speakerAdapter }) => {\n          speakerAdapter.pause();\n        });\n      }\n    }\n  ),\n\n  speakerActiveObserver: observer('speakerService.active', function () {\n    this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] = false;\n\n    if (this.get('speakerService.active')) {\n      this._startContentPoller();\n    } else {\n      this._stopContentPoller();\n    }\n  }),\n\n  cinemaModeObserver: observer('speakerService.storyCinemaMode', function () {\n    // Don't do anything if speaker is not active\n    if (!this.get('speakerService.active')) {\n      return false;\n    }\n\n    // When turning \"only images\" on/off, we should not reset any speakers, but some speaker controls and highlighting need to be changed\n    let contentType = this.get('contentType');\n\n    if (contentType === 'story') {\n      this._speakerContext.withSpeaker(\n        DigilarSpeakerType.MAIN,\n        (speakerSandbox) => {\n          let { speakerAdapter, domHandler } = speakerSandbox;\n\n          if (this.get('speakerService.storyCinemaMode')) {\n            const speakerControls = this._getSpeakerControls(\n              this._speakerContext,\n              speakerAdapter\n            );\n            this._domHelper.addSpeakerControlsToStoryImage(\n              speakerSandbox,\n              speakerControls\n            );\n\n            let progressBarValue = 0;\n            let audioSource = speakerAdapter.getCurrentAudioSource();\n            if (audioSource) {\n              progressBarValue = audioSource.position / audioSource.duration; // A value [0-1]\n            }\n\n            this._domHelper.applySpeakerMarkUpToStoryImage(domHandler, {\n              numberOfAudioSources:\n                speakerAdapter.numberOfInitializedAudioSources(),\n              highlightAsSelected: speakerAdapter.isPlaying(),\n              highlightAsPlaying: speakerAdapter.isPlaying(),\n              // If speaker is paused, we always highlight the image as paused, since it doesn't matter which text block has been paused\n              highlightAsPaused: speakerAdapter.isPaused(),\n              // The progress bar must also be initialized to current progress value or else it won't be visible until the next progress event is received\n              progressBarValue,\n            });\n          } else {\n            this._domHelper.cleanUpStoryImage(domHandler);\n          }\n        }\n      );\n    }\n  }),\n\n  /**\n   * The popup speaker only needs to be reset under specific circumstances, very different from the main speaker.\n   * Only if the content itself changes and we need to create and load audio sources must it be reset.\n   *\n   * Add more observed attributes to this method if necessary.\n   * If the method starts to look like observePropsToResetMainSpeaker(), consider merging into one method instead and just do the same check for all (both) speaker types\n   */\n  observePropsToResetPopupSpeaker: observer(\n    'exercise',\n    function (sender, attributeName) {\n      // Reset the popup speaker after next render. If not waiting until 'afterRender' there's a risk that all components haven't been rendered yet.\n      scheduleOnce('afterRender', this, () => {\n        // console.debug(`*** Resetting POPUP speaker because attribute \"${attributeName}\" changed ***`);\n        let options = {\n          loadFromAudioSourceIndex: 0, // Always start from first audio source when changing exercise\n          autoplayFirstLoadedAudioSource: false, // Never autoplay when changing exercise\n        };\n        return this._speakerContext.reset(\n          DigilarSpeakerType.POPUP,\n          this._domHelper.findPopupSpeakerDomContextElem(),\n          options\n        );\n      });\n    }\n  ),\n\n  /**\n   * Add an observer to the attributes that will/might affect the main speaker's behavior.\n   * When any of these attributes has changed, we need to clean up the existing main speaker and create a new one.\n   */\n  // TODO: Not all attributes are relevant for all content types. Maybe break this apart into different observers for different content types.\n  observePropsToResetMainSpeaker: observer(\n    'section',\n    'exercise',\n    'languages.contentLanguage',\n    'speakerService.active',\n    'speakerSettings.speechSpeed',\n    'speakerSettings.preferSpeechSynthesis',\n    'readSettings.mode',\n    'readSettings.onlytext',\n    'speakerSettings.voices',\n    'contentInfo.contentTitle',\n    function (sender, attributeName) {\n      // console.debug(`--- speaker-context ${this._speakerContext.getUuid()}: Attribute \"${attributeName}\" affecting Speaker changed. Will reset speaker...`);\n\n      // If the observed attribute is anything except 'speakerService.active', the speaker should only be reset if active\n      if (\n        attributeName !== 'speakerService.active' &&\n        !this.get('speakerService.active')\n      ) {\n        return false;\n      }\n\n      // For some attributes we only want to init/reset the speaker if it has not already been initialized.\n      // This is because the attribute might trigger the observer even if the content has not changed.\n      if (attributeName === 'contentInfo.contentTitle') {\n        let isInitialized = false;\n\n        this._speakerContext.withSpeaker(\n          DigilarSpeakerType.MAIN,\n          ({ speakerAdapter }) => {\n            isInitialized = speakerAdapter.isInitialized();\n          }\n        );\n\n        if (isInitialized) {\n          return false;\n        }\n      }\n\n      // Get some information from the speaker's sandbox\n      let ttsAudioSourceExists = false;\n      this._speakerContext.withSpeaker(\n        DigilarSpeakerType.MAIN,\n        ({ speakerAdapter }) => {\n          // Find out if at least one TTS source has been initialized which is necessary to know if we need to reload audio source when some attributes have changed.\n          ttsAudioSourceExists = speakerAdapter.hasTtsAudioSources();\n        }\n      );\n\n      // If speech speed has changed, speaker doesn't need to be reset if there are no TTS audio sources or if we're not using the TTS provider's speech speed.\n      // When that is the case, the separate observer for 'speakerSettings.speechSpeed' will adjust playback speed instead.\n      if (attributeName === 'speakerSettings.speechSpeed') {\n        if (\n          !ttsAudioSourceExists ||\n          !this._digilarSpeakerConfig.useTtsSpeechSpeed()\n        ) {\n          return false;\n        }\n      }\n\n      // If any voices have changed, the speaker needs to be reset since any content may contain any number of different languages/voices\n      if (attributeName === 'speakerSettings.voices') {\n        // Don't reset speaker if there are no TTS audio sources\n        if (!ttsAudioSourceExists) {\n          return false;\n        }\n      }\n\n      // Disable autoplay when toggling between recorded speech and TTS to prevent the\n      // speaker from starting all over from the beginning again.\n      if (attributeName === 'speakerSettings.preferSpeechSynthesis') {\n        this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] = false;\n      }\n\n      let mode = this.get('readSettings.mode');\n      let contentType = this.get('contentType');\n\n      // Do not reset speaker if section has changed in scroll mode when viewing a chapter, since that will happen when scrolling up/down\n      if (\n        contentType === 'chapter' &&\n        mode === 'scroll' &&\n        attributeName === 'section'\n      ) {\n        return;\n      }\n\n      // Stop any speaker that might be playing\n      this._speakerContext.forEachSpeaker(({ speakerAdapter }) => {\n        speakerAdapter.stop();\n      });\n\n      // ...and then reset the speaker after next render. If not waiting until 'afterRender' there's a risk that all components haven't been rendered yet.\n      scheduleOnce('afterRender', this, async () => {\n        const shouldSetContextFocus = () => {\n          let giveFocusToContext = false;\n\n          if (\n            this.get('speakerService').countRegisteredSpeakerContexts() === 1\n          ) {\n            // If this is the only registered context, we always give it focus.\n            // (This can happen for example in a workflow, if an exercise context has focus and is destroyed as we move back to the workflow context)\n            giveFocusToContext = true;\n            // console.debug(`** This context is alone. Giving it focus! **`);\n          } else {\n            // If in exercise/practice content, we should give focus only if the speaker context is within a workflow,\n            // because in that case the other context(s) within the workflow are not currently visible.\n            if (\n              this.get('contentType') === 'practice' &&\n              this._domHelper.isSpeakerContextWithinWorkflow(this.element)\n            ) {\n              giveFocusToContext = true;\n              // console.debug(`** This exercise context is within a workflow. Giving it focus! **`);\n            }\n          }\n\n          return giveFocusToContext;\n        };\n\n        // We need to find out if the context should receive focus when being reset, for keyboard controls to work.\n        // When we have several contexts and one or more of them is being reset, it's not obvious which one should have focus.\n        if (shouldSetContextFocus()) {\n          this._speakerContext.setContextFocus(true);\n        }\n\n        const allowRestartFromCurrentAudioSourceIndex = [\n          'speakerSettings.voices',\n          'speakerSettings.speechSpeed',\n        ].includes(attributeName);\n\n        // Do not autoselect first audio source, since we're autoselecting the first\n        // visible audiosource instead. Need to set it to false, since it defaults to true\n        // in the speaker repo.\n        const autoSelectFirstAudioSource = false;\n\n        const options = {\n          loadFromAudioSourceIndex: allowRestartFromCurrentAudioSourceIndex\n            ? -1\n            : 0,\n          autoSelectFirstAudioSource,\n          autoplayFirstLoadedAudioSource:\n            this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] &&\n            // Never start speaker automatically when in an exercise\n            !this.get('exercise'),\n          autoSelectFirstVisibleAudioSource: !this.get('speakerService.encourageListeningEnabled'),\n        };\n\n        // console.debug(`observePropsToResetMainSpeaker, reset speaker context with options:`, options);\n\n        // When changing exercise in fullscreen mode, we need to wait until the next tick,\n        // otherwise the speaker controls won't be rendered when navigating to next/previous exercise.\n        await this._nextTick();\n\n        return this._speakerContext\n          .reset(DigilarSpeakerType.MAIN, this.element, options)\n          .then((response) => {\n            // Make sure to \"reactivate\" the main speaker to trigger the onSpeakerActive callback\n            this._speakerContext.setActiveSpeaker(DigilarSpeakerType.MAIN);\n          });\n      });\n    }\n  ),\n\n  _nextTick() {\n    return new Promise((resolve) => setTimeout(resolve));\n  },\n\n  _updatePlaybackSpeed() {\n    // Update the playback speed of each SpeakerAdapter in real time\n    this._speakerContext.forEachSpeaker(({ speakerAdapter }) => {\n      // Update playback speed only if HTML5 audio is used, to avoid pitch changes with Web Audio API.\n      if (this._getSpeakerOptions().forceHtml5Audio) {\n        const rsPlaybackSpeed = this._getSelectedSpeechSpeed(\n          this._recordedSpeechProviderId\n        );\n        // console.debug('Setting RS speed to: ', rsPlaybackSpeed);\n        speakerAdapter.setPlaybackSpeedRecordedSpeech(rsPlaybackSpeed);\n\n        // Only update playback speed for TTS if not already using TTS provider's speech speed\n        // (The audio file will already have the correct speed when generated, so we don't want to alter it with a different playback speed)\n        if (!this._digilarSpeakerConfig.useTtsSpeechSpeed()) {\n          const ttsPlaybackSpeed = this._getSelectedSpeechSpeed(\n            this._textToSpeechProviderId\n          );\n          // console.debug('Setting TTS speed to: ', ttsPlaybackSpeed);\n          speakerAdapter.setPlaybackSpeedTextToSpeech(ttsPlaybackSpeed);\n        }\n      }\n    });\n  },\n\n  speakerSpeechSpeedObserver: observer(\n    'speakerSettings.speechSpeed',\n    function () {\n      this._updatePlaybackSpeed();\n    }\n  ),\n\n  _updateTextHighlightingOptions() {\n    let highlighting = this.get('speakerSettings.highlighting');\n\n    // Update highlighting options for all speaker types\n    let speakerType = null;\n    this._speakerContext.setTextHighlighting(speakerType, highlighting);\n  },\n\n  highlightingObserver: observer('speakerSettings.highlighting', function () {\n    this._updateTextHighlightingOptions();\n  }),\n\n  _startContentPoller() {\n    // Stop in case it's already running\n    this._stopContentPoller();\n\n    // Setup a polling function that inspects the DOM to decide if a switch should be made between main/popup speaker.\n    this._contentPoller = new Poller();\n    this._contentPoller.setInterval(200);\n    this._contentPoller.start(this, function () {\n      let popupSpeakerDomElem =\n        this._domHelper.findPopupSpeakerDomContextElem();\n      if (popupSpeakerDomElem) {\n        // Make sure that the modal is only handled by the speaker context currently in focus.\n        if (!this._speakerContext.hasContextFocus()) {\n          return;\n        }\n\n        // Check if popupSpeakerDomElem is already handled by another speaker-context and in that case return.\n        let isDomElemAvailable = false;\n        this._speakerContext.withSpeaker(\n          DigilarSpeakerType.POPUP,\n          ({ domHandler }) => {\n            isDomElemAvailable = domHandler.isSpeakerContextDomElementAvailable(\n              popupSpeakerDomElem,\n              this._speakerContext.getUuid()\n            );\n          }\n        );\n        if (!isDomElemAvailable) {\n          return;\n        }\n\n        // Don't proceed if popup speaker is already active\n        if (\n          this._speakerContext.getActiveSpeaker() === DigilarSpeakerType.POPUP\n        ) {\n          return;\n        }\n\n        // Get access to the sandbox of the MAIN speaker first\n        this._speakerContext.withSpeakerTransactional(\n          DigilarSpeakerType.MAIN,\n          ({ speakerAdapter }) => {\n\n            // Give focus to this speaker context in case it doesn't already have focus.\n            //\n            // Might happen for example if speaker is playing in chapter context and the user opens an exercise in fullscreen mode from the workspace context.\n            // If not changing focus, the speaker in the chapter context will just continue playing\n            this._speakerContext.setContextFocus(true);\n\n            // Pause main speaker immediately if playing\n            let isMainSpeakerPlaying = speakerAdapter.pause();\n\n            // Set popup speaker autoplay to true if main speaker was playing,\n            // but never set it to false here since this code will sometimes run several times.\n            if (isMainSpeakerPlaying) {\n              this._autoplaySpeakerOnLoad[DigilarSpeakerType.POPUP] = true;\n            }\n\n            let initPopupSpeakerOptions = {\n              autoplayFirstLoadedAudioSource:\n                this._autoplaySpeakerOnLoad[DigilarSpeakerType.POPUP],\n            };\n\n            // Now try to init the popup speaker\n            return this._speakerContext\n              .initSpeaker(\n                DigilarSpeakerType.POPUP,\n                popupSpeakerDomElem,\n                initPopupSpeakerOptions\n              )\n              .then(({ success }) => {\n                if (success) {\n                  // Set the popup speaker as active after successful initialization\n                  // for keyboard controls to switch focus from main speaker to popup speaker\n                  this._speakerContext.setActiveSpeaker(\n                    DigilarSpeakerType.POPUP\n                  );\n                }\n                return Promise.resolve(success);\n              });\n          }\n        );\n      } else {\n        // console.debug(`speaker-context content poller: modal not found, will try to init main speaker and clean up popup speaker`);\n\n        // Clean up popup speaker when no modal is visible\n        this._speakerContext.cleanUp(DigilarSpeakerType.POPUP);\n\n        // Set the main speaker as active again in case popup speaker was previously active\n        if (\n          this._speakerContext.getActiveSpeaker() !== DigilarSpeakerType.MAIN\n        ) {\n          this._speakerContext.setActiveSpeaker(DigilarSpeakerType.MAIN);\n        }\n\n        // Reset popup speaker autoplay to false for the next time it will be used\n        this._autoplaySpeakerOnLoad[DigilarSpeakerType.POPUP] = false;\n\n        // Intitialize the main speaker\n        let initMainSpeakerOptions = {\n          autoplayFirstLoadedAudioSource:\n            this._autoplaySpeakerOnLoad[DigilarSpeakerType.MAIN] &&\n            // Never start speaker automatically when in an exercise\n            !this.get('exercise'),\n          autoSelectFirstVisibleAudioSource: !this.get('speakerService.encourageListeningEnabled'),\n        };\n\n        this._speakerContext\n          .initSpeaker(\n            DigilarSpeakerType.MAIN,\n            this.element,\n            initMainSpeakerOptions\n          )\n          .then((resolveData) => {\n            //eslint-disable-next-line no-unused-vars\n            const { success, message, audioSources } = resolveData;\n            // console.debug('initSpeaker resolveData = ', resolveData);\n            if (!success) {\n              // console.debug(`SpeakerContext could not be initialized for MAIN speaker: ${message}`);\n            }\n          });\n      }\n    });\n  },\n\n  _stopContentPoller() {\n    if (this._contentPoller) {\n      this._contentPoller.stop();\n      this._contentPoller = null;\n    }\n  },\n\n  willDestroyElement() {\n    this._stopContentPoller();\n\n    this._speakerContext.cleanUp();\n\n    this.get('speakerService').unregisterSpeakerContext(\n      this._speakerContext\n    );\n  },\n\n  didInsertElement() {\n    // Start the content poller that will look for content changes on regular short intervals\n    if (this.get('speakerService.active')) {\n      this._startContentPoller();\n    }\n\n    /**\n     * Listens for click events and gives focus to the speaker context if a click happened within the context's DOM.\n     */\n    this._domHelper.addSpeakerContextClickListener(\n      this._speakerContext,\n      this.element\n    );\n  },\n\n  didRender() {\n    this._super(...arguments);\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.requireUserInteraction}}\\n  <div class=\\\"speaker-context-required\\\">\\n    {{#x-alert\\n      class=\\\"speaker-context-required-interaction\\\"\\n      dismissable=true\\n      onDismiss=(action \\\"onCancelRequiredUserInteraction\\\")\\n    }}\\n      <h3 class=\\\"text-tertiary\\\">\\n        {{t \\\"components.speakerContext.noAutoplayHeading\\\"}}\\n      </h3>\\n      <p>{{t \\\"components.speakerContext.noAutoplayContent\\\"}}</p>\\n      {{#ui-button onClick=(action \\\"onRequiredUserInteraction\\\")}}\\n        {{t \\\"components.speakerContext.noAutoplayAction\\\"}}\\n      {{/ui-button}}\\n    {{/x-alert}}\\n  </div>\\n{{/if}}\\n\\n{{yield}}', { moduleName: 'babel/components/speaker-context/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { storageFor } from 'ember-local-storage';\nimport { resolve } from 'rsvp';\nimport { WebPageTranslationDetector } from 'speaker';\n\nexport default class SpeakerProviderIconComponent extends Component {\n  /**\n   * Arguments:\n   * content (object)\n   */\n\n  @service speakerSession;\n\n  @service speaker;\n\n  @storageFor('play-settings') speakerSettings;\n\n  @tracked pageIsTranslated = false;\n\n  @tracked translationLanguage = null;\n\n  observer;\n\n  constructor() {\n    super(...arguments);\n\n    const htmlTag = WebPageTranslationDetector.getHTMLElement();\n\n    if (htmlTag) {\n      this.observer = new MutationObserver(this._setPageTranslationInfo);\n      this.observer.observe(htmlTag, { attributeFilter: ['class', 'lang'] });\n\n      this._setPageTranslationInfo();\n    }\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.observer.disconnect();\n    this.observer = null;\n  }\n\n  @cached get contentProxy() {\n    return load(resolve(this.args.content), this);\n  }\n\n  get content() {\n    return this.contentProxy.isResolved ? this.contentProxy.value : null;\n  }\n\n  @cached get bookProxy() {\n    return load(resolve(this.content?.book), this);\n  }\n\n  get book() {\n    return this.bookProxy.isResolved ? this.bookProxy.value : null;\n  }\n\n  get provider() {\n    // Only need to check recorded speech providers if user has not checked\n    // \"always speech synthesis\" and the page isn't translated.\n    if (\n      !this.pageIsTranslated &&\n      !this.speakerSettings.get('preferSpeechSynthesis')\n    ) {\n      // storage for requires get :(\n      if (this.content?.body?.recorded_speech_activated) {\n        return 'digilar';\n      } else if (\n        this.book?.body?.ilt_activated &&\n        this.speakerSession?.iltEnabled\n      ) {\n        return 'ilt';\n      }\n    }\n\n    // Default to synthesis\n    return 'synthesis';\n  }\n\n  get disabled() {\n    if (this.pageIsTranslated && this.translationLanguage) {\n      const supportedVoices =\n        this.speaker.digilarSpeakerConfig.supportedVoices();\n\n      if (!Object.keys(supportedVoices).includes(this.translationLanguage)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  @action _setPageTranslationInfo() {\n    this.pageIsTranslated = WebPageTranslationDetector.isTranslated();\n    this.translationLanguage = WebPageTranslationDetector.detectLanguage();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @provider}}\\n  {{#if (eq @provider \\\"digilar\\\")}}\\n    <DcIcon @name=\\\"voice\\\" />\\n  {{else if (eq @provider \\\"ilt\\\")}}\\n    <DcIcon @name=\\\"ILT\\\" />\\n  {{else}}\\n    <DcIcon @name=\\\"soundwave\\\" />\\n  {{/if}}\\n{{else}}\\n  <DcLoader @size=\\\"xsmall\\\" />\\n{{/if}}\\n', { moduleName: 'babel/components/speaker-provider/icon/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~yield (hash disabled=this.disabled provider=this.provider)~}}\\n', { moduleName: 'babel/components/speaker-provider/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nconst PRESETS = {\n  french: {\n    common: [],\n    upper: ['À', 'Â', 'Ç', 'É', 'È', 'Ê', 'Ë', 'Î', 'Ï', 'Ù', 'Û', 'Ô', 'Œ'],\n    lower: ['à', 'â', 'ç', 'é', 'è', 'ê', 'ë', 'î', 'ï', 'ù', 'û', 'ô', 'œ'],\n  },\n  german: {\n    common: ['ß'],\n    upper: ['Ü'],\n    lower: ['ü'],\n  },\n  italian: {\n    common: [],\n    upper: ['À', 'È', 'É', 'Ì', 'Í', 'Ò', 'Ó', 'Ù', 'Ú'],\n    lower: ['à', 'è', 'é', 'ì', 'í', 'ò', 'ó', 'ù', 'ú'],\n  },\n  spanish: {\n    common: ['¡', '!', '¿', '?'],\n    upper: ['Á', 'É', 'Ó', 'Í', 'Ú', 'Ü', 'Ñ'],\n    lower: ['á', 'é', 'ó', 'í', 'ú', 'ü', 'ñ'],\n  },\n  swedish: {\n    common: [],\n    upper: ['Å', 'Ä', 'Ö'],\n    lower: ['å', 'ä', 'ö'],\n  },\n};\n\nconst FORM_ELEMENTS = ['input', 'textarea'];\nconst NOK_EDITOR_SELECTOR = 'nok-editor';\nconst NOK_EDITOR_CONTENTEDITABLE_SELECTOR = `${NOK_EDITOR_SELECTOR} [contenteditable]`;\n\nexport default class SpecialKeyboardComponent extends Component {\n  @tracked lowercased = this.characterSet?.lower?.length ? true : false;\n\n  @tracked disabled = false;\n\n  @tracked element;\n\n  @tracked isNokEditor = false;\n\n  get characterSet() {\n    return this.args.characters || PRESETS[this.args.preset];\n  }\n\n  get lowerCaseLetters() {\n    return this.characterSet?.lower;\n  }\n\n  get upperCaseLetters() {\n    return this.characterSet?.upper;\n  }\n\n  get commonLetters() {\n    return this.characterSet?.common;\n  }\n\n  get showShiftKey() {\n    return this.lowerCaseLetters?.length && this.upperCaseLetters?.length;\n  }\n\n  get shiftIcon() {\n    return 'shift';\n  }\n\n  get shiftAlternative() {\n    return this.lowercased ? 'alternative' : 'default';\n  }\n\n  // Hack to solve DINO-5144,\n  // since the greek beta β is sometimes wrongfully used as the german ß\n  get shouldShowGreekBetaInsteadOfEszett() {\n    if (this.args.preset !== 'german' || !Array.isArray(this.args?.objects)) {\n      return false;\n    }\n\n    return this.args.objects.some(\n      (obj) =>\n        Array.isArray(obj?.alternatives) &&\n        obj.alternatives.some(\n          ({ value }) => typeof value === 'string' && value.includes('β')\n        )\n    );\n  }\n\n  @action\n  insertChar(char) {\n    if (this.isNokEditor) {\n      this.element.insertText(char);\n    } else {\n      document.execCommand('insertText', false, char);\n    }\n  }\n\n  @action\n  toggleCase() {\n    this.lowercased = !this.lowercased;\n  }\n\n  @action\n  preventBlur(e) {\n    e.preventDefault();\n  }\n\n  @action\n  detectFocus(event) {\n    this.setEnabledIfFocus(event.srcElement);\n  }\n\n  @action\n  detectBlur() {\n    this.disabled = true;\n  }\n\n  setEnabledIfFocus(element) {\n    if (FORM_ELEMENTS.includes(element.tagName?.toLowerCase())) {\n      this.element = element;\n      this.disabled = false;\n      this.isNokEditor = false;\n    } else if (element.matches?.(NOK_EDITOR_CONTENTEDITABLE_SELECTOR)) {\n      this.element = element.closest(NOK_EDITOR_SELECTOR);\n      this.disabled = false;\n      this.isNokEditor = true;\n    } else {\n      this.element = null;\n      this.disabled = true;\n      this.isNokEditor = false;\n    }\n  }\n\n  // Life cycle hooks\n\n  constructor() {\n    super(...arguments);\n    window.addEventListener('focus', this.detectFocus, true);\n    window.addEventListener('blur', this.detectBlur, true);\n\n    this.setEnabledIfFocus(document.activeElement);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    window.removeEventListener('focus', this.detectFocus, true);\n    window.removeEventListener('blur', this.detectBlur, true);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{! template-lint-disable no-pointer-down-event-binding no-invalid-interactive }}\\n<div class=\\\"special_keyboard\\\" {{on \\\"mousedown\\\" this.preventBlur}} ...attributes>\\n  <div class=\\\"special_keyboard_set block\\\">\\n    {{#if this.showShiftKey}}\\n      <UiButton\\n        class=\\\"special_keyboard_key\\\"\\n        disabled={{this.disabled}}\\n        @variant={{this.shiftAlternative}}\\n        @size=\\\"small\\\"\\n        @onClick={{this.toggleCase}}\\n        data-test-shiftkey-button\\n      >\\n        <DcIcon @name={{this.shiftIcon}} />\\n      </UiButton>\\n    {{/if}}\\n    {{#each this.commonLetters as |char|}}\\n      <UiButton\\n        class=\\\"special_keyboard_key\\\"\\n        disabled={{this.disabled}}\\n        @variant=\\\"alternative\\\"\\n        @size=\\\"small\\\"\\n        {{on\\n          \\\"mousedown\\\"\\n          (fn\\n            this.insertChar\\n            (if this.shouldShowGreekBetaInsteadOfEszett \\\"β\\\" char)\\n          )\\n        }}\\n        data-test-keyboard-button={{char}}\\n      >\\n        {{if this.shouldShowGreekBetaInsteadOfEszett \\\"β\\\" char}}\\n      </UiButton>\\n    {{/each}}\\n    {{#if this.lowercased}}\\n      {{#each this.lowerCaseLetters as |char|}}\\n        <UiButton\\n          class=\\\"special_keyboard_key\\\"\\n          disabled={{this.disabled}}\\n          @variant=\\\"alternative\\\"\\n          @size=\\\"small\\\"\\n          {{on \\\"mousedown\\\" (fn this.insertChar char)}}\\n          data-test-keyboard-button={{char}}\\n        >\\n          {{char}}\\n        </UiButton>\\n      {{/each}}\\n    {{else}}\\n      {{#each this.upperCaseLetters as |char|}}\\n        <UiButton\\n          class=\\\"special_keyboard_key\\\"\\n          disabled={{this.disabled}}\\n          @variant=\\\"alternative\\\"\\n          @size=\\\"small\\\"\\n          {{on \\\"mousedown\\\" (fn this.insertChar char)}}\\n          data-test-keyboard-button={{char}}\\n        >\\n          {{char}}\\n        </UiButton>\\n      {{/each}}\\n    {{/if}}\\n  </div>\\n</div>', { moduleName: 'babel/components/special-keyboard/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { storageFor } from 'ember-local-storage';\nexport default class StoryModalComponent extends Component {\n  @service speaker;\n\n  @storageFor('read-setting') settings;\n\n  @action handleStartWithReading() {\n    this.speaker.setSpeakerActive(true);\n    this.speaker.setAutoplay(true);\n    this.args.onClose?.();\n  }\n\n  @action handleStartWithoutReading() {\n    this.speaker.setSpeakerActive(false);\n    this.args.onClose?.();\n  }\n\n  @action handleOnlyImage(value) {\n    this.settings.set('onlyImage', value);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XModal\\n  @closeButton={{false}}\\n  @onClose={{@onClose}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @locked={{true}}\\n  @fillOnSmallBreakpoint={{false}}\\n  @fullscreen={{false}}\\n>\\n  <div\\n    class=\\\"story-modal container-xs flex justify-center flex-column my3 {{if this.settings.onlyImage \\\"story-modal-only-image-checked\\\"}}\\\"\\n    data-test-story-modal\\n  >\\n    <div class=\\\"text-secondary text-center\\\">\\n      {{t \\\"components.storyModal.header\\\"}}\\n    </div>\\n\\n    <div class=\\\"nt1\\\">\\n      {{t \\\"components.storyModal.ingress\\\"}}\\n    </div>\\n\\n    <div class=\\\"mx-auto block mt1 mb2\\\">\\n      <XCheckbox\\n        class=\\\"mr1 nb1\\\"\\n        @value={{this.settings.onlyImage}}\\n        @checked={{this.settings.onlyImage}}\\n        @onChange={{this.handleOnlyImage}}\\n      >\\n        {{t \\\"components.storyModal.onlyImageCheckboxLabel\\\"}}\\n      </XCheckbox>\\n    </div>\\n\\n    <div class=\\\"story-modal-divider divider\\\"></div>\\n\\n    <div class=\\\"mx-auto block mt2\\\">\\n      <div class=\\\"flex flex-column\\\">\\n        <UiButton\\n          class=\\\"nb1 justify-center\\\"\\n          @onClick={{this.handleStartWithReading}}>\\n          {{t \\\"components.storyModal.listenButton\\\"}}\\n        </UiButton>\\n\\n        <UiButton\\n          class=\\\"story-modal-read-button\\\"\\n          @onClick={{this.handleStartWithoutReading}}\\n          @flat={{true}}\\n          data-test-story-modal-no-sound\\n        >\\n          {{t \\\"components.storyModal.readButton\\\"}}\\n        </UiButton>\\n      </div>\\n    </div>\\n\\n  </div>\\n\\n</XModal>\\n', { moduleName: 'babel/components/story-modal/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { mapBy } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\nimport { flatten } from 'compton/utils/array';\nimport DS from 'ember-data';\nimport { all } from 'rsvp';\n\nconst { PromiseArray } = DS;\n\nfunction createPromiseArray(promise) {\n  return PromiseArray.create({ promise });\n}\n\nexport default Component.extend({\n  intl: service(),\n\n  value: null,\n\n  groups: null,\n\n  disabled: false,\n\n  missionMode: false,\n\n  canSelectAll: true,\n\n  tagName: '',\n\n  groupsUsers: mapBy('groups', 'users'),\n\n  students: computed('groupsUsers.@each.{role,showname}', function () {\n    const promise = all(this.get('groupsUsers')).then((t) => {\n      return flatten(t.invoke('toArray'))\n        .uniq()\n        .filterBy('role', 'student')\n        .sortBy('showname');\n    });\n\n    return createPromiseArray(promise);\n  }),\n\n  items: computed('students.@each', 'canSelectAll', 'missionMode', function () {\n    const options = [];\n\n    if (this.get('canSelectAll')) {\n      if (this.get('missionMode')) {\n        options.addObject({\n          label: this.get('intl').t(\n            'components.studentSelect.allStudentsInMission'\n          ),\n          value: null,\n        });\n      } else {\n        options.addObject({\n          label: this.get('intl').t('components.studentSelect.allStudents'),\n          value: null,\n        });\n      }\n    }\n\n    this.get('students').forEach((user) => {\n      options.addObject({\n        label: user.get('showname'),\n        value: user.get('id'),\n        meta: { user },\n        metadata: user.get('metadata'),\n        isTeacher: user.get('isTeacher'),\n        initials: user.get('initials'),\n      });\n    });\n\n    return options;\n  }),\n\n  actions: {\n    handleChange(value) {\n      this.set('value', value);\n      this.onChange?.(value);\n\n      const selectedOption = this.items?.findBy('value', value);\n      const name = selectedOption ? selectedOption.label : 'Alla elever';\n\n      trackAuditEvent('Elevfilter', name);\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-center\\\">\\n\\n  <DcAvatar\\n    @user={{@user}}\\n    @size=\\\"large\\\"\\n    @icon=\\\"group\\\"\\n  />\\n\\n  {{x-atom\\n    class=\\\"text-tertiary ml1\\\"\\n    label=@label\\n    placeholder=@placeholder\\n  }}\\n\\n</div>', { moduleName: 'babel/components/student-select/detail/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-select\\n  class=this.class\\n  value=this.value\\n  items=this.items\\n  onChange=(action \\\"handleChange\\\")\\n  disabled=this.disabled\\n  stretch=true\\n  size=\\\"md\\\"\\n  placeholder=(t \\\"components.studentSelect.selectStudent\\\")\\n  as |select|\\n}}\\n\\n  {{#select.box as |box|}}\\n\\n    {{student-select/detail\\n      label=box.label\\n      placeholder=box.placeholder\\n      user=box.selectedOption.meta.user\\n    }}\\n\\n  {{/select.box}}\\n\\n  {{#select.menu as |option|}}\\n\\n    {{student-select/detail label=option.label user=option.meta.user}}\\n\\n  {{/select.menu}}\\n\\n{{/x-select}}\\n', { moduleName: 'babel/components/student-select/template.hbs' });\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class TableOfContentsListItemAssignmentItemComponent extends Component {\n  @service router;\n\n  @service routerScroll;\n\n  get itemProps() {\n    const item = this.args.item.exercise;\n\n    const props = {\n      title: item.title,\n      type: item.type,\n      name: null,\n    };\n\n    if (this.args.space === 'content') {\n      if (this.args.isInteractive) {\n        props.params = [\n          'master.interactives.practices.show',\n          this.args.collection.id,\n          item.id,\n        ];\n      } else {\n        props.params = [\n          {\n            isQueryParams: true,\n            values: {\n              exercise: item.id,\n              section: this.args.collection.id,\n            },\n          },\n        ];\n      }\n    } else {\n      props.params = ['master.contents.assignments.show', item.id];\n      if (this.args.firstSectionQuery) {\n        props.params.push({\n          isQueryParams: true,\n          values: {\n            ...this.args.firstSectionQuery,\n          },\n        });\n      }\n    }\n    return props;\n  }\n\n  @action handleClick() {\n    if (\n      this.args.space === 'content' &&\n      !this.args.isInteractive &&\n      this.router.currentRoute.queryParams.section === this.args.collection.id\n    ) {\n      // This covers the case where we are in a content and viewing the same\n      // section as the link targets. When we then change exercise, we should\n      // not first be scrolled to the top before scrolling down to the exercise.\n\n      const initialPreserveScrollPositionState =\n        this.routerScroll.preserveScrollPosition;\n\n      this.routerScroll.preserveScrollPosition = true;\n\n      later(this, () => {\n        this.routerScroll.preserveScrollPosition =\n          initialPreserveScrollPositionState;\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<UiLink\\n  class=\\\"table-of-contents-sub-item\\\"\\n  @params={{this.itemProps.params}}\\n  {{on \\\"click\\\" this.handleClick}}\\n>\\n  <div class=\\\"table-of-contents-sub-item-inner\\\">\\n    <AnswerStatusIcon\\n      @status={{@item.answer.computedStatus}}\\n      class=\\\"mr1\\\"\\n    />\\n    {{#unless @item.exercise.hideAssignmentSortNumbers}}\\n      {{increment @index}}. \\n    {{/unless}}\\n\\n    {{@item.exercise.title}}\\n  </div>\\n</UiLink>\\n', { moduleName: 'babel/components/table-of-contents-item/assignment-item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (eq this.itemProps.type \\\"collections\\\")}}\\n  <div>\\n    <CollectionListItem\\n      @collection={{@item}}\\n      @onOpenExercise={{this.handleOpenExercise}}\\n      @onOpenCollection={{this.handleOpenCollection}}\\n      @startExpanded={{this.isExpanded}}\\n      @active={{or\\n        this.isSectionRouteActive\\n        this.isCollectionRouteActive\\n        this.isInteractiveRouteActive\\n      }}\\n      @routed={{@routed}}\\n    />\\n  </div>\\n{{else}}\\n  <div\\n    class=\\\"table-of-contents-item\\\"\\n    {{did-insert this.scrollIntoView}}\\n    ...attributes\\n  >\\n    <div>\\n      <UiLink\\n        @params={{this.itemProps.params}}\\n        @class={{this.childClass}}\\n        data-test-table-of-contents-item-link\\n        {{on \\\"click\\\" this.trackClick}}\\n      >\\n        <EntityThumbnail\\n          class=\\\"table-of-contents-thumbnail\\\"\\n          @avatarUser={{this.itemProps.avatarUser}}\\n          @type={{this.itemProps.type}}\\n          @model={{@item}}\\n          @index={{@index}}\\n        />\\n        <div class=\\\"table-of-contents-title flex-auto mr1\\\">\\n          {{this.itemProps.title}}\\n          {{#if this.itemProps.name}}\\n            <div class=\\\"table-of-contents-name\\\">{{this.itemProps.name}}</div>\\n          {{/if}}\\n        </div>\\n\\n        {{#if this.isSectionWithExercises}}\\n          <CollectionOptions\\n            @collection={{@item}}\\n            class=\\\"flex-shrink text-color mr1\\\"\\n          />\\n        {{/if}}\\n\\n        {{#if this.hasToggler}}\\n         <UiButton\\n          @onClick={{this.toggleExpanded}}\\n          @appearance=\\\"none\\\"\\n         >\\n            <DcIcon\\n              @name={{if this.expanded \\\"small-up\\\" \\\"small-down\\\"}}\\n              class={{this.togglerClass}}\\n            />\\n         </UiButton>\\n        {{/if}}\\n      </UiLink>\\n    </div>\\n\\n    {{#if this.isExpanded}}\\n      <div class=\\\"table-of-contents-sub-items\\\">\\n        {{#each this.headings as |heading|}}\\n          {{!-- template-lint-disable no-invalid-interactive --}}\\n          <div\\n            class=\\\"table-of-contents-sub-item ui-link ui-link--link--default ui-link--medium\\\"\\n            {{on \\\"click\\\" (fn this.scrollTo heading.uuid)}}\\n          >\\n            <div class=\\\"table-of-contents-sub-item-inner\\\">\\n              <TbRenderInline @value={{heading.value}} @stripTags={{true}} />\\n            </div>\\n          </div>\\n        {{/each}}\\n\\n        {{#each this.assignmentItem as |item index|}}\\n          <TableOfContentsItem::AssignmentItem\\n            @firstSectionQuery={{this.firstSectionQuery}}\\n            @collection={{@item}}\\n            @item={{item}}\\n            @index={{index}}\\n            @space={{@space}}\\n            @isInteractive={{@isInteractive}}\\n          />\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n\\n  </div>\\n{{/if}}\\n\", {\"contents\":\"{{#if (eq this.itemProps.type \\\"collections\\\")}}\\n  <div>\\n    <CollectionListItem\\n      @collection={{@item}}\\n      @onOpenExercise={{this.handleOpenExercise}}\\n      @onOpenCollection={{this.handleOpenCollection}}\\n      @startExpanded={{this.isExpanded}}\\n      @active={{or\\n        this.isSectionRouteActive\\n        this.isCollectionRouteActive\\n        this.isInteractiveRouteActive\\n      }}\\n      @routed={{@routed}}\\n    />\\n  </div>\\n{{else}}\\n  <div\\n    class=\\\"table-of-contents-item\\\"\\n    {{did-insert this.scrollIntoView}}\\n    ...attributes\\n  >\\n    <div>\\n      <UiLink\\n        @params={{this.itemProps.params}}\\n        @class={{this.childClass}}\\n        data-test-table-of-contents-item-link\\n        {{on \\\"click\\\" this.trackClick}}\\n      >\\n        <EntityThumbnail\\n          class=\\\"table-of-contents-thumbnail\\\"\\n          @avatarUser={{this.itemProps.avatarUser}}\\n          @type={{this.itemProps.type}}\\n          @model={{@item}}\\n          @index={{@index}}\\n        />\\n        <div class=\\\"table-of-contents-title flex-auto mr1\\\">\\n          {{this.itemProps.title}}\\n          {{#if this.itemProps.name}}\\n            <div class=\\\"table-of-contents-name\\\">{{this.itemProps.name}}</div>\\n          {{/if}}\\n        </div>\\n\\n        {{#if this.isSectionWithExercises}}\\n          <CollectionOptions\\n            @collection={{@item}}\\n            class=\\\"flex-shrink text-color mr1\\\"\\n          />\\n        {{/if}}\\n\\n        {{#if this.hasToggler}}\\n         <UiButton\\n          @onClick={{this.toggleExpanded}}\\n          @appearance=\\\"none\\\"\\n         >\\n            <DcIcon\\n              @name={{if this.expanded \\\"small-up\\\" \\\"small-down\\\"}}\\n              class={{this.togglerClass}}\\n            />\\n         </UiButton>\\n        {{/if}}\\n      </UiLink>\\n    </div>\\n\\n    {{#if this.isExpanded}}\\n      <div class=\\\"table-of-contents-sub-items\\\">\\n        {{#each this.headings as |heading|}}\\n          {{!-- template-lint-disable no-invalid-interactive --}}\\n          <div\\n            class=\\\"table-of-contents-sub-item ui-link ui-link--link--default ui-link--medium\\\"\\n            {{on \\\"click\\\" (fn this.scrollTo heading.uuid)}}\\n          >\\n            <div class=\\\"table-of-contents-sub-item-inner\\\">\\n              <TbRenderInline @value={{heading.value}} @stripTags={{true}} />\\n            </div>\\n          </div>\\n        {{/each}}\\n\\n        {{#each this.assignmentItem as |item index|}}\\n          <TableOfContentsItem::AssignmentItem\\n            @firstSectionQuery={{this.firstSectionQuery}}\\n            @collection={{@item}}\\n            @item={{item}}\\n            @index={{index}}\\n            @space={{@space}}\\n            @isInteractive={{@isInteractive}}\\n          />\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n\\n  </div>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/table-of-contents-item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/table-of-contents-item/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { scrollTo } from 'babel/utils/chapter-viewport';\nimport { getOriginalAnswer } from 'babel/utils/get-answer';\nimport { isWorkspaceCollectionActive } from 'babel/utils/is-workspace-collection-active';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\nimport sortBy from 'babel/utils/sort-by';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class TableOfContentsItemComponent extends Component {\n  /**\n   * Arguments:\n   * item\n   * index\n   * activeSubHeading\n   * sections\n   * activeCategory\n   * routeOnSubHeadingClick\n   * firstSection\n   * scrollBehavior\n   * closeIndex\n   * space\n   * goToSection\n   * isInteractive\n   * showNumberOfAssignments\n   */\n\n  @service contextHelper;\n  @service router;\n  @service intl;\n  @service missionMode;\n  @service store;\n  @service assignmentEvents;\n\n  @tracked expanded;\n  @tracked activeSubHeading;\n\n  constructor() {\n    super(...arguments);\n\n    this.expanded = false;\n\n    this.sortedComponents.forEach((component) => {\n      if (\n        this.args.activeSubHeading === component.uuid &&\n        this.isSectionRouteActive\n      ) {\n        this.expanded = true;\n      }\n    });\n    if (!this.isInteractive) {\n      if (this.isCollectionRouteActive) {\n        this.expanded = true;\n      }\n    }\n  }\n\n  get isExpanded() {\n    return this.expanded;\n  }\n\n  get size() {\n    return this.args.size || 'normal';\n  }\n\n  get sizeClass() {\n    return ['table-of-contents-list-item', this.size].join('--');\n  }\n\n  get scrollBehavior() {\n    return this.args.scrollBehavior || 'smooth';\n  }\n\n  get isSectionRouteActive() {\n    return (\n      this.router.currentRoute?.queryParams?.section === this.args.item?.id\n    );\n  }\n\n  get isInteractiveRouteActive() {\n    if (this.contextHelper.activeContent?.type === 'interactives') {\n      if (\n        this.contextHelper.activeWorkspaceSection?.id === this.args.item?.id\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  get firstSectionQuery() {\n    if (this.args?.firstSection) {\n      return {\n        section: this.args.firstSection.id,\n      };\n    } else if (this.isAnotherCategory) {\n      return {\n        section:\n          this.args.sections?.firstObject?.id ||\n          this.args.unrestrictedSections?.firstObject?.id,\n      };\n    } else if (\n      !this.args?.sections &&\n      this.args?.unrestrictedSections?.length > 0\n    ) {\n      return {\n        section: this.args.unrestrictedSections.firstObject.id,\n      };\n    } else {\n      return null;\n    }\n  }\n\n  get isCollectionRouteActive() {\n    const type = this.args.item?.type;\n\n    if (type === 'collections') {\n      return isWorkspaceCollectionActive(this.router, this.args.item);\n    }\n\n    return false;\n  }\n\n  get itemProps() {\n    const item = this.args.item;\n    const props = {\n      title: item.title,\n      type: item.type,\n      name: null,\n    };\n\n    if (item.type === 'sections') {\n      props.params = [\n        {\n          isQueryParams: true,\n          values: {\n            section: item.id,\n            exercise: null,\n          },\n        },\n      ];\n      if (this.isAnotherCategory) {\n        props.params.unshift('master.contents');\n      }\n    }\n\n    if (this.args.space === 'content' && item.type === 'collections') {\n      if (this.args.showNumberOfAssignments) {\n        props.name = this.intl.t(\n          'components.tableOfContentsItem.numAssignments',\n          { count: this.assignments?.length || 0 }\n        );\n        props.params = ['master.interactives.practices', item.id];\n      } else {\n        props.params = [\n          {\n            isQueryParams: true,\n            values: {\n              section: item.id,\n              exercise: null,\n            },\n          },\n        ];\n      }\n    } else if (item.type === 'collections') {\n      props.params = [\n        'master.contents.assignments.show',\n        this.assignmentItem?.firstObject?.exercise?.id ||\n          this.assignments?.firstObject?.id,\n      ];\n      if (this.firstSectionQuery) {\n        props.params.push({\n          isQueryParams: true,\n          values: {\n            ...this.firstSectionQuery,\n          },\n        });\n      }\n      props.avatarUser = item.owner;\n      if (item.teacherAssignment) {\n        props.title = this.intl.t(\n          'components.tableOfContentsItem.headingLabel'\n        );\n        props.name = item.teacherAssignment.user.get('showname');\n      }\n    }\n\n    if (['glossaries', 'concepts'].includes(item.type)) {\n      props.params = ['master.contents.wordlists.show', item.id];\n      if (this.firstSectionQuery) {\n        props.params.push({\n          isQueryParams: true,\n          values: {\n            section:\n              this.firstSectionQuery?.section ||\n              this.contextHelper?.activeSection?.id,\n          },\n        });\n      }\n      props.avatarUser = item.user;\n      if (item.user) {\n        props.name = item.user.get('showname');\n      }\n    }\n    return props;\n  }\n\n  get sortedComponents() {\n    const compontents = this.args.item?.contenteditor\n      ?.get('rows')\n      ?.map((row) => row?.columns.map((column) => column?.components).flat())\n      ?.flat();\n    return compontents || [];\n  }\n\n  get headings() {\n    return this.sortedComponents.filter((component) => {\n      if (\n        component.component === 'heading' &&\n        component.settings &&\n        component.settings.size === 'large'\n      ) {\n        return true;\n      }\n      return false;\n    });\n  }\n\n  get assignments() {\n    if (this.args.item?.children?.length > 0) {\n      return this.args.item.children;\n    }\n\n    return null;\n  }\n\n  get childClass() {\n    const classes = ['table-of-contents-item-main'];\n\n    if (this.isExpanded || this.isSectionRouteActive) {\n      classes.push('table-of-contents-item--active');\n    }\n\n    classes.push(this.sizeClass);\n\n    return classes.join(' ');\n  }\n\n  get isSectionWithExercises() {\n    return (\n      this.args.item?.type === 'sections' &&\n      this.args.item?.childrenSum > 0 &&\n      this.assignmentItem?.length > 0\n    );\n  }\n\n  get hasToggler() {\n    if (this.headings.length > 0) {\n      return true;\n    } else if (this.args.item?.type === 'collections') {\n      return true;\n    } else if (this.isSectionWithExercises) {\n      return true;\n    }\n    return false;\n  }\n\n  get togglerClass() {\n    const classes = ['flex-shrink', 'table-of-contents-toggler'];\n\n    if (this.isExpanded) {\n      classes.push('table-of-contents-toggler--active');\n    }\n\n    return classes.join(' ');\n  }\n\n  get shouldRouteOnSubHeadingClick() {\n    return (\n      this.args.routeOnSubHeadingClick ||\n      this.args.item.get('category.id') !== this.args.activeCategory?.id\n    );\n  }\n\n  @cached\n  get assignmentItemProxy() {\n    const answers = this.answers;\n\n    const promise = resolve(this.args.item?.children)\n      .then((children) => this.missionMode.allowedEntities(children))\n      .then((allowed) => {\n        if (allowed) {\n          if (this.args.item?.isTeacherCollection) {\n            allowed = sortBy(allowed, 'title_asc');\n          }\n\n          return allowed.map((exercise) => ({\n            exercise,\n            answer: getOriginalAnswer(exercise, answers),\n          }));\n        }\n      });\n\n    return load(promise, this);\n  }\n\n  get assignmentItem() {\n    return this.assignmentItemProxy.isResolved\n      ? this.assignmentItemProxy.value\n      : null;\n  }\n\n  @cached\n  get interactiveProxy() {\n    const promise = this.assignmentEvents\n      .getOrCreateInteractiveForCollection(this.args.item)\n      .then(({ interactive }) => interactive);\n\n    return load(promise, this);\n  }\n\n  get interactive() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value\n      : null;\n  }\n\n  get answers() {\n    return this.interactive?.answers;\n  }\n\n  @action\n  scrollIntoView(element) {\n    if (\n      element &&\n      this.args.item?.type === 'sections' &&\n      this.isSectionRouteActive\n    ) {\n      const link = element.getElementsByTagName('a')[0];\n      if (link) link.focus();\n      later(() => {\n        scrollIntoViewIfNeeded(element, { behavior: 'smooth' });\n      }, 200);\n    }\n  }\n\n  @action\n  scrollTo(id) {\n    this.args.closeIndex?.();\n\n    if (this.shouldRouteOnSubHeadingClick) {\n      const route = this.isAnotherCategory ? 'master.contents' : null;\n      const query = {\n        queryParams: { section: this.args.item?.id, exercise: null },\n      };\n\n      let promise;\n\n      if (!route) {\n        promise = this.router.transitionTo(query);\n      } else {\n        promise = this.router.transitionTo(route, query);\n      }\n\n      promise.then(() =>\n        scheduleOnce('afterRender', this, '_scrollToHeading', id)\n      );\n    } else {\n      scheduleOnce('afterRender', this, '_scrollToHeading', id);\n    }\n  }\n\n  @action\n  toggleExpanded(evt) {\n    evt.preventDefault();\n    evt.stopPropagation();\n\n    this.expanded = !this.expanded;\n  }\n\n  @action\n  trackClick() {\n    if (['glossaries', 'concepts'].includes(this.args.item?.type)) {\n      trackWordlistEvent(\n        'Öppna ordlista från Inneåll',\n        this.args.item?.isReadOnly\n      );\n    }\n  }\n\n  _scrollToHeading(id) {\n    window.requestAnimationFrame(() => {\n      const elem = document.querySelectorAll('[data-id=\"' + id + '\"]')[0];\n      if (elem) {\n        scrollTo(elem, this.scrollBehavior);\n      }\n    });\n  }\n\n  @action\n  handleOpenExercise(exercise) {\n    return this._navigateToExercise(exercise);\n  }\n\n  @action\n  handleOpenCollection(collection, exercise) {\n    return this._navigateToExercise(exercise);\n  }\n\n  async _navigateToExercise(exercise) {\n    const collection = await exercise.parent;\n\n    if (this.args.isInteractive) {\n      if (collection.isCarousel) {\n        return this.router.transitionTo(\n          'master.interactives.practices.show',\n          collection.id,\n          'carousel'\n        );\n      }\n\n      return this.router.transitionTo(\n        'master.interactives.practices.show',\n        collection.id,\n        exercise.id\n      );\n    } else if (collection.space === 'workspace') {\n      let sectionId = this.router.currentRoute.queryParams.section;\n\n      if (!sectionId) {\n        sectionId = this.firstSectionQuery?.section;\n      }\n\n      return this.router.transitionTo(\n        'master.contents.assignments.show',\n        exercise.id,\n        {\n          queryParams: {\n            section: sectionId,\n          },\n        }\n      );\n    } else {\n      let exerciseId = exercise.id;\n\n      if (collection.isCarousel) {\n        exerciseId = null;\n      }\n\n      return this.router.transitionTo({\n        queryParams: {\n          section: collection.id,\n          exercise: exerciseId,\n        },\n      });\n    }\n  }\n\n  get isAnotherCategory() {\n    if (this.args.item?.category?.id !== this.args.activeCategory?.id) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#each this.groupedLists as |list|}}\\n  {{#if list.items.length}}\\n    {{#if (and list.heading this.showHeading)}}\\n      <div class=\\\"text-heading mx1 ny1\\\">\\n        {{list.heading}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (and list.categoryTitle this.showCategory)}}\\n      <div class=\\\"text-ui mx1 nb1 mt1\\\">\\n        {{list.categoryTitle}}\\n      </div>\\n    {{/if}}\\n\\n    {{#each list.items as |item index|}}\\n      <div class=\\\"snb1\\\" data-test-table-of-contents-list-item-wrapper>\\n        <TableOfContentsItem\\n          @item={{item}}\\n          @index={{increment index}}\\n          @activeSubHeading={{@activeSubHeading}}\\n          @sections={{@categorizedSections}}\\n          @unrestrictedSections={{@unrestrictedSections}}\\n          @activeCategory={{@activeCategory}}\\n          @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n          @firstSection={{@firstSection}}\\n          @scrollBehavior={{@scrollBehavior}}\\n          @closeIndex={{@closeIndex}}\\n          @space={{list.space}}\\n          @goToSection={{@goToSection}}\\n          @isInteractive={{@isInteractive}}\\n          @routed={{@routed}}\\n        />\\n      </div>\\n    {{/each}}\\n  {{/if}}\\n{{/each}}\", {\"contents\":\"{{#each this.groupedLists as |list|}}\\n  {{#if list.items.length}}\\n    {{#if (and list.heading this.showHeading)}}\\n      <div class=\\\"text-heading mx1 ny1\\\">\\n        {{list.heading}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if (and list.categoryTitle this.showCategory)}}\\n      <div class=\\\"text-ui mx1 nb1 mt1\\\">\\n        {{list.categoryTitle}}\\n      </div>\\n    {{/if}}\\n\\n    {{#each list.items as |item index|}}\\n      <div class=\\\"snb1\\\" data-test-table-of-contents-list-item-wrapper>\\n        <TableOfContentsItem\\n          @item={{item}}\\n          @index={{increment index}}\\n          @activeSubHeading={{@activeSubHeading}}\\n          @sections={{@categorizedSections}}\\n          @unrestrictedSections={{@unrestrictedSections}}\\n          @activeCategory={{@activeCategory}}\\n          @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n          @firstSection={{@firstSection}}\\n          @scrollBehavior={{@scrollBehavior}}\\n          @closeIndex={{@closeIndex}}\\n          @space={{list.space}}\\n          @goToSection={{@goToSection}}\\n          @isInteractive={{@isInteractive}}\\n          @routed={{@routed}}\\n        />\\n      </div>\\n    {{/each}}\\n  {{/if}}\\n{{/each}}\",\"moduleName\":\"babel/components/table-of-contents-list/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/table-of-contents-list/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport arg from 'compton/utils/arg';\n\nexport default class TableOfContentsListComponent extends Component {\n  @arg showHeading = true;\n\n  @arg showCategory = true;\n\n  @service intl;\n\n  @service store;\n\n  get groupedLists() {\n    const categoryIds =\n      this.args.categorizedSections\n        ?.map((item) => item.belongsTo('cat').id())\n        ?.filter((val, idx, arr) => arr.indexOf(val) === idx) || [];\n    const result = [];\n\n    if (categoryIds.length > 1) {\n      categoryIds.forEach((id) => {\n        const items = this.args.categorizedSections.filter(\n          (item) => item.belongsTo('cat').id() === id\n        );\n\n        let category;\n\n        if (id) {\n          category = this.store.peekRecord('category', id);\n        }\n\n        result.push({\n          items,\n          categoryTitle: category?.name,\n          space: 'content',\n        });\n      });\n    } else {\n      result.push({\n        items: this.args.categorizedSections,\n        space: 'content',\n      });\n    }\n\n    return [\n      ...result,\n      {\n        heading: this.intl.t('components.tableOfContents.list.assignments'),\n        items: this.args.categorizedCollections,\n        space: 'workspace',\n      },\n      {\n        heading: this.intl.t('components.tableOfContents.list.wordlists'),\n        items: this.args.wordlists,\n        space: 'workspace',\n      },\n    ];\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"table-of-contents p1\\\">\\n  <TableOfContentsList\\n    @activeSubHeading={{@activeSubHeading}}\\n    @categorizedSections={{this.categorizedSections}}\\n    @categorizedCollections={{this.categorizedCollections}}\\n    @wordlists={{this.categorizedWordlists}}\\n    @activeCategory={{@activeCategory}}\\n    @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n    @goToSection={{@goToSection}}\\n    @isInteractive={{@isInteractive}}\\n    @closeIndex={{@closeIndex}}\\n  />\\n</div>\", {\"contents\":\"<div class=\\\"table-of-contents p1\\\">\\n  <TableOfContentsList\\n    @activeSubHeading={{@activeSubHeading}}\\n    @categorizedSections={{this.categorizedSections}}\\n    @categorizedCollections={{this.categorizedCollections}}\\n    @wordlists={{this.categorizedWordlists}}\\n    @activeCategory={{@activeCategory}}\\n    @routeOnSubHeadingClick={{@routeOnSubHeadingClick}}\\n    @goToSection={{@goToSection}}\\n    @isInteractive={{@isInteractive}}\\n    @closeIndex={{@closeIndex}}\\n  />\\n</div>\",\"moduleName\":\"babel/components/table-of-contents/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/table-of-contents/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class TableOfContentsComponent extends Component {\n  /**\n   * Arguments:\n   * activeCategory\n   * sections\n   * collections\n   * wordlists\n   * expandEntity\n   * activeSubHeading\n   * routeOnSubHeadingClick\n   * closeIndex\n   */\n\n  @service session;\n\n  get categorizedSections() {\n    if (this.args.activeCategory) {\n      return this.args.sections?.filterBy(\n        'category.id',\n        this.args.activeCategory?.id\n      );\n    } else {\n      return this.args.sections;\n    }\n  }\n\n  get categorizedWordlists() {\n    if (!this.args.wordlists) {\n      return null;\n    }\n    return this.args.wordlists?.filter((wordlist) => {\n      if (!wordlist?.category) {\n        return true;\n      }\n      if (wordlist?.category?.id === this.args.activeCategory?.id) {\n        return true;\n      }\n      return false;\n    });\n  }\n\n  get categorizedCollections() {\n    if (!this.args.collections) {\n      return null;\n    }\n    let filteredCollections = this.args.collections?.filter((collection) => {\n      if (collection?.category?.id === this.args.activeCategory?.id) {\n        return true;\n      }\n      if (collection.isTeacherCollection) {\n        return true;\n      }\n      return false;\n    });\n    filteredCollections = filteredCollections.reject((collection) =>\n      collection.get('children').isEvery('isPublished', false)\n    );\n\n    const sorted = filteredCollections.sort((a, b) => {\n      if (a.isTeacherCollection) {\n        if (b.isTeacherCollection) {\n          if (a.title) {\n            if (b.title) {\n              return a.title.localeCompare(b.title);\n            } else {\n              return 1;\n            }\n          } else {\n            return -1;\n          }\n        } else {\n          return -1;\n        }\n      } else {\n        if (b.isTeacherCollection) {\n          return 1;\n        } else {\n          return a.sort > b.sort ? 1 : -1;\n        }\n      }\n    });\n\n    if (this.session?.user?.isStudent) {\n      return sorted.rejectBy('userId', this.session?.user?.id);\n    }\n\n    return sorted;\n  }\n}\n","import { isPresent, typeOf } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport himalaya from 'babel/utils/himalaya';\n\nconst SYMBOL_VALUE_TO_CHAR_CODE_MAPPING = {\n  nbsp: 160,\n  narrownbsp: 8239,\n  thinsp: 8201,\n  shy: 173,\n};\n\nfunction transformSymbols(str) {\n  const div = document.createElement('div');\n  div.innerHTML = str;\n\n  div.querySelectorAll('[data-type=\"symbol\"]').forEach((element) => {\n    element.parentNode.replaceChild(\n      document.createTextNode(\n        String.fromCharCode(\n          SYMBOL_VALUE_TO_CHAR_CODE_MAPPING[element.dataset.value]\n        )\n      ),\n      element\n    );\n  });\n\n  return div.innerHTML;\n}\n\nexport default class TbRenderInlineComponent extends Component {\n  /**\n   * Arguments:\n   * value (string)\n   * nodes (array)\n   * stripTags (bool)\n   */\n\n  get nodes() {\n    if (this.args.nodes) return this.args.nodes;\n\n    let value = this.args.value;\n\n    if (isPresent(value)) {\n      if (typeOf(value) === 'string') {\n        value = transformSymbols(value);\n        value = himalaya.parse(value);\n      }\n\n      return value;\n    }\n\n    return null;\n  }\n}\n","import Component from '@glimmer/component';\n\nconst TAG_NAME_TO_TYPE_MAPPING = {\n  b: 'format',\n  i: 'format',\n  u: 'format',\n  strike: 'format',\n  span: 'format',\n  br: 'format',\n  a: 'enclose',\n  sub: 'format',\n  sup: 'format',\n\n  // Legacy\n  em: 'format',\n  strong: 'format',\n  p: 'format',\n  div: 'format',\n  ol: 'format',\n  ul: 'format',\n  li: 'format',\n};\n\nexport default class TbRenderInlineElementComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   * stripTags (bool)\n   */\n\n  get type() {\n    const node = this.args.node;\n\n    if (!node) return null;\n\n    if (this.args.stripTags) return 'stripped';\n\n    const { attributes, tagName } = node;\n    const dataType = attributes.findBy('key', 'data-type');\n\n    if (['formula', 'footnote'].includes(dataType?.value)) {\n      return 'extension';\n    }\n\n    if (dataType?.value === 'text-gap') {\n      return 'enclose';\n    }\n\n    if (dataType?.value === 'image' && tagName === 'span') {\n      return 'image';\n    }\n\n    return TAG_NAME_TO_TYPE_MAPPING[tagName];\n  }\n\n  get componentName() {\n    return this.type ? `tb-render-inline/element/${this.type}` : null;\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class TbRenderInlineElementEncloseAComponent extends Component {\n  /**\n   * Arguments:\n   * href (string)\n   * active (bool)\n   * variant (string)\n   * onClick (function)\n   */\n\n  @storageFor('read-setting') settings;\n\n  baseClass = 'tb-render-inline-element-enclose-a';\n\n  get href() {\n    return this.args.href || '#';\n  }\n\n  get markingClass() {\n    // ember localStorage requires get\n    const marking = this.args.active ? 'colored' : this.settings.get('marking');\n    return [this.baseClass, marking].join('--');\n  }\n\n  get variantClass() {\n    return this.args.variant && [this.baseClass, this.args.variant].join('--');\n  }\n\n  get classes() {\n    const classes = [this.baseClass];\n\n    if (this.markingClass) {\n      classes.push(this.markingClass);\n    }\n\n    if (this.variantClass) {\n      classes.push(this.variantClass);\n    }\n\n    return classes.join(' ');\n  }\n\n  @action\n  handleClick(e) {\n    if (this.href) {\n      if (e.shiftKey || e.ctrlKey || e.metaKey) {\n        return;\n      }\n\n      e.preventDefault();\n    }\n\n    this.args.onClick?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<a\\n  href={{this.href}}\\n  class={{this.classes}}\\n  {{on \\\"click\\\" this.handleClick}}\\n  ...attributes\\n>\\n  {{~yield~}}\\n</a>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/enclose/a/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport loadDataFromStore from 'babel/utils/load-data-from-store';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nconst ALLOWED_TYPES = [\n  'article',\n  'embed',\n  'audio',\n  'formula',\n  'image',\n  'interactive-image',\n  'link',\n  'video',\n  'word-explanation',\n];\n\nconst COMPONENT_PREFIX = 'tb-render-inline/element/enclose';\n\nconst IMMERSION_TYPES = [\n  'article',\n  'audio',\n  'embed',\n  'image',\n  'interactive-image',\n  'video',\n];\n\nexport default class TbRenderInlineElementEncloseComponent extends Component {\n  /**\n   * node (object)\n   */\n\n  @service store;\n\n  get materialId() {\n    return this.args.node?.attributes?.findBy('key', 'data-id')?.value;\n  }\n\n  get type() {\n    return this.args.node?.attributes?.findBy('key', 'data-type')?.value;\n  }\n\n  get linkType() {\n    return this.args.node?.attributes?.findBy('key', 'data-link-type')?.value;\n  }\n\n  @cached\n  get materialPromise() {\n    let promise = resolve();\n\n    if (\n      this.materialId &&\n      this.type !== 'custom' &&\n      (this.type !== 'link' || !['node', 'guidance'].includes(this.linkType))\n    ) {\n      promise = loadDataFromStore('material', this.materialId, this.store);\n    }\n\n    return promise;\n  }\n\n  @cached\n  get materialProxy() {\n    return load(this.materialPromise, this);\n  }\n\n  get material() {\n    return this.materialProxy.isResolved ? this.materialProxy.value : null;\n  }\n\n  get typeIsAllowed() {\n    return ALLOWED_TYPES.includes(this.type);\n  }\n\n  get isCustomComponent() {\n    return ['custom', 'text-gap'].includes(this.type);\n  }\n\n  get componentName() {\n    if (this.type) {\n      if (IMMERSION_TYPES.includes(this.type)) {\n        return [COMPONENT_PREFIX, 'immersion'].join('/');\n      }\n\n      return [COMPONENT_PREFIX, this.type].join('/');\n    }\n\n    return null;\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class TbRenderInlineElementEncloseImmersionComponent extends Component {\n  @tracked hasMaterialPreview = false;\n\n  @action openMaterialPreview() {\n    this.hasMaterialPreview = true;\n  }\n\n  @action closeMaterialPreview() {\n    this.hasMaterialPreview = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<TbRenderInline::Element::Enclose::A\\n  @variant=\\\"immersion\\\"\\n  @active={{this.hasMaterialPreview}}\\n  @onClick={{this.openMaterialPreview}}\\n>\\n  {{~yield~}}\\n</TbRenderInline::Element::Enclose::A>\\n\\n{{~#if this.hasMaterialPreview~}}\\n  <MaterialViewer\\n    @material={{@materialPromise}}\\n    @onClose={{this.closeMaterialPreview}}\\n  />\\n{{~/if~}}', { moduleName: 'babel/components/tb-render-inline/element/enclose/immersion/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class TbRenderInlineElementEncloseLinkComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   * material (object)\n   */\n\n  @service ajax;\n\n  @service contextHelper;\n\n  @service router;\n\n  @service store;\n\n  @service entityInspector;\n\n  @tracked modalIsOpen = false;\n\n  get material() {\n    return this.args.material;\n  }\n\n  get type() {\n    return this.args.node?.attributes?.findBy('key', 'data-link-type')?.value;\n  }\n\n  get id() {\n    return this.args.node?.attributes?.findBy('key', 'data-id')?.value;\n  }\n\n  get routeArgs() {\n    const routeArgs = ['nodes', this.id];\n\n    const contentRoute = this.router.currentRoute.find(\n      (route) => route.name === 'master.contents'\n    );\n\n    if (contentRoute) {\n      let { queryParams } = contentRoute;\n      queryParams = { ...queryParams };\n\n      if (!this.contextHelper.hasReturnUrl) {\n        queryParams.return_url = this.router.currentURL;\n      }\n\n      if (this.contextHelper.hasCloseUrl) {\n        queryParams.close_url = this.contextHelper.closeUrl;\n      }\n\n      if (this.contextHelper.inMission) {\n        this.contextHelper.activeMission.customContents.forEach((item) => {\n          const entityId = item.belongsTo('entity').id();\n\n          if (entityId === this.id) {\n            // When following a link to a content that exists in the same mission\n            // we are already in we should not set return url, instead we should\n            // update the custom content id in query params. This way following\n            // the link will have the same behaviour as navigating in the mission.\n            queryParams.return_url = null;\n            queryParams.custom_content = item.id;\n          }\n        });\n      }\n\n      routeArgs.addObject({ queryParams });\n    }\n\n    return routeArgs;\n  }\n\n  get href() {\n    if (this.type === 'attachment') {\n      return '#';\n    } else if (this.type === 'node') {\n      return this.router.urlFor(...this.routeArgs);\n    }\n\n    return null;\n  }\n\n  @action\n  handleClick() {\n    switch (this.type) {\n      case 'attachment':\n      case 'link':\n        this.modalIsOpen = true;\n        break;\n      case 'node':\n        this.router.transitionTo(...this.routeArgs);\n        break;\n    }\n  }\n\n  @action\n  handleModalClose() {\n    this.modalIsOpen = false;\n  }\n\n  @action\n  handleBoxContinue() {\n    this.modalIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<TbRenderInline::Element::Enclose::A\\n  @variant=\\\"link\\\"\\n  @active={{this.modalIsOpen}}\\n  @href={{this.href}}\\n  @onClick={{this.handleClick}}\\n  data-test-tb-render-inline-link\\n>\\n  {{~yield~}}\\n\\n  {{#if (eq this.type \\\"link\\\")}}\\n    <DcIcon @name=\\\"external\\\" @size=\\\"xs\\\" />\\n  {{~/if~}}\\n</TbRenderInline::Element::Enclose::A>\\n\\n{{~#if this.modalIsOpen~}}\\n  <MaterialViewer\\n    @material={{@materialPromise}}\\n    @onClose={{this.handleModalClose}}\\n  />\\n{{~/if~}}', { moduleName: 'babel/components/tb-render-inline/element/enclose/link/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~#let (generate-id \\\"enclose\\\") as |id|~}}\\n  <span id={{id}}>\\n    {{~#if this.typeIsAllowed~}}\\n      {{#let (component this.componentName) as |Component|~}}\\n        <Component\\n          @node={{@node}}\\n          @material={{this.material}}\\n          @materialPromise={{this.materialPromise}}\\n          @parentElementId={{id}}\\n        >\\n          {{~yield~}}\\n        </Component>\\n      {{~/let~}}\\n    {{else if this.isCustomComponent}}\\n      {{~yield (hash customComponent=true node=@node parentElementId=id)~}}\\n    {{else}}\\n      {{~yield~}}\\n    {{/if~}}\\n  </span>\\n{{~/let~}}', { moduleName: 'babel/components/tb-render-inline/element/enclose/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class TbRenderInlineElementEncloseWordExplanationComponent extends Component {\n  /**\n   * Arguments:\n   * material (object)\n   * parentElementId (string)\n   */\n\n  @service contextHelper;\n\n  @service languages;\n\n  @tracked popoverIsOpen = false;\n\n  // Will be set in case word explanation is within a component with language specified.\n  @tracked parentComponentLanguage = null;\n\n  // Will be set in case word explanation is within an exercise with language specified.\n  @tracked exerciseLanguage = null;\n\n  get canSave() {\n    if (this.contextHelper.activeContent) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get text() {\n    return this.args.material?.metadata?.explanation;\n  }\n\n  get linkId() {\n    return [this.args.parentElementId, 'a'].join('-');\n  }\n\n  @action insertElement(elem) {\n    if (elem) {\n      // Find out if the component that the word explanation belongs to has a specific language set.\n      // We do that by simple searching the DOM upwards.\n      const parentComponentElement = elem.closest('[data-id]');\n      const parentComponentLanguage =\n        (parentComponentElement &&\n          parentComponentElement.getAttribute('data-language')) ||\n        null;\n      this.parentComponentLanguage = parentComponentLanguage;\n\n      // Then do the same thing for exercises, and in case a match is found we fetch the\n      // exercise language (if any) from the languages service.\n      const exerciseElement = elem.closest('.exercise-main');\n      const exerciseLanguage =\n        (exerciseElement && this.languages?.exerciseLanguage) || null;\n      this.exerciseLanguage = exerciseLanguage;\n    }\n  }\n\n  @action handleClick() {\n    this.popoverIsOpen = true;\n  }\n\n  @action handlePopoverClose() {\n    this.popoverIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<TbRenderInline::Element::Enclose::A\\n  id={{this.linkId}}\\n  @variant=\\\"word-explanation\\\"\\n  @active={{this.popoverIsOpen}}\\n  @onClick={{this.handleClick}}\\n  {{did-insert this.insertElement}}\\n>\\n  {{~yield~}}\\n</TbRenderInline::Element::Enclose::A>\\n\\n{{~#if this.popoverIsOpen~}}\\n\\n  <XPopup\\n    @for={{this.linkId}}\\n    @switchToDialogOnSmallBreakpoint={{false}}\\n    @onClose={{this.handlePopoverClose}}\\n  >\\n    <WordExplanationBox\\n      class=\\\"p1\\\"\\n      @word={{@material.name}}\\n      @wordClass={{@material.metadata.word_class}}\\n      @wordConstruction={{@material.metadata.word_formations}}\\n      @explanation={{@material.metadata.explanation}}\\n      @examples={{@material.metadata.examples}}\\n      @translation={{@material.metadata.translation}}\\n      @parentComponentLanguage={{this.parentComponentLanguage}}\\n      @exerciseLanguage={{this.exerciseLanguage}}\\n      @canSave={{this.canSave}}\\n    />\\n  </XPopup>\\n{{~/if~}}', { moduleName: 'babel/components/tb-render-inline/element/enclose/word-explanation/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class TbRenderInlineElementExtensionComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  get type() {\n    return this.args.node?.attributes?.findBy('key', 'data-type')?.value;\n  }\n\n  get componentName() {\n    return this.type ? `tb-render-inline/element/extension/${this.type}` : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.footnote}}\\n  <button\\n    data-footnote\\n    type=\\\"button\\\"\\n    id={{this.id}}\\n    class=\\\"tb-render-inline-element-extension-footnote\\\"\\n    {{on \\\"mousedown\\\" this.handleMouseDown}}\\n    {{on \\\"click\\\" this.handleClick}}\\n  >\\n    [{{this.index}}]\\n  </button>\\n{{/if}}\\n\", {\"contents\":\"{{#if this.footnote}}\\n  <button\\n    data-footnote\\n    type=\\\"button\\\"\\n    id={{this.id}}\\n    class=\\\"tb-render-inline-element-extension-footnote\\\"\\n    {{on \\\"mousedown\\\" this.handleMouseDown}}\\n    {{on \\\"click\\\" this.handleClick}}\\n  >\\n    [{{this.index}}]\\n  </button>\\n{{/if}}\\n\",\"moduleName\":\"babel/components/tb-render-inline/element/extension/footnote/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/tb-render-inline/element/extension/footnote/index.hbs\"}});\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class TbRenderInlineElementExtensionFootnoteComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  @service footnotes;\n\n  // PROPERTIES\n\n  get dataId() {\n    return this.args.node?.attributes.findBy('key', 'data-id')?.value;\n  }\n\n  get id() {\n    return ['footnote', this.dataId].join('-');\n  }\n\n  get footnote() {\n    return this.footnotes.getFootnote(this.dataId);\n  }\n\n  get index() {\n    return this.footnotes.getIndex(this.dataId);\n  }\n\n  // ACTIONS\n\n  @action handleMouseDown(evt) {\n    evt.preventDefault();\n  }\n\n  @action handleClick() {\n    const element = document.getElementById(this.dataId);\n\n    if (element) {\n      later(() => element.focus());\n    }\n  }\n}\n","import Component from '@glimmer/component';\n\nexport default class TbRenderInlineElementExtensionFormulaComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  get value() {\n    return this.args.node?.attributes?.findBy('key', 'data-value')?.value || '';\n  }\n\n  get content() {\n    return this.args.node?.children?.firstObject?.content;\n  }\n\n  get formula() {\n    const rawValue = this.value;\n    if (!rawValue) return this.content;\n    try {\n      return decodeURIComponent(rawValue);\n    } catch (e) {\n      return rawValue;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<span class=\\\"mathlive\\\" {{math-output this.formula}} />\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/extension/formula/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.componentName~}}\\n  {{#let (component this.componentName) as |ExtensionComponent|~}}\\n    <ExtensionComponent @node={{@node}}>{{yield}}</ExtensionComponent>\\n  {{~/let}}\\n{{~/if~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/extension/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<strong class=\\\"tb-render-inline-element-bold\\\">\\n  {{~yield~}}\\n</strong>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/bold/template.hbs' });\n","import Component from '@glimmer/component';\n\nconst TAG_NAME_TO_TYPE_MAPPING = {\n  b: 'bold',\n  i: 'italic',\n  strike: 'strike-through',\n  u: 'underline',\n  br: 'line-break',\n  sup: 'superscript',\n  sub: 'subscript',\n\n  // Legacy\n  em: 'italic',\n  strong: 'bold',\n\n  // Handle invalid\n  p: 'regular',\n  div: 'regular',\n  ul: 'regular',\n  ol: 'regular',\n  li: 'regular',\n};\n\nexport default class TbRenderInlineElementFormatComponent extends Component {\n  /**\n   * node (object)\n   */\n\n  get type() {\n    const node = this.args.node;\n\n    if (!node) return null;\n\n    const { attributes, tagName } = node;\n\n    if (tagName === 'span') {\n      const textColor = attributes.findBy('key', 'data-text-color');\n\n      if (textColor) {\n        return 'text-color';\n      }\n\n      return 'speech';\n    }\n\n    return TAG_NAME_TO_TYPE_MAPPING[tagName];\n  }\n\n  get componentName() {\n    return this.type ? `tb-render-inline/element/format/${this.type}` : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<i class=\\\"tb-render-inline-element-italic\\\">\\n  {{~yield~}}\\n</i>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/italic/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class TbRenderInlineElementFormatLineBreakComponent extends Component {\n  /**\n   * node (object)\n   */\n\n  @action onElementInsert(elem) {\n    if (this._isLineBreak(elem.previousSibling)) {\n      if (!this._isLineBreak(elem.nextSibling)) {\n        // Add --visible state to the last in any group of line breaks\n        elem.classList.add('tb-render-inline-element-line-break--visible');\n      }\n    }\n  }\n\n  _isLineBreak(elem) {\n    return (\n      elem &&\n      elem.nodeType === 1 &&\n      elem.classList.contains('tb-render-inline-element-line-break')\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<span\\n  class=\\\"tb-render-inline-element-line-break\\\"\\n  {{did-insert this.onElementInsert}}\\n/>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/line-break/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~yield~}}<br />{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/regular/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<span class=\\\"tb-render-inline-element-speech\\\">\\n  {{~yield~}}\\n</span>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/speech/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<s class=\\\"tb-render-inline-element-strike-through\\\">\\n  {{~yield~}}\\n</s>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/strike-through/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<sub class=\\\"tb-render-inline-element-subscript\\\">\\n  {{~yield~}}\\n</sub>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/subscript/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<sup class=\\\"tb-render-inline-element-superscript\\\">\\n  {{~yield~}}\\n</sup>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/superscript/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.componentName~}}\\n  {{#let (component this.componentName) as |FormatComponent|~}}\\n    <FormatComponent @node={{@node}}>\\n      {{~yield~}}\\n    </FormatComponent>\\n  {{~/let}}\\n{{~/if~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class TBRenderInlineElementFormatTextColorComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  get color() {\n    return this.args.node?.attributes?.findBy('key', 'data-text-color')?.value;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<span class=\\\"tb-render-inline-element-text-color--{{this.color}}\\\">\\n  {{~yield~}}\\n</span>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/text-color/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~trim~}}\\n\\n<u class=\\\"tb-render-inline-element-underline\\\">\\n  {{~yield~}}\\n</u>\\n\\n{{~trim~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/format/underline/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nconst SIZE_TO_IMAGE_SIZE = {\n  small: 30,\n  medium: 40,\n  large: 50,\n};\n\nexport default class TbRenderInlineElementImageComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n  @service store;\n\n  get imageId() {\n    return this.args.node?.attributes?.findBy('key', 'data-image')?.value;\n  }\n\n  get position() {\n    return this.args.node?.attributes?.findBy('key', 'data-position')?.value;\n  }\n\n  get size() {\n    return this.args.node?.attributes?.findBy('key', 'data-size')?.value;\n  }\n\n  get imageWidth() {\n    const maxDim = SIZE_TO_IMAGE_SIZE[this.size];\n\n    let imageWidth = this.image?.imageWidth ?? maxDim;\n    let imageHeight = this.image?.imageHeight ?? maxDim;\n\n    if (imageWidth > imageHeight) {\n      return maxDim;\n    } else {\n      return (imageWidth / imageHeight) * maxDim;\n    }\n  }\n\n  get imageWidthRounded() {\n    return Math.round(this.imageWidth);\n  }\n\n  get imageHeight() {\n    const maxDim = SIZE_TO_IMAGE_SIZE[this.size];\n\n    let imageWidth = this.image?.imageWidth ?? 0;\n    let imageHeight = this.image?.imageHeight ?? 0;\n\n    if (imageWidth > imageHeight) {\n      return (imageHeight / imageWidth) * maxDim;\n    } else {\n      return maxDim;\n    }\n  }\n\n  get imageHeightRounded() {\n    return Math.round(this.imageHeight);\n  }\n\n  get retinaImageWidth() {\n    return this.imageWidth * 2;\n  }\n\n  get retinaImageHeight() {\n    return this.imageHeight * 2;\n  }\n\n  get hasSpacer() {\n    return this.position === 'left' || this.position === 'right';\n  }\n\n  @cached\n  get imageProxy() {\n    let promise = resolve();\n\n    if (this.imageId) {\n      promise = this.store.findRecord('material', this.imageId);\n    }\n\n    return load(promise, this);\n  }\n\n  get image() {\n    return this.imageProxy.isResolved ? this.imageProxy.value : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"inline-image-container {{concat \\'inline-image-position-\\' this.position}}\\\"\\n  {{style-variable \\\"image-width\\\" (concat this.imageWidth \\\"px\\\")}}\\n  {{style-variable \\\"image-height\\\" (concat this.imageHeight \\\"px\\\")}}\\n  {{style-variable \\\"image-width-rounded\\\" (concat this.imageWidthRounded \\\"px\\\")}}\\n  {{style-variable \\\"image-height-rounded\\\" (concat this.imageHeightRounded \\\"px\\\")}}\\n>\\n  {{~trim~}}\\n  <span>\\n    {{~yield~}}\\n  </span>\\n\\n  {{~#if this.hasSpacer~}}\\n    <span>&nbsp;</span>\\n  {{~/if~}}\\n\\n  {{~#if this.image.imageUrl~}}\\n    <XImage\\n      class=\\\"inline-x-image\\\"\\n      @source={{image-source\\n        this.image.imageUrl\\n        preserve-transparency=true\\n        width=this.retinaImageWidth\\n        height=this.retinaImageHeight\\n      }}\\n      @width={{this.image.imageWidth}}\\n      @height={{this.image.imageHeight}}\\n      @mimetype={{this.image.imageMimetype}}\\n      @color=\\\"transparent\\\"\\n    />\\n  {{~/if~}}\\n</div>', { moduleName: 'babel/components/tb-render-inline/element/image/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~yield~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/stripped/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.componentName~}}\\n  {{#let (component this.componentName) as |InlineComponent|~}}\\n    <InlineComponent\\n      @node={{@node}}\\n      as |inline|\\n    >\\n      {{~#if inline.customComponent~}}\\n        {{~yield (hash\\n          customComponent=true\\n          node=inline.node\\n          parentElementId=inline.parentElementId\\n        )~}}\\n      {{~else~}}\\n        <TbRenderInline @nodes={{@node.children}} @stripTags={{@stripTags}}>\\n          {{~yield~}}\\n        </TbRenderInline>\\n      {{~/if~}}\\n    </InlineComponent>\\n  {{~/let~}}\\n{{/if~}}\\n', { moduleName: 'babel/components/tb-render-inline/element/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class TbRenderInlineIteratorComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  get pronounceValue() {\n    return this.args.node?.attributes?.findBy('key', 'data-pronounce')?.value;\n  }\n\n  get componentName() {\n    const type = this.args.node?.type || 'comment';\n    return type === 'comment' ? null : `tb-render-inline/${type}`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.componentName~}}\\n  {{#if this.pronounceValue~}}\\n    <span data-speaker-alt-text aria-label={{this.pronounceValue}}>\\n      {{~yield (hash component=this.componentName)~}}\\n      <span class=\\\"speaker-alt-text\\\">{{~this.pronounceValue~}}</span>\\n      {{~trim~}}\\n    </span>\\n  {{~else~}}\\n    {{yield (hash component=this.componentName)}}\\n  {{~/if}}\\n{{~/if~}}\\n', { moduleName: 'babel/components/tb-render-inline/iterator/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.nodes as |node|~}}\\n  <TbRenderInline::Iterator @node={{node}} as |iterator|>\\n    {{~#let (component iterator.component) as |NodeComponent|~}}\\n      <NodeComponent @node={{node}} @stripTags={{@stripTags}} as |component|>\\n        {{~#if component.customComponent~}}\\n          {{~yield\\n            (hash\\n              customComponent=true\\n              node=component.node\\n              parentElementId=component.parentElementId\\n            )\\n          ~}}\\n        {{~else~}}\\n          {{~yield~}}\\n        {{~/if~}}\\n      </NodeComponent>\\n    {{~/let~}}\\n  </TbRenderInline::Iterator>\\n{{~/each~}}', { moduleName: 'babel/components/tb-render-inline/template.hbs' });\n","import { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport { encode } from 'compton/utils/punctuation';\n\nexport default class TbRenderInlineTextComponent extends Component {\n  /**\n   * Arguments:\n   * node (object)\n   */\n\n  get content() {\n    return htmlSafe(\n      encode(\n        this.args.node?.content?.replace(/&lt;/g, '<')?.replace(/&gt;/g, '>')\n      )\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{~this.content~}}\\n', { moduleName: 'babel/components/tb-render-inline/text/template.hbs' });\n","import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class TbRenderWrapperComponent extends Component {\n  /**\n   * Arguments:\n   * editorId (string)\n   * model (object)\n   */\n\n  @cached get editorProxy() {\n    let promise = resolve();\n\n    if (this.args.model && this.args.editorId) {\n      promise = resolve(this.args.model.editors).then((editors) =>\n        editors?.findBy('id', this.args.editorId)\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get editor() {\n    return this.editorProxy.isResolved ? this.editorProxy.value : null;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAwait @value={{@model.editors}}>\\n  <TbRender @content={{this.editor}}/>\\n</XAwait>\\n', { moduleName: 'babel/components/tb-render-wrapper/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport { getOriginalAnswer } from 'babel/utils/get-answer';\n\nexport default class TbRenderAssignmentLinkComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @service router;\n\n  @service store;\n\n  @service contextHelper;\n\n  @service missionMode;\n\n  baseClass = 'tb-render-assignment-link';\n\n  asyncType = 'entity';\n\n  get asyncId() {\n    return this.args.part?.assignment_link_id;\n  }\n\n  get assignment() {\n    return this.asyncData;\n  }\n\n  get assignmentHasPossibleAnswer() {\n    return !['glossaries'].includes(this.assignment?.type);\n  }\n\n  get isExcluded() {\n    if (this.contextHelper.inMission) {\n      const includedEntities = this.missionMode.includedEntities;\n\n      if (includedEntities.length === 0) {\n        return false;\n      }\n\n      return !includedEntities.mapBy('id').includes(this.asyncId);\n    }\n\n    return false;\n  }\n\n  get answer() {\n    if (!this.assignment) return null;\n    return getOriginalAnswer(this.assignment, this.store.peekAll('answer'));\n  }\n\n  get status() {\n    return this.answer?.computedStatus || 'not-started';\n  }\n\n  get routeName() {\n    switch (this.assignment?.type) {\n      case 'assignments':\n      case 'exercises':\n      case 'studies':\n        return 'master.contents.assignments.show';\n      case 'glossaries':\n        return 'master.contents.wordlists.show';\n      default:\n        return null;\n    }\n  }\n\n  @action openLink() {\n    if (this.routeName && this.assignment?.id) {\n      this.router.transitionTo(this.routeName, this.assignment.id).then(() => {\n        const elem = document.querySelector('.content-workspace-aside-content');\n\n        if (elem) {\n          elem.scrollTo(0, 0);\n        }\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"{{this.classes}}\\\" ...attributes>\\n  {{#if this.isExcluded}}\\n    <XAlert @variant=\\\"error\\\">\\n      {{t \\\"components.tbRender.assignmentLink.excludedAlertMessage\\\"}}\\n    </XAlert>\\n  {{else}}\\n    <DcCard as |Card|>\\n      <Card.content class=\\\"assignment-link-card\\\">\\n        <UiButton\\n          @appearance=\\\"link\\\"\\n          @onClick={{this.openLink}}\\n          @width=\\\"expand\\\"\\n          class=\\\"text-ui\\\"\\n        >\\n          <span class=\\\"assignment-link-card-button-content\\\">\\n            {{~#if this.assignmentHasPossibleAnswer}}\\n              <AnswerStatusIcon\\n                @status={{this.status}}\\n                class=\\\"assignment-link-answer-status\\\"\\n              />\\n            {{~/if}}\\n            {{~or this.assignment.title (singularize this.assignment.type)}}\\n          </span>\\n\\n          <DcIcon @name=\\\"workspace\\\" class=\\\"flex-right\\\" />\\n        </UiButton>\\n      </Card.content>\\n    </DcCard>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/tb-render/assignment-link/template.hbs' });\n","import { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderAttachmentComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-attachment';\n\n  asyncType = 'material';\n\n  @tracked materialViewerIsOpen = false;\n\n  get asyncId() {\n    return this.args.part?.material_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n\n  get materialPromise() {\n    return this.store.findRecord('material', this.asyncId);\n  }\n\n  get title() {\n    return this.args.part?.title || this.material?.name;\n  }\n\n  get description() {\n    return this.args.part?.description;\n  }\n\n  @action openMaterialViewer() {\n    this.materialViewerIsOpen = true;\n  }\n\n  @action closeMaterialViewer() {\n    this.materialViewerIsOpen = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  <UiButton\\n    @appearance=\\\"none\\\"\\n    @onClick={{this.openMaterialViewer}}\\n    class=\\\"tb-render-attachment-card\\\"\\n  >\\n    <div class=\\\"flex-auto\\\">\\n      <div\\n        data-test-tb-render-attachment-title\\n        class=\\\"tb-render-attachment-title\\\"\\n      >\\n        {{~this.title~}}\\n      </div>\\n\\n      {{#if this.description}}\\n        <div\\n          data-test-tb-render-attachment-description\\n          class=\\\"tb-render-attachment-description\\\"\\n        >\\n          {{~this.description~}}\\n        </div>\\n      {{/if}}\\n    </div>\\n\\n    <div class=\\\"tb-render-attachment-icon\\\">\\n      <span data-speaker-alt-text>\\n        <div class=\\\"tb-render-attachment-icon-label\\\">\\n          {{t \\\"components.tbRender.attachment.download\\\"}}\\n        </div>\\n        <span class=\\\"speaker-alt-text\\\"></span>\\n      </span>\\n\\n      <DcIcon @name=\\\"cloud-download\\\" />\\n    </div>\\n  </UiButton>\\n</div>\\n\\n{{#if this.materialViewerIsOpen}}\\n  <MaterialViewer\\n    @material={{this.materialPromise}}\\n    @onClose={{this.closeMaterialViewer}}\\n  />\\n{{/if}}\\n', { moduleName: 'babel/components/tb-render/attachment/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderAudioComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @service speaker;\n\n  baseClass = 'tb-render-audio';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return this.args.part?.media_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n\n  get showLabel() {\n    return this.args.part?.appearance === 'label';\n  }\n\n  @action\n  handleAudioPlayButtonClick() {\n    this.speaker.pauseOther();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  <div class=\\\"tb-render-audio-card\\\">\\n    <XAudio\\n      @source={{this.material.meta.attachment_url}}\\n      @label={{@part.label}}\\n      @showTime={{@part.show_time}}\\n      @showLabel={{@part.show_label}}\\n      @showProgress={{@part.show_progress}}\\n      @onPlayButtonClick={{this.handleAudioPlayButtonClick}}\\n      @canSpeedUp={{this.material.metadata.can_speed_up}}\\n      @canSlowDown={{this.material.metadata.can_slow_down}}\\n    />\\n  </div>\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption class=\\\"tb-render-audio-caption\\\" @language={{@language}}>\\n      {{~yield (hash value=@part.value)~}}\\n    </TbRender::Caption>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/tb-render/audio/template.hbs' });\n","import { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport getSettingClassesForPart from 'babel/utils/get-setting-classes-for-part';\nimport loadDataFromStore from 'babel/utils/load-data-from-store';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class TbRenderBlockComponent extends Component {\n  @service store;\n\n  get classes() {\n    const classes = getSettingClassesForPart(this.baseClass, this.args.part);\n\n    if (this.extraClasses) {\n      classes.push(...this.extraClasses);\n    }\n\n    return classes.join(' ');\n  }\n\n  @cached get asyncProxy() {\n    const promise = this.asyncId\n      ? loadDataFromStore(this.asyncType, this.asyncId, this.store)\n      : resolve();\n\n    return load(promise, this);\n  }\n\n  get asyncData() {\n    return this.asyncProxy.isResolved ? this.asyncProxy.value : null;\n  }\n}\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderCanvasComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   * editor (object)\n   * canvasUser (object)\n   */\n\n  baseClass = 'tb-render-canvas';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return this.args.part?.media_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n\\n  {{#if this.material}}\\n    <CanvasPresentorWrapper\\n      @material={{this.material}}\\n      @editor={{@editor}}\\n      @user={{@canvasUser}}\\n    />\\n  {{/if}}\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption\\n      class=\\\"tb-render-canvas-caption\\\"\\n      @language={{@language}}\\n    >{{yield (hash value=@part.value)}}</TbRender::Caption>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/canvas/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"tb-render-caption\\\"\\n  data-language={{@language}}\\n  ...attributes>{{yield}}</div>\\n', { moduleName: 'babel/components/tb-render/caption/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderCodeComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-code';\n\n  theme = 'dracula';\n\n  get extraClasses() {\n    return [[this.baseClass, this.theme].join('--')];\n  }\n\n  get lineNumbers() {\n    return this.args.part?.settings?.line_numbers;\n  }\n\n  get mode() {\n    return this.args.part?.settings?.language;\n  }\n\n  get showCaption() {\n    return this.args.part?.settings?.show_caption;\n  }\n\n  get viewportMargin() {\n    return Infinity;\n  }\n\n  get value() {\n    return this.args.part?.value;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"{{this.classes}}\\\" ...attributes>\\n  <div\\n    {{code-mirror\\n      id=(generate-id \\\"codemirror\\\")\\n      value=this.value\\n      lineNumbers=this.lineNumbers\\n      matchTags=true\\n      mode=this.mode\\n      readOnly=true\\n      smartIndent=false\\n      styleActiveLine=true\\n      tabSize=2\\n      viewportMargin=this.viewportMargin\\n    }}\\n  />\\n\\n  {{#if (and this.showCaption @part.caption)}}\\n    <TbRender::Caption\\n      class=\\\"tb-render-code-caption\\\"\\n      @language={{@language}}\\n    >{{yield (hash value=@part.caption)}}</TbRender::Caption>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/code/template.hbs' });\n","import Component from '@glimmer/component';\nimport Part from 'babel/utils/part';\n\nconst ALLOWED_COMPONENTS = [\n  'assignment_link',\n  'attachment',\n  'audio',\n  'code',\n  'embed',\n  'gallery',\n  'heading',\n  'image',\n  'divider',\n  'list',\n  'paragraph',\n  'table',\n  'video',\n  'canvas',\n  'interactive_image',\n  'placeholder',\n  'ilt-video',\n  'tag',\n];\n\nexport default class TbRenderColumnComponent extends Component {\n  /**\n   * Arguments:\n   * column (object)\n   */\n\n  get groups() {\n    const components = this.args.column?.components?.sortBy('index') || [];\n    const groups = [];\n\n    components.forEach((component) => {\n      const part = new Part(component);\n\n      if (!ALLOWED_COMPONENTS.includes(part.component)) return;\n\n      const templateDisjoin = part.settings?.template_disjoin ? true : false;\n      const prevGroup = groups.objectAt(groups.length - 1);\n\n      if (\n        prevGroup &&\n        part.template === prevGroup.template &&\n        !templateDisjoin\n      ) {\n        prevGroup.parts.addObject(part);\n      } else {\n        groups.addObject({\n          template: part.template,\n          parts: [part],\n        });\n      }\n    });\n\n    return groups;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"tb-render-column tb-render-column--{{@area}}\\\">\\n  {{#each this.groups as |group|}}\\n    {{yield (hash group=group)}}\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/column/template.hbs' });\n","import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class TbRenderComponent extends Component {\n  /**\n   * Arguments:\n   * content (object)\n   * canvasUser (object)\n   */\n\n  @cached\n  get contentProxy() {\n    return load(resolve(this.args.content), this);\n  }\n\n  get content() {\n    return this.contentProxy.isResolved ? this.contentProxy.value : null;\n  }\n\n  get sortedRows() {\n    return this.content?.rows?.sortBy('index');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (eq @part.settings.type \\\"line_break\\\")}}\\n  <br />\\n{{else}}\\n  {{#let (dasherize (or @part.settings.type \\\"line\\\")) as |type|}}\\n    <div class=\\\"tb-render-divider tb-render-divider--type-{{type}}\\\">\\n      <hr class=\\\"tb-render-divider-line\\\" />\\n    </div>\\n  {{/let}}\\n{{/if}}\", {\"contents\":\"{{#if (eq @part.settings.type \\\"line_break\\\")}}\\n  <br />\\n{{else}}\\n  {{#let (dasherize (or @part.settings.type \\\"line\\\")) as |type|}}\\n    <div class=\\\"tb-render-divider tb-render-divider--type-{{type}}\\\">\\n      <hr class=\\\"tb-render-divider-line\\\" />\\n    </div>\\n  {{/let}}\\n{{/if}}\",\"moduleName\":\"babel/components/tb-render/divider/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/tb-render/divider/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport combineStyle from 'compton/utils/combine-style';\n\nexport default class TbRenderEmbedComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-embed';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return this.args.part?.embed_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n\n  get extraClasses() {\n    return [[this.baseClass, this.material?.type].join('--')];\n  }\n\n  get aspectRatio() {\n    const height = this.material?.metadata?.height;\n    const width = this.material?.metadata?.width;\n\n    if (isNaN(height) || isNaN(width)) return 56.25;\n\n    return (height / width) * 100;\n  }\n\n  get wrapperStyle() {\n    return combineStyle({ paddingTop: this.aspectRatio + '%' });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  <div\\n    class=\\\"tb-render-embed-wrapper\\\"\\n    style={{this.wrapperStyle}}\\n  >\\n    <iframe\\n      title={{this.material.name}}\\n      allowfullscreen\\n      frameborder=\\\"0\\\"\\n      src={{this.material.metadata.url}}\\n    />\\n  </div>\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption\\n      class=\\\"tb-render-embed-caption\\\"\\n      @language={{@language}}\\n    >{{yield (hash value=@part.value)}}</TbRender::Caption>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/embed/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport Poller from 'babel/utils/Poller';\nimport DigilarSpeakerType from 'babel/utils/speaker/DigilarSpeakerType';\n\nexport default class EncourageListeningBubbleComponent extends Component {\n  /**\n   * Arguments:\n   * element (object)\n   */\n\n  @service speaker;\n\n  @tracked isPlaying = false;\n\n  speakerAdapter = null;\n\n  isBlockSelected = false;\n\n  shouldDisableOnEnd = false;\n\n  statePoller = null;\n\n  speakerBlockDataAttribute = '[data-speaker-text-id]';\n\n  constructor() {\n    super(...arguments);\n    this.speaker.digilarRecordedSpeechEnabled = true;\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.handleStopEvent();\n  }\n\n  @action toggleListening() {\n    this.speaker.encourageListeningEnabled = true;\n    this.speaker.digilarRecordedSpeechEnabled = true;\n\n    // If speaker was not active it should be inactive after reading\n    if (!this.isBlockSelected) {\n      this.shouldDisableOnEnd = !this.speaker.active;\n    }\n\n    if (!this.speakerAdapter) {\n      this.speaker.setSpeakerActive(true);\n    }\n\n    const poller = new Poller();\n    poller.setInterval(100);\n\n    poller.start(this, function () {\n      this.speakerAdapter = this.getSpeakerAdapter(this.args.element);\n      if (this.speakerAdapter?._speaker) {\n        this.speakerAdapter.on('play', this.handlePlayEvent);\n        this.speakerAdapter.on('stop', this.handleStopEvent);\n\n        this.startSpeaker(this.speakerAdapter);\n        this.pollState(this.speakerAdapter);\n\n        poller.stop();\n      }\n    });\n  }\n\n  @action handleStopEvent() {\n    this.speaker.encourageListeningEnabled = false;\n    this.isPlaying = false;\n    this.statePoller?.stop();\n  }\n\n  @action handlePlayEvent(event) {\n    if (this.isBlockSelected) {\n      if (\n        !this.isInsideBubble(this.speakerAdapter) &&\n        !this.isMultipart(event)\n      ) {\n        this.isBlockSelected = false;\n        this.speaker.encourageListeningEnabled = false;\n\n        if (!event.isUserTriggered) {\n          this.speakerAdapter.stop();\n\n          if (this.shouldDisableOnEnd) {\n            this.speaker.setSpeakerActive(false);\n          }\n        }\n\n        this.speakerAdapter = null;\n        this.statePoller?.stop();\n        this.isPlaying = false;\n      } else {\n        this.isPlaying = this.speakerAdapter.isPlaying();\n      }\n    }\n  }\n\n  isMultipart(event) {\n    return event.recordedSpeechPartIndex > 0;\n  }\n\n  getSpeakerAdapter(element) {\n    if (!element) {\n      return;\n    }\n\n    const firstSpeakerElement = element?.querySelector(\n      this.speakerBlockDataAttribute\n    );\n\n    const speakerTextId = firstSpeakerElement?.dataset?.speakerTextId;\n    const contexts = this.speaker.getRegisteredSpeakerContexts();\n\n    return this.getSpeakerAdapterForSpeakerTextId(speakerTextId, contexts);\n  }\n\n  getSpeakerAdapterForSpeakerTextId(speakerTextId, contexts) {\n    let speakerAdapter;\n\n    for (const type of Object.values(DigilarSpeakerType)) {\n      contexts.map((ctx) => {\n        const context = ctx._speakerSandboxes[\n          type\n        ]?.speakerAdapter?._audioSources.filter((source) => {\n          return source._originalConfig.id === speakerTextId;\n        });\n        if (context.length) {\n          speakerAdapter = ctx?._speakerSandboxes[type]?.speakerAdapter;\n        }\n      });\n    }\n\n    return speakerAdapter;\n  }\n\n  getIncludesTextIndexes(speakerAdapter) {\n    const allElements = [\n      ...this.args.element?.querySelectorAll(this.speakerBlockDataAttribute),\n    ];\n\n    return allElements?.map((el) => {\n      return speakerAdapter._audioSources?.findIndex((source) => {\n        return el?.dataset?.speakerTextId === source._originalConfig.id\n      });\n    });\n  }\n\n  isInsideBubble(speakerAdapter) {\n    const includedTextIndexes = this.getIncludesTextIndexes(speakerAdapter);\n\n    const currentAudioSource = speakerAdapter.getCurrentAudioSource();\n\n    return (\n      currentAudioSource &&\n      includedTextIndexes.includes(currentAudioSource.audioSourceIndex)\n    );\n  }\n\n  pollState(speakerAdapter) {\n    this.statePoller = new Poller();\n    this.statePoller.setInterval(200);\n    this.statePoller.start(this, function () {\n      this.isPlaying = speakerAdapter?.isPlaying();\n    });\n  }\n\n  startSpeaker(speakerAdapter) {\n    if (this.isPlaying) {\n      this.isPlaying = false;\n      speakerAdapter.pause();\n    } else {\n      const includedTextIndexes = this.getIncludesTextIndexes(speakerAdapter);\n\n      // Select first block in row\n      if (!this.isBlockSelected) {\n        speakerAdapter.select(includedTextIndexes[0], false);\n        this.isBlockSelected = true;\n      }\n\n      // Play\n      speakerAdapter.play({\n        autoLoad: false,\n        autoPlayWhenLoaded: true,\n        isUserTriggered: true,\n        playNextOnError: true,\n      });\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DcEncourageListeningBubble\\n  @onClick={{this.toggleListening}}\\n  @isPlaying={{this.isPlaying}}\\n  ...attributes\\n>\\n  <:label>\\n    {{yield}}\\n  </:label>\\n</DcEncourageListeningBubble>\\n\\n', { moduleName: 'babel/components/tb-render/encourage-listening-bubble/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport getResizedImageDimensions from 'babel/utils/image-dimensions';\n\nexport default class TbRenderGalleryComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @service store;\n\n  @tracked imageViewerIsOpen = false;\n\n  @tracked _selectedImage;\n\n  @tracked element;\n\n  @tracked fullscreen;\n\n  baseClass = 'tb-render-gallery';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return (this.args.part?.value || []).sortBy('index').mapBy('media_id');\n  }\n\n  get images() {\n    return this.asyncData || [];\n  }\n\n  get selectedImage() {\n    if (this._selectedImage) {\n      return this._selectedImage;\n    }\n\n    return this.comparableImages?.firstObject;\n  }\n\n  get selectedImageIndex() {\n    return (this.comparableImages || [])\n      .mapBy('id')\n      .indexOf(this.selectedImage?.id);\n  }\n\n  get captions() {\n    const values = this.args.part?.value;\n\n    if (!values) return null;\n\n    return values.mapBy('value');\n  }\n\n  get currentCaption() {\n    const index = this.selectedImageIndex;\n\n    if (!this.captions || !this.captions[index]) return null;\n\n    return this.captions[index];\n  }\n\n  get imageViewerImages() {\n    const values = this.args.part?.value || [];\n\n    return this.images.map((material, index) => {\n      const caption = !values[index] ? null : values[index].value;\n\n      return {\n        caption,\n        source: material.imageUrl,\n        width: material.imageWidth,\n        height: material.imageHeight,\n        color: material.imageColor,\n        mimetype: material.imageMimetype,\n        copyright: material.metadata?.copyright,\n      };\n    });\n  }\n\n  get comparableImages() {\n    return this.images.map((material) => ({\n      imageURL: material.imageUrl,\n      width: material.imageWidth,\n      height: material.imageHeight,\n      color: material.imageColor,\n      mimetype: material.imageMimetype,\n      id: material.id,\n    }));\n  }\n\n  get previousImage() {\n    if (this.selectedImageIndex > 0) {\n      return this.comparableImages[this.selectedImageIndex - 1];\n    }\n\n    return null;\n  }\n\n  get nextImage() {\n    if (this.selectedImageIndex < this.comparableImages.length) {\n      return this.comparableImages[this.selectedImageIndex + 1];\n    }\n\n    return null;\n  }\n\n  get behaviour() {\n    return this.args.part?.settings?.behaviour\n      ? this.args.part?.settings?.behaviour\n      : 'enlarge';\n  }\n\n  get isFullscreen() {\n    return document.fullscreenElement || document.webkitFullscreenElement\n      ? true\n      : false;\n  }\n\n  get fullscreenIcon() {\n    if (this.behaviour === 'enlarge') {\n      return 'expand';\n    } else if (this.fullscreen) {\n      return 'simple-remove';\n    } else {\n      return 'fullscreen';\n    }\n  }\n\n  get isFullscreenAvailable() {\n    return Boolean(\n      document.documentElement.requestFullscreen ||\n        document.documentElement.webkitRequestFullscreen\n    );\n  }\n\n  get resizedImageDimensions() {\n    return getResizedImageDimensions({\n      width: this.selectedImage?.width,\n      height: this.selectedImage?.height,\n    });\n  }\n\n  get resizedImageWidth() {\n    return this.resizedImageDimensions.width;\n  }\n\n  get resizedImageHeight() {\n    return this.resizedImageDimensions.height;\n  }\n\n  @action\n  handlePreviousButtonClick() {\n    const previousImage = this.previousImage;\n\n    if (previousImage) {\n      this._selectedImage = previousImage;\n    }\n  }\n\n  @action\n  handleNextButtonClick() {\n    const nextImage = this.nextImage;\n\n    if (nextImage) {\n      this._selectedImage = nextImage;\n    }\n  }\n\n  @action\n  handleImageSelectImage(image) {\n    this._selectedImage = image;\n  }\n\n  @action\n  handleFullscreenButtonClick() {\n    if (this.behaviour === 'enlarge') {\n      this.imageViewerIsOpen = true;\n    } else if (this.behaviour === 'fullscreen') {\n      if (!this.isFullscreen) {\n        this.element.requestFullscreen\n          ? this.element.requestFullscreen()\n          : this.element.webkitRequestFullscreen?.();\n      } else {\n        document.exitFullscreen\n          ? document.exitFullscreen()\n          : document.webkitExitFullscreen?.();\n      }\n    }\n  }\n\n  @action\n  handleImageViewerClose() {\n    this.imageViewerIsOpen = false;\n  }\n\n  @action\n  setElement(elem) {\n    elem.addEventListener('fullscreenchange', this.toggleFullscreen);\n    elem.addEventListener('webkitfullscreenchange', this.toggleFullscreen);\n    this.element = elem;\n  }\n\n  @action\n  toggleFullscreen() {\n    this.fullscreen = this.isFullscreen;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div\\n  class=\\\"{{if this.fullscreen \\'tb-render-gallery--fullscreen-active\\'}}\\n    {{this.classes}}\\\"\\n  data-footnote-ids={{this.dataFootnoteIds}}\\n  ...attributes\\n  {{did-insert this.setElement}}\\n>\\n  {{#if this.images}}\\n    <div class=\\\"tb-render-gallery-current\\\">\\n      {{#if (and this.isFullscreenAvailable (not (eq this.behaviour \\\"static\\\")))}}\\n        {{#let (generate-id \\\"fullscreen-button\\\") as |id|}}\\n          <UiButton\\n            @id={{id}}\\n            @appearance=\\\"none\\\"\\n            @ariaLabel=\\\"Enter fullscreen\\\"\\n            @onClick={{this.handleFullscreenButtonClick}}\\n            class=\\\"tb-render-gallery-fullscreen-button\\\"\\n          >\\n            <DcIcon @name={{this.fullscreenIcon}} />\\n          </UiButton>\\n\\n          <XTooltip @for={{id}} @delay={{500}}>\\n            {{t \\\"components.tbRender.gallery.fullscreen\\\"}}\\n          </XTooltip>\\n        {{/let}}\\n      {{/if}}\\n\\n      <div class=\\\"tb-render-gallery-slide\\\">\\n        {{#if this.previousImage}}\\n          {{#let (generate-id \\\"previous-button\\\") as |id|}}\\n            <UiButton\\n              @id={{id}}\\n              @ariaLabel={{t \\\"components.tbRender.gallery.prev\\\"}}\\n              @appearance=\\\"none\\\"\\n              @onClick={{this.handlePreviousButtonClick}}\\n              class=\\\"tb-render-gallery-previous-button\\\"\\n            >\\n              <DcIcon @name=\\\"tail-left\\\" />\\n            </UiButton>\\n\\n            <XTooltip @for={{id}} @delay={{500}}>\\n              {{t \\\"components.tbRender.gallery.prev\\\"}}\\n            </XTooltip>\\n          {{/let}}\\n        {{/if}}\\n\\n        {{#if this.nextImage}}\\n          {{#let (generate-id \\\"next-button\\\") as |id|}}\\n            <UiButton\\n              @id={{id}}\\n              @appearance=\\\"none\\\"\\n              @ariaLabel={{t \\\"components.tbRender.gallery.next\\\"}}\\n              @onClick={{this.handleNextButtonClick}}\\n              class=\\\"tb-render-gallery-next-button\\\"\\n            >\\n              <DcIcon @name=\\\"tail-right\\\" />\\n            </UiButton>\\n\\n            <XTooltip @for={{id}} @delay={{500}}>\\n              {{t \\\"components.tbRender.gallery.next\\\"}}\\n            </XTooltip>\\n          {{/let}}\\n        {{/if}}\\n        <XImage\\n          class=\\\"tb-render-gallery-preview-image\\\"\\n          @source={{\\n            image-source\\n            this.selectedImage.imageURL\\n            width=this.resizedImageWidth\\n            height=this.resizedImageHeight\\n          }}\\n          @width={{this.selectedImage.imageWidth}}\\n          @height={{this.selectedImage.imageHeight}}\\n          @color={{this.selectedImage.imageColor}}\\n          @alt={{this.selectedImage.name}}\\n          @mimetype={{this.selectedImage.imageMimetype}}\\n        />\\n      </div>\\n    </div>\\n\\n    <div class=\\\"tb-render-gallery-content\\\">\\n      <div class=\\\"text-separator tb-render-gallery-index\\\">\\n        {{t \\\"components.tbRender.gallery.indexLabel\\\"}}\\n        {{increment this.selectedImageIndex}}\\n        {{t \\\"components.tbRender.gallery.indexOf\\\"}}\\n        {{this.images.length}}\\n      </div>\\n\\n      {{#if this.currentCaption}}\\n        <div class=\\\"tb-render-gallery-caption\\\">\\n          {{yield (hash value=this.currentCaption)}}\\n        </div>\\n      {{/if}}\\n\\n      {{#each this.captions as |caption|}}\\n        <div class=\\\"tb-render-gallery-caption--invisible\\\">\\n          {{yield (hash value=caption)}}\\n        </div>\\n      {{/each}}\\n    </div>\\n\\n    {{#if this.imageViewerIsOpen}}\\n      <XImageViewer\\n        @images={{this.imageViewerImages}}\\n        @index={{this.selectedImageIndex}}\\n        @onClose={{this.handleImageViewerClose}}\\n        as |caption|\\n      >\\n        {{yield (hash value=caption)}}\\n      </XImageViewer>\\n    {{/if}}\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/gallery/template.hbs' });\n","import { dasherize } from '@ember/string';\nimport Component from '@glimmer/component';\n\nconst FILES = [\n  { template: 'conclusion', src: '/assets/images/tb-render/conclusion.svg' },\n  { template: 'example', src: '/assets/images/tb-render/example.svg' },\n  { template: 'fact', src: '/assets/images/tb-render/fact.svg' },\n  { template: 'important', src: '/assets/images/tb-render/important.svg' },\n  { template: 'instruction', src: '/assets/images/tb-render/instruction.svg' },\n  {\n    template: 'introduction',\n    src: '/assets/images/tb-render/introduction.svg',\n  },\n  { template: 'quote', src: '/assets/images/tb-render/quote.svg' },\n  {\n    template: 'recommendation',\n    src: '/assets/images/tb-render/recommendation.svg',\n  },\n  { template: 'discussion', src: '/assets/images/tb-render/discussion.svg' },\n  { template: 'tool', src: '/assets/images/tb-render/tools.svg' },\n  { template: 'laboration', src: '/assets/images/tb-render/lab.svg' },\n];\n\nexport default class TbRenderGroupComponent extends Component {\n  /**\n   * Arguments:\n   * template (string)\n   */\n\n  baseClass = 'tb-render-group';\n\n  get imgSrc() {\n    const file = FILES.findBy('template', this.args.template);\n\n    if (!file) return null;\n\n    return file.src;\n  }\n\n  get templateClass() {\n    return `tb-render-template--${dasherize(this.args.template ?? 'standard')}`;\n  }\n\n  get legacyTemplateClass() {\n    return [this.baseClass, this.args.template].join('--');\n  }\n\n  get classes() {\n    const classes = [this.baseClass];\n\n    classes.push(this.templateClass);\n    // Re-add old template class to fix regression DINO-5280 (caused by DINO-4901).\n    // TODO: Correct fix is replacing 'tb-render-group--' with 'to-render-template--' in CSS (deemed too error-prone for now).\n    classes.push(this.legacyTemplateClass);\n\n    if (this.imgSrc) {\n      classes.push(`${this.baseClass}--has-icon`);\n    }\n\n    return classes.join(' ');\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}}>\\n  {{#if this.imgSrc}}\\n    <div class=\\\"tb-render-group-icon\\\">\\n      <img alt=\\\"\\\" role=\\\"presentation\\\" src={{this.imgSrc}}>\\n    </div>\\n  {{/if}}\\n\\n  <div class=\\\"tb-render-group-content\\\">{{yield}}</div>\\n</div>\\n', { moduleName: 'babel/components/tb-render/group/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderHeadingComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-heading';\n\n  get extraClasses() {\n    const part = this.args.part;\n    const classes = [];\n\n    if (part?.settings?.alignment) {\n      classes.push(`${this.baseClass}--${part.settings.alignment}`);\n    }\n\n    return classes;\n  }\n\n  get size() {\n    return this.args.part?.settings?.size;\n  }\n\n  get isH3() {\n    return this.size === 'large';\n  }\n\n  get isH4() {\n    return this.size === 'medium';\n  }\n\n  get isH5() {\n    return this.size === 'small';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.isH3}}\\n  <h3 class={{this.classes}} ...attributes>{{yield (hash value=@part.value)}}</h3>\\n{{else if this.isH4}}\\n  <h4 class={{this.classes}} ...attributes>{{yield (hash value=@part.value)}}</h4>\\n{{else if this.isH5}}\\n  <h5 class={{this.classes}} ...attributes>{{yield (hash value=@part.value)}}</h5>\\n{{/if}}\\n', { moduleName: 'babel/components/tb-render/heading/template.hbs' });\n","import { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport { storageFor } from 'ember-local-storage';\nimport { service } from '@ember/service';\n\nexport default class TbRenderIltVideoComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @storageFor('read-setting') settings;\n\n  @tracked baseClass = 'tb-render-ilt-video hidden';\n\n  @tracked videoLoaded = false;\n\n  asyncType = 'material';\n\n  @service(\"video\") videoService;\n\n  get asyncId() {\n    return this.args.part?.video_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n\n  get showPlaceholder() {\n    return (\n      this.videoLoaded &&\n      this.settings.get('onlytext') &&\n      !this.args.part.mediaForced\n    );\n  }\n\n  @action\n  handleVideoReady() {\n    this.baseClass = 'tb-render-ilt-video';\n    this.videoLoaded = true;\n  }\n\n  @action\n  handleVideoClick(event) {\n    \n    const videoContainer = event.target.closest('.ilt-video');\n    \n    if (!videoContainer) {\n      return;\n    }\n\n    const videoElement = videoContainer.querySelector('video');\n   \n    if (!videoElement) {\n      return;\n    }\n\n    if (!videoElement.paused) {\n      this.videoService.pauseOtherVideos(videoElement.id);\n    }\n  }\n\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.showPlaceholder}}\\n  <TbRender::Placeholder @part={{@part}} />\\n{{else}}\\n  <div\\n    class={{this.classes}}\\n    data-test-tb-render-ilt-video\\n    ...attributes\\n  >\\n    <DcIltVideoPlayer\\n      @videoId={{this.material.metadata.video_id}}\\n      @onVideoReady={{this.handleVideoReady}}\\n      onclick={{this.handleVideoClick}}\\n    />\\n\\n    {{#if (and @part.settings.show_caption @part.caption)}}\\n      <TbRender::Caption\\n        class=\\\"tb-render-video-caption\\\"\\n        @language={{@language}}\\n      >{{yield (hash value=@part.caption)}}</TbRender::Caption>\\n    {{/if}}\\n  </div>\\n{{/if}}\\n', { moduleName: 'babel/components/tb-render/ilt-video/template.hbs' });\n","import { action } from '@ember/object';\nimport { dasherize } from '@ember/string';\nimport { htmlSafe } from '@ember/template';\nimport { tracked } from '@glimmer/tracking';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport getResizedImageDimensions from 'babel/utils/image-dimensions';\n\nexport default class TbRenderImageComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @tracked isMaterialViewerOpen = false;\n\n  @tracked element;\n\n  @tracked fullscreen;\n\n  @tracked backgroundColor;\n\n  @tracked imageWidth = 0;\n\n  baseClass = 'tb-render-image';\n\n  asyncType = 'material';\n\n  get size() {\n    return this.args.part?.settings?.size || '';\n  }\n\n  get extraClasses() {\n    const classes = [];\n\n    classes.push([this.baseClass, dasherize(this.size)].join('--'));\n\n    if (this.isMaterialViewerOpen) {\n      classes.push(`${this.baseClass}--image-viewer-open`);\n    }\n\n    if (this.material?.noShadow) {\n      classes.push(`${this.baseClass}--no-shadow`);\n    }\n\n    if (this.fullscreen) {\n      classes.push(`${this.baseClass}--fullscreen-active`);\n    }\n\n    if (this.behaviour !== 'enlarge') {\n      classes.push(`${this.baseClass}--no-enlarge`);\n    }\n\n    return classes;\n  }\n\n  get asyncId() {\n    return this.args.part?.media_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n\n  get alt() {\n    return this.material?.metadata?.alt_text || this.material?.name || '';\n  }\n\n  get preferredSize() {\n    return this.args.part?.settings?.preferred_size;\n  }\n\n  get behaviour() {\n    return this.args.part?.settings?.behaviour\n      ? this.args.part?.settings?.behaviour\n      : 'enlarge';\n  }\n\n  get preferredSizeStyle() {\n    if (!this.preferredSize) return null;\n    return htmlSafe(`--preferred-size: ${this.preferredSize}px`);\n  }\n\n  get fullscreenIcon() {\n    return this.fullscreen ? 'simple-remove' : 'fullscreen';\n  }\n\n  get resizedImageDimensions() {\n    return getResizedImageDimensions({\n      width: this.material?.imageWidth,\n      height: this.material?.imageHeight,\n    });\n  }\n\n  get resizedImageWidth() {\n    return this.resizedImageDimensions.width;\n  }\n\n  get resizedImageHeight() {\n    return this.resizedImageDimensions.height;\n  }\n\n  get isFullscreen() {\n    return document.fullscreenElement || document.webkitFullscreenElement\n      ? true\n      : false;\n  }\n\n  get isFullscreenAvailable() {\n    return Boolean(\n      document.documentElement.requestFullscreen ||\n        document.documentElement.webkitRequestFullscreen\n    );\n  }\n\n  get imageBackground() {\n    return this.backgroundColor\n      ? this.backgroundColor\n      : this.material?.imageColor;\n  }\n\n  @action\n  handleImageClick() {\n    if (this.behaviour === 'enlarge') {\n      this.isMaterialViewerOpen = true;\n    }\n  }\n\n  @action\n  handleFullscreenClick() {\n    if (this.behaviour === 'fullscreen') {\n      if (!this.isFullscreen) {\n        this.element.requestFullscreen\n          ? this.element.requestFullscreen()\n          : this.element.webkitRequestFullscreen?.();\n      } else {\n        document.exitFullscreen\n          ? document.exitFullscreen()\n          : document.webkitExitFullscreen?.();\n      }\n    }\n  }\n\n  @action\n  setElement(elem) {\n    elem.addEventListener('fullscreenchange', this.toggleFullscreen);\n    elem.addEventListener('webkitfullscreenchange', this.toggleFullscreen);\n    this.element = elem;\n  }\n\n  @action\n  toggleFullscreen() {\n    this.fullscreen = this.isFullscreen;\n  }\n\n  @action\n  handleImageFinally() {\n    this.backgroundColor = '#000';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<figure\\n  data-speaker-pause={{900}}\\n  style={{this.preferredSizeStyle}}\\n  class={{this.classes}}\\n  ...attributes\\n>\\n  <div class=\\\"tb-render-image-container\\\" {{did-insert this.setElement}}>\\n    {{#if (and (eq this.behaviour \\\"fullscreen\\\") this.isFullscreenAvailable)}}\\n      {{#let (generate-id \\\"fullscreen\\\") as |id|}}\\n        <UiButton\\n          id={{id}}\\n          class=\\\"m1 tb-render-image-fullscreen-btn\\\"\\n          @onClick={{this.handleFullscreenClick}}\\n          @appearance={{\\\"link\\\"}}\\n        >\\n          <DcIcon class=\\\"n1\\\" @name={{this.fullscreenIcon}} />\\n        </UiButton>\\n\\n        <XTooltip @for={{id}}>\\n          {{t \\\"components.tbRender.image.fullscreenTooltip\\\"}}\\n        </XTooltip>\\n      {{/let}}\\n    {{/if}}\\n    <div class=\\\"tb-render-image-wrapper\\\">\\n      {{#if (and this.fullscreen this.material.meta.properties.svg)}}\\n        <XImage\\n          @source={{image-source this.material.meta.svg_url}}\\n          @width={{this.material.imageWidth}}\\n          @height={{this.material.imageHeight}}\\n          @color={{this.imageBackground}}\\n          @mimetype=\\\"image/svg+xml\\\"\\n          @alt={{this.alt}}\\n          class=\\\"tb-render-image\\\"\\n        />\\n      {{else}}\\n        <XImage\\n          @source={{\\n            image-source\\n            this.material.imageUrl\\n            width=this.resizedImageWidth\\n            height=this.resizedImageHeight\\n          }}\\n          @width={{this.material.imageWidth}}\\n          @height={{this.material.imageHeight}}\\n          @color={{this.imageBackground}}\\n          @mimetype={{this.material.imageMimetype}}\\n          @alt={{this.alt}}\\n          @onClick={{this.handleImageClick}}\\n          @onFinally={{this.handleImageFinally}}\\n          class=\\\"tb-render-image\\\"\\n        />\\n      {{/if}}\\n\\n      {{#if (and this.fullscreen this.material.metadata.copyright)}}\\n        {{! template-lint-disable no-bare-strings }}\\n        <div class=\\\"tb-render-image-fullscreen-copyright\\\">\\n          <p class=\\\"m0 text-small\\\">\\n            ©\\n            {{this.material.metadata.copyright}}\\n          </p>\\n        </div>\\n        {{! template-lint-enable no-bare-strings }}\\n      {{/if}}\\n    </div>\\n  </div>\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption\\n      data-speaker-scroll-to=\\\"parent\\\"\\n      class=\\\"tb-render-image-caption\\\"\\n      @language={{@language}}\\n    >\\n      {{yield (hash value=@part.value)}}\\n    </TbRender::Caption>\\n  {{/if}}\\n\\n  {{#if this.isMaterialViewerOpen}}\\n    <MaterialViewer\\n      @material={{this.material}}\\n      @caption={{if @part.settings.show_caption @part.value}}\\n      @onClose={{set this \\\"isMaterialViewerOpen\\\" false}}\\n      @preferSvg={{true}}\\n      as |caption|\\n    >\\n      {{yield (hash value=caption)}}\\n    </MaterialViewer>\\n  {{/if}}\\n</figure>\\n', { moduleName: 'babel/components/tb-render/image/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderInteractiveImageComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-interactive-image';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return this.args.part?.media_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<figure class={{this.classes}} ...attributes>\\n  {{#if this.material}}\\n    <InteractiveImageWrapper @material={{this.material}} />\\n  {{/if}}\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption\\n      class=\\\"tb-render-interactive-image-caption\\\"\\n      @language={{@language}}\\n    >{{yield (hash value=@part.value)}}</TbRender::Caption>\\n  {{/if}}\\n</figure>', { moduleName: 'babel/components/tb-render/interactive-image/template.hbs' });\n","import { dasherize } from '@ember/string';\nimport { htmlSafe } from '@ember/template';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\nimport { previousObject } from 'compton/utils/array';\n\nimport { numberToBase26 } from '../../../utils/number-to-base-26';\n\nconst LIST_STYLES = {\n  ordered: 'ordered',\n  orderedParen: 'ordered_paren',\n  orderedPlain: 'ordered_plain',\n  lowerAlpha: 'lower_alpha',\n  lowerAlphaDot: 'lower_alpha_dot',\n  lowerAlphaPlain: 'lower_alpha_plain',\n  lowerRoman: 'lower_roman',\n  unordered: 'unordered',\n  unorderedHollow: 'unordered_hollow',\n  unorderedSquare: 'unordered_square',\n  arrow: 'arrow',\n  arrowTail: 'arrow_tail',\n  blank: 'blank',\n  tags: 'tags',\n};\n\nconst DEFAULT_STYLES_BY_LEVEL = {\n  [LIST_STYLES.ordered]: {\n    2: LIST_STYLES.lowerAlpha,\n    3: LIST_STYLES.lowerRoman,\n  },\n  [LIST_STYLES.orderedParen]: {\n    2: LIST_STYLES.lowerAlpha,\n    3: LIST_STYLES.lowerRoman,\n  },\n  [LIST_STYLES.orderedPlain]: {\n    2: LIST_STYLES.lowerAlphaPlain,\n    3: LIST_STYLES.lowerRoman,\n  },\n  [LIST_STYLES.lowerAlpha]: {\n    2: LIST_STYLES.lowerRoman,\n    3: LIST_STYLES.orderedParen,\n  },\n  [LIST_STYLES.lowerAlphaDot]: {\n    2: LIST_STYLES.lowerRoman,\n    3: LIST_STYLES.ordered,\n  },\n  [LIST_STYLES.lowerAlphaPlain]: {\n    2: LIST_STYLES.lowerRoman,\n    3: LIST_STYLES.orderedPlain,\n  },\n  [LIST_STYLES.lowerRoman]: {\n    2: LIST_STYLES.lowerAlpha,\n    3: LIST_STYLES.ordered,\n  },\n  [LIST_STYLES.unordered]: {\n    2: LIST_STYLES.unorderedHollow,\n    3: LIST_STYLES.unorderedSquare,\n  },\n  [LIST_STYLES.unorderedHollow]: {\n    2: LIST_STYLES.unorderedSquare,\n    3: LIST_STYLES.unordered,\n  },\n  [LIST_STYLES.unorderedSquare]: {\n    2: LIST_STYLES.unordered,\n    3: LIST_STYLES.unorderedHollow,\n  },\n  [LIST_STYLES.arrow]: {\n    2: LIST_STYLES.arrow,\n    3: LIST_STYLES.arrow,\n  },\n  [LIST_STYLES.arrow_tail]: {\n    2: LIST_STYLES.arrow_tail,\n    3: LIST_STYLES.arrow_tail,\n  },\n  [LIST_STYLES.blank]: {\n    2: LIST_STYLES.blank,\n    3: LIST_STYLES.blank,\n  },\n  [LIST_STYLES.tags]: {\n    2: LIST_STYLES.tags,\n    3: LIST_STYLES.tags,\n  },\n};\n\nfunction previousObjectBy(arr, obj, key, value) {\n  let previousObj = previousObject(arr, obj);\n\n  while (previousObj && previousObj[key] !== value) {\n    previousObj = previousObject(arr, previousObj);\n  }\n\n  return previousObj;\n}\n\nexport default class TbRenderListComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   * start (number)\n   * itemGroups (array)\n   */\n\n  baseClass = 'tb-render-list';\n\n  numberToBase26(number) {\n    // Split and join the characters with a dash to get the speaker to read them\n    // as letters instead of sentences.\n    return numberToBase26(number).split('').join('-');\n  }\n\n  getDefaultStyleForLevel(mainStyle, level) {\n    return DEFAULT_STYLES_BY_LEVEL[mainStyle]?.[level] || mainStyle;\n  }\n\n  getEffectiveStyleForLevel(level) {\n    if (level === 1) {\n      return this.style;\n    }\n\n    if (\n      this.styles.every((style) => style === null) &&\n      this.style === LIST_STYLES.lowerAlpha\n    ) {\n      return this.style;\n    }\n\n    const index = level - 1;\n    const styles = this.styles;\n\n    if (!styles || styles.length <= index) {\n      return this.getDefaultStyleForLevel(this.style, level);\n    }\n\n    const levelStyle = styles[index];\n\n    if (levelStyle === null) {\n      return this.getDefaultStyleForLevel(this.style, level);\n    }\n\n    return levelStyle;\n  }\n\n  get itemGroups() {\n    if (this.args.itemGroups) return this.args.itemGroups;\n\n    const items = this.args.part?.value || [];\n\n    const itemGroups = items.map((item) => {\n      return {\n        item,\n        itemGroups: [],\n        level: item.level,\n        effectiveStyle: this.getEffectiveStyleForLevel(item.level),\n        effectiveStart: this.getStartForLevel(item.level),\n      };\n    });\n\n    const nestedItemGroups = [];\n\n    itemGroups.forEach((itemGroup) => {\n      const parentItemGroup = previousObjectBy(\n        itemGroups,\n        itemGroup,\n        'level',\n        itemGroup.level - 1\n      );\n\n      if (parentItemGroup) {\n        parentItemGroup.itemGroups.addObject(itemGroup);\n        nestedItemGroups.addObject(itemGroup);\n      }\n    });\n\n    itemGroups.removeObjects(nestedItemGroups);\n\n    return itemGroups;\n  }\n\n  get style() {\n    return this.args.part?.settings?.style || '';\n  }\n\n  get styles() {\n    return this.args.part?.settings?.styles || [];\n  }\n\n  getStartForLevel(level) {\n    if (level === 1) return this.start;\n\n    return 1;\n  }\n\n  get classes() {\n    const style = this.args.overrideStyle || this.style;\n    const sizeStyle = `${this.baseClass}--${this.args.part?.settings?.size}`;\n\n    return [\n      this.baseClass,\n      sizeStyle,\n      [this.baseClass, dasherize(style)].join('--'),\n    ].join(' ');\n  }\n\n  get start() {\n    return this.args.start ?? this.args.part?.settings?.start ?? 1;\n  }\n\n  get cssStyle() {\n    return htmlSafe(`--start: ${this.start};`);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ol\\n  class={{this.classes}}\\n  style={{this.cssStyle}}\\n  start={{this.start}}\\n  ...attributes\\n>\\n  {{#each this.itemGroups as |itemGroup index|}}\\n    <li class=\\\"tb-render-list-item\\\" data-level={{itemGroup.level}}>\\n      <span class=\\\"tb-render-list-content\\\">\\n        <span hidden>\\n          {{#if\\n            (or\\n              (eq itemGroup.effectiveStyle \\\"ordered\\\")\\n              (eq itemGroup.effectiveStyle \\\"ordered_paren\\\")\\n              (eq itemGroup.effectiveStyle \\\"ordered_plain\\\")\\n              (eq itemGroup.effectiveStyle \\\"lower_alpha\\\")\\n              (eq itemGroup.effectiveStyle \\\"lower_alpha_dot\\\")\\n              (eq itemGroup.effectiveStyle \\\"lower_alpha_plain\\\")\\n              (eq itemGroup.effectiveStyle \\\"lower_roman\\\")\\n            )\\n          }}\\n            {{#let\\n              (increment index (if (eq itemGroup.level 1) this.start 1))\\n              as |number|\\n            }}\\n              {{#if\\n                (or\\n                  (eq itemGroup.effectiveStyle \\\"lower_alpha\\\")\\n                  (eq itemGroup.effectiveStyle \\\"lower_alpha_dot\\\")\\n                  (eq itemGroup.effectiveStyle \\\"lower_alpha_plain\\\")\\n                )\\n              }}\\n                {{this.numberToBase26 number}}.\\n              {{else}}\\n                {{number}}.\\n              {{/if}}\\n            {{/let}}\\n          {{/if}}\\n        </span>\\n\\n        {{yield (hash value=(or itemGroup.item.value \\\"&zwnj;\\\"))}}\\n\\n        {{#if itemGroup.item.value}}\\n          <span hidden data-speaker-pause-for=\\\"500\\\"></span>\\n        {{else}}\\n          <span class=\\\"empty-line\\\"></span>\\n        {{/if}}\\n      </span>\\n\\n      {{#if itemGroup.itemGroups}}\\n        <TbRender::List\\n          @part={{@part}}\\n          @start={{itemGroup.itemGroups.firstObject.effectiveStart}}\\n          @itemGroups={{itemGroup.itemGroups}}\\n          @overrideStyle={{itemGroup.itemGroups.firstObject.effectiveStyle}}\\n          as |list|\\n        >\\n          {{yield (hash value=list.value)}}\\n        </TbRender::List>\\n      {{/if}}\\n    </li>\\n  {{/each}}\\n</ol>', { moduleName: 'babel/components/tb-render/list/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderParagraphComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-paragraph';\n\n  get extraClasses() {\n    const part = this.args.part;\n    const classes = [];\n\n    classes.push(`${this.baseClass}--${part?.settings?.size}`);\n\n    if (part?.settings?.alignment) {\n      classes.push(`${this.baseClass}--${part.settings.alignment}`);\n    }\n\n    return classes;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<p class=\\\"{{this.classes}}\\\" ...attributes>{{\\n  yield (hash value=@part.value)\\n}}</p>\\n', { moduleName: 'babel/components/tb-render/paragraph/template.hbs' });\n","import { dasherize } from '@ember/string';\nimport Component from '@glimmer/component';\nimport { storageFor } from 'ember-local-storage';\n\nconst HIDDEN_COMPONENTS_IN_ONLYTEXT = [\n  'gallery',\n  'image',\n  'video',\n  'embed',\n  'interactive_image',\n];\n\nexport default class TbRenderPartComponent extends Component {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  @storageFor('read-setting') settings;\n\n  get component() {\n    const part = this.args.part;\n\n    let component = part?.component;\n\n    // ember-local-storage requires .get\n    if (this.settings.get('onlytext')) {\n      if (HIDDEN_COMPONENTS_IN_ONLYTEXT.includes(component)) {\n        if (!part?.mediaForced) {\n          component = 'placeholder';\n        }\n      }\n    }\n\n    return `tb-render/${dasherize(component)}`;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ReadingResolve @readingId={{@part.reading_id}} as |readingUrl|>\\n  {{yield (hash component=this.component readingUrl=readingUrl)}}\\n</ReadingResolve>\\n', { moduleName: 'babel/components/tb-render/part/template.hbs' });\n","import { action } from '@ember/object';\nimport TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderPlaceholderComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-placeholder';\n\n  @action forceMedia() {\n    this.args.part.mediaForced = true;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  {{#let (generate-id \\\"placeholder\\\") as |id|}}\\n    <UiButton\\n      @id={{id}}\\n      @appearance=\\\"none\\\"\\n      @variant=\\\"inherit\\\"\\n      @onClick={{this.forceMedia}}\\n      class=\\\"tb-render-placeholder-action\\\"\\n    >\\n      <DcIcon @name=\\\"eye-ban\\\" />\\n    </UiButton>\\n\\n    <XTooltip @for={{id}}>\\n      {{t \\\"components.tbRender.placeholder.toolTip\\\"}}\\n    </XTooltip>\\n  {{/let}}\\n</div>', { moduleName: 'babel/components/tb-render/placeholder/template.hbs' });\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { dasherize } from '@ember/string';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { resolve } from 'rsvp';\n\nexport default class TbRenderComponent extends Component {\n  /**\n   * Arguments:\n   * row (object)\n   */\n\n  @service ilt;\n\n  @tracked element;\n\n  get sortedColumns() {\n    return this.args.row?.columns?.sortBy('index');\n  }\n\n  get rowClassNames() {\n    const row = this.args.row;\n    const classes = ['tb-render-row'];\n\n    if (row?.column_width === 'widerLeft') {\n      classes.push('tb-render-row--wider-left');\n    } else if (row?.column_width === 'widerRight') {\n      classes.push('tb-render-row--wider-right');\n    }\n\n    if (row?.encourage_listening_enabled) {\n      classes.push('tb-render-row--listening-enabled');\n    }\n\n    if (row?.template && row?.template !== 'standard') {\n      classes.push('tb-render-row--has-template');\n      classes.push(`tb-render-template--${dasherize(row.template)}`);\n    }\n\n    if (row?.with_prefix) {\n      classes.push('tb-render-row--has-prefix');\n    }\n\n    return classes.join(' ');\n  }\n\n  get encourageListeningEnabled() {\n    return this.args.row.encourage_listening_enabled && this.element;\n  }\n\n  get onlyIlt() {\n    return this.args.row.only_ilt;\n  }\n\n  get showRowPromise() {\n    if (!this.onlyIlt) return resolve(true);\n\n    return this.ilt\n      .getToken()\n      .then(() => this.ilt.hasBegreppa)\n      .catch(() => false);\n  }\n\n  @action\n  setElement(element) {\n    this.element = element;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XAwait @value={{this.showRowPromise}} as |showRow|>\\n  {{#if showRow}}\\n    {{#if this.encourageListeningEnabled}}\\n      <TbRender::EncourageListeningBubble\\n        class=\\\"tb-render-encourage-listening-bubble\\\"\\n        @element={{this.element}}\\n      >\\n        {{@row.encourage_listening_label}}\\n      </TbRender::EncourageListeningBubble>\\n    {{/if}}\\n\\n    <div\\n      class=\\\"{{this.rowClassNames}}\\\"\\n      style=\\\"{{if (and @row.with_prefix (gt @row.longest_prefix 0)) (concat \\'--prefix-size: \\' @row.longest_prefix \\'ch;\\')}}\\\"\\n      {{did-insert this.setElement}}\\n    >\\n      {{#if @row.with_prefix}}\\n        <div class=\\\"tb-render-row--prefix\\\" data-speaker-block>\\n          {{@row.prefix}}\\n        </div>\\n      {{/if}}\\n\\n      {{#each this.sortedColumns as |column index|}}\\n        {{yield (hash column=column index=index num=@row.columns.length)}}\\n      {{/each}}\\n    </div>\\n  {{/if}}\\n</XAwait>', { moduleName: 'babel/components/tb-render/row/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderTableComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-table';\n\n  get settings() {\n    return this.args.part?.settings;\n  }\n\n  get cells() {\n    return (this.args.part?.rows || []).map((row) => {\n      return (row.columns || []).map((column) => {\n        if (\n          (row.index === 0 && this.settings?.horizontal_heading) ||\n          (column.index === 0 && this.settings?.vertical_heading)\n        ) {\n          column.isHeading = true;\n        }\n\n        return column;\n      });\n    });\n  }\n\n  get caption() {\n    return this.args.part?.caption;\n  }\n\n  get tableAppearance() {\n    return this.args.part.settings.appearance\n      ? this.args.part.settings.appearance\n      : 'standard';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  <XTable\\n    class=\\\"tb-render-table-table\\\"\\n    @appearance={{this.tableAppearance}}\\n    as |table|\\n  >\\n    {{#each this.cells as |rowData|}}\\n      <table.row class=\\\"tb-render-table-row\\\" as |row|>\\n        {{#each rowData as |columnData|}}\\n          {{#if columnData.isHeading}}\\n            <row.cell\\n              class=\\\"tb-render-table-column tb-render-table-column--heading\\\"\\n              @tagName=\\\"th\\\"\\n              @valign={{this.settings.vertical_alignment}}\\n              @halign={{this.settings.horizontal_alignment}}\\n            >\\n              {{yield (hash value=columnData.value)}}\\n            </row.cell>\\n          {{else}}\\n            <row.cell\\n              class=\\\"tb-render-table-column\\\"\\n              @valign={{this.settings.vertical_alignment}}\\n              @halign={{this.settings.horizontal_alignment}}\\n            >\\n              {{yield (hash value=columnData.value)}}\\n            </row.cell>\\n          {{/if}}\\n        {{/each}}\\n      </table.row>\\n    {{/each}}\\n  </XTable>\\n\\n  {{#if (and this.settings.show_caption this.caption)}}\\n    <TbRender::Caption class=\\\"tb-render-table-caption\\\" @language={{@language}}>\\n      {{yield (hash value=this.caption)}}\\n    </TbRender::Caption>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/tb-render/table/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nimport { numberToBase26 } from '../../../utils/number-to-base-26';\n\nexport default class TbRenderTagComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   * start (number)\n   * itemGroups (array)\n   */\n\n  baseClass = 'tb-render-tag';\n\n  numberToBase26(number) {\n    // Split and join the characters with a dash to get the speaker to read them\n    // as letters instead of sentences.\n    return numberToBase26(number).split('').join('-');\n  }\n\n  get itemGroups() {\n    if (this.args.itemGroups) return this.args.itemGroups;\n\n    const items = this.args.part?.value || [];\n    const itemGroups = items.map((item) => {\n      return {\n        item,\n        itemGroups: [],\n      };\n    });\n\n    return itemGroups;\n  }\n\n  get style() {\n    return this.args.part?.settings?.style || '';\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ol class={{this.classes}} ...attributes>\\n  {{#each this.itemGroups as |itemGroup|}}\\n    <li class=\\\"tb-render-tag-item\\\" data-level={{itemGroup.level}}>\\n      <span class=\\\"tb-render-tag-content\\\">\\n        {{yield (hash value=(or itemGroup.item.value \\\"&zwnj;\\\"))}}\\n\\n        {{! This is needed for speaker to make a pause when reading tags }}\\n        {{#if itemGroup.item.value}}\\n          <span hidden>\\n            .\\n          </span>\\n        {{/if}}\\n      </span>\\n    </li>\\n  {{/each}}\\n</ol>', { moduleName: 'babel/components/tb-render/tag/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"tb-render\\\">\\n  {{#each this.sortedRows as |rowObj|}}\\n    <TbRender::Row @row={{rowObj}} as |row|>\\n      <TbRender::Column\\n        @column={{row.column}}\\n        @area={{if (gt row.num 1) (if (eq row.index 0) \\\"left\\\" \\\"right\\\") \\\"main\\\"}}\\n        as |column|\\n      >\\n        <TbRender::Group @template={{column.group.template}}>\\n          {{#each column.group.parts as |partObj|}}\\n            <TbRender::Part\\n              @part={{partObj}}\\n              as |part|\\n            >\\n              {{#let (component part.component) as |BlockComponent|}}\\n                <BlockComponent\\n                  @part={{partObj}}\\n                  @editor={{this.content}}\\n                  @canvasUser={{@canvasUser}}\\n                  @language={{partObj.language}}\\n                  class=\\\"tb-render-block-component {{concat \\\"component-\\\" partObj.uuid}}\\\"\\n                  data-id={{partObj.uuid}}\\n                  data-language={{partObj.language}}\\n                  data-reading={{part.readingUrl}}\\n                  data-reading-loading={{not part.readingUrl}}\\n                  as |Block|\\n                >\\n                  <TbRenderInline\\n                    @value={{Block.value}}\\n                    as |inline|\\n                  >\\n                    {{~#if inline.customComponent~}}\\n                      {{~yield (hash\\n                        customComponent=true\\n                        node=inline.node\\n                        parentElementId=inline.parentElementId\\n                      )~}}\\n                    {{~else~}}\\n                      {{~yield~}}\\n                    {{~/if~}}\\n                  </TbRenderInline>\\n                </BlockComponent>\\n              {{/let}}\\n            </TbRender::Part>\\n          {{/each}}\\n        </TbRender::Group>\\n      </TbRender::Column>\\n    </TbRender::Row>\\n  {{/each}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/template.hbs' });\n","import TbRenderBlockComponent from 'babel/components/tb-render/block-component/component';\n\nexport default class TbRenderVideoComponent extends TbRenderBlockComponent {\n  /**\n   * Arguments:\n   * part (object)\n   */\n\n  baseClass = 'tb-render-video';\n\n  asyncType = 'material';\n\n  get asyncId() {\n    return this.args.part?.media_id;\n  }\n\n  get material() {\n    return this.asyncData;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class={{this.classes}} ...attributes>\\n  <VideoPlayer\\n    class=\\\"tb-render-video-video\\\"\\n    @source={{this.material.meta.attachment_url}}\\n    @posterUrl={{this.material.meta.image_url}}\\n    @name={{this.material.name}}\\n    @type={{this.material.type}}\\n    @subtitles={{this.material.metadata.subtitles}}\\n  />\\n\\n  {{#if (and @part.settings.show_caption @part.value)}}\\n    <TbRender::Caption\\n      class=\\\"tb-render-video-caption\\\"\\n      @language={{@language}}\\n    >{{yield (hash value=@part.value)}}</TbRender::Caption>\\n  {{/if}}\\n</div>\\n', { moduleName: 'babel/components/tb-render/video/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ChooseModal\\n  data-test-teacher-assignment-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.teacherAssignmentChooseModal.title\\\"}}\\n  @count={{this.pickedTeacherAssignments.length}}\\n  @onChoose={{fn this.onChoose this.pickedTeacherAssignments}}\\n  @onDelete={{fn this.handleDelete this.pickedTeacherAssignments}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.teacherAssignments}}\\n      @query={{this.query}}\\n      @mode=\\\"list\\\"\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.teacherAssignmentChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.teacherAssignmentChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedTeacherAssignments|\\n    >\\n\\n      <TeacherAssignmentPicker\\n        @teacherAssignments={{collatedTeacherAssignments}}\\n        @pickedTeacherAssignments={{this.pickedTeacherAssignments}}\\n        @disabledTeacherAssignments={{@disabledTeacherAssignments}}\\n        @onPick={{this.handleTeacherAssignmentPickerPick}}\\n        @onUnpick={{this.handleTeacherAssignmentPickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\", {\"contents\":\"<ChooseModal\\n  data-test-teacher-assignment-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.teacherAssignmentChooseModal.title\\\"}}\\n  @count={{this.pickedTeacherAssignments.length}}\\n  @onChoose={{fn this.onChoose this.pickedTeacherAssignments}}\\n  @onDelete={{fn this.handleDelete this.pickedTeacherAssignments}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.teacherAssignments}}\\n      @query={{this.query}}\\n      @mode=\\\"list\\\"\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.teacherAssignmentChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.teacherAssignmentChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedTeacherAssignments|\\n    >\\n\\n      <TeacherAssignmentPicker\\n        @teacherAssignments={{collatedTeacherAssignments}}\\n        @pickedTeacherAssignments={{this.pickedTeacherAssignments}}\\n        @disabledTeacherAssignments={{@disabledTeacherAssignments}}\\n        @onPick={{this.handleTeacherAssignmentPickerPick}}\\n        @onUnpick={{this.handleTeacherAssignmentPickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\",\"moduleName\":\"babel/components/teacher-assignment-choose-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/teacher-assignment-choose-modal/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nimport Resource from '../../utils/resource';\n\n/*\n\nimport TeacherAssignmentModel from 'babel/models/teacher-assignment';\n\nexport interface TeacherAssignmentChooseModalComponentArgs {\n  disabledTeacherAssignments: TeacherAssignmentModel[];\n  onChoose(pickedTeacherAssignments: TeacherAssignmentModel[]): void;\n  onClose(): void;\n}\n\n*/\nconst QUERY = {\n  bookId: null,\n  search: '',\n  page: 1,\n};\n\nexport default class TeacherAssignmentChooseModalComponent extends Component {\n  @service store;\n  @service session;\n  @service teacherAssignmentDispatcher;\n\n  @tracked pickedTeacherAssignments = [];\n  @tracked query = QUERY;\n\n  resource = new Resource(async () => {\n    return {\n      teacherAssignments: (\n        await this.store.findAll('teacher-assignment')\n      ).filterBy('userId', this.session.user.id),\n    };\n  });\n\n  get onChoose() {\n    const onChoose = this.args.onChoose;\n\n    assert(\n      `The @onChoose arg passed to <TeacherAssignmentChooseModal> must be a function. Got ${typeof onChoose}`,\n      typeof onChoose === 'function'\n    );\n\n    return onChoose;\n  }\n\n  @action\n  handleAdditionCollatorQuery(query) {\n    this.query = query;\n    this.pickedTeacherAssignments.clear();\n  }\n\n  @action\n  handleTeacherAssignmentPickerPick(file) {\n    this.pickedTeacherAssignments.addObject(file);\n  }\n\n  @action\n  handleTeacherAssignmentPickerUnpick(file) {\n    this.pickedTeacherAssignments.removeObject(file);\n  }\n\n  @action\n  async handleDelete(teacherAssignments) {\n    await this.teacherAssignmentDispatcher.deleteMany(teacherAssignments);\n    this.pickedTeacherAssignments.clear();\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class TeacerAssignmentDetailComponent extends Component {\n  @service router;\n  @service colorTheme;\n\n  @action\n  onCancel() {\n    if (this.args.cancelRouteName) {\n      return this.router.transitionTo(\n        this.args.cancelRouteName,\n        this.args.teacherAssignment.id\n      );\n    }\n\n    return this.router.transitionTo(this.args.indexRouteName);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"teacher-assignment-detail\\\">\\n  <XLockedScope\\n    class=\\\"teacher-assignment-detail\\\"\\n    @active={{@teacherAssignment.isDeleted}}\\n  >\\n    {{#if (not-eq @hasBreadcrumb false)}}\\n      <XBreadcrumb class=\\\"mb1\\\" as |Breadcrumb|>\\n        <Breadcrumb.item as |item|>\\n          <item.link @route={{@indexRouteName}}>\\n            {{t \\\"components.teacherAssignmentDetail.indexBreadcrumbItemLabel\\\"}}\\n          </item.link>\\n        </Breadcrumb.item>\\n\\n        <Breadcrumb.item @active={{true}}>\\n          <span class=\\\"line-height-base\\\">\\n            {{#if @teacherAssignment.isNew}}\\n              {{t\\n                \\\"components.teacherAssignmentDetail.activeBreadcrumbItemLabel\\\"\\n                isNew=true\\n              }}\\n            {{else}}\\n              {{@teacherAssignment.titleWithFallback}}\\n            {{/if}}\\n          </span>\\n        </Breadcrumb.item>\\n      </XBreadcrumb>\\n    {{/if}}\\n\\n    <UiFormFor\\n      @object={{@teacherAssignment}}\\n      @onSubmit={{fn @onSave true}}\\n      as |form|\\n    >\\n      <div class=\\\"mb1\\\">\\n        <form.label\\n          @key=\\\"title\\\"\\n          @content={{t \\\"components.teacherAssignmentDetail.titleInputLabel\\\"}}\\n        />\\n\\n        <form.input\\n          @key=\\\"title\\\"\\n          @autofocus={{@teacherAssignment.isNew}}\\n          @placeholder={{t\\n            \\\"components.teacherAssignmentDetail.titleInputPlaceholder\\\"\\n          }}\\n        />\\n      </div>\\n\\n      <div class=\\\"mb1\\\">\\n        <form.label\\n          @key=\\\"questionHtml\\\"\\n          @content={{t\\n            \\\"components.teacherAssignmentDetail.questionEditorLabel\\\"\\n          }}\\n        />\\n\\n        <XEditor\\n          @value={{@teacherAssignment.questionHtml}}\\n          @theme={{this.colorTheme.currentTheme}}\\n          @onChange={{set @teacherAssignment \\\"questionHtml\\\"}}\\n        />\\n      </div>\\n\\n      <FileAssignment\\n        class=\\\"my1\\\"\\n        @files={{@teacherAssignment.files}}\\n        @onAdd={{@onAddFile}}\\n        @onRemove={{@onRemoveFile}}\\n      />\\n\\n      {{#if @teacherAssignment.exercise.assignments}}\\n        <XAccordion class=\\\"mb1\\\" as |accordion|>\\n          <accordion.header\\n            class=\\\"text-bold\\\"\\n            @appearance=\\\"compact\\\"\\n            @isClickable={{true}}\\n          >\\n            {{t \\\"components.teacherAssignmentDetail.moreOptionsButtonLabel\\\"}}\\n          </accordion.header>\\n\\n          <accordion.content>\\n            {{#each @teacherAssignment.exercise.assignments as |assignment|}}\\n              <div class=\\\"mb1\\\">\\n                <UiLabel>\\n                  {{t\\n                    \\\"components.teacherAssignmentDetail.answerTemplateEditorLabel\\\"\\n                  }}\\n                </UiLabel>\\n\\n                <XEditor\\n                  @value={{assignment.content.pattern}}\\n                  @theme={{this.colorTheme.currentTheme}}\\n                  @onChange={{fn (mut assignment.content.pattern)}}\\n                />\\n              </div>\\n            {{/each}}\\n          </accordion.content>\\n        </XAccordion>\\n      {{/if}}\\n\\n      <div\\n        class=\\\"flex\\n          {{if\\n            @teacherAssignment.isNew\\n            \\'justify-flex-end\\'\\n            \\'justify-space-between\\'\\n          }}\\n          flex-center mt2\\\"\\n      >\\n        {{#unless @teacherAssignment.isNew}}\\n          <UiButton @appearance=\\\"link\\\" @variant=\\\"error\\\" @onClick={{@onDelete}}>\\n            {{t \\\"components.teacherAssignmentDetail.deleteButtonLabel\\\"}}\\n          </UiButton>\\n        {{/unless}}\\n\\n        <div>\\n          <form.button\\n            class=\\\"nr1 text-color-default\\\"\\n            @variant=\\\"alternative\\\"\\n            @onClick={{this.onCancel}}\\n          >\\n            {{t \\\"components.teacherAssignmentDetail.cancelLinkLabel\\\"}}\\n          </form.button>\\n\\n          <form.button\\n            class=\\\"nr1 text-color-default\\\"\\n            @variant=\\\"alternative\\\"\\n            @onClick={{fn @onSave false}}\\n          >\\n            {{t\\n              \\\"components.teacherAssignmentDetail.switchToDraftButtonLabel\\\"\\n              isPublished=@teacherAssignment.isPublished\\n            }}\\n          </form.button>\\n\\n          {{#let (generate-id \\\"save-button\\\") as |id|}}\\n            <form.submit @id={{id}} @variant=\\\"default\\\">\\n              {{t \\\"components.teacherAssignmentDetail.saveButtonLabel\\\"}}\\n            </form.submit>\\n\\n            {{#unless @teacherAssignment.isPublished}}\\n              <XTooltip @for={{id}} @placement=\\\"top\\\">\\n                {{t\\n                  \\\"components.teacherAssignmentDetail.saveButtonTooltipLabel\\\"\\n                }}\\n              </XTooltip>\\n            {{/unless}}\\n          {{/let}}\\n        </div>\\n      </div>\\n    </UiFormFor>\\n  </XLockedScope>\\n</div>', { moduleName: 'babel/components/teacher-assignment-detail/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport TeacherAssignmentModel from 'babel/models/teacher-assignment';\\n\\nexport interface TeacherAssignmentPickerComponentArgs {\\n\\n  teacherAssignments: TeacherAssignmentModel[];\\n  pickedTeacherAssignments: TeacherAssignmentModel[];\\n  disabledTeacherAssignments: TeacherAssignmentModel[];\\n  onPick(file: TeacherAssignment): void;\\n  onUnpick(file: TeacherAssignment): void;\\n}\\n\\n}}\\n\\n<div class=\\\"teacher-assignment-picker\\\" ...attributes>\\n\\n  {{#each @teacherAssignments as |teacherAssignment|}}\\n\\n    <TeacherAssignmentPicker::Item\\n      @teacherAssignment={{teacherAssignment}}\\n      @pickedTeacherAssignments={{@pickedTeacherAssignments}}\\n      @disabledTeacherAssignments={{@disabledTeacherAssignments}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</div>\", {\"contents\":\"{{!\\n\\nimport TeacherAssignmentModel from 'babel/models/teacher-assignment';\\n\\nexport interface TeacherAssignmentPickerComponentArgs {\\n\\n  teacherAssignments: TeacherAssignmentModel[];\\n  pickedTeacherAssignments: TeacherAssignmentModel[];\\n  disabledTeacherAssignments: TeacherAssignmentModel[];\\n  onPick(file: TeacherAssignment): void;\\n  onUnpick(file: TeacherAssignment): void;\\n}\\n\\n}}\\n\\n<div class=\\\"teacher-assignment-picker\\\" ...attributes>\\n\\n  {{#each @teacherAssignments as |teacherAssignment|}}\\n\\n    <TeacherAssignmentPicker::Item\\n      @teacherAssignment={{teacherAssignment}}\\n      @pickedTeacherAssignments={{@pickedTeacherAssignments}}\\n      @disabledTeacherAssignments={{@disabledTeacherAssignments}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</div>\",\"moduleName\":\"babel/components/teacher-assignment-picker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/teacher-assignment-picker/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"teacher-assignment-picker-item\\\"\\n    (if this.isDisabled \\\"teacher-assignment-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @teacherAssignment}}\\n  >\\n\\n    {{@teacherAssignment.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n  {{#unless @teacherAssignment.isPublished}}\\n\\n    <XBadge class=\\\"ml1\\\" @size=\\\"small\\\">\\n      {{t \\\"components.teacherAssignmentBrowser.item.draftBadgeLabel\\\"}}\\n    </XBadge>\\n\\n  {{/unless}}\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"teacher-assignment-picker-item\\\"\\n    (if this.isDisabled \\\"teacher-assignment-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @teacherAssignment}}\\n  >\\n\\n    {{@teacherAssignment.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n  {{#unless @teacherAssignment.isPublished}}\\n\\n    <XBadge class=\\\"ml1\\\" @size=\\\"small\\\">\\n      {{t \\\"components.teacherAssignmentBrowser.item.draftBadgeLabel\\\"}}\\n    </XBadge>\\n\\n  {{/unless}}\\n</label>\",\"moduleName\":\"babel/components/teacher-assignment-picker/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/teacher-assignment-picker/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport TeacherAssignmentModel from 'babel/models/teacher-assignment';\n\nexport interface TeacherAssignmentPickerItemComponentArgs {\n  teacherAssignment: TeacherAssignmentModel;\n  pickedTeacherAssignments: TeacherAssignmentModel[];\n  disabledTeacherAssignments: TeacherAssignmentModel[];\n  onPick(teacherAssignment: TeacherAssignmentModel): void;\n  onUnpick(teacherAssignment: TeacherAssignmentModel): void;\n}\n\n*/\n\nexport default class TeacherAssignmentPickerItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedTeacherAssignments.includes(\n      this.args.teacherAssignment\n    );\n  }\n\n  get isDisabled() {\n    const disabledTeacherAssignments = this.args.disabledTeacherAssignments;\n\n    return (\n      disabledTeacherAssignments &&\n      disabledTeacherAssignments.includes(this.args.teacherAssignment)\n    );\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackPresentationEvent } from 'babel/utils/matomo-events';\n\nexport default class ThemeSwitchComponent extends Component {\n  @service colorTheme;\n  @service intl;\n\n  @tracked themeOptions;\n\n  get currentTheme() {\n    return this.colorTheme.currentTheme;\n  }\n\n  constructor() {\n    super(...arguments);\n\n    this.themeOptions = [\n      {\n        label: this.intl.t('components.themeSwitch.colorSchemes.standard'),\n        value: 'light',\n      },\n      {\n        label: this.intl.t('components.themeSwitch.colorSchemes.dark'),\n        value: 'dark',\n      },\n      {\n        label: this.intl.t('components.themeSwitch.colorSchemes.dyslexi'),\n        value: 'dyslexi',\n      },\n    ];\n  }\n\n  @action\n  setTheme(value) {\n    trackPresentationEvent(`Ändra tema`, value);\n\n    this.colorTheme.changeTheme(value);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"theme-switch\\\">\\n  <UiLabel>\\n    {{t \\\"components.themeSwitch.colorScheme\\\"}}\\n  </UiLabel>\\n\\n  <div class=\\\"grid-layout-3 grid-gap-1 mb1\\\">\\n\\n    {{#each this.themeOptions as |option|}}\\n\\n      <UiButton\\n        @appearance=\\\"none\\\"\\n        @class={{class\\n          \\\"flex flex-center justify-center\\\"\\n          (concat \\\"read-settings-theme theme-\\\" option.value)\\n          (if (eq option.value this.currentTheme) \\\"read-settings-theme-active\\\")\\n        }}\\n        @variant=\\\"inherit\\\"\\n        @onClick={{fn this.setTheme option.value}}\\n        data-test-theme-option={{option.value}}\\n      >\\n\\n        <DcIcon @name=\\\"text\\\" @size=\\\"md\\\" class=\\\"read-settings-theme-icon\\\" />\\n        <DcIcon\\n          @name=\\\"check\\\"\\n          @size=\\\"xs\\\"\\n          class=\\\"read-settings-theme-icon-active\\\"\\n        />\\n\\n      </UiButton>\\n\\n    {{/each}}\\n\\n  </div>\\n</div>', { moduleName: 'babel/components/theme-switch/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @user}}\\n  <div class=\\\"user-avatar-and-name flex-auto flex flex-center\\\" ...attributes>\\n    <DcAvatar @user={{@user}} class=\\\"flex-shrink mr1\\\" @size=\\\"large\\\" />\\n\\n    <div class=\\\"flex-auto\\\">\\n      <div\\n        class=\\\"text-quarternary snb1 hyphens word-break-all text-overflow-ellipsis\\\"\\n      >\\n        {{@user.showname}}\\n      </div>\\n\\n      {{#if (not-eq @user.username @user.showname)}}\\n        <div\\n          class=\\\"text-small text-base text-paragraph hyphens word-break-all text-overflow-ellipsis\\\"\\n        >\\n          {{@user.username}}\\n        </div>\\n      {{/if}}\\n    </div>\\n  </div>\\n{{/if}}', { moduleName: 'babel/components/user-avatar-and-name/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport arg from 'compton/utils/arg';\n\nexport default class UserExternalLinkDialog extends Component {\n  // ARGS\n\n  @arg onClose;\n\n  @action handleContinueButtonClick() {\n    if (this.args?.url) {\n      window.open(this.args.url);\n    }\n    this.close();\n  }\n\n  close() {\n    this.onClose?.();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XModal\\n  ...attributes\\n  @title={{t \\\"components.userExternalLinkDialog.title\\\"}}\\n  @size={{hash width=\\\"small\\\" height=\\\"auto\\\"}}\\n  @fillOnSmallBreakpoint={{true}}\\n  @headerDivider={{true}}\\n  @closeButton={{false}}\\n  @locked={{true}}\\n  @onClose={{@onClose}}\\n  as |modal|\\n>\\n\\n  <modal.header />\\n\\n  <modal.content class=\\\"p1\\\">\\n\\n    <p class=\\\"m0\\\">\\n\\n      <p>\\n        {{t \\\"components.userExternalLinkDialog.message\\\"}}\\n      </p>\\n\\n      <XExternalLink @href={{@url}} class=\\\"mt1\\\"/>\\n    </p>\\n\\n  </modal.content>\\n\\n  <modal.footer class=\\\"flex justify-flex-end\\\">\\n\\n    <div>\\n      <UiButton @appearance=\\\"link\\\" @onClick={{@onClose}}>\\n        {{t \\\"components.userExternalLinkDialog.cancelButtonLabel\\\"}}\\n      </UiButton>\\n\\n      <UiButton class=\\\"ml1\\\" @onClick={{this.handleContinueButtonClick}}>\\n        {{t \\\"components.userExternalLinkDialog.continueButtonLabel\\\"}}\\n      </UiButton>\\n    </div>\\n\\n  </modal.footer>\\n\\n</XModal>\\n', { moduleName: 'babel/components/user-external-link-dialog/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"user-profile flex flex-center\\\" ...attributes>\\n  <DcAvatar @user={{@user}} @size=\\\"large\\\" class=\\\"mr1\\\" />\\n\\n  <div>\\n    <div class=\\\"text-quarternary sny1 hyphens word-break-all\\\">\\n      {{@user.showname}}\\n    </div>\\n\\n    <UiLink @route=\\\"logout\\\" @size=\\\"small\\\" @variant=\\\"error\\\">\\n      {{t \\\"components.userProfile.logout\\\"}}\\n    </UiLink>\\n  </div>\\n</div>', { moduleName: 'babel/components/user-profile/template.hbs' });\n","import Component from '@glimmer/component';\n\nexport default class UserSelectCheckbox extends Component {\n  /**\n   * Arguments:\n   * user (object)\n   * selectedUsers (array)\n   * onChange (function)\n   */\n\n  get isSelected() {\n    const selectedUsers = this.args.selectedUsers;\n    const user = this.args.user;\n\n    if (selectedUsers && user) {\n      if (selectedUsers.indexOf(user) !== -1) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XCheckbox\\n  @checked={{this.isSelected}}\\n  @twoWay={{false}}\\n  @onChange={{fn @onChange @user}}\\n  ...attributes\\n/>\\n', { moduleName: 'babel/components/user-select/checkbox/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class UserSelectComponent extends Component {\n  /**\n   * Arguments:\n   * users (array)\n   * selected (array)\n   */\n\n  @tracked modalSelected;\n\n  @tracked modalOpen = false;\n\n  get sortedSelected() {\n    return (this.args.selected || []).sortBy('showname');\n  }\n\n  @action openModal() {\n    this.modalOpen = true;\n    this.modalSelected = (this.args.selected || []).slice(0);\n  }\n\n  @action closeModal() {\n    this.modalOpen = false;\n  }\n\n  @action userChanged(user, checked) {\n    if (checked) {\n      this.modalSelected.addObject(user);\n    } else {\n      this.modalSelected.removeObject(user);\n    }\n  }\n\n  @action remove(item) {\n    if (this.args.selected) {\n      this.args.selected.removeObject(item);\n    }\n  }\n\n  @action saveUsers() {\n    if (this.args.selected) {\n      this.args.selected.clear().addObjects(this.modalSelected.slice(0));\n    }\n\n    this.closeModal();\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class UserSelectListComponent extends Component {\n  /**\n   * Arguments:\n   * users (array)\n   * userChanged (function)\n   * modalSelected (array)\n   */\n\n  @tracked searchVal;\n\n  @tracked search;\n\n  @tracked searchArr;\n\n  get sortedUsers() {\n    return (this.args.users || []).sortBy('lastname', 'firstname', 'username');\n  }\n\n  get filteredUsers() {\n    return this.sortedUsers.filter((user) => {\n      if (!this.search) return true;\n\n      if (\n        (user.lastname &&\n          user.lastname.toLowerCase().indexOf(this.search) !== -1) ||\n        (user.firstname &&\n          user.firstname.toLowerCase().indexOf(this.search) !== -1) ||\n        user.username.toLowerCase().indexOf(this.search) !== -1 ||\n        user.showname.toLowerCase().indexOf(this.search) !== -1 ||\n        (typeof user.listname === 'string' &&\n          user.listname.toLowerCase().indexOf(this.search) !== -1)\n      ) {\n        return true;\n      }\n\n      return false;\n    });\n  }\n\n  get numMatchingUsers() {\n    return this.filteredUsers?.length ?? 0;\n  }\n\n  @action doSearch() {\n    let search = this.searchVal;\n\n    if (search && search.length > 0) {\n      search = search.trim().toLowerCase();\n\n      this.search = search;\n      this.searchArr = search.split(' ');\n    } else {\n      this.search = null;\n      this.searchArr = null;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"user-list-component\\\" ...attributes>\\n  {{#if this.filteredUsers}}\\n    <div class=\\\"user-list-search mb1\\\">\\n      <UiLabel @for=\\\"search-user\\\">\\n        {{t \\\"components.userSelect.list.searchPlaceholder\\\"}}\\n      </UiLabel>\\n\\n      <div class=\\\"flex\\\">\\n        <UiInput\\n          @controlId=\\\"search-user\\\"\\n          @clearable={{true}}\\n          @placeholder={{t \\\"components.userSelect.list.searchPlaceholder\\\"}}\\n          @value={{this.searchVal}}\\n          @onClear={{this.doSearch}}\\n          @onEnter={{this.doSearch}}\\n        />\\n\\n        <UiButton class=\\\"nl1\\\" @onClick={{this.doSearch}}>\\n          <DcIcon @name=\\\"search\\\" />\\n        </UiButton>\\n\\n        <div class=\\\"flex-right text-small text-bold align-self-center\\\">\\n          {{t\\n            \\\"components.userSelect.list.numStudents\\\"\\n            count=this.numMatchingUsers\\n            hasGroups=false\\n          }}\\n        </div>\\n      </div>\\n    </div>\\n\\n    <UserSelect::Table\\n      @users={{this.filteredUsers}}\\n      @searchArr={{this.searchArr}}\\n      @userChanged={{@userChanged}}\\n      @modalSelected={{@modalSelected}}\\n    />\\n  {{else}}\\n    <XAlert>{{t \\\"components.userSelect.list.noUsersMessage\\\"}}</XAlert>\\n  {{/if}}\\n</div>', { moduleName: 'babel/components/user-select/list/template.hbs' });\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\n\nexport default class UserSelectTableComponent extends Component {\n  /**\n   * Arguments:\n   * users (array)\n   * searchArr (array)\n   * userChanged (function)\n   * modalSelected (array)\n   */\n\n  @action toggle(id) {\n    const checkbox = document\n      .getElementById(id)\n      ?.querySelector('input[type=\"checkbox\"]');\n\n    if (checkbox) {\n      const event = new Event('change');\n\n      checkbox.checked = !checkbox.checked;\n      checkbox.dispatchEvent(event);\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"user-list-user-table\\\" ...attributes>\\n  <XTable @fixed={{true}} as |Table|>\\n    <Table.head as |Head|>\\n      <Head.row as |Row|>\\n        <Row.column class=\\\"yielded-col\\\" size=\\\"1\\\" />\\n        <Row.column size=\\\"5\\\">\\n          {{t \\\"components.userSelect.table.userNameHeading\\\"}}\\n        </Row.column>\\n        <Row.column size=\\\"6\\\">\\n          {{t \\\"components.userSelect.table.userEmailHeading\\\"}}\\n        </Row.column>\\n      </Head.row>\\n    </Table.head>\\n\\n    <Table.body as |Body|>\\n      {{#each @users as |user|}}\\n        {{#let (concat \\\"checkbox-\\\" user.id) as |checkId|}}\\n          <Body.row as |Row|>\\n            <Row.column class=\\\"yielded-col\\\" size=\\\"1\\\">\\n              <UserSelect::Checkbox\\n                @onChange={{@userChanged}}\\n                @selectedUsers={{@modalSelected}}\\n                @user={{user}}\\n                id={{checkId}}\\n              />\\n            </Row.column>\\n\\n            <Row.column\\n              class=\\\"text-ui cursor-pointer\\\"\\n              {{on \\\"click\\\" (fn this.toggle checkId)}}\\n            >\\n              {{#if @searchArr}}\\n                {{#if (or user.firstname user.lastname)}}\\n                  <span {{highlight-terms @searchArr}}>{{user.listname}}</span>\\n                {{else}}\\n                  <span {{highlight-terms @searchArr}}>{{user.listname}}</span>\\n                {{/if}}\\n              {{else}}\\n                {{user.listname}}\\n              {{/if}}\\n            </Row.column>\\n\\n            <Row.column\\n              class=\\\"cursor-pointer\\\"\\n              {{on \\\"click\\\" (fn this.toggle checkId)}}\\n            >\\n              {{#if @searchArr}}\\n                <span class=\\\"user-table-email\\\" {{highlight-terms @searchArr}}>\\n                  {{~user.username~}}\\n                </span>\\n              {{else}}\\n                <span class=\\\"user-table-email\\\" title=\\\"{{user.username}}\\\">\\n                  {{~user.username~}}\\n                </span>\\n              {{/if}}\\n            </Row.column>\\n          </Body.row>\\n        {{/let}}\\n      {{/each}}\\n    </Table.body>\\n  </XTable>\\n</div>', { moduleName: 'babel/components/user-select/table/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-wrap flex-center mb1\\\">\\n\\n  {{#each this.sortedSelected as |user|}}\\n    <XBadge class=\\\"nb1 nr1 flex-center\\\">\\n      {{user.showname}}\\n\\n      <UiButton\\n        @variant=\\\"inherit\\\"\\n        @appearance=\\\"link\\\"\\n        @onClick={{fn this.remove user}}\\n      >\\n        <DcIcon @name=\\\"remove-circle\\\" @size=\\\"sm\\\" class=\\\"nl1\\\" />\\n      </UiButton>\\n    </XBadge>\\n  {{/each}}\\n\\n  <UiButton class=\\\"nb1\\\" @shape=\\\"rounded\\\" @onClick={{this.openModal}}>\\n    <DcIcon @name=\\\"simple-add\\\" @size=\\\"sm\\\" />\\n  </UiButton>\\n\\n  {{#unless this.sortedSelected}}\\n    <div class=\\\"text-muted text-italic text-small nl1 nb1\\\">\\n      {{t \\\"components.userSelect.noAddedUsers\\\"}}\\n    </div>\\n  {{/unless}}\\n</div>\\n\\n{{#if this.modalOpen}}\\n  <XModal\\n    @title={{t \\\"components.userSelect.selectUser\\\"}}\\n    @onClose={{this.closeModal}}\\n    @locked={{true}}\\n    @closeButton={{false}}\\n    as |Modal|\\n  >\\n    <Modal.header />\\n\\n    <Modal.content class=\\\"p1\\\">\\n      <UserSelect::List\\n        @users={{@users}}\\n        @userChanged={{this.userChanged}}\\n        @modalSelected={{this.modalSelected}}\\n      />\\n    </Modal.content>\\n\\n    <Modal.footer class=\\\"justify-flex-end\\\">\\n      <div>\\n        <UiButton class=\\\"mr1\\\" @appearance=\\\"link\\\" @onClick={{this.closeModal}}>\\n          {{t \\\"components.userSelect.cancel\\\"}}\\n        </UiButton>\\n\\n        <UiButton @onClick={{this.saveUsers}}>\\n          {{t \\\"components.userSelect.done\\\"}}\\n        </UiButton>\\n      </div>\\n    </Modal.footer>\\n  </XModal>\\n{{/if}}', { moduleName: 'babel/components/user-select/template.hbs' });\n","import { isArray } from '@ember/array';\nimport Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\n\nexport default Component.extend({\n  intl: service(),\n  videoService: service(\"video\"),\n  classNames: ['video-player-component'],\n\n  classNameBindings: ['videoReady::video-placeholder'],\n\n  elem: null,\n  plyr: null,\n\n  type: null,\n  subtitles: null,\n  name: null,\n  posterUrl: null,\n  source: null,\n  videoReady: false,\n  \n  setupPlayer: on(\n    'didInsertElement',\n    observer('source', function () {\n      const source = this.get('source');\n      const plyr = this.get('plyr');\n\n      if (source) {\n        if (!plyr) {\n          later(this, this._initPlyr);\n        } else {\n          this._updatePlyr();\n        }\n      }\n    })\n  ),\n\n  _initPlyr() {\n    const mediaElem = this.element.querySelectorAll(\n      this.get('type') === 'videos' ? 'video' : 'audio'\n    )[0];\n\n    const plyr = new Plyr(mediaElem, {\n      fullscreen: { enabled: true, fallback: true, iosNative: true },\n      intl: {\n        restart: this.intl.t('components.videoPlayer.restart').toString(),\n        rewind: this.intl\n          .t('components.videoPlayer.rewind', { seektime: 'seektime' })\n          .toString(),\n        play: this.intl.t('components.videoPlayer.play').toString(),\n        pause: this.intl.t('components.videoPlayer.pause').toString(),\n        fastForward: this.intl\n          .t('components.videoPlayer.fastForward', { seektime: 'seektime' })\n          .toString(),\n        seek: this.intl.t('components.videoPlayer.seek').toString(),\n        seekLabel: this.intl\n          .t('components.videoPlayer.seekLabel', {\n            currentTime: 'currentTime',\n            duration: 'duration',\n          })\n          .toString(),\n        played: this.intl.t('components.videoPlayer.played').toString(),\n        buffered: this.intl.t('components.videoPlayer.buffered').toString(),\n        currentTime: this.intl\n          .t('components.videoPlayer.currentTime')\n          .toString(),\n        duration: this.intl.t('components.videoPlayer.duration').toString(),\n        volume: this.intl.t('components.videoPlayer.volume').toString(),\n        mute: this.intl.t('components.videoPlayer.mute').toString(),\n        unmute: this.intl.t('components.videoPlayer.unmute').toString(),\n        enableCaptions: this.intl\n          .t('components.videoPlayer.enableCaptions')\n          .toString(),\n        disableCaptions: this.intl\n          .t('components.videoPlayer.disableCaptions')\n          .toString(),\n        enterFullscreen: this.intl\n          .t('components.videoPlayer.enterFullscreen')\n          .toString(),\n        exitFullscreen: this.intl\n          .t('components.videoPlayer.exitFullscreen')\n          .toString(),\n        frameTitle: this.intl\n          .t('components.videoPlayer.frameTitle', { title: 'title' })\n          .toString(),\n        captions: this.intl.t('components.videoPlayer.captions').toString(),\n        settings: this.intl.t('components.videoPlayer.settings').toString(),\n        menuBack: this.intl.t('components.videoPlayer.menuBack').toString(),\n        speed: this.intl.t('components.videoPlayer.speed').toString(),\n        normal: this.intl.t('components.videoPlayer.normal').toString(),\n        quality: this.intl.t('components.videoPlayer.quality').toString(),\n        loop: this.intl.t('components.videoPlayer.loop').toString(),\n        start: this.intl.t('components.videoPlayer.start').toString(),\n        end: this.intl.t('components.videoPlayer.end').toString(),\n        all: this.intl.t('components.videoPlayer.all').toString(),\n        reset: this.intl.t('components.videoPlayer.reset').toString(),\n        disabled: this.intl.t('components.videoPlayer.disabled').toString(),\n        enabled: this.intl.t('components.videoPlayer.enabled').toString(),\n        advertisement: this.intl\n          .t('components.videoPlayer.advertisement')\n          .toString(),\n        qualityBadge: {\n          2160: this.intl\n            .t('components.videoPlayer.qualityBadge.2160')\n            .toString(),\n          1440: this.intl\n            .t('components.videoPlayer.qualityBadge.1440')\n            .toString(),\n          1080: this.intl\n            .t('components.videoPlayer.qualityBadge.1080')\n            .toString(),\n          720: this.intl\n            .t('components.videoPlayer.qualityBadge.720')\n            .toString(),\n          576: this.intl\n            .t('components.videoPlayer.qualityBadge.576')\n            .toString(),\n          480: this.intl\n            .t('components.videoPlayer.qualityBadge.480')\n            .toString(),\n        },\n      },\n      speed: {\n        selected: 1,\n        options: [0.75, 1, 1.25, 1.5],\n      },\n      blankVideo: '',\n      listeners: {\n        play: () => {\n          // For some reason, this is triggered when user plays the video and pauses it.\n          // We need to check if the video is actually playing.\n          if(this.videoReady && this.videoService && !plyr.playing) {\n            this.videoService.pauseOtherVideos(null);\n          }\n        }\n      }\n    });\n\n    this.set('plyr', plyr);\n    this.set('videoReady', true);\n\n    this._updatePlyr();\n  },\n \n  _updatePlyr() {\n    if (this.get('type') === 'videos') {\n      this._plyrVideo();\n    }\n  },\n\n  _plyrVideo() {\n    const subtitles = this.get('subtitles');\n    const plyr = this.get('plyr');\n\n    plyr.on('enterfullscreen', (event) => {\n      document.body.classList.add('plyr-fullscreen');\n    });\n\n    plyr.on('exitfullscreen', (event) => {\n      document.body.classList.remove('plyr-fullscreen');\n    });\n\n    let tracks = null;\n    let activateSubs = false;\n\n    if (isArray(subtitles)) {\n      const len = subtitles.length;\n\n      tracks = [];\n\n      for (let i = 0; i < len; i++) {\n        let obj = subtitles[i];\n\n        //if (obj.default_state === true) {\n        activateSubs = true;\n        //}\n\n        tracks.push({\n          kind: 'subtitles',\n          label: obj.label,\n          srclang: obj.language,\n          src: obj.subtitle_url,\n          default: true, // obj.default_state\n        });\n      }\n    }\n\n    let name = this.get('name') || '';\n\n    plyr.source = {\n      type: 'video',\n      title: name,\n      sources: [{ src: this.get('source'), type: 'video/mp4' }],\n      poster: this.get('posterUrl'),\n      tracks: tracks,\n    };\n\n    if (activateSubs) {\n      plyr.captions.active = true;\n    }\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (eq this.type \\\"videos\\\")}}\\n\\n  <video\\n    controls\\n    preload\\n    playsinline=\\\"true\\\"\\n    crossorigin=\\\"anonymous\\\"\\n    class={{unless this.videoReady \\\"video-loading\\\"}}\\n  ></video>\\n\\n  {{#unless this.videoReady}}\\n\\n    <div class=\\\"video-placeholder--loader\\\">\\n      <DcLoader />\\n    </div>\\n\\n  {{/unless}}\\n\\n{{else if (eq this.type \\\"audios\\\")}}\\n\\n  <audio controls preload></audio>\\n\\n{{/if}}', { moduleName: 'babel/components/video-player/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.resource.isResolved}}\\n\\n  {{yield this.resource.value}}\\n\\n{{else if this.resource.isRejected}}\\n\\n  {{#if (has-block \\\"error\\\")}}\\n    {{yield this.resource.error to=\\\"error\\\"}}\\n  {{else}}\\n\\n    <XAlert data-test-wait-for-error-alert @variant=\\\"error\\\">\\n\\n      <p class=\\\"mb1\\\">\\n        {{t \\\"components.waitFor.errorAlertMessage\\\"}}\\n      </p>\\n\\n      <div class=\\\"flex justify-flex-end\\\">\\n\\n        <UiButton\\n          data-test-wait-for-retry-button\\n          @onClick={{this.resource.load}}\\n        >\\n          {{t \\\"components.waitFor.retryButtonLabel\\\"}}\\n        </UiButton>\\n\\n      </div>\\n    </XAlert>\\n\\n  {{/if}}\\n\\n{{else if this.resource.isPending}}\\n\\n  {{#if (has-block \\\"loading\\\")}}\\n    {{yield to=\\\"loading\\\"}}\\n  {{else}}\\n\\n    <DcLoader data-test-wait-for-loader />\\n\\n  {{/if}}\\n\\n{{/if}}\", {\"contents\":\"{{#if this.resource.isResolved}}\\n\\n  {{yield this.resource.value}}\\n\\n{{else if this.resource.isRejected}}\\n\\n  {{#if (has-block \\\"error\\\")}}\\n    {{yield this.resource.error to=\\\"error\\\"}}\\n  {{else}}\\n\\n    <XAlert data-test-wait-for-error-alert @variant=\\\"error\\\">\\n\\n      <p class=\\\"mb1\\\">\\n        {{t \\\"components.waitFor.errorAlertMessage\\\"}}\\n      </p>\\n\\n      <div class=\\\"flex justify-flex-end\\\">\\n\\n        <UiButton\\n          data-test-wait-for-retry-button\\n          @onClick={{this.resource.load}}\\n        >\\n          {{t \\\"components.waitFor.retryButtonLabel\\\"}}\\n        </UiButton>\\n\\n      </div>\\n    </XAlert>\\n\\n  {{/if}}\\n\\n{{else if this.resource.isPending}}\\n\\n  {{#if (has-block \\\"loading\\\")}}\\n    {{yield to=\\\"loading\\\"}}\\n  {{else}}\\n\\n    <DcLoader data-test-wait-for-loader />\\n\\n  {{/if}}\\n\\n{{/if}}\",\"moduleName\":\"babel/components/wait-for/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/wait-for/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport Component from '@glimmer/component';\n\nimport Resource from '../../utils/resource';\n\n/*\n\nimport Resource from '../../utils/resource';\n\nexport interface WaitForComponentArgs {\n  resource: Resource;\n}\n\n*/\n\nexport default class WaitForComponent extends Component {\n  get resource() {\n    const resource = this.args.resource;\n\n    assert(\n      `The @resource arg passed to <WaitFor> must be an instance of Resource. Got ${typeof resource}`,\n      resource instanceof Resource\n    );\n\n    return resource;\n  }\n}\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['word-browser'],\n\n  // PARAMS\n\n  words: null,\n\n  onPerform() {}\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { alias, and, equal } from '@ember/object/computed';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['word-browser-item'],\n\n  classNameBindings: [\n    'word.isDeleted:word-browser-item--deleted',\n    'isTransformedConcepts:word-browser-item-transformed-concepts'\n  ],\n\n  // PARAMS\n\n  word: null,\n\n  onPerform: null,\n\n  // PROPERTIES\n\n  isReadOnly: alias('word.wordlist.isReadOnly'),\n\n  isTransformed: alias('word.wordlist.isTransformed'),\n\n  isGlossary: equal('word.wordlist.type', 'glossaries'),\n\n  isConcepts: equal('word.wordlist.type', 'concepts'),\n\n  isTransformedGlossary: and('isTransformed', 'isGlossary'),\n\n  isTransformedConcepts: and('isTransformed', 'isConcepts'),\n\n  buttonClass: computed(\n    'isTransformedConcepts',\n    'isTransformedGlossary',\n    function() {\n      if (this.get('isTransformedGlossary')) {\n        return 'word-browser-item-glossary-button text-color';\n      }\n\n      return 'text-color';\n    }\n  ),\n\n  wordExplanationPopoverIsOpen: false,\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let (generate-id \\\"word-explanation-button\\\") as |id|}}\\n\\n  {{#ui-button\\n    id=id\\n    appearance=\\\"link\\\"\\n    active=this.wordExplanationPopoverIsOpen\\n    disabled=this.word.isDeleted\\n    class=this.buttonClass\\n    onClick=(action (mut this.wordExplanationPopoverIsOpen) true)\\n  }}\\n\\n    {{this.word.word}}\\n\\n  {{/ui-button}}\\n\\n  {{#if this.isTransformedGlossary}}\\n\\n    <div class=\\\"word-browser-item-translation\\\">\\n      <TbRenderInline @value={{this.word.translation}} />\\n    </div>\\n\\n  {{else if this.isTransformed}}\\n\\n    <div>\\n      <TbRenderInline @value={{this.word.explanation}} />\\n    </div>\\n\\n  {{/if}}\\n\\n  {{#if this.wordExplanationPopoverIsOpen}}\\n\\n    <WordExplanationPopup\\n      @word={{this.word}}\\n      @wordlist={{this.word.wordlist}}\\n      @for={{id}}\\n      @onClose={{set this \\\"wordExplanationPopoverIsOpen\\\" false}}\\n    />\\n\\n  {{/if}}\\n\\n{{/let}}\\n\\n{{#unless this.isReadOnly}}\\n\\n  {{#let (generate-id) as |id|}}\\n    {{#ui-button\\n      id=id\\n      appearance=\\\"link\\\"\\n      onClick=(action this.onPerform this.word \\\"edit\\\")\\n    }}\\n      <DcIcon @name=\\\"pen\\\" class=\\\"n1\\\" />\\n    {{/ui-button}}\\n\\n    {{#x-tooltip for=id}}\\n      {{t \\\"components.wordBrowser.item.performMenuButtonItems.edit\\\"}}\\n    {{/x-tooltip}}\\n  {{/let}}\\n{{/unless}}', { moduleName: 'babel/components/word-browser/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.words key=\\\"id\\\" as |word|}}\\n\\n  {{word-browser/item word=word onPerform=(action this.onPerform)}}\\n\\n{{/each}}', { moduleName: 'babel/components/word-browser/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-locked-scope class=\\\"word-detail\\\" active=@word.isDeleted}}\\n  {{#if (not-eq @hasBreadcrumb false)}}\\n    <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n      <breadcrumb.item as |item|>\\n        <item.link @route={{@wordlistIndexRouteName}}>\\n          {{t \\\"components.wordDetail.indexBreadcrumbItemLabel\\\"}}\\n        </item.link>\\n      </breadcrumb.item>\\n\\n      <breadcrumb.item as |item|>\\n        <item.link\\n          @route={{@wordlistShowRouteName}}\\n          @model={{@word.wordlist.id}}\\n        >\\n          {{@word.wordlist.name}}\\n        </item.link>\\n      </breadcrumb.item>\\n\\n      <breadcrumb.item @active={{true}}>\\n        <span class=\\\"line-height-base\\\">\\n          {{t\\n            \\\"components.wordDetail.activeBreadcrumbItemLabel\\\"\\n            isNew=@word.isNew\\n          }}\\n        </span>\\n      </breadcrumb.item>\\n    </XBreadcrumb>\\n  {{/if}}\\n\\n  {{#archive-form\\n    model=@word\\n    routed=@routed\\n    cancelRouteParams=(array @wordlistShowRouteName @word.wordlist.id)\\n    onDelete=(action (optional @onDelete))\\n    onCancel=(action (optional @onCancel))\\n    onSave=(action @onSave)\\n    as |form|\\n  }}\\n    <div class=\\\"mb1\\\">\\n      {{form.label \\\"word\\\" (t \\\"components.wordDetail.wordInputLabel\\\")}}\\n      {{form.input \\\"word\\\" autofocus=(unbound @word.isNew)}}\\n    </div>\\n\\n    {{#if (eq @word.wordlist.type \\\"glossaries\\\")}}\\n      <div class=\\\"mb1\\\">\\n        {{form.label\\n          \\\"translation\\\"\\n          (t \\\"components.wordDetail.translationInputLabel\\\")\\n        }}\\n        {{form.input \\\"translation\\\"}}\\n      </div>\\n    {{/if}}\\n\\n    <div>\\n      {{form.label\\n        \\\"explanation\\\"\\n        (t \\\"components.wordDetail.explanationEditorLabel\\\")\\n      }}\\n\\n      <XEditor\\n        @value={{form.object.explanation}}\\n        @capabilities={{hash textFormats=(array \\\"bold\\\" \\\"italic\\\")}}\\n        @onChange={{set form.object \\\"explanation\\\"}}\\n      />\\n    </div>\\n  {{/archive-form}}\\n{{/x-locked-scope}}', { moduleName: 'babel/components/word-detail/template.hbs' });\n","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport config from 'babel/config/environment';\nimport { computed as overridable } from 'compton/utils/computed-override';\n\n// FIXME\nfunction strip(html) {\n  if (!html) {\n    return '';\n  }\n  const doc = new DOMParser().parseFromString(html, 'text/html');\n  return doc.body.textContent || '';\n}\n\nexport default Component.extend({\n  classNames: ['word-explanation-box'],\n\n  languages: service(),\n\n  session: service(),\n\n  intl: service(),\n\n  // EXTERNAL PROPERTIES\n\n  word: null,\n\n  wordlist: null,\n\n  wordClass: null,\n\n  wordConstruction: null,\n\n  explanation: null,\n\n  examples: null,\n\n  translation: null,\n\n  canSave: false,\n\n  parentComponentLanguage: null,\n\n  exerciseLanguage: null,\n\n  // COMPUTED PROPERTIES\n\n  htmlSafeWordClass: computed('wordClass', function () {\n    return htmlSafe(this.wordClass);\n  }),\n\n  htmlSafeWordConstruction: computed('wordConstruction', function () {\n    return htmlSafe(this.wordConstruction);\n  }),\n\n  wordExplanationLanguage: computed(\n    'parentComponentLanguage',\n    'exerciseLanguage',\n    'wordlist.language',\n    'languages.contentLanguage',\n    function () {\n      const lang =\n        this.parentComponentLanguage ||\n        this.exerciseLanguage ||\n        this.get('wordlist.language') ||\n        this.get('languages.contentLanguage');\n      return lang;\n    }\n  ),\n\n  wordLanguage: computed(\n    'parentComponentLanguage',\n    'exerciseLanguage',\n    'wordlist.language',\n    'languages.contentLanguage',\n    function () {\n      const lang =\n        this.parentComponentLanguage ||\n        this.exerciseLanguage ||\n        this.get('wordlist.language') ||\n        this.get('languages.contentLanguage');\n      return lang;\n    }\n  ),\n\n  strippedExplanation: computed('explanation', function () {\n    return strip(this.explanation);\n  }),\n\n  tab: overridable('examples', 'explanation', 'translation', function () {\n    let selected_tab = 'examples';\n\n    if (this.strippedExplanation) {\n      selected_tab = 'explanation';\n    } else if (this.translation) {\n      selected_tab = 'translation';\n    }\n\n    return selected_tab;\n  }),\n\n  onClick(e) {\n    e.preventDefault();\n  },\n\n  readTextArray: computed(\n    'examples',\n    'explanation',\n    'session.user.language',\n    'tab',\n    'translation',\n    'word',\n    'wordClass',\n    'wordExplanationLanguage',\n    'wordLanguage',\n    function () {\n      const arr = [];\n\n      arr.push({\n        text: this.word + '. ',\n        // language: this.get('languages.contentLanguage')\n        language: this.wordLanguage,\n      });\n\n      if (this.explanation && this.tab === 'explanation') {\n        arr.push({\n          text: this.intl.t('components.wordExplanationBox.explanation') + ':',\n          language: this.get('session.user.language'),\n        });\n\n        arr.push({\n          text: this.explanation + '. ',\n          // language: this.get('languages.contentLanguage')\n          language: this.wordExplanationLanguage,\n        });\n      }\n\n      if (this.examples && this.tab === 'examples') {\n        arr.push({\n          text: this.intl.t('components.wordExplanationBox.examples') + ':',\n          language: this.get('session.user.language'),\n        });\n\n        arr.push({\n          text: this.examples + ':',\n          // language: this.get('languages.contentLanguage')\n          language: this.wordExplanationLanguage,\n        });\n      }\n\n      if (this.translation && this.tab === 'translation') {\n        arr.push({\n          text: this.intl.t('components.wordExplanationBox.translation') + ':',\n          language: this.get('session.user.language'),\n        });\n\n        arr.push({\n          text: this.translation + '.',\n          language: config.defaultLanguage,\n        });\n      }\n\n      return arr;\n    }\n  ),\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"word-explanation-header flex justify-space-between flex-start\\\">\\n\\n  <div class=\\\"word-explanation-header-content\\\">\\n\\n    <div class=\\\"word-explanation-heading flex text-secondary\\\">\\n\\n      {{this.word}}\\n      {{#if this.wordClass}}\\n        ({{this.htmlSafeWordClass}})\\n      {{/if}}\\n\\n    </div>\\n    {{#if this.wordConstruction}}\\n      <div\\n        class=\\\"text-small text-italic\\\"\\n      >{{this.htmlSafeWordConstruction}}</div>\\n    {{/if}}\\n  </div>\\n  {{simple-speech-player\\n    lang=this.wordExplanationLanguage\\n    playlist=this.readTextArray\\n  }}\\n\\n</div>\\n\\n{{#x-tab this.tab as |tab|}}\\n\\n  {{#if this.strippedExplanation}}\\n    {{#tab.pane \\\"explanation\\\" (t \\\"components.wordExplanationBox.explanation\\\")}}\\n      <ContentPresenter>\\n        <TbRenderInline @value={{this.explanation}} />\\n      </ContentPresenter>\\n    {{/tab.pane}}\\n  {{/if}}\\n\\n  {{#if this.examples}}\\n    {{#tab.pane \\\"examples\\\" (t \\\"components.wordExplanationBox.examples\\\")}}\\n      <ContentPresenter>\\n        <TbRenderInline @value={{this.examples}} />\\n      </ContentPresenter>\\n    {{/tab.pane}}\\n  {{/if}}\\n\\n  {{#if this.translation}}\\n    {{#tab.pane \\\"translation\\\" (t \\\"components.wordExplanationBox.translation\\\")}}\\n      <ContentPresenter>\\n        <TbRenderInline @value={{this.translation}} />\\n      </ContentPresenter>\\n    {{/tab.pane}}\\n  {{/if}}\\n\\n{{/x-tab}}\\n\\n{{#if this.canSave}}\\n  {{word-save\\n    word=this.word\\n    wordClass=this.wordClass\\n    wordConstruction=this.wordConstruction\\n    explanation=this.explanation\\n    examples=this.examples\\n    translation=this.translation\\n    class=\\\"mt2\\\"\\n  }}\\n{{/if}}', { moduleName: 'babel/components/word-explanation-box/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<XPopup ...attributes @for={{@for}} @onClose={{@onClose}}>\\n\\n  <WordExplanationBox\\n    class=\\\"p1\\\"\\n    @word={{@word.word}}\\n    @wordlist={{@wordlist}}\\n    @wordClass={{@word.word_class}}\\n    @wordConstruction={{@word.word_construction}}\\n    @explanation={{@word.explanation}}\\n    @examples={{@word.examples}}\\n    @translation={{@word.translation}}\\n  />\\n\\n</XPopup>\", {\"contents\":\"<XPopup ...attributes @for={{@for}} @onClose={{@onClose}}>\\n\\n  <WordExplanationBox\\n    class=\\\"p1\\\"\\n    @word={{@word.word}}\\n    @wordlist={{@wordlist}}\\n    @wordClass={{@word.word_class}}\\n    @wordConstruction={{@word.word_construction}}\\n    @explanation={{@word.explanation}}\\n    @examples={{@word.examples}}\\n    @translation={{@word.translation}}\\n  />\\n\\n</XPopup>\",\"moduleName\":\"babel/components/word-explanation-popup/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/word-explanation-popup/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\nimport shuffle from 'compton/utils/array-shuffle';\n\nconst STRIP_HTML_RX = /<[^>]*>?/gm;\nconst STRIP_PARENTHESES = / *\\([^)]*\\) */g;\n\nconst SYMBOLS = Object.freeze([\n  {\n    value: 'nbsp',\n    entity: '&nbsp;',\n    replacement: ' ',\n    charCode: 160,\n  },\n  {\n    value: 'narrownbsp',\n    entity: '&#8239;',\n    replacement: ' ',\n    charCode: 8239,\n  },\n  {\n    value: 'thinsp',\n    entity: '&thinsp;',\n    replacement: ' ',\n    charCode: 8201,\n  },\n  {\n    value: 'shy',\n    entity: '&shy;',\n    replacement: '',\n    charCode: 173,\n  },\n]);\n\nfunction fragmentFromString(strHTML) {\n  return document.createRange().createContextualFragment(strHTML);\n}\n\nfunction fragmentToString(fragment) {\n  const div = document.createElement('div');\n  div.appendChild(fragment);\n  return div.innerHTML;\n}\n\nfunction stripHtml(str) {\n  if (str) {\n    return str.replace(STRIP_HTML_RX, '');\n  }\n  return str;\n}\n\nfunction stripParentheses(str) {\n  if (str) {\n    return str.replace(STRIP_PARENTHESES, '');\n  }\n  return str;\n}\n\nfunction replaceInvisibleCharacters(str) {\n  SYMBOLS.forEach((symbol) => {\n    str = str.replaceAll(symbol.entity, symbol.replacement);\n    str = str.replaceAll(\n      new RegExp(String.fromCharCode(symbol.charCode), 'g'),\n      symbol.replacement\n    );\n  });\n\n  return str;\n}\n\nfunction replaceSymbols(str) {\n  const fragment = fragmentFromString(str);\n\n  Array.from(fragment.querySelectorAll('[data-type=\"symbol\"]')).forEach(\n    (element) => {\n      const symbol = SYMBOLS.findBy('value', element.dataset.value);\n      if (symbol) {\n        element.replaceWith(document.createTextNode(symbol.replacement));\n      }\n    }\n  );\n\n  return fragmentToString(fragment);\n}\n\nexport default Component.extend({\n  showResponse: service(),\n\n  userAgent: service(),\n\n  languages: service(),\n\n  // SETUP\n\n  tagName: '',\n\n  // PUBLIC\n\n  title: null,\n\n  words: null,\n\n  type: null,\n\n  onClose() {},\n\n  lang: null,\n\n  // PRIVATE\n\n  currentWordIndex: 0,\n\n  totalWords: null,\n\n  answerWithWord: false,\n\n  totalCorrectAnswers: 0,\n\n  wrongAnswer: false,\n\n  shuffledWords: null,\n\n  currentWord: null,\n\n  canContinue: false,\n\n  progress: 0,\n\n  done: false,\n\n  answer: null,\n\n  hasStarted: false,\n\n  // COMPUTED\n\n  translationLanguage: computed(\n    'lang', // Specific language for translation, probably passed in from wordlist's language...\n    'languages.contentLanguage',\n    function () {\n      const lang = this.get('lang') || this.get('languages.contentLanguage');\n      return lang;\n    }\n  ),\n\n  trainOnTranslations: computed('type', function () {\n    return this.get('type') === 'glossaries';\n  }),\n\n  correctAnswers: computed(\n    'currentWord.{word,translation}',\n    'trainOnTranslations',\n    'answerWithWord',\n    function () {\n      if (this.get('trainOnTranslations')) {\n        if (this.get('answerWithWord')) {\n          let word = this._stripWord(this.get('currentWord.word'));\n          return word.split(',');\n        } else {\n          let translation = this._stripWord(\n            this.get('currentWord.translation')\n          );\n          return translation.split(',');\n        }\n      } else {\n        let word = this._stripWord(this.get('currentWord.word'));\n        return word.split(',');\n      }\n    }\n  ),\n\n  noShuffledWords: computed('shuffledWords.[]', 'words.isPending', function () {\n    if (\n      this.get('shuffledWords.length') === 0 &&\n      !this.get('words.isPending')\n    ) {\n      return true;\n    }\n\n    return false;\n  }),\n\n  inputFocus: computed(\n    'userAgent.device.isDesktop',\n    'canContinue',\n    function () {\n      if (this.get('canContinue')) {\n        return false;\n      } else if (this.get('userAgent.device.isDesktop')) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n  ),\n\n  percentCorrect: computed('totalCorrectAnswers', function () {\n    return (this.get('totalCorrectAnswers') / this.get('totalWords')) * 100;\n  }),\n\n  percentDone: computed('progress', function () {\n    return (this.get('progress') / this.get('totalWords')) * 100;\n  }),\n\n  filteredWords: computed('type', 'words.[]', function () {\n    const words = this.get('words');\n    const type = this.get('type');\n\n    if (type === 'glossaries') {\n      return words.filterBy('translation');\n    } else if (type === 'concepts') {\n      return words.filterBy('explanation');\n    }\n\n    return [];\n  }),\n\n  totalWords: computed('filteredWords.[]', function () {\n    return this.get('filteredWords.length');\n  }),\n\n  // INIT\n\n  didReceiveAttrs() {\n    this._super(...arguments);\n    this._initQuiz();\n  },\n\n  _initQuiz() {\n    this.set('shuffledWords', shuffle(this.get('filteredWords').toArray()));\n    this.set('currentWord', this.get('shuffledWords.firstObject'));\n    this._setFocus();\n  },\n\n  // PRIVATE\n\n  _reset() {\n    this._initQuiz();\n\n    this.set('currentWordIndex', 0);\n    this.set('totalCorrectAnswers', 0);\n    this.set('progress', 0);\n    this.set('done', false);\n  },\n\n  _nextWord() {\n    this.incrementProperty('currentWordIndex');\n\n    this.set(\n      'currentWord',\n      this.get('shuffledWords').objectAt(this.get('currentWordIndex'))\n    );\n\n    if (this.get('currentWordIndex') === this.get('totalWords')) {\n      trackWordlistEvent('Träna: Klar');\n      this.set('done', true);\n    }\n\n    this.set('answer', '');\n    this.set('canContinue', false);\n    this.set('wrongAnswer', false);\n\n    this._setFocus();\n  },\n\n  _setFocus() {\n    later(() => {\n      const input = document.querySelector('.word-hearing--word-input-focus');\n\n      if (input) {\n        input.focus();\n      }\n    }, 200);\n  },\n\n  _normalizeString(string) {\n    return string.toLowerCase().trim();\n  },\n\n  _answer() {\n    let correct = false;\n\n    this.get('correctAnswers').forEach((answer) => {\n      if (\n        this._normalizeString(answer) ===\n        this._normalizeString(this.get('answer'))\n      ) {\n        correct = true;\n      }\n    });\n\n    if (correct) {\n      this.incrementProperty('totalCorrectAnswers');\n      this.showResponse.handleResponse('show-response-quiz', 'correct');\n    } else {\n      // WRONG\n      this.set('wrongAnswer', true);\n    }\n\n    this.incrementProperty('progress');\n    this.set('canContinue', true);\n    this.set('hasStarted', true);\n  },\n\n  _stripWord(str) {\n    str = replaceInvisibleCharacters(str);\n    str = replaceSymbols(str);\n    str = stripHtml(str);\n    str = stripParentheses(str);\n    return str;\n  },\n\n  actions: {\n    answer() {\n      trackWordlistEvent('Träna: Svarar');\n      this._answer();\n    },\n    nextWord() {\n      trackWordlistEvent('Träna: Nästa ord');\n      this._nextWord();\n    },\n    enter() {\n      if (this.get('canContinue')) {\n        this._nextWord();\n      } else {\n        this._answer();\n      }\n    },\n    restart() {\n      trackWordlistEvent('Träna: Starta om');\n      this._reset();\n    },\n    close() {\n      trackWordlistEvent('Träna: Avsluta');\n      this.get('onClose')();\n    },\n    switchType() {\n      if (!this.get('canContinue')) {\n        this.set('answer', '');\n        this._initQuiz();\n        this.toggleProperty('answerWithWord');\n      }\n    },\n  },\n});\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  tagName: '',\n\n  // EXTERNAL\n\n  title: null,\n\n  percentCorrect: 0,\n\n  totalCorrectAnswers: 0,\n\n  totalWords: 0\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"text-primary mb2\\\">{{this.title}}</div>\\n\\n<div>{{x-percentage-circle percent=this.percentCorrect}}</div>\\n\\n<div class=\\\"text-secondary mt1 mb1\\\">\\n  {{t\\n    \\\"components.wordQuiz.summary\\\"\\n    result=this.totalCorrectAnswers\\n    total=this.totalWords\\n  }}\\n</div>', { moduleName: 'babel/components/word-quiz/done/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\n\nexport default Component.extend({\n  intl: service(),\n\n  userAgent: service(),\n\n  classNames: ['word-quiz-quiz-component'],\n\n  // EXTERNAL\n\n  currentWord: null,\n\n  translationLanguage: null,\n\n  correctAnswers: null,\n\n  trainOnTranslations: false,\n\n  title: null,\n\n  answerWithWord: false,\n\n  wrongAnswer: null,\n\n  enter() {},\n\n  canContinue: false,\n\n  answer: null,\n\n  percentDone: 0,\n\n  hasStarted: false,\n\n  // INTERNAL\n\n  showBetaInfo: false,\n\n  defaultUserLang: 'sv_SE',\n\n  // COMPUTED\n\n  questionLabel: computed('trainOnTranslations', 'answerWithWord', function () {\n    if (this.trainOnTranslations) {\n      if (this.answerWithWord) {\n        return this.intl.t('components.wordQuiz.quiz.translation');\n      } else {\n        return this.intl.t('components.wordQuiz.quiz.word');\n      }\n    } else {\n      return this.intl.t('components.wordQuiz.quiz.explanation');\n    }\n  }),\n\n  question: computed(\n    'answerWithWord',\n    'currentWord.{explanation,translation,word}',\n    'trainOnTranslations',\n    function () {\n      let question;\n\n      if (this.trainOnTranslations) {\n        if (this.answerWithWord) {\n          question = this.get('currentWord.translation');\n        } else {\n          question = this.get('currentWord.word');\n        }\n      } else {\n        if (this.get('currentWord.explanation')) {\n          question = this.get('currentWord.explanation').replace(\n            new RegExp(this.get('currentWord.word'), 'ig'),\n            this.intl.t('components.wordQuiz.quiz.replaceWord')\n          );\n        }\n      }\n\n      if (!question) return null;\n\n      return question;\n    }\n  ),\n\n  answerLabel: computed('trainOnTranslations', 'answerWithWord', function () {\n    if (this.trainOnTranslations) {\n      if (this.answerWithWord) {\n        return this.intl.t('components.wordQuiz.quiz.word');\n      } else {\n        return this.intl.t('components.wordQuiz.quiz.translation');\n      }\n    } else {\n      return this.intl.t('components.wordQuiz.quiz.word');\n    }\n  }),\n\n  correctAnswersString: computed('correctAnswers.length', function () {\n    let correctAnswersString;\n\n    if (this.get('correctAnswers.length') > 0) {\n      correctAnswersString = this.correctAnswers.join(', ');\n    } else {\n      correctAnswersString = this.correctAnswers;\n    }\n\n    return htmlSafe(correctAnswersString);\n  }),\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"wordlist-hearing--heading p1\\\">\\n\\n  <div class=\\\"wordlist-hearing--heading-text text-primary\\\">\\n    {{this.title}}\\n  </div>\\n\\n  <div class=\\\"nt1\\\">\\n    {{t \\\"components.wordQuiz.quiz.practiceOnWords\\\"}}\\n  </div>\\n\\n</div>\\n\\n<div class=\\\"p1 flex-grow\\\">\\n\\n  <div class=\\\"word-type-label nb1\\\">{{this.questionLabel}}</div>\\n\\n  <div class=\\\"flex flex-center mb1\\\">\\n\\n    <div class=\\\"wordlist-hearing--word flex-expand\\\">\\n      {{html-safe this.question}}\\n    </div>\\n\\n    {{simple-speech-player\\n      value=this.question\\n      lang=(if\\n        this.answerWithWord this.defaultUserLang this.translationLanguage\\n      )\\n    }}\\n\\n  </div>\\n\\n  <div class=\\\"divider position-relative\\\">\\n    {{#if (and this.trainOnTranslations (not this.hasStarted))}}\\n      <div class=\\\"word-quiz-switch\\\" {{action this.switchType}}>\\n        <DcIcon @name=\\\"swap-vertical\\\" />\\n      </div>\\n    {{/if}}\\n  </div>\\n\\n  <div class=\\\"word-type-label mt1 nb1\\\">{{this.answerLabel}}</div>\\n\\n  <div class=\\\"flex flex-center mb1\\\">\\n\\n    <Input\\n      class={{concat\\n        \\\"wordlist-hearing--word word-hearing--word-input word-hearing--word-input-focus \\\"\\n        (if this.wrongAnswer \\\"wrong\\\" \\\"correct\\\")\\n      }}\\n      @enter={{action this.enter}}\\n      autofocus={{this.userAgent.device.isDesktop}}\\n      readonly={{this.canContinue}}\\n      @value={{this.answer}}\\n      placeholder={{t \\\"components.wordQuiz.quiz.inputPlaceholder\\\"}}\\n    />\\n\\n    {{simple-speech-player\\n      value=this.answer\\n      lang=(if\\n        this.answerWithWord this.translationLanguage this.defaultUserLang\\n      )\\n    }}\\n\\n  </div>\\n\\n  {{#if this.wrongAnswer}}\\n    <span class=\\\"text-color-error\\\">{{t \\\"components.wordQuiz.quiz.wrongAnswer\\\"}}\\n    </span>\\n    {{this.correctAnswersString}}\\n  {{/if}}\\n\\n  <ShowResponse id=\\\"show-response-quiz\\\" />\\n\\n  {{ui-progress this.percentDone class=\\\"mt3\\\"}}\\n\\n</div>', { moduleName: 'babel/components/word-quiz/quiz/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#x-modal\\n  closeButton=false\\n  headerDivider=false\\n  closeOnEscape=false\\n  locked=true\\n  onClose=this.onClose\\n  size=(hash width=\\\"medium\\\" height=\\\"auto\\\")\\n  as |modal|\\n}}\\n\\n  {{#if this.noShuffledWords}}\\n\\n    {{#modal.content class=\\\"p1\\\"}}\\n\\n      {{t\\n        (concat \\\"components.wordQuiz.noWordsMessage.\\\" this.type)\\n        htmlSafe=true\\n      }}\\n\\n    {{/modal.content}}\\n\\n    {{#modal.footer class=\\\"justify-space-between\\\"}}\\n\\n      {{#ui-button\\n        appearance=\\\"link\\\"\\n        variant=\\\"error\\\"\\n        class=\\\"text-ui\\\"\\n        onClick=(action \\\"close\\\")\\n      }}\\n        {{t \\\"components.wordQuiz.cancel\\\"}}\\n      {{/ui-button}}\\n\\n    {{/modal.footer}}\\n\\n  {{else if this.shuffledWords}}\\n\\n    {{#unless this.done}}\\n\\n      {{#modal.content}}\\n\\n        {{word-quiz/quiz\\n          currentWord=this.currentWord\\n          hasStarted=this.hasStarted\\n          translationLanguage=this.translationLanguage\\n          correctAnswers=this.correctAnswers\\n          trainOnTranslations=this.trainOnTranslations\\n          title=this.title\\n          answerWithWord=this.answerWithWord\\n          wrongAnswer=this.wrongAnswer\\n          enter=(action \\\"enter\\\")\\n          canContinue=this.canContinue\\n          answer=this.answer\\n          percentDone=this.percentDone\\n          switchType=(action \\\"switchType\\\")\\n        }}\\n\\n      {{/modal.content}}\\n\\n      {{#modal.footer class=\\\"justify-space-between\\\"}}\\n\\n        {{#ui-button\\n          appearance=\\\"link\\\"\\n          variant=\\\"error\\\"\\n          class=\\\"text-ui\\\"\\n          onClick=(action \\\"close\\\")\\n        }}\\n          {{t \\\"components.wordQuiz.cancel\\\"}}\\n        {{/ui-button}}\\n\\n        {{#unless this.canContinue}}\\n\\n          {{#ui-button\\n            variant=\\\"success\\\"\\n            disabled=(not this.answer)\\n            onClick=(action \\\"answer\\\")\\n          }}\\n            {{t \\\"components.wordQuiz.answer\\\"}}\\n          {{/ui-button}}\\n\\n        {{else}}\\n\\n          {{#ui-button\\n            variant=\\\"default\\\"\\n            disabled=(not this.answer)\\n            onClick=(action \\\"nextWord\\\")\\n          }}\\n            {{t \\\"components.wordQuiz.next\\\"}}\\n          {{/ui-button}}\\n\\n        {{/unless}}\\n\\n      {{/modal.footer}}\\n\\n    {{else}}\\n\\n      {{#modal.content class=\\\"p1 text-center\\\"}}\\n\\n        {{word-quiz/done\\n          title=this.title\\n          percentCorrect=this.percentCorrect\\n          totalCorrectAnswers=this.totalCorrectAnswers\\n          totalWords=this.totalWords\\n        }}\\n\\n      {{/modal.content}}\\n\\n      {{#modal.footer class=\\\"justify-space-between\\\"}}\\n\\n        {{#ui-button\\n          appearance=\\\"link\\\"\\n          variant=\\\"error\\\"\\n          class=\\\"text-ui\\\"\\n          onClick=(action \\\"close\\\")\\n        }}\\n          {{t \\\"components.wordQuiz.cancel\\\"}}\\n        {{/ui-button}}\\n\\n        {{#ui-button variant=\\\"default\\\" onClick=(action \\\"restart\\\")}}\\n          {{t \\\"components.wordQuiz.restart\\\"}}\\n        {{/ui-button}}\\n\\n      {{/modal.footer}}\\n\\n    {{/unless}}\\n\\n  {{else}}\\n\\n    <DcLoader class=\\\"my3\\\" />\\n\\n  {{/if}}\\n\\n{{/x-modal}}', { moduleName: 'babel/components/word-quiz/template.hbs' });\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { sendEvent } from '@ember/object/events';\nimport { inject as service } from '@ember/service';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\nimport { computed as overridable } from 'compton/utils/computed-override';\nimport DS from 'ember-data';\nimport { storageFor } from 'ember-local-storage';\nimport { all } from 'rsvp';\n\nconst { PromiseArray } = DS;\n\nexport default Component.extend({\n  // SETUP\n\n  snackbar: service(),\n\n  session: service(),\n\n  contextHelper: service(),\n\n  store: service(),\n\n  intl: service(),\n\n  wordlist: service(),\n\n  missionMode: service(),\n\n  favWordlists: storageFor('wordlists'),\n\n  // PARAMS\n\n  word: null,\n\n  wordClass: null,\n\n  wordConstruction: null,\n\n  explanation: null,\n\n  examples: null,\n\n  translation: null,\n\n  wordSaved: false,\n\n  // PROPERTIES\n\n  wordlists: computed(\n    'session.user.id',\n    'contextHelper.activeBook',\n    function () {\n      const promise = this.store.findAll('wordlist').then((wordlists) =>\n        all(\n          wordlists.map((wordlist) =>\n            all([wordlist.get('books'), wordlist.get('contents')])\n          )\n        ).then(() =>\n          wordlists\n            .filter((wordlist) =>\n              wordlist.hasBook(this.get('contextHelper.activeBook'))\n            )\n            .filter((wordlist) => wordlist.isUser(this.get('session.user')))\n            .sortBy('created')\n            .reverse()\n        )\n      );\n\n      return PromiseArray.create({ promise });\n    }\n  ),\n\n  contentWordLists: computed(\n    'wordlists.[]',\n    'contextHelper.activeContent.id',\n    function () {\n      const currentEntityId = this.get('contextHelper.activeContent.id');\n\n      return this.wordlists.filter((wordlist) => {\n        return (\n          wordlist\n            .get('contents')\n            .map((x) => x.get('id'))\n            .indexOf(currentEntityId) !== -1\n        );\n      });\n    }\n  ),\n\n  selectedWordlist: overridable(\n    'contentWordLists.[]',\n    'favWordlists.[]',\n    function () {\n      const contentWordLists = this.contentWordLists;\n      const favWordlists = this.favWordlists;\n\n      if (favWordlists && contentWordLists) {\n        const wordlistIds = contentWordLists.map((list) => list.get('id'));\n        let favListId;\n\n        favWordlists.forEach((listId) => {\n          if (wordlistIds.indexOf(listId) !== -1) {\n            favListId = listId;\n          }\n        });\n\n        if (favListId) {\n          return contentWordLists.find((list) => list.get('id') === favListId);\n        }\n      }\n\n      if (contentWordLists && contentWordLists.length > 0) {\n        return contentWordLists.get('firstObject');\n      }\n\n      return null;\n    }\n  ),\n\n  relatedWordLists: computed(\n    'wordlists.[]',\n    'contentWordLists.[]',\n    function () {\n      const contentWordLists = this.contentWordLists;\n\n      return this.wordlists.filter((wordlist) => {\n        return contentWordLists.indexOf(wordlist) === -1;\n      });\n    }\n  ),\n\n  wordlistOptions: computed(\n    'contentWordLists.[]',\n    'relatedWordLists.[]',\n    function () {\n      const contentWordLists = this.contentWordLists.map((wordlist) => {\n        return { value: wordlist, label: wordlist.get('name') };\n      });\n      const relatedWordLists = this.relatedWordLists.map((wordlist) => {\n        return { value: wordlist, label: wordlist.get('name') };\n      });\n\n      const wordlistOptions = [].concat(contentWordLists);\n\n      if (contentWordLists.length > 0 && relatedWordLists.length > 0) {\n        wordlistOptions.push({ type: 'divider' });\n      }\n\n      return wordlistOptions.concat(relatedWordLists);\n    }\n  ),\n\n  // ACTIONS\n\n  actions: {\n    changeWordlist(wordlist) {\n      const favWordlists = this.favWordlists;\n      const contentWordLists = this.contentWordLists;\n\n      if (contentWordLists) {\n        contentWordLists.forEach((list) => {\n          favWordlists.removeObject(list.get('id'));\n        });\n      }\n\n      favWordlists.addObject(wordlist.get('id'));\n      trackWordlistEvent('Välj ordlista via innehåll');\n    },\n\n    handleFormSubmit() {\n      const book = this.get('contextHelper.activeBook');\n      const content = this.get('contextHelper.activeContent');\n      const user = this.get('session.user');\n      let selectedWordlist = this.selectedWordlist;\n\n      if (!selectedWordlist) {\n        const { explanation, translation } = this.getProperties(\n          'explanation',\n          'translation'\n        );\n\n        const lang = book.get('body.language');\n        let type = 'glossaries';\n\n        if (explanation && !translation) {\n          type = 'concepts';\n        } else if (translation && !explanation) {\n          type = 'glossaries';\n        } else if (lang === 'sv_SE') {\n          type = 'concepts';\n        }\n\n        const name = content.get('heading')\n          ? this.intl.t('components.wordSave.wordExplanation.listName', {\n              title: content.get('title'),\n            })\n          : book.get('title');\n\n        selectedWordlist = this.store.createRecord('wordlist', {\n          books: [book],\n          language: lang,\n          user: user,\n          name: name,\n          type,\n          public: this.get('session.user.role') === 'student',\n        });\n\n        this.set('selectedWordlist', selectedWordlist);\n      }\n\n      selectedWordlist\n        .get('contents')\n        .addObject(this.get('contextHelper.activeContent'));\n\n      const wordlistWasNew = selectedWordlist.get('isNew');\n\n      return selectedWordlist\n        .save()\n        .then(() => {\n          if (wordlistWasNew) {\n            trackWordlistEvent('Skapa via innehåll');\n          }\n\n          const newWord = this.store.createRecord('word', {\n            wordlist: selectedWordlist,\n            ...this.getProperties(\n              'word',\n              'wordClass',\n              'wordConstruction',\n              'explanation',\n              'examples',\n              'translation'\n            ),\n          });\n\n          return newWord.save().then(() => {\n            trackWordlistEvent('Lägg till ord via innehåll');\n\n            this.set('wordSaved', true);\n\n            sendEvent(this.wordlist, 'refresh');\n\n            this.snackbar.enqueue(\n              this.intl.t(\n                'components.wordSave.wordExplanation.wordSavedMessage'\n              ),\n              {\n                variant: 'success',\n                autoDismiss: true,\n              }\n            );\n          });\n        })\n        .then(() =>\n          this.missionMode.addIncludedWordlistIfNeeded(selectedWordlist)\n        )\n\n        .catch(() => {\n          this.snackbar.enqueue(\n            this.intl.t(\n              'components.wordSave.wordExplanation.wordNotSavedMessage'\n            ),\n            {\n              variant: 'error',\n            }\n          );\n        });\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.wordSaved}}\\n\\n  <div class=\\\"flex flex-center mt2 justify-space-between\\\">\\n    <UiLink\\n      @route=\\\"master.contents.wordlists.show\\\"\\n      @model={{this.selectedWordlist.id}}\\n    >\\n      {{t\\n        \\\"components.wordSave.wordExplanation.savedTo\\\"\\n        list=this.selectedWordlist.name\\n      }}\\n    </UiLink>\\n    <div class=\\\"word-explanation-saved flex flex-center justify-center ml1\\\">\\n      <DcIcon @name=\\\"check-circle\\\" @size=\\\"lg\\\" class=\\\"text-color-success\\\" />\\n    </div>\\n  </div>\\n\\n{{else}}\\n\\n  {{#ui-form\\n    class=(concat\\n      \\\"flex flex-center mt2 justify-\\\"\\n      (if\\n        (or this.wordlists.isPending this.wordlists) \\\"space-between\\\" \\\"flex-end\\\"\\n      )\\n    )\\n    onSubmit=(action \\\"handleFormSubmit\\\")\\n    as |form|\\n  }}\\n\\n    {{#if this.wordlists.isPending}}\\n\\n      <div class=\\\"flex-shrink\\\">\\n        <DcLoader @size=\\\"xsmall\\\" />\\n      </div>\\n\\n    {{else if this.wordlists}}\\n\\n      {{x-select\\n        class=\\\"nr1 flex\\\"\\n        stretch=true\\n        value=this.selectedWordlist\\n        items=this.wordlistOptions\\n        placeholder=(t \\\"components.wordSave.wordExplanation.addPlaceholder\\\")\\n        onChange=(action \\\"changeWordlist\\\")\\n      }}\\n\\n    {{/if}}\\n\\n    {{#ui-button\\n      type=\\\"submit\\\"\\n      variant=\\\"success\\\"\\n      loading=form.isSubmitting\\n      disabled=(if (and this.wordlists (not this.selectedWordlist)) true false)\\n    }}\\n\\n      {{t \\\"components.wordSave.save\\\"}}\\n\\n    {{/ui-button}}\\n\\n  {{/ui-form}}\\n\\n{{/if}}', { moduleName: 'babel/components/word-save/template.hbs' });\n","import Component from '@ember/component';\n\nexport default Component.extend({\n  // SETUP\n\n  classNames: ['wordlist-browser'],\n\n  // PARAMS\n\n  wordlists: null,\n\n  disabledWordlists: null,\n\n  highlightedWordlist: null,\n\n  showRouteName: null,\n\n  unlinkable: false,\n\n  onPerform() {}\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\nimport { scrollIntoViewIfNeeded } from 'compton/utils/dom';\n\nconst PUBLISH = 'publish';\nconst UNPUBLISH = 'unpublish';\nconst DUPLICATE = 'duplicate';\nconst ADD_WORD = 'add_word';\nconst QUIZ = 'quiz';\nconst EDIT = 'edit';\nconst UNLINK = 'unlink';\nconst DELETE = 'delete';\n\nexport default Component.extend({\n  // SETUP\n\n  session: service(),\n\n  intl: service(),\n\n  wordlistDispatcher: service(),\n\n  classNames: ['wordlist-browser-item'],\n\n  classNameBindings: ['isHighlighted:wordlist-browser-item--highlighted'],\n\n  // PARAMS\n\n  wordlist: null,\n\n  selectedWordlist: null,\n\n  disabledWordlists: null,\n\n  unlinkable: null,\n\n  showRouteName: null,\n\n  onPerform: null,\n\n  // PROPERTIES\n\n  isDisabled: computed(\n    'wordlist.{isDeleted,isBusy}',\n    'disabledWordlists.[]',\n    function () {\n      const wordlist = this.wordlist;\n\n      if (wordlist.get('isDeleted') || wordlist.get('isBusy')) {\n        return true;\n      }\n\n      const disabledWordlists = this.disabledWordlists;\n\n      return disabledWordlists && disabledWordlists.includes(wordlist);\n    }\n  ),\n\n  isHighlighted: computed(\n    'wordlist',\n    'wordlistDispatcher.highlightedWordlists.[]',\n    function () {\n      return this.wordlistDispatcher.highlightedWordlists.includes(\n        this.wordlist\n      );\n    }\n  ),\n\n  performMenuButtonItems: computed(\n    'intl.locale',\n    'wordlist.{isReadOnly,isPublished,isQuizable}',\n    'unlinkable',\n    'session.user.{isTeacher,isTestUser}',\n    function () {\n      const t = (value) => {\n        return this.intl.t(\n          [\n            'components',\n            'wordlistBrowser',\n            'item',\n            'performMenuButtonItems',\n            camelize(value),\n          ].join('.')\n        );\n      };\n\n      const { isReadOnly, isPublished, isQuizable } =\n        this.wordlist.getProperties('isReadOnly', 'isPublished', 'isQuizable');\n\n      const user = this.get('session.user');\n\n      const items = [];\n\n      if (isReadOnly) {\n        items.addObject({\n          value: QUIZ,\n          label: t(QUIZ),\n          disabled: !isQuizable,\n        });\n\n        items.addObject({\n          value: DUPLICATE,\n          label: t(DUPLICATE),\n        });\n      } else {\n        items.addObject({\n          value: ADD_WORD,\n          label: t(ADD_WORD),\n        });\n\n        items.addObject({\n          value: QUIZ,\n          label: t(QUIZ),\n          disabled: !isQuizable,\n        });\n\n        items.addObjects([\n          {\n            type: 'divider',\n          },\n          {\n            value: EDIT,\n            label: t(EDIT),\n          },\n        ]);\n\n        if (user.get('isTeacher') || user.get('isTestUser')) {\n          if (isPublished) {\n            items.addObject({\n              value: UNPUBLISH,\n              label: t(UNPUBLISH),\n            });\n          } else {\n            items.addObject({\n              value: PUBLISH,\n              label: t(PUBLISH),\n            });\n          }\n        }\n\n        if (this.unlinkable) {\n          items.addObject({\n            value: UNLINK,\n            label: t(UNLINK),\n            variant: 'error',\n          });\n        }\n\n        items.addObject({\n          value: DELETE,\n          label: t(DELETE),\n          variant: 'error',\n        });\n      }\n\n      return items;\n    }\n  ),\n\n  didRender() {\n    this._super(...arguments);\n    if (this.isHighlighted) {\n      scrollIntoViewIfNeeded(this.element);\n    }\n  },\n\n  actions: {\n    trackClick() {\n      trackWordlistEvent(\n        'Öppna ordlista från Ordlistor',\n        this.wordlist?.isReadOnly\n      );\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-center\\\">\\n\\n  {{#if this.wordlist.isReadOnly}}\\n\\n    {{#if this.wordlist.user}}\\n      <XAwait @value={{this.wordlist.user}} as |wordlistUser|>\\n        <DcAvatar class=\\\"nr1\\\" @user={{wordlistUser}} />\\n      </XAwait>\\n\\n    {{else}}\\n\\n      <div class=\\\"wordlist-browser-item-author nr1\\\">\\n        <DcIcon @name=\\\"glossaries\\\" />\\n      </div>\\n\\n    {{/if}}\\n\\n  {{/if}}\\n\\n  <div>\\n    <UiLink\\n      @route={{this.showRouteName}}\\n      @model={{this.wordlist.id}}\\n      class=\\\"text-quarternary\\\"\\n      @disabled={{this.isDisabled}}\\n      data-test-workspace-wordlist-link\\n      {{on \\\"click\\\" (action \\\"trackClick\\\")}}\\n    >\\n\\n      {{this.wordlist.titleWithFallback}}\\n\\n    </UiLink>\\n\\n    <div class=\\\"text-small text-muted\\\">\\n      {{t\\n        \\\"components.wordlistBrowser.item.numWords\\\"\\n        num=this.wordlist.words.length\\n      }}\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=\\\"flex flex-center\\\">\\n\\n  {{#unless this.wordlist.isPublished}}\\n\\n    {{#x-badge class=\\\"ml1\\\" size=\\\"small\\\"}}\\n\\n      {{t \\\"components.wordlistBrowser.item.draftBadgeLabel\\\"}}\\n\\n    {{/x-badge}}\\n\\n  {{/unless}}\\n\\n  {{#x-menu-button\\n    class=\\\"ml1 text-color-default\\\"\\n    appearance=\\\"bulb\\\"\\n    displayArrowIcon=false\\n    disabled=this.isDisabled\\n    items=this.performMenuButtonItems\\n    onChange=(action this.onPerform this.wordlist)\\n  }}\\n\\n    <DcIcon @name=\\\"menu-dots\\\" />\\n\\n  {{/x-menu-button}}\\n\\n</div>\\n', { moduleName: 'babel/components/wordlist-browser/item/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#each this.wordlists key=\\\"id\\\" as |wordlist|}}\\n\\n  {{wordlist-browser/item\\n    wordlist=wordlist\\n    disabledWordlists=this.disabledWordlists\\n    unlinkable=this.unlinkable\\n    showRouteName=this.showRouteName\\n    onPerform=(action this.onPerform)\\n  }}\\n\\n{{/each}}', { moduleName: 'babel/components/wordlist-browser/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ChooseModal\\n  data-test-wordlist-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.wordlistChooseModal.title\\\"}}\\n  @count={{this.pickedWordlists.length}}\\n  @onChoose={{fn this.onChoose this.pickedWordlists}}\\n  @onDelete={{fn this.handleDelete this.pickedWordlists}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.wordlists}}\\n      @query={{this.query}}\\n      @mode=\\\"list\\\"\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.wordlistChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.wordlistChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedWordlists|\\n    >\\n\\n      <WordlistPicker\\n        @wordlists={{collatedWordlists}}\\n        @pickedWordlists={{this.pickedWordlists}}\\n        @disabledWordlists={{@disabledWordlists}}\\n        @onPick={{this.handleWordlistPickerPick}}\\n        @onUnpick={{this.handleWordlistPickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\", {\"contents\":\"<ChooseModal\\n  data-test-wordlist-choose-modal\\n  ...attributes\\n  @title={{t \\\"components.wordlistChooseModal.title\\\"}}\\n  @count={{this.pickedWordlists.length}}\\n  @onChoose={{fn this.onChoose this.pickedWordlists}}\\n  @onDelete={{fn this.handleDelete this.pickedWordlists}}\\n  @onClose={{@onClose}}\\n>\\n\\n  <WaitFor @resource={{this.resource}} as |data|>\\n\\n    <AdditionCollator\\n      @additions={{data.wordlists}}\\n      @query={{this.query}}\\n      @mode=\\\"list\\\"\\n      @scrollToTopOnQuery={{true}}\\n      @emptytMessage={{t\\n        \\\"components.wordlistChooseModal.additionCollatorEmptyMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @noResultMessage={{t\\n        \\\"components.wordlistChooseModal.additionCollatorNoResultMessage\\\"\\n        htmlSafe=true\\n      }}\\n      @onQuery={{this.handleAdditionCollatorQuery}}\\n      as |collatedWordlists|\\n    >\\n\\n      <WordlistPicker\\n        @wordlists={{collatedWordlists}}\\n        @pickedWordlists={{this.pickedWordlists}}\\n        @disabledWordlists={{@disabledWordlists}}\\n        @onPick={{this.handleWordlistPickerPick}}\\n        @onUnpick={{this.handleWordlistPickerUnpick}}\\n      />\\n\\n    </AdditionCollator>\\n\\n  </WaitFor>\\n\\n</ChooseModal>\",\"moduleName\":\"babel/components/wordlist-choose-modal/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/wordlist-choose-modal/index.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nimport Resource from '../../utils/resource';\n\n/*\n\nimport WordlistModel from 'babel/models/wordlist';\n\nexport interface WordlistChooseModalComponentArgs {\n  disabledWordlists: WordlistModel[];\n  onChoose(pickedWordlists: WordlistModel[]): void;\n  onClose(): void;\n}\n\n*/\nconst QUERY = {\n  bookId: null,\n  search: '',\n  page: 1,\n};\n\nexport default class WordlistChooseModalComponent extends Component {\n  @service store;\n  @service session;\n  @service wordlistDispatcher;\n\n  @tracked pickedWordlists = [];\n  @tracked query = QUERY;\n\n  resource = new Resource(async () => {\n    return {\n      wordlists: (await this.store.findAll('wordlist')).filterBy(\n        'userId',\n        this.session.user.id\n      ),\n    };\n  });\n\n  get onChoose() {\n    const onChoose = this.args.onChoose;\n\n    assert(\n      `The @onChoose arg passed to <WordlistChooseModal> must be a function. Got ${typeof onChoose}`,\n      typeof onChoose === 'function'\n    );\n\n    return onChoose;\n  }\n\n  @action\n  handleAdditionCollatorQuery(query) {\n    this.query = query;\n    this.pickedWordlists.clear();\n  }\n\n  @action\n  handleWordlistPickerPick(file) {\n    this.pickedWordlists.addObject(file);\n  }\n\n  @action\n  handleWordlistPickerUnpick(file) {\n    this.pickedWordlists.removeObject(file);\n  }\n\n  @action\n  async handleDelete(wordlists) {\n    await this.wordlistDispatcher.deleteMany(wordlists);\n    this.pickedWordlists.clear();\n  }\n}\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nconst GLOSSARIES = 'glossaries';\nconst CONCEPTS = 'concepts';\n\nexport default Component.extend({\n  // SETUP\n\n  router: service(),\n\n  intl: service(),\n\n  classNames: ['wordlist-detail'],\n\n  // PARAMS\n\n  wordlist: null,\n\n  indexRouteName: null,\n\n  showRouteName: null,\n\n  onSave() {},\n\n  onDelete() {},\n\n  // PROPERTIES\n\n  typeRadioButtonGroupItems: computed('intl.locale', function() {\n    const t = (value, property) => {\n      return this.get('intl').t(\n        [\n          'components',\n          'wordlistDetail',\n          'typeRadioButtonGroupItems',\n          value,\n          property\n        ].join('.')\n      );\n    };\n\n    return [GLOSSARIES, CONCEPTS].map((value) => {\n      return {\n        value,\n        label: t(value, 'label'),\n        description: t(value, 'description')\n      };\n    });\n  }),\n\n  actions: {\n    handleCancel() {\n      const params = this.wordlist.isNew\n        ? [this.indexRouteName]\n        : [this.showRouteName, this.wordlist.id];\n\n        return this.router.transitionTo(...params);\n    }\n  }\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if @hasBreadcrumb}}\\n\\n  <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n    <breadcrumb.item as |item|>\\n      <item.link @route={{this.indexRouteName}}>\\n        {{t \\\"components.wordlistDetail.indexBreadcrumbItemLabel\\\"}}\\n      </item.link>\\n    </breadcrumb.item>\\n\\n    {{#unless this.wordlist.isNew}}\\n      <breadcrumb.item as |item|>\\n        <item.link @route={{this.showRouteName}} @model={{this.wordlist.id}}>\\n          {{this.wordlist.nameWithFallback}}\\n        </item.link>\\n      </breadcrumb.item>\\n    {{/unless}}\\n\\n    <breadcrumb.item @active={{true}}>\\n      <span class=\\\"line-height-base\\\">\\n        {{t\\n          \\\"components.wordlistDetail.activeBreadcrumbItemLabel\\\"\\n          isNew=this.wordlist.isNew\\n        }}\\n      </span>\\n    </breadcrumb.item>\\n  </XBreadcrumb>\\n\\n{{/if}}\\n\\n{{#x-locked-scope active=this.wordlist.isDeleted}}\\n\\n  {{#ui-form-for this.wordlist onSubmit=(action this.onSave true) as |form|}}\\n\\n    <div class=\\\"mb1\\\">\\n\\n      {{form.label \\\"name\\\" (t \\\"components.wordlistDetail.nameInputLabel\\\")}}\\n\\n      {{form.input \\\"name\\\" autofocus=(unbound this.wordlist.isNew)}}\\n\\n    </div>\\n\\n    <div class=\\\"mb1\\\">\\n\\n      {{form.label\\n        \\\"type\\\"\\n        (t \\\"components.wordlistDetail.typeRadioButtonGroupLabel\\\")\\n      }}\\n\\n      {{#form.radio-button-group\\n        \\\"type\\\"\\n        this.typeRadioButtonGroupItems\\n        align=\\\"start\\\"\\n        as |item|\\n      }}\\n\\n        <div class=\\\"text-bold\\\">\\n\\n          {{item.label}}\\n\\n        </div>\\n\\n        {{item.description}}\\n\\n      {{/form.radio-button-group}}\\n\\n    </div>\\n\\n    <div class=\\\"mb1\\\">\\n\\n      {{form.label\\n        \\\"language\\\"\\n        (t \\\"components.wordlistDetail.languageSelectLabel\\\")\\n      }}\\n\\n      {{form.select \\\"language\\\" (language-items) stretch=true}}\\n\\n    </div>\\n\\n    <div\\n      class=\\\"flex\\n        {{if\\n          (unbound this.wordlist.isNew)\\n          \\'justify-flex-end\\'\\n          \\'justify-space-between\\'\\n        }}\\n        flex-center mt2 flex-wrap\\\"\\n    >\\n\\n      <div class=\\\"flex flex-auto flex-center\\\">\\n        {{! template-lint-disable simple-unless }}\\n        {{#unless (unbound this.wordlist.isNew)}}\\n\\n          {{#ui-button\\n            appearance=\\\"link\\\"\\n            variant=\\\"error\\\"\\n            onClick=(action this.onDelete)\\n            class=\\\"mr1 mb1\\\"\\n          }}\\n\\n            {{t \\\"components.wordlistDetail.deleteButtonLabel\\\"}}\\n\\n          {{/ui-button}}\\n\\n        {{/unless}}\\n        {{! template-lint-enable simple-unless }}\\n\\n        {{#if (and this.wordlist.isPublished this.wordlist.user.isTeacher)}}\\n          {{#form.button\\n            class=\\\"mr1 mb1 text-color-default\\\"\\n            appearance=\\\"link\\\"\\n            onClick=(action this.onSave false)\\n          }}\\n\\n            {{t\\n              \\\"components.wordlistDetail.switchToDraftButtonLabel\\\"\\n              isPublished=(unbound this.wordlist.isPublished)\\n            }}\\n\\n          {{/form.button}}\\n        {{/if}}\\n      </div>\\n\\n      <div class=\\\"flex flex-auto flex-center flex-wrap justify-flex-end\\\">\\n\\n        {{#form.button\\n          class=\\\"mb1 text-color-default\\\"\\n          variant=\\\"alternative\\\"\\n          onClick=(action \\\"handleCancel\\\")\\n        }}\\n\\n          {{t \\\"components.wordlistDetail.cancelLinkOrButtonLabel\\\"}}\\n\\n        {{/form.button}}\\n\\n        {{#if\\n          (and this.wordlist.user.isTeacher (not this.wordlist.isPublished))\\n        }}\\n\\n          {{#form.button\\n            class=\\\"nl1 mb1 text-color-default\\\"\\n            variant=\\\"alternative\\\"\\n            onClick=(action this.onSave false)\\n          }}\\n\\n            {{t\\n              \\\"components.wordlistDetail.switchToDraftButtonLabel\\\"\\n              isPublished=(unbound this.wordlist.isPublished)\\n            }}\\n\\n          {{/form.button}}\\n\\n        {{/if}}\\n\\n        {{#let (generate-id \\\"save-button\\\") as |id|}}\\n\\n          {{#form.submit variant=\\\"default\\\" class=\\\"nl1 mb1\\\" id=id}}\\n\\n            {{t\\n              \\\"components.wordlistDetail.saveButtonLabel\\\"\\n              userRole=this.wordlist.user.role\\n              isPublished=(unbound this.wordlist.isPublished)\\n            }}\\n\\n          {{/form.submit}}\\n\\n          {{#if\\n            (and this.wordlist.user.isTeacher (not this.wordlist.isPublished))\\n          }}\\n\\n            {{#x-tooltip for=id placement=\\\"top\\\"}}\\n\\n              {{t \\\"components.wordlistDetail.saveButtonTooltipLabel\\\"}}\\n\\n            {{/x-tooltip}}\\n\\n          {{/if}}\\n\\n        {{/let}}\\n\\n      </div>\\n\\n    </div>\\n\\n  {{/ui-form-for}}\\n\\n{{/x-locked-scope}}', { moduleName: 'babel/components/wordlist-detail/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{!\\n\\nimport WordlistModel from 'babel/models/wordlist';\\n\\nexport interface WordlistPickerComponentArgs {\\n\\n  wordlists: WordlistModel[];\\n  pickedWordlists: WordlistModel[];\\n  disabledWordlists: WordlistModel[];\\n  onPick(file: Wordlist): void;\\n  onUnpick(file: Wordlist): void;\\n}\\n\\n}}\\n\\n<div class=\\\"wordlist-picker\\\" ...attributes>\\n\\n  {{#each @wordlists as |wordlist|}}\\n\\n    <WordlistPicker::Item\\n      @wordlist={{wordlist}}\\n      @pickedWordlists={{@pickedWordlists}}\\n      @disabledWordlists={{@disabledWordlists}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</div>\", {\"contents\":\"{{!\\n\\nimport WordlistModel from 'babel/models/wordlist';\\n\\nexport interface WordlistPickerComponentArgs {\\n\\n  wordlists: WordlistModel[];\\n  pickedWordlists: WordlistModel[];\\n  disabledWordlists: WordlistModel[];\\n  onPick(file: Wordlist): void;\\n  onUnpick(file: Wordlist): void;\\n}\\n\\n}}\\n\\n<div class=\\\"wordlist-picker\\\" ...attributes>\\n\\n  {{#each @wordlists as |wordlist|}}\\n\\n    <WordlistPicker::Item\\n      @wordlist={{wordlist}}\\n      @pickedWordlists={{@pickedWordlists}}\\n      @disabledWordlists={{@disabledWordlists}}\\n      @onPick={{@onPick}}\\n      @onUnpick={{@onUnpick}}\\n    />\\n\\n  {{/each}}\\n\\n</div>\",\"moduleName\":\"babel/components/wordlist-picker/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/wordlist-picker/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<label\\n  class={{class\\n    \\\"wordlist-picker-item\\\"\\n    (if this.isDisabled \\\"wordlist-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @wordlist}}\\n  >\\n\\n    {{@wordlist.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n  {{#unless @wordlist.isPublished}}\\n\\n    <XBadge class=\\\"ml1\\\" @size=\\\"small\\\">\\n      {{t \\\"components.wordlistBrowser.item.draftBadgeLabel\\\"}}\\n    </XBadge>\\n\\n  {{/unless}}\\n</label>\", {\"contents\":\"<label\\n  class={{class\\n    \\\"wordlist-picker-item\\\"\\n    (if this.isDisabled \\\"wordlist-picker-item--disabled\\\")\\n  }}\\n  ...attributes\\n>\\n\\n  <XCheckbox\\n    class=\\\"text-quarternary word-break-all\\\"\\n    @checked={{this.isPicked}}\\n    @disabled={{this.isDisabled}}\\n    @twoWay={{false}}\\n    @onChange={{fn (if this.isPicked @onUnpick @onPick) @wordlist}}\\n  >\\n\\n    {{@wordlist.titleWithFallback}}\\n\\n  </XCheckbox>\\n\\n  {{#unless @wordlist.isPublished}}\\n\\n    <XBadge class=\\\"ml1\\\" @size=\\\"small\\\">\\n      {{t \\\"components.wordlistBrowser.item.draftBadgeLabel\\\"}}\\n    </XBadge>\\n\\n  {{/unless}}\\n</label>\",\"moduleName\":\"babel/components/wordlist-picker/item/index.hbs\",\"parseOptions\":{\"srcName\":\"babel/components/wordlist-picker/item/index.hbs\"}});\nimport Component from '@glimmer/component';\n\n/*\n\nimport WordlistModel from 'babel/models/wordlist';\n\nexport interface WordlistPickerItemComponentArgs {\n  wordlist: WordlistModel;\n  pickedWordlists: WordlistModel[];\n  disabledWordlists: WordlistModel[];\n  onPick(wordlist: WordlistModel): void;\n  onUnpick(wordlist: WordlistModel): void;\n}\n\n*/\n\nexport default class WordlistPickerItemComponent extends Component {\n  get isPicked() {\n    return this.args.pickedWordlists.includes(this.args.wordlist);\n  }\n\n  get isDisabled() {\n    const disabledWordlists = this.args.disabledWordlists;\n\n    return disabledWordlists && disabledWordlists.includes(this.args.wordlist);\n  }\n}\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\n\nexport default Component.extend({\n  // SETUP\n\n  router: service(),\n\n  classNames: ['wordlist-view'],\n\n  // PARAMS\n\n  wordlist: null,\n\n  hasBreadcrumb: true,\n\n  showTitle: true,\n\n  onWordPerform() {},\n\n  // PROPERTIES\n\n  quiz: false,\n\n  sortedWords: computed(\n    'wordlist.{isTransformed,words.@each.sort,word}',\n    function () {\n      const wordlist = this.get('wordlist');\n\n      const words = wordlist.get('words').toArray();\n\n      if (wordlist.get('isTransformed')) {\n        return words.sortBy('sort');\n      }\n      return words.sortBy('word');\n    }\n  ),\n\n  // ACTIONS\n\n  actions: {\n    handleWordlistQuizModalClose() {\n      this.router.transitionTo({ queryParams: { quiz: null } });\n    },\n\n    openQuiz() {\n      trackWordlistEvent('Träna: Öppna');\n      this.router.transitionTo({ queryParams: { quiz: true } });\n    },\n  },\n});\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.hasBreadcrumb}}\\n\\n  <XBreadcrumb class=\\\"mb1\\\" as |breadcrumb|>\\n    <breadcrumb.item as |item|>\\n      <item.link @route={{this.indexRouteName}}>\\n        {{t \\\"components.wordlistView.indexBreadcrumbItemLabel\\\"}}\\n      </item.link>\\n    </breadcrumb.item>\\n\\n    <breadcrumb.item @active={{true}}>\\n      <span class=\\\"line-height-base\\\">\\n        {{this.wordlist.nameWithFallback}}\\n      </span>\\n    </breadcrumb.item>\\n  </XBreadcrumb>\\n\\n{{/if}}\\n\\n{{#x-locked-scope active=this.wordlist.isDeleted}}\\n\\n  {{#if this.showTitle}}\\n\\n    <div class=\\\"flex flex-center justify-space-between nb1\\\">\\n\\n      <h2 class=\\\"text-secondary snb1\\\">\\n\\n        {{this.wordlist.nameWithFallback}}\\n\\n      </h2>\\n\\n      {{#unless this.wordlist.public}}\\n\\n        {{#x-badge class=\\\"ml1\\\" size=\\\"small\\\"}}\\n\\n          {{t \\\"components.wordlistView.draftBadgeLabel\\\"}}\\n\\n        {{/x-badge}}\\n\\n      {{/unless}}\\n\\n    </div>\\n\\n  {{/if}}\\n\\n  {{#if this.wordlist.isReadOnly}}\\n\\n    <div class=\\\"flex mb1\\\">\\n\\n      {{#ui-button\\n        class=\\\"mr1\\\"\\n        appearance=\\\"link\\\"\\n        onClick=(action this.onDuplicate)\\n      }}\\n\\n        <DcIcon @name=\\\"cloud-folder\\\" class=\\\"nr1\\\" />\\n\\n        {{t \\\"components.wordlistView.duplicateButtonLabel\\\"}}\\n\\n      {{/ui-button}}\\n\\n      {{#ui-button\\n        class=\\\"mr1\\\"\\n        appearance=\\\"link\\\"\\n        active=this.quiz\\n        disabled=(not this.wordlist.isQuizable)\\n        onClick=(action \\\"openQuiz\\\")\\n      }}\\n\\n        <DcIcon @name=\\\"stretching\\\" class=\\\"nr1\\\" />\\n\\n        {{t \\\"components.wordlistView.quizButtonLabel\\\"}}\\n\\n      {{/ui-button}}\\n\\n    </div>\\n\\n  {{else}}\\n\\n    <div class=\\\"flex flex-wrap\\\">\\n\\n      <UiLink\\n        @route={{this.newWordRouteName}}\\n        @model={{this.wordlist.id}}\\n        class=\\\"mr1 mb1\\\"\\n        @appearance=\\\"button\\\"\\n      >\\n\\n        <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n\\n        {{t \\\"components.wordlistView.newLinkLabel\\\"}}\\n\\n      </UiLink>\\n\\n      {{#ui-button\\n        variant=\\\"alternative\\\"\\n        class=\\\"mr1 mb1\\\"\\n        active=this.quiz\\n        disabled=(not this.wordlist.isQuizable)\\n        onClick=(action \\\"openQuiz\\\")\\n      }}\\n\\n        <DcIcon @name=\\\"stretching\\\" class=\\\"nr1\\\" />\\n\\n        {{t \\\"components.wordlistView.quizButtonLabel\\\"}}\\n\\n      {{/ui-button}}\\n\\n      <UiLink\\n        @route={{this.editRouteName}}\\n        @model={{this.wordlist.id}}\\n        class=\\\"mb1\\\"\\n      >\\n\\n        {{t \\\"components.wordlistView.editLinkLabel\\\"}}\\n\\n      </UiLink>\\n\\n    </div>\\n\\n  {{/if}}\\n\\n  {{#if this.wordlist.words}}\\n\\n    {{word-browser\\n      words=this.sortedWords\\n      onPerform=(action this.onWordPerform)\\n    }}\\n\\n  {{else}}\\n\\n    {{#x-alert}}\\n\\n      {{t \\\"components.wordlistView.wordBrowserEmptyAlertMessage\\\"}}\\n\\n    {{/x-alert}}\\n\\n  {{/if}}\\n\\n  {{#if this.quiz}}\\n\\n    {{word-quiz\\n      title=this.wordlist.name\\n      lang=this.wordlist.language\\n      words=this.wordlist.sortedWords\\n      type=this.wordlist.type\\n      onClose=(action \\\"handleWordlistQuizModalClose\\\")\\n    }}\\n\\n  {{/if}}\\n\\n{{/x-locked-scope}}', { moduleName: 'babel/components/wordlist-view/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nconst BODY_CLASS_NAME = 'workspace';\n\nexport default class ContentWorkspaceAsideComponent extends Component {\n  // SETUP\n\n  @service router;\n\n  constructor() {\n    super(...arguments);\n    document.body.classList.add(BODY_CLASS_NAME);\n    this.router.on('routeDidChange', this.routerRouteDidChange);\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    document.body.classList.remove(BODY_CLASS_NAME);\n    this.router.off('routeDidChange', this.routerRouteDidChange);\n  }\n\n  // PROPERTIES\n\n  @tracked element;\n\n  // ACTIONS\n\n  @action setElement(elem) {\n    this.element = elem;\n  }\n\n  @action routerRouteDidChange(transition) {\n    if (transition.from && transition.from.name) {\n      const { from, to } = transition;\n\n      if (from.name !== to.name) {\n        const fromSegments = from.name.split('.').slice(0, 3);\n        const toSegments = to.name.split('.').slice(0, 3);\n\n        if (fromSegments.join('.') === toSegments.join('.')) {\n          this.element?.scrollTo({ top: 0 });\n        }\n      }\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<aside class=\\\"workspace-aside\\\">\\n  <div class=\\\"workspace-aside-sticky\\\">\\n    <div\\n      class=\\\"workspace-aside-content\\\"\\n      {{did-insert this.setElement}}\\n    >\\n      {{yield}}\\n    </div>\\n  </div>\\n</aside>\\n', { moduleName: 'babel/components/workspace/aside/template.hbs' });\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { resolve } from 'rsvp';\n\nexport default class WorkspaceAssignmentsEditComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  // SETUP\n\n  @service router;\n\n  @service teacherAssignmentDispatcher;\n\n  @service missionMode;\n\n  @controller('master.contents') contentsController;\n\n  // PROPERTIES\n\n  get teacherAssignment() {\n    return this.args.model;\n  }\n\n  get content() {\n    return this.contentsController?.content;\n  }\n\n  // ACTIONS\n\n  @action openIndex() {\n    if (this.teacherAssignment.isNew) {\n      return this.router.transitionTo('master.contents.assignments.index');\n    }\n\n    return this.router.transitionTo(\n      'master.contents.assignments.show',\n      this.teacherAssignment.id\n    );\n  }\n\n  @action handleTeacherAssignmentDetailAddFile(file) {\n    this.teacherAssignment?.files?.addObject(file);\n  }\n\n  @action handleTeacherAssignmentDetailRemoveFile(file) {\n    this.teacherAssignment?.files?.removeObject(file);\n  }\n\n  @action handleTeacherAssignmentDetailSave(publish) {\n    if (this.teacherAssignment.validate()) {\n      const isNew = this.teacherAssignment.isNew;\n\n      return this.teacherAssignmentDispatcher\n        .save(this.teacherAssignment, publish)\n        .then(() => {\n          if (isNew) {\n            return this.teacherAssignment.createAsEntity(this.content);\n          }\n\n          return this.teacherAssignment.updateAsEntity(this.content);\n        })\n        .then(() => {\n          if (isNew) {\n            return this.missionMode.addIncludedTeacherAssignmentIfNeeded(\n              this.teacherAssignment\n            );\n          }\n\n          return resolve();\n        })\n        .then(() =>\n          this.router.transitionTo(\n            'master.contents.assignments.show',\n            this.teacherAssignment.id\n          )\n        );\n    }\n  }\n\n  @action handleTeacherAssignmentDetailDelete() {\n    return this.teacherAssignmentDispatcher\n      .delete(this.teacherAssignment)\n      .then(() => this.teacherAssignment.deleteAsEntity(this.content))\n      .then(() =>\n        this.router.transitionTo('master.contents.assignments.index')\n      );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton @onClick={{this.openIndex}} @appearance=\\\"circle\\\">\\n      <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <div class=\\\"text-secondary flex-auto ml1\\\">\\n      {{#if this.teacherAssignment.isNew}}\\n        {{t\\n          \\\"components.workspace.assignments.edit.activeBreadcrumbItemLabel\\\"\\n          isNew=true\\n        }}\\n      {{else}}\\n        {{this.teacherAssignment.titleWithFallback}}\\n      {{/if}}\\n    </div>\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <TeacherAssignmentDetail\\n    @hasBreadcrumb={{false}}\\n    @teacherAssignment={{this.teacherAssignment}}\\n    @cancelRouteName={{unless\\n      this.teacherAssignment.isNew\\n      \\\"master.contents.assignments.show\\\"\\n    }}\\n    @indexRouteName=\\\"master.contents.assignments.index\\\"\\n    @onAddFile={{this.handleTeacherAssignmentDetailAddFile}}\\n    @onRemoveFile={{this.handleTeacherAssignmentDetailRemoveFile}}\\n    @onSave={{this.handleTeacherAssignmentDetailSave}}\\n    @onDelete={{this.handleTeacherAssignmentDetailDelete}}\\n  />\\n</div>', { moduleName: 'babel/components/workspace/assignments/edit/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XErrorPage\\n  @explanation={{t \\\"routes.404.explanation\\\"}}\\n  @greeting={{t \\\"routes.404.greeting\\\"}}\\n  @heading={{t \\\"routes.404.heading\\\"}}\\n  @statusCode={{404}}\\n/>\\n', { moduleName: 'babel/components/workspace/assignments/error/template.hbs' });\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class WorkspaceAssignmentsIndexComponent extends Component {\n  /**\n   * Arguments:\n   * onClose (function)\n   */\n\n  @service assignmentEvents;\n\n  @service intl;\n\n  @service router;\n\n  @service session;\n\n  @service missionMode;\n\n  @service teacherAssignmentDispatcher;\n\n  @controller('master.contents') contentsController;\n\n  @tracked teacherAssignmentChooseModalIsOpen = false;\n\n  get content() {\n    return this.contentsController?.content;\n  }\n\n  get collections() {\n    return this.contentsController?.categorizedCollections;\n  }\n\n  get currentTeacherAssignments() {\n    return this.contentsController?.currentTeacherAssignments;\n  }\n\n  get noAssignmentsMessage() {\n    const isTeacher = this.session?.user?.isTeacher;\n\n    return htmlSafe(\n      this.intl.t('components.workspace.assignments.index.noAssignments', {\n        isTeacher,\n      })\n    );\n  }\n\n  @action async handleTeacherAssignmentChooseModalChoose(teacherAssignments) {\n    await this.teacherAssignmentDispatcher.linkMany(\n      teacherAssignments,\n      this.content\n    );\n\n    const exercises = [];\n\n    teacherAssignments.forEach((teacherAssignment) => {\n      exercises.push(teacherAssignment.createAsEntity(this.content));\n      this.missionMode.addIncludedTeacherAssignmentIfNeeded(teacherAssignment);\n    });\n\n    await this.assignmentEvents.handleTeacherAssignmentsAddedToCollection(\n      exercises\n    );\n  }\n\n  @action openExercise(exercise) {\n    return this.router.transitionTo(\n      'master.contents.assignments.show',\n      exercise.id\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"text-secondary\\\">\\n    {{t \\\"components.workspace.assignments.index.contentWorkspaceTitle\\\"}}\\n  </div>\\n</Workspace::Topbar>\\n\\n{{#if this.session.user.isTeacher}}\\n  <div class=\\\"px1 pt1\\\">\\n    <UiLink\\n      @route=\\\"master.contents.assignments.new\\\"\\n      class=\\\"mr1\\\"\\n      @appearance=\\\"button\\\"\\n    >\\n      <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.assignments.index.newLinkLabel\\\"}}\\n    </UiLink>\\n\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @onClick={{fn (mut this.teacherAssignmentChooseModalIsOpen) true}}\\n    >\\n      <DcIcon @name=\\\"add-circle\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.assignments.index.importButtonLabel\\\"}}\\n    </UiButton>\\n  </div>\\n{{/if}}\\n\\n{{#if this.collections}}\\n  <div class=\\\"mb3 mt1\\\">\\n    <CollectionList\\n      @collections={{this.collections}}\\n      @onOpenExercise={{this.openExercise}}\\n    />\\n  </div>\\n{{else}}\\n  <XAlert class=\\\"mx1 mt1 editor-preview\\\">\\n    {{this.noAssignmentsMessage}}\\n  </XAlert>\\n{{/if}}\\n\\n{{#if this.teacherAssignmentChooseModalIsOpen}}\\n  <TeacherAssignmentChooseModal\\n    @disabledTeacherAssignments={{this.currentTeacherAssignments}}\\n    @onChoose={{this.handleTeacherAssignmentChooseModalChoose}}\\n    @onClose={{fn (mut this.teacherAssignmentChooseModalIsOpen) false}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/workspace/assignments/index/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class WorkspaceAssignmentsShowComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  @service router;\n\n  @tracked isModalOpen = false;\n\n  @action\n  openModal() {\n    this.isModalOpen = true;\n  }\n\n  @action\n  closeModal() {\n    this.isModalOpen = false;\n  }\n\n  @action\n  openIndex() {\n    return this.router.transitionTo('master.contents.assignments');\n  }\n\n  @action\n  openExercise(exerciseId) {\n    return this.router.transitionTo(\n      'master.contents.assignments.show',\n      exerciseId\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ModelRejection @model={{@model.exercise}} />\\n<ModelRejection @model={{@model.collection}} />\\n\\n<CollectionModal\\n  @isModalOpen={{this.isModalOpen}}\\n  @closeModal={{this.closeModal}}\\n>\\n  <CollectionView\\n    @collection={{@model.collection}}\\n    @exercises={{@model.exercises}}\\n    @activeExercise={{@model.activeExercise}}\\n    @answers={{@model.answers}}\\n    @activeAnswer={{@model.activeAnswer}}\\n    @shortCode={{@model.book.body.shortcode}}\\n    @digilarRecordedSpeechEnabled={{@model.content.body.recorded_speech_activated}}\\n    @editor={{@model.editor}}\\n    @openExercise={{this.openExercise}}\\n    @closeModal={{this.closeModal}}\\n    @onCollectionClose={{this.openIndex}}\\n    as |CollectionViewYield|\\n  >\\n    {{#unless this.isModalOpen}}\\n      <CollectionViewYield.TopbarLeft>\\n        <UiButton\\n          @appearance=\\\"circle\\\"\\n          @onClick={{this.openIndex}}\\n          class=\\\"text-ui mr1\\\"\\n          id=\\\"collection-back\\\"\\n          data-test-workspace-assignments-return-button\\n        >\\n          <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n        </UiButton>\\n\\n        <XTooltip @for=\\\"collection-back\\\">\\n          {{t \\\"components.workspace.assignments.show.backTooltip\\\"}}\\n        </XTooltip>\\n      </CollectionViewYield.TopbarLeft>\\n    {{/unless}}\\n\\n    <CollectionViewYield.TopbarRight>\\n      {{#unless this.isModalOpen}}\\n        <CollectionModalToggler\\n          @appearance=\\\"circle\\\"\\n          @isModalOpen={{this.isModalOpen}}\\n          @closeModal={{this.closeModal}}\\n          @openModal={{this.openModal}}\\n          class=\\\"ml1\\\"\\n        />\\n\\n        {{#let\\n          (generate-id \\\"close-button\\\")\\n          (t \\\"components.workspace.assignments.show.close\\\")\\n          as |id label|\\n        }}\\n          <UiButton\\n            @id={{id}}\\n            @appearance=\\\"circle\\\"\\n            @ariaLabel={{label}}\\n            @onClick={{@onClose}}\\n            class=\\\"ml1\\\"\\n            data-test-workspace-assignments-close-button\\n          >\\n            <DcIcon @name=\\\"simple-remove\\\" class=\\\"n1\\\" />\\n          </UiButton>\\n\\n          <XTooltip @for={{id}}>\\n            {{label}}\\n          </XTooltip>\\n        {{/let}}\\n      {{/unless}}\\n    </CollectionViewYield.TopbarRight>\\n  </CollectionView>\\n</CollectionModal>', { moduleName: 'babel/components/workspace/assignments/show/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class WorkspaceComponent extends Component {\n  /**\n   * Arguments:\n   * route (string)\n   * model (object)\n   */\n\n  // SETUP\n\n  @service router;\n\n  @service pageviews;\n\n  @tracked isPrint = false;\n\n  constructor() {\n    super(...arguments);\n    window.addEventListener('beforeprint', this.beforePrint.bind(this));\n    window.addEventListener('afterprint', this.afterPrint.bind(this));\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    window.removeEventListener('beforeprint', this.beforePrint);\n    window.removeEventListener('afterprint', this.afterPrint);\n  }\n\n  // ACTIONS\n\n  @action async handleDrawerClose() {\n    await this.router.transitionTo('master.contents');\n    const { currentRoute } = this.router;\n    const sectionId = currentRoute.queryParams.section;\n    const { bookEntity, model, children } = currentRoute.attributes;\n    const section = children.findBy('id', sectionId);\n    this.pageviews.logPageView(section, bookEntity, model);\n  }\n\n  beforePrint() {\n    this.isPrint = true;\n  }\n\n  afterPrint() {\n    this.isPrint = false;\n  }\n}\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class WorkspaceNotesEditComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  // SETUP\n\n  @service router;\n\n  @service session;\n\n  @service noteDispatcher;\n\n  @controller('master.contents') contentController;\n\n  // PROPERTIES\n\n  get note() {\n    return this.args.model;\n  }\n\n  get content() {\n    return this.contentController.content;\n  }\n\n  // ACTIONS\n\n  @action openIndex() {\n    return this.router.transitionTo('master.contents.notes');\n  }\n\n  @action handleNoteDetailUnlink() {\n    return this.noteDispatcher\n      .unlink(this.note, this.content)\n      .then(() => this.router.transitionTo('master.contents.notes.index'));\n  }\n\n  @action handleNoteDetailSave() {\n    if (this.note.validate()) {\n      return this.noteDispatcher\n        .save(this.note)\n        .then(() => this.router.transitionTo('master.contents.notes.index'))\n        .then(() => this.noteDispatcher.highlight(this.note));\n    }\n  }\n\n  @action handleNoteDetailDelete() {\n    return this.noteDispatcher\n      .delete(this.note)\n      .then(() => this.router.transitionTo('master.contents.notes.index'));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton @onClick={{this.openIndex}} @appearance=\\\"circle\\\">\\n      <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <div class=\\\"text-secondary flex-auto ml1\\\">\\n      {{#if this.note.isNew}}\\n        {{t\\n          \\\"components.workspace.notes.edit.activeBreadcrumbItemLabel\\\"\\n          isNew=true\\n        }}\\n      {{else}}\\n        {{this.note.title}}\\n      {{/if}}\\n    </div>\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <NoteDetail\\n    @hasBreadcrumb={{false}}\\n    @note={{this.note}}\\n    @routed={{true}}\\n    @indexRouteName=\\\"master.contents.notes\\\"\\n    @onUnlink={{this.handleNoteDetailUnlink}}\\n    @onSave={{this.handleNoteDetailSave}}\\n    @onDelete={{this.handleNoteDetailDelete}}\\n  />\\n</div>', { moduleName: 'babel/components/workspace/notes/edit/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XErrorPage\\n  @explanation={{t \\\"routes.404.explanation\\\"}}\\n  @greeting={{t \\\"routes.404.greeting\\\"}}\\n  @heading={{t \\\"routes.404.heading\\\"}}\\n  @statusCode={{404}}\\n/>\\n', { moduleName: 'babel/components/workspace/notes/error/template.hbs' });\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class WorkspaceNotesIndexComponent extends Component {\n  /**\n   * Arguments:\n   * onClose (function)\n   */\n\n  // SETUP\n\n  @service noteDispatcher;\n\n  @service router;\n\n  @controller('master.contents') contentsController;\n\n  // PROPERTIES\n\n  @tracked noteChooseModalIsOpen = false;\n\n  @tracked relatedAccordionIsExpanded = false;\n\n  @tracked highlightedNote = null;\n\n  get content() {\n    return this.contentsController.content;\n  }\n\n  get currentNotes() {\n    return this.contentsController.currentNotes;\n  }\n\n  get relatedNotes() {\n    return this.contentsController.relatedNotes;\n  }\n\n  // ACTIONS\n\n  @action openNoteChooseModal() {\n    this.noteChooseModalIsOpen = true;\n  }\n\n  @action closeNoteChooseModal() {\n    this.noteChooseModalIsOpen = false;\n  }\n\n  @action handleNoteBrowserPerform(note, value) {\n    switch (value) {\n      case 'edit':\n        return this.router.transitionTo('master.contents.notes.edit', note.id);\n      case 'unlink':\n        return this.noteDispatcher.unlink(note, this.content);\n      case 'delete':\n        return this.noteDispatcher.delete(note);\n      default:\n        break;\n    }\n  }\n\n  @action async handleNoteChooseModalChoose(notes) {\n    await this.noteDispatcher.linkMany(notes, this.content);\n    this.noteDispatcher.highlightMany(notes);\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"text-secondary\\\">\\n    {{t \\\"components.workspace.notes.index.contentWorkspaceTitle\\\"}}\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <div class=\\\"flex flex-center flex-wrap\\\">\\n    <UiLink\\n      @route=\\\"master.contents.notes.new\\\"\\n      @appearance=\\\"button\\\"\\n      class=\\\"mb1 mr1\\\"\\n    >\\n      <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.notes.index.newLinkLabel\\\"}}\\n    </UiLink>\\n\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @active={{this.noteChooseModalIsOpen}}\\n      @onClick={{this.openNoteChooseModal}}\\n      class=\\\"mb1\\\"\\n    >\\n      <DcIcon @name=\\\"add-circle\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.notes.index.importButtonLabel\\\"}}\\n    </UiButton>\\n  </div>\\n\\n  {{#if this.currentNotes}}\\n    <NoteBrowser\\n      @notes={{this.currentNotes}}\\n      @mode=\\\"grid\\\"\\n      @range=\\\"small\\\"\\n      @unlinkable={{true}}\\n      @showRouteName=\\\"master.contents.notes.edit\\\"\\n      @onPerform={{this.handleNoteBrowserPerform}}\\n      class=\\\"nt1 mb1\\\"\\n    />\\n  {{else}}\\n    <XAlert>\\n      {{t \\\"components.workspace.notes.index.currentNoResultAlertMessage\\\"}}\\n    </XAlert>\\n  {{/if}}\\n\\n  {{#if this.relatedNotes}}\\n    <XAccordion\\n      class=\\\"mt1\\\"\\n      @expanded={{this.relatedAccordionIsExpanded}}\\n      as |Accordion|\\n    >\\n      <Accordion.header\\n        class=\\\"text-bold justify-space-between\\\"\\n        @appearance=\\\"compact\\\"\\n        @isClickable={{true}}\\n      >\\n        {{t \\\"components.workspace.notes.index.relatedAccordionHeaderLabel\\\"}}\\n      </Accordion.header>\\n\\n      <Accordion.content>\\n        <NoteBrowser\\n          @notes={{this.relatedNotes}}\\n          @mode=\\\"list\\\"\\n          @showRouteName=\\\"master.contents.notes.edit\\\"\\n          @onPerform={{this.handleNoteBrowserPerform}}\\n        />\\n      </Accordion.content>\\n    </XAccordion>\\n  {{/if}}\\n</div>\\n\\n{{#if this.noteChooseModalIsOpen}}\\n  <NoteChooseModal\\n    @disabledNotes={{this.currentNotes}}\\n    @onChoose={{this.handleNoteChooseModalChoose}}\\n    @onClose={{this.closeNoteChooseModal}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/workspace/notes/index/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#let\\n  (component\\n    (if\\n      (and (media \\\"mediumOrLess\\\") (not this.isPrint))\\n      \\\"x-drawer\\\"\\n      \\\"workspace/aside\\\"\\n    )\\n  )\\n  as |Wrapper|\\n}}\\n\\n  <Wrapper\\n    @position=\\\"right\\\"\\n    @closeButton={{false}}\\n    @onClose={{this.handleDrawerClose}}\\n    @size={{520}}\\n  >\\n    {{#let (component (concat \\\"workspace/\\\" @route)) as |Component|}}\\n      <Component @onClose={{this.handleDrawerClose}} @model={{@model}} />\\n    {{/let}}\\n  </Wrapper>\\n{{/let}}\\n', { moduleName: 'babel/components/workspace/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"flex flex-center px1 mt1\\\" ...attributes>\\n  <div class=\\\"flex-auto mr1\\\">{{yield}}</div>\\n\\n  {{#let\\n    (generate-id \\\"close-button\\\") (t \\\"components.workspace.topbar.close\\\")\\n    as |id label|\\n  }}\\n    <UiButton\\n      @id={{id}}\\n      @appearance=\\\"circle\\\"\\n      @ariaLabel={{label}}\\n      @onClick={{@onClose}}\\n      data-test-workspace-topbar-close\\n    >\\n      <DcIcon @name=\\\"simple-remove\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <XTooltip @for={{id}}>{{label}}</XTooltip>\\n  {{/let}}\\n</div>', { moduleName: 'babel/components/workspace/topbar/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { resolve } from 'rsvp';\n\nexport default class WorkspaceWordlistsWordsEditComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  @service router;\n\n  @service wordlistDispatcher;\n\n  @service missionMode;\n\n  get wordlist() {\n    return this.args.model;\n  }\n\n  @action openIndex() {\n    return this.router.transitionTo('master.contents.wordlists.index');\n  }\n\n  @action handleWordlistDetailSave(publish) {\n    if (this.wordlist.validate()) {\n      const isNew = this.wordlist.isNew;\n\n      return this.wordlistDispatcher\n        .save(this.wordlist, publish)\n        .then(() => {\n          if (isNew) {\n            return this.missionMode.addIncludedWordlistIfNeeded(this.wordlist);\n          }\n\n          return resolve();\n        })\n        .then(() =>\n          this.router.transitionTo(\n            'master.contents.wordlists.show',\n            this.wordlist.id\n          )\n        )\n        .then(() => this.wordlistDispatcher.highlight(this.wordlist));\n    }\n  }\n\n  @action handleWordlistDetailDelete() {\n    return this.wordlistDispatcher\n      .delete(this.wordlist)\n      .then(() => this.router.transitionTo('master.contents.wordlists.index'));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton @onClick={{this.openIndex}} @appearance=\\\"circle\\\">\\n      <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <div class=\\\"text-secondary flex-auto ml1\\\">\\n      {{t\\n        \\\"components.workspace.wordlist.edit.activeBreadcrumbItemLabel\\\"\\n        isNew=this.wordlist.isNew\\n      }}\\n    </div>\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <WordlistDetail\\n    @hasBreadcrumb={{false}}\\n    @wordlist={{this.wordlist}}\\n    @indexRouteName=\\\"master.contents.wordlists\\\"\\n    @showRouteName=\\\"master.contents.wordlists.show\\\"\\n    @onSave={{this.handleWordlistDetailSave}}\\n    @onDelete={{this.handleWordlistDetailDelete}}\\n  />\\n</div>', { moduleName: 'babel/components/workspace/wordlists/edit/template.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<XErrorPage\\n  @explanation={{t \\\"routes.404.explanation\\\"}}\\n  @greeting={{t \\\"routes.404.greeting\\\"}}\\n  @heading={{t \\\"routes.404.heading\\\"}}\\n  @statusCode={{404}}\\n/>\\n', { moduleName: 'babel/components/workspace/wordlists/error/template.hbs' });\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\n\nconst PUBLISH = 'publish';\nconst UNPUBLISH = 'unpublish';\nconst ADD_WORD = 'add_word';\nconst QUIZ = 'quiz';\nconst DUPLICATE = 'duplicate';\nconst EDIT = 'edit';\nconst LINK = 'link';\nconst UNLINK = 'unlink';\nconst DELETE = 'delete';\n\nexport default class WorkspaceWordlistsIndexComponent extends Component {\n  /**\n   * Arguments:\n   * onClose (function)\n   */\n\n  // SETUP\n\n  @service() router;\n\n  @service() missionMode;\n\n  @service() wordlistDispatcher;\n\n  @controller('master.contents') contentsController;\n\n  // PROPERTIES\n\n  @tracked wordlistChooseModalIsOpen = false;\n\n  @tracked relatedAccordionIsExpanded = false;\n\n  get content() {\n    return this.contentsController.content;\n  }\n\n  get currentWordlists() {\n    return this.contentsController.currentWordlists;\n  }\n\n  get relatedWordlists() {\n    return this.contentsController.relatedWordlists;\n  }\n\n  // ACTIONS\n\n  @action\n  openWordlistChooseModal() {\n    trackWordlistEvent('Från mitt arkiv');\n    this.wordlistChooseModalIsOpen = true;\n  }\n\n  @action\n  closeWordlistChooseModal() {\n    this.wordlistChooseModalIsOpen = false;\n  }\n\n  @action\n  trackNewWordlist() {\n    trackWordlistEvent('Ny ordlista');\n  }\n\n  @action\n  handleWordlistBrowserPerform(wordlist, value) {\n    switch (value) {\n      case ADD_WORD:\n        trackWordlistEvent('Kontextmeny: Lägg till ord');\n        return this.router.transitionTo(\n          'master.contents.wordlists.show.words.new',\n          wordlist.id\n        );\n      case QUIZ:\n        trackWordlistEvent('Kontextmeny: Starta Träna');\n        return this.router.transitionTo(\n          'master.contents.wordlists.show',\n          wordlist.id,\n          { queryParams: { quiz: true } }\n        );\n      case DUPLICATE:\n        return this.wordlistDispatcher\n          .duplicate(wordlist, this.content)\n          .then((duplicatedWordlist) => {\n            this.wordlistDispatcher.highlight(duplicatedWordlist);\n          });\n      case EDIT:\n        trackWordlistEvent('Kontextmeny: Redigera');\n        return this.router.transitionTo(\n          'master.contents.wordlists.edit',\n          wordlist.id\n        );\n      case PUBLISH:\n        return this.wordlistDispatcher.save(wordlist, true);\n      case UNPUBLISH:\n        return this.wordlistDispatcher.save(wordlist, false);\n      case LINK:\n        return this.wordlistDispatcher.link(wordlist, this.content);\n      case UNLINK:\n        return this.wordlistDispatcher.unlink(wordlist, this.content);\n      case DELETE:\n        return this.wordlistDispatcher.delete(wordlist);\n      default:\n        break;\n    }\n  }\n\n  @action\n  async handleWordlistChooseModalChoose(wordlists) {\n    await this.wordlistDispatcher.linkMany(wordlists, this.content);\n    this.wordlistDispatcher.highlightMany(wordlists);\n\n    wordlists.forEach((wordlist) => {\n      this.missionMode.addIncludedWordlistIfNeeded(wordlist);\n    });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"text-secondary\\\">\\n    {{t \\\"components.workspace.wordlist.index.contentWorkspaceTitle\\\"}}\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <div class=\\\"mb1\\\">\\n    <UiLink\\n      @route=\\\"master.contents.wordlists.new\\\"\\n      @appearance=\\\"button\\\"\\n      class=\\\"nr1\\\"\\n      @click={{this.trackNewWordlist}}\\n    >\\n      <DcIcon @name=\\\"simple-add\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.wordlist.index.newLinkLabel\\\"}}\\n    </UiLink>\\n\\n    <UiButton\\n      @appearance=\\\"link\\\"\\n      @active={{this.wordlistChooseModalIsOpen}}\\n      @onClick={{this.openWordlistChooseModal}}\\n    >\\n      <DcIcon @name=\\\"add-circle\\\" class=\\\"nr1\\\" />\\n      {{t \\\"components.workspace.wordlist.index.importButtonLabel\\\"}}\\n    </UiButton>\\n  </div>\\n\\n  {{#if this.currentWordlists}}\\n    <WordlistBrowser\\n      @wordlists={{this.currentWordlists}}\\n      @showRouteName=\\\"master.contents.wordlists.show\\\"\\n      @routed={{true}}\\n      @unlinkable={{true}}\\n      @mode=\\\"show\\\"\\n      @onPerform={{this.handleWordlistBrowserPerform}}\\n    />\\n  {{else}}\\n    <XAlert>\\n      {{t \\\"components.workspace.wordlist.index.currentNoResultAlertMessage\\\"}}\\n    </XAlert>\\n  {{/if}}\\n\\n  {{#if this.relatedWordlists}}\\n    <XAccordion\\n      class=\\\"mt1\\\"\\n      @expanded={{this.relatedAccordionIsExpanded}}\\n      as |Accordion|\\n    >\\n      <Accordion.header\\n        class=\\\"text-bold\\\"\\n        @appearance=\\\"compact\\\"\\n        @isClickable={{true}}\\n      >\\n        {{t \\\"components.workspace.wordlist.index.relatedAccordionHeaderLabel\\\"}}\\n      </Accordion.header>\\n\\n      <Accordion.content>\\n        <WordlistBrowser\\n          @wordlists={{this.relatedWordlists}}\\n          @showRouteName=\\\"master.contents.wordlists.show\\\"\\n          @routed={{true}}\\n          @mode=\\\"show\\\"\\n          @onPerform={{this.handleWordlistBrowserPerform}}\\n        />\\n      </Accordion.content>\\n    </XAccordion>\\n  {{/if}}\\n</div>\\n\\n{{#if this.wordlistChooseModalIsOpen}}\\n  <WordlistChooseModal\\n    @disabledWordlists={{this.currentWordlists}}\\n    @onChoose={{this.handleWordlistChooseModalChoose}}\\n    @onClose={{this.closeWordlistChooseModal}}\\n  />\\n{{/if}}', { moduleName: 'babel/components/workspace/wordlists/index/template.hbs' });\n","import { inject as controller } from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nconst EDIT = 'edit';\nconst DELETE = 'delete';\n\nexport default class WorkspaceWordlistsShowComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  // SETUP\n\n  @service router;\n\n  @service wordlistDispatcher;\n\n  @service wordDispatcher;\n\n  @controller('master.contents') contentsController;\n\n  // PROPERTIES\n\n  get wordlist() {\n    return this.args.model?.wordlist;\n  }\n\n  get quiz() {\n    return this.args.model?.quiz;\n  }\n\n  get content() {\n    return this.contentsController.content;\n  }\n\n  // ACTIONS\n\n  @action openIndex() {\n    return this.router.transitionTo('master.contents.wordlists.index');\n  }\n\n  @action handleWordlistViewUnlink() {\n    return this.wordlistDispatcher\n      .unlink(this.wordlist, this.content)\n      .then(() => this.router.transitionTo('master.contents.wordlists.index'));\n  }\n\n  @action handleWordlistViewDuplicate() {\n    return this.wordlistDispatcher\n      .duplicate(this.wordlist, this.content)\n      .then(() => this.router.transitionTo('master.contents.wordlists.index'));\n  }\n\n  @action handleWordlistViewWordPerform(word, value) {\n    switch (value) {\n      case EDIT:\n        return this.router.transitionTo(\n          'master.contents.wordlists.show.words.edit',\n          word.id\n        );\n      case DELETE:\n        return this.wordDispatcher.delete(word);\n      default:\n        break;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton @onClick={{this.openIndex}} @appearance=\\\"circle\\\">\\n      <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <div class=\\\"text-secondary flex-auto ml1\\\">\\n      {{this.wordlist.nameWithFallback}}\\n    </div>\\n\\n    {{#unless this.wordlist.public}}\\n      <XBadge class=\\\"ml1 flex-shrink\\\" @size=\\\"small\\\">\\n        {{t \\\"components.workspace.wordlist.show.draftBadgeLabel\\\"}}\\n      </XBadge>\\n    {{/unless}}\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <WordlistView\\n    @wordlist={{this.wordlist}}\\n    @quiz={{this.quiz}}\\n    @hasBreadcrumb={{false}}\\n    @showTitle={{false}}\\n    @indexRouteName=\\\"master.contents.wordlists.index\\\"\\n    @editRouteName=\\\"master.contents.wordlists.edit\\\"\\n    @newWordRouteName=\\\"master.contents.wordlists.show.words.new\\\"\\n    @onUnlink={{this.handleWordlistViewUnlink}}\\n    @onDuplicate={{this.handleWordlistViewDuplicate}}\\n    @onWordPerform={{this.handleWordlistViewWordPerform}}\\n  />\\n</div>', { moduleName: 'babel/components/workspace/wordlists/show/template.hbs' });\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\n\nexport default class WorkspaceWordlistsWordsEditComponent extends Component {\n  /**\n   * Arguments:\n   * model (object)\n   * onClose (function)\n   */\n\n  @service router;\n\n  @service wordDispatcher;\n\n  get word() {\n    return this.args.model;\n  }\n\n  @action openIndex() {\n    return this.router.transitionTo('master.contents.wordlists.show');\n  }\n\n  @action handleWordDetailSave() {\n    if (this.word.validate()) {\n      return this.wordDispatcher\n        .save(this.word)\n        .then(() => this.router.transitionTo('master.contents.wordlists.show'));\n    }\n  }\n\n  @action handleWordDetailDelete() {\n    return this.wordDispatcher\n      .delete(this.word)\n      .then(() => this.router.transitionTo('master.contents.wordlists.show'));\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace::Topbar @onClose={{@onClose}}>\\n  <div class=\\\"flex flex-center\\\">\\n    <UiButton @onClick={{this.openIndex}} @appearance=\\\"circle\\\">\\n      <DcIcon @name=\\\"corner-left-round\\\" class=\\\"n1\\\" />\\n    </UiButton>\\n\\n    <div class=\\\"text-secondary flex-auto ml1\\\">\\n      {{t\\n        \\\"components.workspace.wordlist.words.edit.activeBreadcrumbItemLabel\\\"\\n        isNew=this.word.isNew\\n      }}\\n    </div>\\n  </div>\\n</Workspace::Topbar>\\n\\n<div class=\\\"p1\\\">\\n  <WordDetail\\n    @word={{this.word}}\\n    @routed={{true}}\\n    @hasBreadcrumb={{false}}\\n    @wordlistIndexRouteName=\\\"master.contents.wordlists.index\\\"\\n    @wordlistShowRouteName=\\\"master.contents.wordlists.show\\\"\\n    @onSave={{this.handleWordDetailSave}}\\n    @onDelete={{this.handleWordDetailDelete}}\\n  />\\n</div>', { moduleName: 'babel/components/workspace/wordlists/words/edit/template.hbs' });\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { defaultValidator } from 'ember-a11y-refocus';\nimport { storageFor } from 'ember-local-storage';\nimport moment from 'moment';\n\nexport default class ApplicationController extends Controller {\n  // SETUP\n\n  constructor() {\n    super(...arguments);\n    this.languageChanged();\n  }\n\n  @service contextHelper;\n\n  @service intl;\n\n  @service session;\n\n  @service colorTheme;\n\n  @service router;\n\n  @service helpList;\n\n  @storageFor('read-setting') readSettings;\n\n  // PROPERTIES\n\n  @tracked provider;\n\n  @tracked idp;\n\n  @tracked isLoading = false;\n\n  @tracked error;\n\n  @action\n  shouldScreenReaderRefocus(transition) {\n    const to = transition.to;\n    const from = transition.from;\n\n    if (!from) {\n      return true;\n    }\n\n    const isScroll = this.readSettings.get('mode') === 'scroll';\n\n    const fromSection = from?.queryParams?.section;\n    const toSection = to?.queryParams?.section;\n\n    const isWorkspaceOpen = () => {\n      const currentRouteName = this.router.currentRouteName;\n\n      return (\n        currentRouteName.includes('master.contents.assignments') ||\n        currentRouteName.includes('master.contents.wordlists') ||\n        currentRouteName.includes('master.contents.notes')\n      );\n    };\n\n    if (\n      (from.name.startsWith('master.contents.assignments') ||\n        from.name.startsWith('master.contents.wordlists') ||\n        from.name.startsWith('master.contents.notes')) &&\n      to.name === 'master.contents.index'\n    ) {\n      // If we're closing the workspace, we should not refocus (this causes DINO-4041)\n      return false;\n    }\n\n    if (isWorkspaceOpen()) {\n      // If workspace is open only refocus if section changes, and not in scroll mode\n      return fromSection !== toSection && !isScroll;\n    }\n\n    const MASTER_CONTENTS_INDEX = 'master.contents.index';\n\n    if (to.name === MASTER_CONTENTS_INDEX && !toSection) {\n      // If we're navigation to master content and there is no toSection, we're probably going to the overview page. Refocus!\n      return true;\n    }\n\n    if (\n      to.name === MASTER_CONTENTS_INDEX &&\n      from.name === MASTER_CONTENTS_INDEX &&\n      fromSection &&\n      isScroll\n    ) {\n      // Don't refocus if we're navigating in content when mode is 'scroll'\n      return false;\n    }\n\n    // otherwise fallback to default\n    return defaultValidator(transition);\n  }\n\n  // ACTIONS\n\n  @action\n  languageChanged() {\n    const currentLocale = (this.intl.locale || [])[0];\n    const userLocale = this.session.user?.language;\n    const locale = userLocale || 'sv';\n\n    if (locale !== currentLocale) {\n      this.intl.locale = locale;\n      moment.locale(locale);\n    }\n  }\n}\n","import Controller from '@ember/controller';\n\nexport default class EmbedAuditCollectionController extends Controller {\n  queryParams = [\n    'answer_id',\n    'course_id',\n    'exercise_id',\n    'teacher_assignment_id',\n    'student_id',\n    'mode',\n    'all_users',\n    'custom_content_id',\n    'included_entity_ids',\n  ];\n\n  answer_id = null;\n\n  course_id = null;\n\n  exercise_id = null;\n\n  teacher_assignment_id = null;\n\n  student_id = null;\n\n  mode = 'assignments';\n\n  all_users = false;\n\n  custom_content_id = null;\n\n  included_entity_ids = null;\n}\n","import Controller from '@ember/controller';\nimport { service } from '@ember/service';\n\nexport default class MasterController extends Controller {\n  queryParams = ['help_list'];\n\n  @service contextHelper;\n\n  @service cookieConsent;\n\n  @service entityInspector;\n\n  @service groupsOnboarding;\n\n  @service studentList;\n\n  @service session;\n}\n","import Controller from '@ember/controller';\nimport { inject as service } from '@ember/service';\n\nexport default class AdminController extends Controller {\n  @service session;\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MasterArchivesController extends Controller {\n  @service contextHelper;\n\n  queryParams = [{ pageNumber: 'page' }];\n\n  @tracked pageNumber = 1;\n\n  @action handlePageChange(page) {\n    this.pageNumber = page;\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MasterArchivesFoldersMaterialsController extends Controller {\n  queryParams = [{ returnUrl: 'return-url' }];\n\n  @service router;\n\n  @service routerScroll;\n\n  @tracked returnUrl;\n\n  @action async handleMaterialViewerClose() {\n    this.routerScroll.preserveScrollPosition = true;\n\n    let transition;\n\n    if (this.returnUrl) {\n      transition = this.router.transitionTo(this.returnUrl);\n    } else {\n      transition = this.router.transitionTo('master.archives');\n    }\n\n    return transition.then(() => {\n      later(\n        this,\n        () => {\n          this.routerScroll.preserveScrollPosition = false;\n        },\n        100\n      );\n    });\n  }\n}\n","/**\n * This is a work in progress with the idea of refactoring\n * the contents controller in steps. Please move other parts\n * of the controller here when refactoring.\n */\n\nimport Controller from '@ember/controller';\nimport { inject as service } from '@ember/service';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class ContentsController extends Controller {\n  // SERVICES\n\n  @service assignmentEvents;\n\n  @service session;\n\n  @service contextHelper;\n\n  @service missionMode;\n\n  // PROPERTIES\n\n  @tracked notes = [];\n\n  @tracked wordlists = [];\n\n  @tracked activeExerciseId = null;\n\n  // NOTES\n\n  get restrictedNotes() {\n    return this.notes.rejectBy('isDeleted');\n  }\n\n  get sortedNotes() {\n    return this.restrictedNotes.sortBy('created');\n  }\n\n  get bookNotes() {\n    return this.sortedNotes.filter((note) =>\n      note.bookIds.includes(this.bookId)\n    );\n  }\n\n  get contentNotes() {\n    return this.sortedNotes.filter((note) =>\n      note.contentIds.includes(this.contentId)\n    );\n  }\n\n  get currentNotes() {\n    return this.contentNotes;\n  }\n\n  get relatedNotes() {\n    return this.bookNotes.filter((note) => !this.contentNotes.includes(note));\n  }\n\n  // WORDLISTS\n\n  get restrictedWordlists() {\n    return this.wordlists\n      .rejectBy('isDeleted')\n      .filterBy('isLoaded')\n      .filter((wordlist) => this.missionMode.wordlistIsAllowed(wordlist))\n      .filter((wordlist) => {\n        const activeCourse = this.contextHelper.activeCourse;\n\n        if (wordlist.isOwner || wordlist.isTransformed) {\n          return true;\n        } else if (activeCourse) {\n          return activeCourse\n            .hasMany('teachers')\n            .ids()\n            .includes(wordlist.userId);\n        } else {\n          return false;\n        }\n      });\n  }\n\n  get sortedWordlists() {\n    const contentWordlists = this.restrictedWordlists\n      ?.filter((l) => l?.entity)\n      ?.sort((a, b) => (a?.entity?.sort > b?.entity?.sort ? 1 : -1));\n\n    const teacherWordlists = this.restrictedWordlists\n      ?.filter((l) => l?.user?.get('isTeacher'))\n      ?.sort((a, b) => a?.title?.localeCompare(b?.title));\n\n    const studentWordlists = this.restrictedWordlists\n      ?.filter((l) => l?.user?.get('isStudent'))\n      ?.sort((a, b) => a?.title?.localeCompare(b?.title));\n\n    const privateUserWordlists = this.restrictedWordlists\n      ?.filter((l) => l?.user?.get('isPrivateUser'))\n      ?.sort((a, b) => a?.title?.localeCompare(b?.title));\n\n    return [\n      ...contentWordlists,\n      ...teacherWordlists,\n      ...studentWordlists,\n      ...privateUserWordlists,\n    ];\n  }\n\n  get bookWordlists() {\n    return this.sortedWordlists.filter((wordlist) =>\n      wordlist.bookIds.includes(this.bookId)\n    );\n  }\n\n  get contentWordlists() {\n    return this.sortedWordlists.filter((wordlist) =>\n      wordlist.contentIds.includes(this.contentId)\n    );\n  }\n\n  get categorizedWordlists() {\n    return this.contentWordlists.filter((wordlist) => {\n      if (wordlist.category) {\n        return wordlist.category === this.activeCategory;\n      }\n\n      return true;\n    });\n  }\n\n  get currentWordlists() {\n    return this.categorizedWordlists;\n  }\n\n  get coverWordlists() {\n    const categorizedWordlists =\n      this.categorizedWordlists.filterBy('isPublished');\n\n    const user = this.session.user;\n\n    if (user.isStudent) {\n      return categorizedWordlists.rejectBy('userId', user.id);\n    }\n\n    return categorizedWordlists;\n  }\n\n  get relatedWordlists() {\n    return this.bookWordlists\n      .reject((wordlist) => this.categorizedWordlists.includes(wordlist))\n      .filterBy('userId', this.session.user.id);\n  }\n\n  // EXERCISE\n\n  @cached\n  get exercisesProxy() {\n    const promise = resolve(this.activeSection?.children).then((children) =>\n      this.missionMode.allowedEntities(children)\n    );\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : null;\n  }\n\n  @cached\n  get interactiveProxy() {\n    const activeExercise = this.exercises?.findBy('id', this.activeExerciseId);\n\n    const promise = this.assignmentEvents.getOrCreateInteractiveForCollection(\n      this.activeSection,\n      activeExercise\n    );\n\n    return load(promise, this);\n  }\n\n  get answers() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.interactive?.answers\n      : [];\n  }\n\n  get activeExercise() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeExercise\n      : null;\n  }\n\n  get activeAnswer() {\n    return this.interactiveProxy.isResolved\n      ? this.interactiveProxy.value.activeAnswer\n      : null;\n  }\n\n  // CATEGORIES\n\n  get categories() {\n    return this.restrictedSections\n      ?.mapBy('category')\n      ?.compact()\n      ?.uniqBy('id')\n      ?.sortBy('sort');\n  }\n\n  get unrestrictedCategories() {\n    return this.sections\n      ?.mapBy('category')\n      ?.compact()\n      ?.uniqBy('id')\n      ?.sortBy('sort');\n  }\n\n  get preferredCategory() {\n    const preferredId = this.session.user?.getPreferredTextVersion(this.bookId);\n\n    if (preferredId) {\n      const category = this.categories?.findBy('id', preferredId);\n      if (category) return category;\n    }\n\n    return null;\n  }\n\n  get activeCategory() {\n    const activeSectionCategoryId = this.activeSection?.belongsTo('cat')?.id();\n\n    if (activeSectionCategoryId) {\n      const categories = this.contextHelper.inMission\n        ? this.unrestrictedCategories\n        : this.categories;\n\n      const category = categories?.findBy('id', activeSectionCategoryId);\n      if (category) return category;\n    }\n\n    return this.preferredCategory ?? this.categories?.firstObject;\n  }\n\n  // SECTIONS\n\n  get categorizedSections() {\n    return this.restrictedSections.filterBy(\n      'category.id',\n      this.activeCategory?.id\n    );\n  }\n\n  // COLLECTIONS\n\n  get categorizedCollections() {\n    return this.sortedCollections.filter((collection) => {\n      if (collection.isTeacherCollection) {\n        return true;\n      }\n\n      if (!collection.category) {\n        return true;\n      }\n\n      if (this.unrestrictedCategories.length === 1) {\n        return collection.category.id === this.unrestrictedCategories[0].id;\n      }\n\n      return collection.category.id === this.activeCategory?.id;\n    });\n  }\n\n  get coverCollections() {\n    let categorizedCollections = this.categorizedCollections.reject(\n      (collection) => collection.children?.isEvery('isPublished', false)\n    );\n\n    const user = this.session.user;\n\n    if (user?.isStudent) {\n      return categorizedCollections.rejectBy('userId', user.id);\n    }\n\n    return categorizedCollections;\n  }\n\n  get isEverythingHidden() {\n    return (\n      this.categorizedSections.length === 0 &&\n      this.categorizedCollections.length === 0 &&\n      this.categorizedWordlists.length === 0\n    );\n  }\n}\n","import { A } from '@ember/array';\nimport { computed, observer } from '@ember/object';\nimport { alias, readOnly, setDiff, sort } from '@ember/object/computed';\nimport { on } from '@ember/object/evented';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport ContentsController from 'babel/controllers/master/contents-refactored';\nimport { nextObject, previousObject } from 'compton/utils/array';\nimport { storageFor } from 'ember-local-storage';\n\nimport DigilarSpeakerConfig from '../../utils/speaker/DigilarSpeakerConfig';\n\nconst TEMPLATE = ['chapter', 'story', 'workflow'];\n\nexport default ContentsController.extend({\n  // SETUP\n\n  contextHelper: service(),\n\n  missionMode: service(),\n\n  speaker: service(),\n\n  session: service(),\n\n  router: service(),\n\n  pageviews: service(),\n\n  settings: storageFor('read-setting'),\n\n  speakerSettings: storageFor('play-settings'),\n\n  queryParams: [\n    'viewAs',\n    { activeExerciseId: 'exercise' },\n    { activeSectionId: 'section' },\n    { missionId: 'mission' },\n    { customContentId: 'custom_content' },\n    { openCustomContent: 'open_custom_content' },\n    { closeUrl: 'close_url' },\n    { returnUrl: 'return_url' },\n  ],\n\n  // PROPERTIES\n\n  content: readOnly('model'),\n\n  contentId: alias('content.id'),\n\n  bookId: alias('content.book.id'),\n\n  activeSectionId: null,\n\n  missionId: null,\n\n  customContentId: null,\n\n  openCustomContent: null,\n\n  viewAs: null,\n\n  lastTransitionWasWithinWorkspace: false,\n\n  activeSection: computed(\n    'activeSectionId',\n    'restrictedSections.firstObject.id',\n    'sections.[]',\n    'preferredCategory.id',\n    function () {\n      const sectionId = this.getActiveSectionId();\n\n      return this.sections.findBy('id', sectionId);\n    }\n  ),\n\n  // NOTE This property is used by Ember Router Scroll to determine whether\n  // the current scroll position should be preserved on a route change. See:\n  // https://github.com/DockYard/ember-router-scroll#preservescrollposition-with-a-controller-property\n  preserveScrollPosition: computed(\n    'activeSection',\n    'settings.mode',\n    'template',\n    'router.currentRoute',\n    'lastTransitionWasWithinWorkspace',\n    function () {\n      if (!this.activeSection) {\n        return false;\n      }\n\n      if (\n        this.get('settings.mode') === 'scroll' &&\n        this.template === 'chapter'\n      ) {\n        return true;\n      }\n\n      // NOTE When the mode is 'browse' and the template is 'story' or\n      // 'workflow', we only want to preserve the scroll position if the last\n      // transition was within the workspace.\n      return this.lastTransitionWasWithinWorkspace;\n    }\n  ),\n\n  template: computed('viewAs', 'content.template', function () {\n    const viewAs = this.viewAs;\n\n    if (TEMPLATE.includes(viewAs)) {\n      return viewAs;\n    }\n\n    let template = this.get('content.template');\n\n    if (TEMPLATE.includes(template)) {\n      return template;\n    }\n\n    return TEMPLATE.get('firstObject');\n  }),\n\n  includedEntities: alias('missionMode.includedEntities'),\n\n  includedTeacherAssignments: alias('missionMode.includedTeacherAssignments'),\n\n  sections: computed('content.children.[]', function () {\n    return (this.get('content.children') || A()).filterBy('space', 'content');\n  }),\n\n  sortedSections: computed('sections.@each.{sort,category}', function () {\n    return this.sections.sort((a, b) => {\n      if (a.category?.sort !== b.category?.sort) {\n        return a.category?.sort > b.category?.sort ? 1 : -1;\n      } else {\n        return a.sort > b.sort ? 1 : -1;\n      }\n    });\n  }),\n\n  restrictedSections: computed(\n    'sortedSections.[]',\n    'contextHelper.activeMission',\n    'includedEntities.[]',\n    function () {\n      return this.sortedSections.filter((section) =>\n        this.missionMode.entityIsAllowed(section)\n      );\n    }\n  ),\n\n  collections: computed('content.children.[]', function () {\n    return this.content.children\n      .filterBy('type', 'collections')\n      .filterBy('space', 'workspace');\n  }),\n\n  restrictedCollections: computed(\n    'collections.@each.{children,isTeacherCollection}',\n    'content',\n    'contextHelper.activeCourse',\n    'includedEntities.[]',\n    'includedTeacherAssignments.[]',\n    'contextHelper.inMission',\n    function () {\n      return this.collections\n        .filter((collection) => this.missionMode.entityIsAllowed(collection))\n        .filter((collection) => {\n          if (collection.get('isTeacherCollection')) {\n            const teacherAssignment = collection.get(\n              'children.firstObject.teacherAssignment'\n            );\n            const activeCourse = this.get('contextHelper.activeCourse');\n\n            if (teacherAssignment?.hasContent(this.content)) {\n              if (teacherAssignment.get('isOwner')) {\n                return true;\n              } else if (activeCourse) {\n                return activeCourse\n                  .hasMany('teachers')\n                  .ids()\n                  .includes(teacherAssignment.get('userId'));\n              } else {\n                return false;\n              }\n            }\n            return false;\n          }\n\n          return true;\n        });\n    }\n  ),\n\n  // eslint-disable-next-line ember/avoid-leaking-state-in-ember-objects\n  sortedCollectionsOrder: [\n    'teacherAssignment:desc',\n    'user.isTeacher:desc',\n    'sort',\n    'user.showname',\n    'title',\n  ],\n\n  sortedCollections: sort('restrictedCollections', 'sortedCollectionsOrder'),\n\n  restrictedTeacherAssignments: computed(\n    'contextHelper.activeCourse',\n    'session.user.isStudent',\n    'teacherAssignments.[]',\n    'includedTeacherAssignments.[]',\n    'contextHelper.inMission',\n    function () {\n      return this.teacherAssignments\n        .filter((teacherAssignment) =>\n          this.missionMode.teacherAssignmentIsAllowed(teacherAssignment)\n        )\n        .filter((teacherAssignment) => {\n          const activeCourse = this.get('contextHelper.activeCourse');\n\n          if (teacherAssignment.get('isOwner')) {\n            return true;\n          } else if (activeCourse) {\n            return activeCourse\n              .hasMany('teachers')\n              .ids()\n              .includes(teacherAssignment.get('userId'));\n          } else {\n            return false;\n          }\n        });\n    }\n  ),\n\n  bookTeacherAssignments: computed(\n    'restrictedTeacherAssignments.@each.{bookIds,created}',\n    'content.book.id',\n    function () {\n      return this.restrictedTeacherAssignments\n        .filter((teacherAssignment) =>\n          teacherAssignment.get('bookIds').includes(this.get('content.book.id'))\n        )\n        .sortBy('created');\n    }\n  ),\n\n  contentTeacherAssignments: computed(\n    'restrictedTeacherAssignments.@each.{contentIds,created}',\n    'content.id',\n    function () {\n      return this.restrictedTeacherAssignments\n        .filter((teacherAssignment) =>\n          teacherAssignment.get('contentIds').includes(this.get('content.id'))\n        )\n        .sortBy('created');\n    }\n  ),\n\n  currentTeacherAssignments: readOnly('contentTeacherAssignments'),\n\n  relatedTeacherAssignments: setDiff(\n    'bookTeacherAssignments',\n    'contentTeacherAssignments'\n  ),\n\n  /**\n   * Additional information about the content that is required by the speaker.\n   * Compiled into a single object from different parts of the model\n   */\n  speakerContentInfo: computed(\n    'content.body.recorded_speech_activated',\n    'content.book.body.{ilt_activated,shortcode}',\n    'content.{sectionRecordedSpeech,title}',\n    function () {\n      const contentInfo = {\n        contentTitle: this.get('content.title'),\n        shortCode: this.get('content.book.body.shortcode'),\n        useLegacyRecordedSpeechForStory: this.get(\n          'content.sectionRecordedSpeech'\n        ),\n        iltRecordedSpeechEnabled:\n          !!this.get('content.book.body.ilt_activated') &&\n          !this.get('content.body.recorded_speech_activated'),\n        digilarRecordedSpeechEnabled: !!this.get(\n          'content.body.recorded_speech_activated'\n        ),\n      };\n\n      return contentInfo;\n    }\n  ),\n\n  // HOOKS\n\n  init() {\n    this._super(...arguments);\n    this.digilarSpeakerConfig = new DigilarSpeakerConfig({\n      getContextData: () => {\n        return {};\n      },\n    });\n  },\n\n  // ACTIONS\n\n  actions: {\n    handleCategoryChange(category) {\n      const newCategorySections = this.restrictedSections.filterBy(\n        'category.id',\n        category?.id\n      );\n\n      let section;\n\n      if (newCategorySections.length === this.categorizedSections.length) {\n        const activeIndex = this.categorizedSections.indexOf(\n          this.activeSection\n        );\n\n        section = newCategorySections.objectAt(activeIndex).get('id');\n      } else {\n        section = newCategorySections.get('firstObject.id');\n      }\n\n      this.router.replaceWith({\n        queryParams: { section },\n      });\n    },\n\n    routeToSection(sectionId) {\n      this.router.transitionTo({\n        queryParams: { section: sectionId, exercise: null },\n      });\n    },\n\n    nextSection() {\n      const nextSection = nextObject(\n        this.categorizedSections,\n        this.activeSection\n      );\n\n      if (nextSection) {\n        this.router.replaceWith({\n          queryParams: { section: nextSection.get('id') },\n        });\n        return true;\n      }\n\n      return false;\n    },\n    cacheNextAndPreviousImage(imageSize) {\n      this._cacheNextAndPreviousImage(this.activeSection, imageSize);\n    },\n\n    previousSection() {\n      const previousSection = previousObject(\n        this.categorizedSections,\n        this.activeSection\n      );\n\n      if (previousSection) {\n        this.router.replaceWith({\n          queryParams: { section: previousSection.get('id') },\n        });\n        return true;\n      }\n\n      return false;\n    },\n\n    handleExerciseChange() {\n      if (this.activeExercise) {\n        this.contextHelper.setActive('activeExercise', this.activeExercise);\n      } else {\n        this.contextHelper.setActive('activeExercise', null);\n      }\n\n      scheduleOnce('afterRender', this, '_trackActiveExercise');\n    },\n  },\n\n  // OBSERVERS\n\n  activeSectionObserver: on(\n    'init',\n    // eslint-disable-next-line ember/no-observers\n    observer('activeSection', 'isActive', function () {\n      if (\n        this.isActive &&\n        this.contextHelper.activeSection?.id !== this.activeSection?.id\n      ) {\n        this.contextHelper.setActive('activeSection', this.activeSection);\n\n        const user = this.session.user;\n        const bookId = this.bookId;\n        const categoryId = this.activeSection?.category?.id;\n\n        if (user && this.contextHelper.inContent) {\n          user.savePreferredTextVersion(bookId, categoryId);\n        }\n\n        scheduleOnce('afterRender', this, '_trackActiveSection');\n      }\n    })\n  ),\n\n  // PRIVATE\n  async _cacheNextAndPreviousImage(section, imageSize) {\n    const currentIndex = this._currentIndex(section);\n    const previousSection = this.sections?.get(currentIndex - 1);\n    const nextSection = this.sections?.get(currentIndex + 1);\n    const previousImageUrl = previousSection?.image?.imageURL;\n    const nextImageUrl = nextSection?.image?.imageURL;\n    if (!previousImageUrl && !nextImageUrl) return;\n\n    if (previousImageUrl) {\n      await this._preloadImg(`${previousImageUrl}&size=${imageSize}`);\n    }\n\n    if (nextImageUrl) {\n      await this._preloadImg(`${nextImageUrl}&size=${imageSize}`);\n    }\n  },\n\n  _currentIndex(section) {\n    return this.sections?.indexOf(section);\n  },\n\n  _preloadImg(imageUrl) {\n    let cache = document.getElementById('image-cache-content-story');\n    if (!cache) {\n      cache = document.createElement('div');\n      cache.id = 'image-cache-content-story';\n      cache.style = 'position:absolute;z-index:-1000;opacity:0;';\n      document.body.appendChild(cache);\n    }\n\n    if (this._divContainsImgWithSrc(cache, imageUrl)) return;\n\n    var img = new Image();\n    img.src = imageUrl;\n    img.style = 'display:none';\n    cache.appendChild(img);\n    return;\n  },\n\n  _divContainsImgWithSrc(div, src) {\n    const imgs = div.getElementsByTagName('img');\n    return [...imgs].some((img) => img.src === src);\n  },\n\n  _sectionFromId(sectionId) {\n    return this.sections.find((section) => section.id === sectionId);\n  },\n\n  _trackActiveSection() {\n    const activeSection = this.activeSection;\n\n    if (!activeSection) {\n      return;\n    }\n\n    const currentRoute = this.get('router.currentRoute');\n\n    const assignmentId = currentRoute.params.assignment_id;\n    const wordlistId = currentRoute.parent.params.wordlist_id;\n\n    // When an exercise/assignment is open, don't also log the section\n    // to have consistency in \"Fortsätt där du var\".\n    if (assignmentId || this.activeExerciseId) {\n      return;\n    }\n\n    const metadata = {};\n    if (wordlistId) {\n      const wordlist = this.currentWordlists.findBy('id', wordlistId);\n\n      if (wordlist.get('isTransformed')) {\n        metadata.wordlist = wordlistId;\n      }\n    }\n\n    const content = this.content;\n\n    this.pageviews.logPageView(\n      activeSection,\n      content.get('book'),\n      content,\n      metadata\n    );\n  },\n\n  _trackActiveExercise() {\n    const activeExercise = this.activeExercise;\n\n    if (activeExercise) {\n      const content = this.content;\n\n      this.pageviews.logPageView(activeExercise, content.get('book'), content);\n    }\n  },\n\n  getActiveSectionId() {\n    let sectionId = this.activeSectionId;\n\n    if (!sectionId || !this.sections.findBy('id', sectionId)) {\n      if (this.preferredCategory) {\n        sectionId = this.restrictedSections?.filter(\n          (section) =>\n            section.belongsTo('cat').id() === this.preferredCategory.id\n        )?.firstObject?.id;\n      }\n\n      if (!sectionId) {\n        sectionId = this.restrictedSections?.firstObject?.id;\n      }\n    }\n\n    return sectionId;\n  },\n\n  setActiveSectionIdIfNeeded() {\n    const section = this.getActiveSectionId();\n\n    if (section !== this.activeSectionId) {\n      this.router.replaceWith({ queryParams: { section } });\n    }\n  },\n});\n","import Controller from '@ember/controller';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MasterContentsWordlistsShowIndexController extends Controller {\n  queryParams = ['quiz'];\n\n  @tracked quiz = null;\n}\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n  queryParams: [\n    {\n      selectedStudent: 'selected-student'\n    },\n    {\n      isAuditing: 'is-auditing'\n    }\n  ],\n\n  selectedStudent: null,\n\n  isAuditing: false\n});\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n  queryParams: [\n    {\n      inboxType: 'inbox-type'\n    },\n    {\n      selectedStudent: 'selected-student'\n    },\n    {\n      isAuditing: 'is-auditing'\n    }\n  ],\n\n  inboxType: 'standard',\n\n  selectedStudent: null,\n\n  isAuditing: false\n});\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\n\nexport default class MasterCoursesShowAuditIndexController extends Controller {\n  @action\n  trackDashboardCard(actionName) {\n    trackAuditEvent(actionName);\n  }\n}\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n  queryParams: [\n    {\n      logInboxType: 'log-inbox-type'\n    },\n    {\n      selectedStudent: 'selected-student'\n    },\n    {\n      isAuditing: 'is-auditing'\n    }\n  ],\n\n  logInboxType: 'standard',\n\n  selectedStudent: null,\n\n  isAuditing: false\n});\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\n\nexport default class MasterCoursesShowAuditMissionsIndexController extends Controller {\n  @service router;\n\n  queryParams = ['page'];\n\n  @tracked model;\n\n  @tracked page = 1;\n\n  get numPages() {\n    return this.model?.meta?.total_pages || 0;\n  }\n\n  @action\n  handlePaginationChange(page) {\n    trackAuditEvent('Uppdrag - Sidnavigering');\n\n    this.router.transitionTo({ queryParams: { page } });\n  }\n\n  @action\n  trackMissionOpen(event) {\n    const target = event?.target;\n    const anchor =\n      target?.closest?.('a') || target?.parentElement?.closest?.('a');\n\n    if (!anchor) {\n      return;\n    }\n\n    trackAuditEvent('Öppna uppdrag');\n  }\n}\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n  queryParams: [\n    {\n      selectedStudent: 'selected-student',\n    },\n    {\n      isAuditing: 'is-auditing',\n    },\n  ],\n\n  selectedStudent: null,\n\n  isAuditing: false,\n});\n","import Controller from '@ember/controller';\nimport { trackAuditEvent } from 'babel/utils/matomo-events';\n\nconst OVERVIEW_TAB_LABELS = Object.freeze({\n  standard: 'Uppgifter',\n  diagnosis: 'Diagnoser',\n  teacher_assignments: 'Läraruppgifter',\n});\n\nexport default Controller.extend({\n  queryParams: [\n    {\n      overviewType: 'overview-type',\n    },\n    {\n      selectedStudent: 'selected-student',\n    },\n    {\n      isAuditing: 'is-auditing',\n    },\n  ],\n\n  overviewType: 'standard',\n\n  selectedStudent: null,\n\n  isAuditing: false,\n\n  actions: {\n    handleOverviewTypeChange(type) {\n      this.set('overviewType', type);\n\n      trackAuditEvent('Översikt - Flik', OVERVIEW_TAB_LABELS[type] || type);\n    },\n  },\n});\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { resolve } from 'rsvp';\n\nexport default class MasterCoursesShowBooksController extends Controller {\n  @service session;\n\n  get books() {\n    if (this.session.user.isTeacher) {\n      return this.model.productBooks.uniqBy('id');\n    }\n    return this.model.course.books;\n  }\n\n  get selectedBooks() {\n    return this.model.course.books;\n  }\n\n  get selectableBooks() {\n    return this.session.user?.isTeacher;\n  }\n\n  get canToggleBooks() {\n    return this.books && this.session.user?.isTeacher;\n  }\n\n  @action\n  async handleSelectBook(book) {\n    const course = await resolve(this.model.course);\n    const setting = await resolve(course?.setting);\n\n    if (!setting) return;\n\n    setting.hiddenBooks.removeObject(book);\n    setting.save();\n  }\n\n  @action\n  async handleDeselectBook(book) {\n    const course = await resolve(this.model.course);\n    const setting = await resolve(course?.setting);\n\n    if (!setting) return;\n\n    setting.hiddenBooks.addObject(book);\n    setting.save();\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { cached, tracked } from '@glimmer/tracking';\nimport { trackMissionEvent } from 'babel/utils/matomo-events';\nimport { load } from 'ember-async-data';\nimport { resolve } from 'rsvp';\n\nexport default class MasterCoursesShowIndexController extends Controller {\n  @service store;\n  @service session;\n  @service missionDispatcher;\n  @service customContentDispatcher;\n  @service fileDispatcher;\n\n  @tracked mission = null;\n  @tracked customContent = null;\n  @tracked pendingFile = null;\n  @tracked isAddNewActionMenuOpen = false;\n  @tracked isCourseMissionActivateModalOpen = false;\n  @tracked isCourseMissionCopyFromModalOpen = false;\n  @tracked courseMissionCopyToModalMeta = null;\n  @tracked missionShareModalMeta = null;\n  @tracked isSortingDisabled = true;\n\n  addNewMissionButtonElement = null;\n\n  get isCourseMissionCopyToModalOpen() {\n    return !!this.courseMissionCopyToModalMeta;\n  }\n\n  get isMissionShareModalOpen() {\n    return !!this.missionShareModalMeta;\n  }\n\n  get isMissionDetailModalOpen() {\n    return !!this.mission;\n  }\n\n  get isCustomContentDetailModalOpen() {\n    return !!this.customContent;\n  }\n\n  @cached\n  get settingProxy() {\n    const promise = resolve(this.model.course).then(\n      (course) => course?.setting\n    );\n\n    return load(promise, this);\n  }\n\n  get setting() {\n    return this.settingProxy.isResolved ? this.settingProxy.value : null;\n  }\n\n  get isShowingIntro() {\n    return (\n      this.session.user?.isTeacher &&\n      this.setting &&\n      !this.setting?.metadata?.hide_intro\n    );\n  }\n\n  get missions() {\n    const { course, missions } = this.model;\n\n    const accessibleMissions = missions?.filter(\n      (mission) => mission.isAccessible\n    );\n\n    const ids = course.sortedMissionIds;\n\n    if (ids?.length > 0) {\n      const sortedMissions = ids\n        .map((id) => accessibleMissions.find((mission) => mission.id === id))\n        .compact();\n\n      const unsortedMissions = accessibleMissions\n        .filter((mission) => !ids.includes(mission.id))\n        .sortBy('created')\n        .reverse();\n\n      return [...unsortedMissions, ...sortedMissions];\n    }\n\n    return accessibleMissions;\n  }\n\n  @action\n  handleAddNewActionMenuOpen() {\n    this.isAddNewActionMenuOpen = true;\n    trackMissionEvent('Lägg till uppdrag - Översikt');\n  }\n\n  @action\n  async handleMissionBrowserActivate(mission) {\n    await this.missionDispatcher.activate(mission);\n    this.model.missions.update();\n  }\n\n  @action\n  async handleMissionBrowserDeactivate(mission) {\n    await this.missionDispatcher.deactivate(mission);\n    this.model.missions.update();\n  }\n\n  @action\n  handleAddNewMissionButtonClick() {\n    this.#addNewMission();\n  }\n\n  @action\n  handleMissionBrowserEdit(mission) {\n    this.mission = mission;\n  }\n\n  @action\n  handleMissionBrowserCopy(mission) {\n    this.courseMissionCopyToModalMeta = {\n      mission,\n    };\n  }\n\n  @action\n  handleMissionBrowserShare(mission) {\n    this.missionShareModalMeta = {\n      mission,\n    };\n  }\n\n  @action\n  handleMissionCopyToModalClose() {\n    this.courseMissionCopyToModalMeta = null;\n  }\n\n  @action\n  handleMissionShareModalClose() {\n    this.missionShareModalMeta = null;\n  }\n\n  @action\n  handleMissionDetailModalClose() {\n    this.mission.rollback();\n    this.mission = null;\n  }\n\n  @action\n  async handleMissionDetailModalSave() {\n    await this.missionDispatcher.save(this.mission, { fromOverview: true });\n    await this.model.missions.update();\n    this.mission = null;\n  }\n\n  @action\n  async handleMissionDetailModalDelete() {\n    await this.missionDispatcher.delete(this.mission, { fromOverview: true });\n    await this.model.missions.update();\n    this.mission = null;\n  }\n\n  @action\n  async handleMissionBrowserToggleActivation(mission) {\n    await this.missionDispatcher.toggleActivation(mission, {\n      fromOverview: true,\n    });\n    return this.model.missions.update();\n  }\n\n  @action\n  async handleMissionBrowserHide(mission) {\n    await this.missionDispatcher.hide(mission, { fromOverview: true });\n    return this.model.missions.update();\n  }\n\n  @action\n  async handleMissionBrowserSort(missions) {\n    return this.model.course.sortMissions(missions);\n  }\n\n  @action\n  handleMissionBrowserEditCustomContent(customContent) {\n    this.customContent = customContent;\n  }\n\n  @action\n  async handleCustomContentDetailModalSave(customContent) {\n    await this.customContentDispatcher.save(customContent);\n    this.customContent = null;\n  }\n\n  @action\n  async handleMissionActivateModalActivate(missions) {\n    await this.missionDispatcher.activateMany(missions, { fromOverview: true });\n    await this.model.missions.update();\n    this.isCourseMissionActivateModalOpen = false;\n  }\n\n  @action\n  handleMissionActionMenuSelect(value) {\n    switch (value) {\n      case 'new':\n        this.#addNewMission();\n        break;\n      case 'activate':\n        this.isCourseMissionActivateModalOpen = true;\n        break;\n      case 'copy':\n        this.isCourseMissionCopyFromModalOpen = true;\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  async handleMissionCopyFromModalCopy(missions) {\n    await this.missionDispatcher.copyManyToCourse(missions, this.model.course, {\n      fromOverview: true,\n    });\n    await this.model.missions.update();\n    this.isCourseMissionCopyFromModalOpen = false;\n  }\n\n  @action\n  async handleMissionCopyToModalCopy(mission, courses) {\n    await this.missionDispatcher.copyToManyCourses(mission, courses, {\n      fromOverview: true,\n    });\n    this.courseMissionCopyToModalMeta = null;\n  }\n\n  @action\n  handleCustomContentDetailModalClose() {\n    this.customContent.rollback();\n    this.customContent = null;\n  }\n\n  @action\n  async handleMissionDetailModalFileUpload(fileData) {\n    this.pendingFile = this.store.createRecord('file', {\n      name: fileData.name,\n      user: this.session.user,\n    });\n\n    try {\n      await this.fileDispatcher.performUpload(this.pendingFile, fileData);\n      return this.pendingFile;\n    } finally {\n      this.pendingFile = null;\n    }\n  }\n\n  @action\n  handleFileUploadAbort() {\n    this.fileDispatcher.abortUpload(this.pendingFile);\n    this.pendingFile = null;\n  }\n\n  @action\n  async closeIntroModal() {\n    const course = await resolve(this.model.course);\n    const setting = await resolve(course?.setting);\n\n    if (!setting) return;\n\n    if (!setting.metadata) {\n      setting.metadata = {};\n    }\n\n    setting.metadata.hide_intro = true;\n\n    setting.save();\n  }\n\n  #addNewMission() {\n    this.mission = this.model.course.newMission({\n      hideSolutions: !this.setting?.showKey,\n    });\n  }\n\n  @action\n  toggleSort() {\n    this.isSortingDisabled = !this.isSortingDisabled;\n    trackMissionEvent(`Ordna ${this.isSortingDisabled ? '- Klar' : ''}`);\n  }\n\n  @action\n  async handleMissionBrowserSchedule(mission, fields) {\n    await this.missionDispatcher.schedule(mission, fields);\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { trackMissionEvent } from 'babel/utils/matomo-events';\n\nexport const DEFAULT_QUERY_PARAMS = Object.freeze({\n  page: 1,\n  sortBy: 'created',\n  sortDirection: 'desc',\n  scope: 'all',\n});\n\nconst SORT_MENU_BUTTON_ITEMS = Object.freeze([\n  {\n    key: 'createdDesc',\n    value: {\n      by: 'created',\n      direction: 'desc',\n    },\n  },\n  {\n    key: 'createdAsc',\n    value: {\n      by: 'created',\n      direction: 'asc',\n    },\n  },\n  {\n    key: 'titleAsc',\n    value: {\n      by: 'title',\n      direction: 'asc',\n    },\n  },\n  {\n    key: 'titleDesc',\n    value: {\n      by: 'title',\n      direction: 'desc',\n    },\n  },\n]);\n\nconst SCOPE_MENU_BUTTON_ITEMS = Object.freeze([\n  {\n    key: 'all',\n    value: 'all',\n  },\n  {\n    key: 'visible',\n    value: 'visible',\n  },\n  {\n    key: 'upcoming',\n    value: 'upcoming',\n  },\n  {\n    key: 'ended',\n    value: 'ended',\n  },\n]);\n\nexport default class MasterCoursesShowMissionsController extends Controller {\n  @service router;\n  @service store;\n  @service intl;\n  @service session;\n  @service missionDispatcher;\n  @service customContentDispatcher;\n  @service fileDispatcher;\n  @service snackbar;\n\n  queryParams = Object.keys(DEFAULT_QUERY_PARAMS);\n\n  @tracked page = DEFAULT_QUERY_PARAMS.page;\n  @tracked sortBy = DEFAULT_QUERY_PARAMS.sortBy;\n  @tracked sortDirection = DEFAULT_QUERY_PARAMS.sortDirection;\n  @tracked scope = DEFAULT_QUERY_PARAMS.scope;\n  @tracked expandedMissions = [];\n  @tracked mission = null;\n  @tracked customContent = null;\n  @tracked pendingFile = null;\n  @tracked isMissionAddActionMenuOpen = false;\n  @tracked isCourseMissionCopyFromModalOpen = false;\n  @tracked courseMissionCopyToModalMeta = null;\n  @tracked missionShareModalMeta = null;\n\n  get isMissionDetailModalOpen() {\n    return !!this.mission;\n  }\n\n  get isCourseMissionCopyToModalOpen() {\n    return !!this.courseMissionCopyToModalMeta;\n  }\n\n  get isMissionShareModalOpen() {\n    return !!this.missionShareModalMeta;\n  }\n\n  get isCustomContentDetailModalOpen() {\n    return !!this.customContent;\n  }\n\n  get sortMenuButtonItems() {\n    return SORT_MENU_BUTTON_ITEMS.map(({ key, value }) => {\n      return {\n        label: this.intl.t(\n          `controllers.master.courses.show.sortMenuButtonItems.${key}`\n        ),\n        value,\n      };\n    });\n  }\n\n  get sortMenuButtonLabel() {\n    const items = SORT_MENU_BUTTON_ITEMS;\n\n    const item =\n      items.find(\n        ({ value }) =>\n          value.by === this.sortBy && value.direction === this.sortDirection\n      ) ?? items.at(0);\n\n    return this.intl.t(\n      `controllers.master.courses.show.sortMenuButtonItems.${item.key}`\n    );\n  }\n\n  get scopeMenuButtonItems() {\n    return SCOPE_MENU_BUTTON_ITEMS.map(({ key, value }) => {\n      return {\n        label: this.intl.t(\n          `controllers.master.courses.show.scopeMenuButtonItems.${key}`\n        ),\n        value,\n      };\n    });\n  }\n\n  get scopeMenuButtonLabel() {\n    const items = SCOPE_MENU_BUTTON_ITEMS;\n\n    const key = items.find(({ value }) => value === this.scope) ?? items.at(0);\n\n    return this.intl.t(\n      `controllers.master.courses.show.scopeMenuButtonItems.${key.value}`\n    );\n  }\n\n  resetQueryParams() {\n    Object.entries(DEFAULT_QUERY_PARAMS).forEach(([key, value]) => {\n      this[key] = value;\n    });\n  }\n\n  @action\n  handleSortMenuButtonChange({ by, direction }) {\n    this.sortBy = by;\n    this.sortDirection = direction;\n    this.page = DEFAULT_QUERY_PARAMS.page;\n  }\n\n  @action\n  handleScopeMenuButtonChange(scope) {\n    this.scope = scope;\n    this.page = DEFAULT_QUERY_PARAMS.page;\n  }\n\n  @action\n  handleMissionActionMenuSelect(value) {\n    switch (value) {\n      case 'new':\n        this.mission = this.model.course.newMission({\n          hideSolutions: !this.model.setting.showKey,\n        });\n        break;\n      case 'copy':\n        this.isCourseMissionCopyFromModalOpen = true;\n        break;\n      default:\n        break;\n    }\n  }\n\n  @action\n  handleMissionDetailModalClose() {\n    this.mission.rollback();\n    this.mission = null;\n\n    const { createMission } = this.model?.query ?? {};\n\n    if (createMission === 'true') {\n      window.history.back();\n    }\n  }\n\n  @action\n  handleMissionBrowserEdit(mission) {\n    this.mission = mission;\n  }\n\n  @action\n  handleMissionBrowserCopy(mission) {\n    this.courseMissionCopyToModalMeta = {\n      mission,\n    };\n  }\n\n  @action\n  handleMissionBrowserShare(mission) {\n    this.missionShareModalMeta = {\n      mission,\n    };\n  }\n\n  @action\n  handleMissionCopyToModalClose() {\n    this.courseMissionCopyToModalMeta = null;\n  }\n\n  @action\n  handleMissionShareModalClose() {\n    this.missionShareModalMeta = null;\n  }\n\n  @action\n  async handleMissionDetailModalSave() {\n    await this.missionDispatcher.save(this.mission);\n    await this.#updateOrReplace();\n    this.mission = null;\n    this.page = DEFAULT_QUERY_PARAMS.page;\n    this.resetCreateMission();\n  }\n\n  @action\n  async handleMissionDetailModalDelete() {\n    await this.missionDispatcher.delete(this.mission);\n    await this.#updateOrReplace();\n    this.mission = null;\n  }\n\n  @action\n  async handleMissionBrowserToggleActivation(mission) {\n    await this.missionDispatcher.toggleActivation(mission);\n    await this.#updateOrReplace();\n  }\n\n  @action\n  handleMissionBrowserEditCustomContent(customContent) {\n    this.customContent = customContent;\n  }\n\n  @action\n  async handleCustomContentDetailModalSave(customContent) {\n    await this.customContentDispatcher.save(customContent);\n    this.customContent = null;\n  }\n\n  @action\n  async handleMissionCopyFromModalCopy(missions) {\n    await this.missionDispatcher.copyManyToCourse(missions, this.model.course);\n    await this.#updateOrReplace();\n    this.isCourseMissionCopyFromModalOpen = false;\n  }\n\n  @action\n  async handleMissionCopyToModalCopy(mission, courses) {\n    await this.missionDispatcher.copyToManyCourses(mission, courses);\n    this.courseMissionCopyToModalMeta = null;\n  }\n\n  @action\n  handleCustomContentDetailModalClose() {\n    this.customContent.rollback();\n    this.customContent = null;\n  }\n\n  @action\n  async handleMissionBrowserSchedule(mission, fields) {\n    await this.missionDispatcher.schedule(mission, fields);\n    await this.#updateOrReplace();\n  }\n\n  @action\n  async handleMissionBrowserCancelSchedule(mission) {\n    await this.missionDispatcher.cancelSchedule(mission);\n    await this.#updateOrReplace();\n  }\n\n  @action\n  async handleMissionDetailModalFileUpload(fileData) {\n    this.pendingFile = this.store.createRecord('file', {\n      name: fileData.name,\n      user: this.session.user,\n    });\n\n    try {\n      await this.fileDispatcher.performUpload(this.pendingFile, fileData);\n      return this.pendingFile;\n    } finally {\n      this.pendingFile = null;\n    }\n  }\n\n  @action\n  handleFileUploadAbort() {\n    this.fileDispatcher.abortUpload(this.pendingFile);\n    this.pendingFile = null;\n  }\n\n  async #updateOrReplace() {\n    if (this.page === DEFAULT_QUERY_PARAMS.page) {\n      return this.model.missions.update();\n    } else {\n      return this.router.replaceWith({\n        queryParams: { page: DEFAULT_QUERY_PARAMS.page },\n      });\n    }\n  }\n\n  resetCreateMission() {\n    const { createMission } = this.model?.query ?? {};\n\n    if (createMission === 'true') {\n      this.router.transitionTo(\n        'master.courses.show.missions',\n        this.model.course.id,\n        {\n          queryParams: {\n            createMission: null,\n            contentId: null,\n            missionTitle: null,\n          },\n        }\n      );\n    }\n  }\n\n  @action\n  handleMissionAddActionMenuOpen() {\n    this.isMissionAddActionMenuOpen = true;\n    trackMissionEvent('Lägg till uppdrag - Planera uppdrag');\n  }\n\n  @action\n  handleMissionAddActionMenuClose() {\n    this.isMissionAddActionMenuOpen = false;\n    this.resetCreateMission();\n  }\n\n  @action\n  async setupMission() {\n    const { createMission, contentId, missionTitle } = this.model?.query ?? {};\n\n    if (createMission === 'true' && contentId && missionTitle) {\n      try {\n        this.mission = this.model.course.newMission({\n          hideSolutions: !this.model.setting.showKey,\n          title: missionTitle,\n        });\n\n        const entity = await this.store.findRecord('entity', contentId);\n        const customContent = await this.mission.addNewCustomContent({\n          entity,\n        });\n\n        await customContent.save();\n      } catch (error) {\n        this.snackbar.enqueue(\n          this.intl.t('routes.master.courses.show.missions.createMissionError'),\n          {\n            variant: 'error',\n          }\n        );\n        this.mission = null;\n        this.resetCreateMission();\n      }\n    }\n  }\n}\n","import Controller from '@ember/controller';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ErrorController extends Controller {\n  @tracked error;\n}\n","import Controller from '@ember/controller';\n\nexport default class MasterInteractivesIndexController extends Controller {\n  queryParams = [\n    { missionId: 'mission' },\n    { customContentId: 'custom_content' },\n    { openCustomContent: 'open_custom_content' },\n    { closeUrl: 'close_url' },\n    { returnUrl: 'return_url' },\n  ];\n\n  openCustomContent = null;\n}\n","import Controller from '@ember/controller';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MasterInteractivesDiagnosesAuditController extends Controller {\n  queryParams = ['exercise'];\n\n  @tracked exercise;\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport collectionClose from 'babel/utils/collection-close';\nimport { all } from 'rsvp';\n\nexport default class MasterInteractivesDiagnosesIndexController extends Controller {\n  @service assignmentEvents;\n  @service contextHelper;\n  @service store;\n  @service router;\n  @service session;\n\n  @action async handleStart(latestResult, allowedTime) {\n    let activeAttempt = null;\n    const { collection, interactive } = this.model;\n    if (latestResult?.isActive) {\n      activeAttempt = latestResult;\n    } else {\n      const [book, area, exercises] = await all([\n        collection.book,\n        interactive.parent,\n        collection.children,\n      ]);\n\n      activeAttempt = this.store.createRecord('interactive', {\n        attempt: (latestResult ? latestResult.attempt : 0) + 1,\n        time_allowed: allowedTime,\n        entity: collection,\n        document_id: collection?.document_id,\n        book,\n        content: interactive,\n        area,\n        type: 'diagnosis_part',\n        user: this.session.user,\n        started: new Date(),\n      });\n\n      await activeAttempt.createAnswers(exercises);\n      await activeAttempt.save();\n\n      this.assignmentEvents.updateInteractiveForCollection(\n        collection,\n        activeAttempt\n      );\n    }\n\n    return this.router.transitionTo(\n      'master.interactives.diagnoses.show',\n      interactive?.id,\n      collection?.id,\n      activeAttempt?.id\n    );\n  }\n\n  @action handleCancel() {\n    return collectionClose(this.model, this.contextHelper, this.router);\n  }\n}\n","import Controller from '@ember/controller';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class MasterInteractivesDiagnosesShowController extends Controller {\n  queryParams = ['exercise'];\n\n  @service diagnosis;\n\n  @tracked exercise;\n}\n","import Controller from '@ember/controller';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterInteractivesIndexController extends Controller {\n  @service contextHelper;\n\n  @service missionMode;\n\n  get interactive() {\n    return this.model;\n  }\n\n  get showCoverImage() {\n    return (\n      this.interactive?.body?.show_cover_image && this.interactive.featuredImage\n    );\n  }\n\n  get componentName() {\n    switch (this.interactive.template) {\n      case 'interactive':\n        return 'interactives/standard';\n      case 'interactive_one_col_with_images':\n        return 'interactives/one-column';\n      case 'interactive_two_col_with_images':\n        return 'interactives/two-columns';\n      case 'interactive_two_col_no_images':\n        return 'interactives/two-columns';\n      default:\n        return 'interactives/standard';\n    }\n  }\n\n  get restrictedCollections() {\n    return this.interactive?.children\n      ?.filter((child) => {\n        if (this.contextHelper.inMission) {\n          return this.missionMode.entityIsAllowed(child);\n        }\n\n        return true;\n      })\n      ?.sortBy('sort');\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport collectionClose from 'babel/utils/collection-close';\nimport { nextObject, previousObject } from 'compton/utils/array';\n\nexport default class MasterInteractivesPracticesShowController extends Controller {\n  @service contextHelper;\n\n  @service router;\n\n  get hasPreviousCollection() {\n    return this.model.collections?.indexOf(this.model.collection) > 0;\n  }\n\n  get hasNextCollection() {\n    return !(\n      this.model.collections?.indexOf(this.model.collection) >=\n      this.model.collections?.length - 1\n    );\n  }\n\n  @action\n  paginateToNextCollection() {\n    const next = nextObject(this.model.collections, this.model.collection);\n    if (next) {\n      this.openCollection(next.id);\n    }\n  }\n\n  @action\n  paginateToPreviousCollection() {\n    const previous = previousObject(\n      this.model.collections,\n      this.model.collection\n    );\n    if (previous) {\n      this.openCollection(previous.id);\n    }\n  }\n\n  @action\n  openExercise(id) {\n    return this.router.transitionTo('master.interactives.practices.show', id);\n  }\n\n  @action\n  openCollection(id) {\n    const collection = this.model.collections.findBy('id', id);\n    if (collection.template === 'diagnosis_part') {\n      return this.router.transitionTo('master.interactives.diagnoses', id);\n    }\n    return this.router.transitionTo('master.interactives.practices', id);\n  }\n\n  @action\n  async handleCollectionClose() {\n    return collectionClose(this.model, this.contextHelper, this.router);\n  }\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { resolve } from 'rsvp';\n\nexport default class MasterMaterialsController extends Controller {\n  @service router;\n\n  @action handleClose() {\n    return resolve(this.model.parent)\n      .then((parent) => this.router.transitionTo('nodes', parent.id))\n      .catch(() => {});\n  }\n}\n","import Controller from '@ember/controller';\n\nexport default class MasterMissionsController extends Controller {\n  queryParams = [{ closeUrl: 'close_url' }];\n}\n","import Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterProductsIndexController extends Controller {\n  @service router;\n\n  @action routeToCourse(course) {\n    return this.router.replaceWith('master.courses.show.index', course.id);\n  }\n}\n","import Controller from '@ember/controller';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class NodesController extends Controller {\n  queryParams = ['content', 'transition'];\n\n  @tracked content;\n\n  @tracked transition;\n}\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n  // INTERNAL\n\n  queryParams: ['arbetsuppgift'],\n\n  arbetsuppgift: null\n});\n","import ModelValidator from 'ember-model-validator/decorators/model-validator';\n\nexport default ModelValidator;\n","import ObjectValidator from 'ember-model-validator/decorators/object-validator';\n\nexport default ObjectValidator;\n","export default {\n  time: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric'\n    }\n  },\n  date: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric'\n    }\n  },\n  number: {\n    EUR: {\n      style: 'currency',\n      currency: 'EUR',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    },\n    USD: {\n      style: 'currency',\n      currency: 'USD',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    }\n  }\n};\n","import { helper } from '@ember/component/helper';\nimport config from '../config/environment';\nimport {\n  shaRegExp,\n  versionRegExp,\n  versionExtendedRegExp,\n} from 'ember-cli-app-version/utils/regexp';\n\nexport function appVersion(_, hash = {}) {\n  const version = config.APP.version;\n  // e.g. 1.0.0-alpha.1+4jds75hf\n\n  // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n  let versionOnly = hash.versionOnly || hash.hideSha;\n  let shaOnly = hash.shaOnly || hash.hideVersion;\n\n  let match = null;\n\n  if (versionOnly) {\n    if (hash.showExtended) {\n      match = version.match(versionExtendedRegExp); // 1.0.0-alpha.1\n    }\n    // Fallback to just version\n    if (!match) {\n      match = version.match(versionRegExp); // 1.0.0\n    }\n  }\n\n  if (shaOnly) {\n    match = version.match(shaRegExp); // 4jds75hf\n  }\n\n  return match ? match[0] : version;\n}\n\nexport default helper(appVersion);\n","import { helper } from '@ember/component/helper';\n\nfunction gcd(a, b) {\n  return b ? gcd(b, a % b) : a;\n}\n\nexport function aspectRatio([width, height]) {\n  const divisor = gcd(width, height);\n\n  return `${width / divisor} / ${height / divisor}`;\n}\n\nexport default helper(aspectRatio);\n","import { helper } from '@ember/component/helper';\n\nexport function courseDisplayName([course]) {\n  if (!course) {\n    return { title: '', subtitle: null };\n  }\n\n  const courseName = course.name;\n  const groups = course.groups;\n\n  if (groups?.length !== 1) {\n    return { title: courseName, subtitle: null };\n  }\n\n  const group = groups.firstObject || groups[0];\n  const groupName = group?.name;\n\n  if (!groupName || groupName === courseName) {\n    return {\n      title: groupName || courseName,\n      subtitle: null,\n    };\n  }\n\n  return {\n    title: groupName,\n    subtitle: courseName,\n  };\n}\n\nexport default helper(courseDisplayName);\n","import { helper } from '@ember/component/helper';\nimport moment from 'moment';\n\nexport function date([date]) {\n  if (date) {\n    return moment(date).format('YYYY-MM-DD');\n  }\n\n  return null;\n}\n\nexport default helper(date);\n","import { helper } from '@ember/component/helper';\nimport moment from 'moment';\n\nexport function datetime([datetime]) {\n  if (datetime) {\n    return moment(datetime).format('YYYY-MM-DD HH:mm');\n  }\n\n  return null;\n}\n\nexport default helper(datetime);\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/format-date';\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/format-message';\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/format-number';\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/format-relative';\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/format-time';\n","import { helper as buildHelper } from '@ember/component/helper';\nimport { htmlSafe as htmlSafeString } from '@ember/template';\n\nexport function htmlSafe(params /*, hash*/) {\n  return htmlSafeString(params);\n}\n\nexport default buildHelper(htmlSafe);\n","import { helper } from '@ember/component/helper';\nimport humanTime from 'compton/utils/human-time';\n\nexport default helper(function ([time]) {\n  return humanTime(time);\n});\n","import { helper } from '@ember/component/helper';\nimport moment from 'moment';\n\nexport function isBefore([date, days]) {\n  if (date) {\n    if (!days) return moment(date).isBefore(moment());\n    return moment(date).isBefore(moment().add(days, 'days'));\n  }\n\n  return null;\n}\n\nexport default helper(isBefore);\n","import Helper from '@ember/component/helper';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\n\nconst SV_SE = 'sv_SE';\nconst EN_GB = 'en_GB';\nconst ES_ES = 'es_ES';\nconst DE_DE = 'de_DE';\nconst FR_FR = 'fr_FR';\nconst IT_IT = 'it_IT';\n\nconst LANGUAGES = [SV_SE, EN_GB, ES_ES, DE_DE, FR_FR, IT_IT];\n\nexport default class LanguageItems extends Helper {\n  // SETUP\n\n  @service intl;\n\n  // HOOKS\n\n  compute() {\n    return LANGUAGES.map((language) => {\n      return {\n        value: language,\n        label: this.intl.t(\n          ['helpers', 'languageItems', camelize(language)].join('.')\n        ),\n      };\n    });\n  }\n}\n","import { helper } from '@ember/component/helper';\n\nconst MATERIAL_TYPE_TO_POPOVER_COMPONENT_NAME_MAPPING = {\n  articles: 'article-popup',\n  images: 'image-popup',\n};\n\nconst MATERIAL_TYPE_TO_MODAL_COMPONENT_NAME_MAPPING = {\n  articles: 'article-dialog',\n  attachments: 'attachment-dialog',\n  embeds: 'embed-lightbox',\n  guidances: 'article-dialog',\n  images: 'image-lightbox',\n  interactive_images: 'interactive-image-lightbox',\n  links: 'link-dialog',\n  videos: 'video-lightbox',\n  audios: 'audio-lightbox',\n  canvas: 'canvas',\n};\n\nconst COMPONENT_NAME_PREFIX = 'material-viewer';\n\nexport function materialViewerComponentName(\n  [material],\n  { behavior = 'modal' }\n) {\n  if (\n    behavior === 'popover' &&\n    Object.keys(MATERIAL_TYPE_TO_POPOVER_COMPONENT_NAME_MAPPING).includes(\n      material.type\n    )\n  ) {\n    return [\n      COMPONENT_NAME_PREFIX,\n      MATERIAL_TYPE_TO_POPOVER_COMPONENT_NAME_MAPPING[material.type],\n    ].join('/');\n  }\n\n  return [\n    COMPONENT_NAME_PREFIX,\n    MATERIAL_TYPE_TO_MODAL_COMPONENT_NAME_MAPPING[material.type],\n  ].join('/');\n}\n\nexport default helper(materialViewerComponentName);\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\n\nimport { numberToBase26 } from '../utils/number-to-base-26';\n\n/*\n\nexport interface NumberToBase26HelperSignature {\n  Args: {\n    Positional: [number];\n  };\n  Return: string;\n}\n\n*/\n\nexport default helper(function _numberToBase26([number]) {\n  assert(\n    `The first argument passed to the number-to-base-26 helper must be a number. Got ${typeof number}.`,\n    typeof number === 'number'\n  );\n\n  return numberToBase26(number);\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","import { helper as buildHelper } from '@ember/component/helper';\nimport Inflector from 'ember-inflector';\n\nexport function singularize(params /*, hash*/) {\n  var inflector = new Inflector(Inflector.defaultRules);\n  return inflector.singularize(params[0]);\n}\n\nexport default buildHelper(singularize);\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/helpers/t';\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version),\n};\n","import 'ember-data';\n\nimport setupContainer from 'ember-data/setup-container';\n\n/*\n  This code initializes EmberData in an Ember application.\n*/\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer,\n};\n","import ResponsiveInitializer from 'ember-responsive/initializers/responsive';\nexport default ResponsiveInitializer;\n","/* exists only for things that historically used \"after\" or \"before\" */\nexport default {\n  name: 'ember-data',\n  initialize() {},\n};\n","import { computed } from '@ember/object';\nimport { notEmpty } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport DS from 'ember-data';\n\nconst { hasMany } = DS;\n\nexport default Mixin.create({\n  // RELATIONSHIPS\n\n  books: hasMany('entity'),\n\n  contents: hasMany('entity'),\n\n  // PROPERTIES\n\n  bookIds: computed('books.@each', function () {\n    return this.get('books').mapBy('id');\n  }),\n\n  contentIds: computed('contents.@each', function () {\n    return this.get('contents').mapBy('id');\n  }),\n\n  hasBooks: notEmpty('bookIds'),\n\n  hasContents: notEmpty('contentIds'),\n\n  // METHODS\n\n  hasBook(book) {\n    return this.get('bookIds').includes(book.get('id'));\n  },\n\n  hasContent(content) {\n    return this.get('contentIds').includes(content.get('id'));\n  },\n});\n","import Mixin from '@ember/object/mixin';\nimport { next } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { logOpenedProduct } from 'babel/utils/log-opened-product';\nimport { getURLFromRouteInfo } from 'babel/utils/routing';\n// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\nimport { all, reject, resolve } from 'rsvp';\n\nimport getUserLicenseForEntity from '../utils/get-user-license-for-entity';\n\nfunction getEntityId(routeName, params) {\n  const idKey =\n    routeName &&\n    [singularize(routeName.split('.').get('lastObject')), 'id'].join('_');\n\n  if (params && idKey) {\n    return params[idKey];\n  }\n\n  return null;\n}\n\nfunction transitionIsWithinWorkspace(transition) {\n  return transition.targetName\n    .split('.')\n    .any((part) => ['assignments', 'wordlists', 'notes'].includes(part));\n}\n\n// eslint-disable-next-line ember/no-new-mixins\nexport default Mixin.create({\n  // SETUP\n\n  languages: service(),\n\n  // headData: service(),\n\n  // snackbar: service(),\n\n  missionMode: service(),\n\n  entityInspector: service(),\n\n  router: service(),\n\n  session: service(),\n\n  store: service(),\n\n  ajax: service(),\n\n  speakerSession: service(),\n\n  // HOOKS\n\n  model(params, transition) {\n    const { routeName, store, session, speakerSession } = this.getProperties(\n      'routeName',\n      'store',\n      'session',\n      'speakerSession'\n    );\n\n    const entityId = getEntityId(routeName, params);\n\n    this.set('entityId', entityId);\n\n    if (!entityId) {\n      // eslint-disable-next-line ember/use-ember-data-rfc-395-imports\n      return reject(new DS.AdapterError());\n    }\n\n    const record = store.peekRecord('entity', entityId);\n    const adapterOptions = {\n      include: ['ancestors', 'children'],\n    };\n\n    if (this.get('includeGrandchildren')) {\n      adapterOptions.include.push('grandchildren');\n    }\n\n    if (this.get('includeCategories')) {\n      adapterOptions.include.push('categories');\n    }\n\n    let entityPromise;\n\n    if (record && record.hasMany('ancestors').value() === null) {\n      // If a record is loaded, but not the necessary relations\n      // we reloaded it with all required data included in one request\n      entityPromise = record.reload({ adapterOptions });\n    } else {\n      entityPromise = store.findRecord('entity', entityId, { adapterOptions });\n    }\n\n    return all([\n      entityPromise,\n      store\n        .findAll('teacher-assignment')\n        .then((teacherAssignments) =>\n          all(\n            teacherAssignments.map((teacherAssignment) =>\n              all([\n                teacherAssignment.get('books'),\n                teacherAssignment.get('contents'),\n                teacherAssignment.get('user'),\n              ])\n            )\n          ).then(() => teacherAssignments)\n        ),\n      store\n        .findAll('wordlist')\n        .then((wordlists) =>\n          all(\n            wordlists.map((wordlist) =>\n              all([wordlist.get('books'), wordlist.get('contents')])\n            )\n          ).then(() => wordlists)\n        ),\n      store\n        .findAll('note')\n        .then((notes) =>\n          all(\n            notes.map((note) => all([note.get('books'), note.get('contents')]))\n          ).then(() => notes)\n        ),\n      speakerSession.getJwt(),\n    ]).then(([model, teacherAssignments, wordlists, notes]) => {\n      logOpenedProduct(model, this.ajax, this.session);\n\n      return all([\n        model.get('ancestors'),\n        model.get('book'),\n        model.get('children'),\n      ]).then(([ancestors, book, children]) => {\n        const promises = [\n          ...ancestors.rejectBy('type', 'contents').getEach('children'),\n        ];\n\n        promises.addObjects(\n          children\n            .filterBy('type', 'glossaries')\n            .invoke('transformToWordlist', model)\n        );\n\n        teacherAssignments\n          .filter((teacherAssignment) => teacherAssignment.hasContent(model))\n          .invoke('createAsEntity', model);\n\n        if (\n          model.get('type') === 'books' &&\n          children &&\n          children.length === 0\n        ) {\n          // Books might be in the store from getting products from the public API.\n          // If the user's accessible books are out of sync with the licenses,\n          // children will be empty. We can't distinguish this from the actual case\n          // of an empty book and therefore can't allow access.\n\n          promises.push(\n            session.refreshUserLicenses().then(() => {\n              return children.reload().then((reloaded) => {\n                if (!reloaded || reloaded.length === 0) {\n                  // eslint-disable-next-line ember/use-ember-data-rfc-395-imports\n                  return reject(new DS.ForbiddenError());\n                }\n              });\n            })\n          );\n        }\n\n        if (model.type === 'contents') {\n          const sections = children?.filterBy('type', 'sections') || [];\n\n          sections.forEach((section) => {\n            if (section?.body?.reading_id) {\n              promises.push(\n                this.store.findRecord('material', section.body.reading_id)\n              );\n            }\n          });\n        }\n\n        let customContent, mission;\n\n        if (params.missionId && params.customContentId) {\n          promises.push(\n            this.store\n              .findRecord('mission', params.missionId)\n              .then((_mission) => {\n                mission = _mission;\n              })\n              .catch(() => {})\n          );\n\n          promises.push(\n            this.store\n              .findRecord('custom-content', params.customContentId)\n              .then((_customContent) => {\n                customContent = _customContent;\n\n                return all([\n                  customContent.includedEntities,\n                  customContent.includedTeacherAssignments,\n                  customContent.includedWordlists,\n                ]);\n              })\n              .catch(() => {})\n          );\n        }\n\n        return all(promises).then(() => {\n          return all(children.getEach('contenteditor')).then(\n            (contentEditors) => {\n              return all(contentEditors.compact().getEach('materials')).then(\n                () => {\n                  return this.prepareMissionModeIfNeeded(\n                    mission,\n                    customContent\n                  ).then(() => {\n                    let closeUrl = transition?.to?.queryParams?.close_url;\n\n                    if (\n                      !closeUrl &&\n                      (model.type === 'contents' ||\n                        model.type === 'interactives') &&\n                      transition?.from &&\n                      transition?.from?.name !== 'nodes' &&\n                      transition?.from?.name !== 'application_loading'\n                    ) {\n                      try {\n                        closeUrl = getURLFromRouteInfo(\n                          transition.from,\n                          this.router\n                        );\n                      } catch (err) {\n                        // do nothing\n                      }\n                    }\n\n                    return {\n                      model,\n                      teacherAssignments,\n                      wordlists,\n                      children,\n                      notes,\n                      book,\n                      bookEntity: book,\n                      mission,\n                      customContent,\n                      closeUrl,\n                      returnUrl: transition?.to?.queryParams?.return_url,\n                    };\n                  });\n                }\n              );\n            }\n          );\n        });\n      });\n    });\n  },\n\n  redirect(model, transition) {\n    const section = transition?.to?.queryParams?.section;\n\n    if (!section && transitionIsWithinWorkspace(transition)) {\n      const firstSection = model.children\n        .filterBy('type', 'sections')\n        .filter((section) => this.get('missionMode').entityIsAllowed(section))\n        .get('firstObject');\n\n      if (firstSection) {\n        next(() => {\n          this.controllerFor('master.contents').set(\n            'activeSectionId',\n            firstSection.get('id')\n          );\n        });\n      }\n    }\n  },\n\n  resetController(controller, isExiting) {\n    this._super(...arguments);\n\n    if (isExiting) {\n      this.missionMode.deactivate();\n    }\n  },\n\n  setupController(\n    controller,\n    {\n      model,\n      teacherAssignments,\n      wordlists,\n      notes,\n      bookEntity,\n      mission,\n      customContent,\n      closeUrl,\n    }\n  ) {\n    this._super(...arguments);\n\n    controller.setProperties({\n      model,\n      teacherAssignments,\n      wordlists,\n      notes,\n      closeUrl,\n    });\n\n    // Set content language\n    const language =\n      model.get('body.language') || bookEntity.get('body.language');\n    this.set('languages.contentLanguage', language);\n\n    if (mission && customContent) {\n      this.missionMode.activate({ mission, customContent, closeUrl });\n    }\n\n    const shouldOpenCustomContent = controller.openCustomContent === 'true';\n\n    if (shouldOpenCustomContent && customContent) {\n      resolve(customContent.entity)\n        .then((entity) => {\n          if (entity) {\n            this.entityInspector.openModal(entity, 'missionCustomizer');\n          }\n        })\n        .finally(() => {\n          this.router.replaceWith({\n            queryParams: { open_custom_content: null },\n          });\n        });\n    }\n  },\n\n  // ACTIONS\n\n  actions: {\n    error(err, transition) {\n      const routeName = this.get('routeName');\n      const route = transition.to.find((route) => route.name === routeName);\n      const entityId = getEntityId(routeName, route.params);\n\n      // eslint-disable-next-line ember/use-ember-data-rfc-395-imports\n      if (err instanceof DS.ForbiddenError) {\n        return getUserLicenseForEntity(\n          entityId,\n          this.get('session'),\n          this.get('ajax'),\n          config.endpoint,\n          config.userApiEndpoint,\n          transition\n        ).catch(() => {\n          this.router.transitionTo('master.forbidden');\n        });\n        // eslint-disable-next-line ember/use-ember-data-rfc-395-imports\n      } else if (err instanceof DS.AdapterError) {\n        this.router.transitionTo('master.error').then(() => {\n          const controller = this.controllerFor('master.error');\n\n          if (controller) {\n            controller.error = err;\n          }\n        });\n      } else {\n        return true;\n      }\n    },\n  },\n\n  // PRIVATE\n\n  async prepareMissionModeIfNeeded(mission, customContent) {\n    if (mission && customContent) {\n      let customContentEntity;\n\n      try {\n        customContentEntity = await resolve(customContent.entity);\n        await resolve(customContentEntity.children);\n      } catch (err) {\n        // do nothing\n      }\n    }\n  },\n});\n","import Mixin from '@ember/object/mixin';\nimport { inject as service } from '@ember/service';\n\n// eslint-disable-next-line ember/no-new-mixins\nexport default Mixin.create({\n  ajax: service(),\n\n  pageviews: service(),\n\n  afterModel(model, transition) {\n    this._super(...arguments);\n\n    const section = model.children.findBy(\n      'id',\n      transition.to?.queryParams?.section\n    );\n\n    let entity = section || model.model;\n\n    if (!model || !model.bookEntity || !model.model) {\n      console.error('Page view could not be registred.');\n    }\n\n    let parent = null;\n\n    if (model.model.get('type') !== 'books') {\n      parent = model.model.parent;\n    }\n\n    this.pageviews.logPageView(entity, model.bookEntity, parent);\n  },\n});\n","import { computed } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\n\nconst { belongsTo } = DS;\n\nexport default Mixin.create({\n  // SETUP\n\n  session: service(),\n\n  // RELATIONSHIPS\n\n  user: belongsTo('user'),\n\n  // PROPERTIES\n\n  userId: computed('user', function () {\n    return this.belongsTo('user').id();\n  }),\n\n  isOwner: computed('user', 'session.user', function () {\n    return this.isUser(this.get('session.user'));\n  }),\n\n  // METHODS\n\n  isUser(user) {\n    return this.get('userId') === user.get('id');\n  },\n});\n","import { attr, belongsTo } from '@ember-data/model';\n\nimport Model from './model';\n\nexport default Model.extend({\n  // ATTRIBUTES\n\n  type: attr('string'),\n\n  comment: attr('string'),\n\n  public: attr('boolean'),\n\n  version: attr('number'),\n\n  metadata: attr('object', {\n    defaultValue() {\n      return {};\n    },\n  }),\n\n  answer: belongsTo('answer', {\n    async: true,\n    inverse: 'comments',\n  }),\n\n  user: belongsTo('user', {\n    async: true,\n    inverse: null,\n  }),\n\n  assignment: belongsTo('entity', {\n    async: true,\n    inverse: null,\n  }),\n});\n","// eslint-disable-next-line ember/no-computed-properties-in-native-classes\nimport { computed, get } from '@ember/object';\n// eslint-disable-next-line ember/no-computed-properties-in-native-classes\nimport { sort } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\nimport Model from 'babel/models/model';\nimport moment from 'moment';\n\nexport default class AnswerModel extends Model {\n  @service intl;\n\n  @service session;\n\n  // ATTRIBUTES\n\n  @attr('array', {\n    defaultValue() {\n      return [];\n    },\n  })\n  assignments;\n\n  @attr('date', {\n    defaultValue() {\n      return new Date();\n    },\n  })\n  created;\n\n  @attr('string') document_id;\n\n  @attr('string') assignment_title;\n\n  @attr('string', { defaultValue: 'not-started' }) status;\n\n  // assignment, study, exercise, survey are automaticly set\n  // diagnosis_part, quiz are set from outside\n  @attr('string') type;\n\n  @attr('number', { defaultValue: null }) version;\n\n  get node_id() {\n    // eslint-disable-next-line ember/no-get\n    return get(this, 'entity.id');\n  }\n\n  get teacher_assignment_id() {\n    // eslint-disable-next-line ember/no-get\n    return get(this, 'teacher-assignment.id');\n  }\n\n  get computedStatus() {\n    // eslint-disable-next-line ember/no-get\n    if (get(this, 'entity.type') === 'studies' && this.status === 'turned-in') {\n      return 'done';\n    } else if (this.status) {\n      return this.status;\n    }\n\n    return 'not-started';\n  }\n\n  get createdDate() {\n    let date = this.updated,\n      createdDate;\n\n    if (!date) {\n      date = this.created;\n    }\n\n    if (date) {\n      let locale = this.intl.locale;\n\n      if (!locale || locale.length !== 1) {\n        locale = 'sv';\n      } else {\n        locale = locale[0];\n      }\n\n      moment.locale(locale);\n\n      createdDate = moment(date)\n        .locale(locale)\n        .calendar(null, {\n          sameDay: `[${this.intl.t('models.answer.calendar.today')}]`,\n          lastDay: `[${this.intl.t('models.answer.calendar.yesterday')}]`,\n          lastWeek: `[${this.intl.t('models.answer.calendar.lastWeek')}]`,\n          sameElse: 'LL',\n        });\n    }\n\n    return createdDate || this.intl.t('models.answer.unknownDate');\n  }\n\n  // OBSERVERS\n\n  @computed('assignments.@each.correct')\n  get correct() {\n    return this.assignments.isEvery('correct');\n  }\n\n  @computed('assignments.@each.score')\n  get score() {\n    return this.assignments.mapBy('score').reduce((a, b) => a + b, 0);\n  }\n\n  @computed('assignments.@each.scoreMax')\n  get scoreMax() {\n    return this.assignments.mapBy('scoreMax').reduce((a, b) => a + b, 0);\n  }\n\n  // RELATIONS\n\n  @hasMany('file', { async: true, inverse: null }) files;\n\n  @hasMany('answer-comment', { async: true, inverse: 'answer' }) comments;\n\n  @belongsTo('entity', {\n    async: true,\n    inverse: null,\n  })\n  entity;\n\n  @belongsTo('entity', {\n    async: true,\n    inverse: null,\n  })\n  content;\n\n  @belongsTo('answer', {\n    async: true,\n    inverse: null,\n  })\n  originalAnswer;\n\n  @belongsTo('entity', {\n    async: true,\n    inverse: null,\n  })\n  area;\n\n  @belongsTo('entity', {\n    async: true,\n    inverse: null,\n  })\n  collection;\n\n  @belongsTo('entity', {\n    async: true,\n    inverse: null,\n  })\n  book;\n\n  @belongsTo('teacher-assignment', {\n    async: true,\n    inverse: null,\n  })\n  teacherAssignment;\n\n  @belongsTo('user', {\n    async: true,\n    inverse: null,\n  })\n  user;\n\n  @hasMany('answer', {\n    async: true,\n    inverse: null,\n  })\n  versions;\n\n  commentSortDefinition = ['created:desc'];\n  @sort('comments', 'commentSortDefinition') sortedComments;\n\n  save() {\n    if (this.session.inPreviewMode) return this;\n    return super.save(...arguments);\n  }\n\n  reload() {\n    if (this.session.inPreviewMode) return this;\n    return super.reload(...arguments);\n  }\n}\n","import DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr } = DS;\n\nexport default Model.extend({\n  title: attr('string')\n});\n","import Model from '@ember-data/model';\nimport { attr, belongsTo } from '@ember-data/model';\n\nexport default class CanvasStateModel extends Model {\n  @attr('date') created;\n\n  @attr('date') updated;\n\n  @attr('string') json;\n\n  @belongsTo('material', { async: true, inverse: null }) material;\n\n  @belongsTo('editor', { async: true, inverse: null }) editor;\n\n  @belongsTo('user', { async: true, inverse: null }) user;\n\n  setJSON(data) {\n    this.json = JSON.stringify(data);\n  }\n}\n","import DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr, hasMany } = DS;\n\nexport default Model.extend({\n  // ATTRIBUTES\n\n  name: attr('string'),\n\n  sort: attr('number'),\n\n  entities: hasMany('entity', { async: true, inverse: null }),\n});\n","import { hasMany } from '@ember-data/model';\nimport Model from 'babel/models/model';\n\nexport default class ContentableModel extends Model {\n  // RELATIONSHIPS\n\n  @hasMany('entity', { async: true, inverse: null }) books;\n\n  @hasMany('entity', { async: true, inverse: null }) contents;\n\n  // PROPERTIES\n\n  get bookIds() {\n    return this.books.mapBy('id');\n  }\n\n  get contentIds() {\n    return this.contents.mapBy('id');\n  }\n\n  get hasBooks() {\n    return this.bookIds.length > 0;\n  }\n\n  get hasContents() {\n    return this.contentIds.length > 0;\n  }\n\n  // METHODS\n\n  hasBook(book) {\n    return this.bookIds.includes(book.id);\n  }\n\n  hasContent(content) {\n    return this.contentIds.includes(content.id);\n  }\n}\n","import { A } from '@ember/array';\nimport ArrayProxy from '@ember/array/proxy';\nimport { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\nimport { inject as service } from '@ember/service';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\nimport config from 'babel/config/environment';\nimport Model from 'babel/models/model';\nimport imageSource from 'compton/utils/image-source';\nimport moment from 'moment';\nimport { all, resolve } from 'rsvp';\n\nconst ArrayPromiseProxy = ArrayProxy.extend(PromiseProxyMixin);\n\nexport default Model.extend({\n  // SETTINGS\n\n  hiddenBooks: alias('setting.hiddenBooks'),\n\n  showKey: alias('setting.showKey'),\n\n  showDiagnosis: alias('setting.showDiagnosis'),\n\n  cover_url: alias('setting.cover_url'),\n\n  sortedMissionIds: alias('setting.metadata.sorted_mission_ids'),\n\n  sortedShortcutIds: alias('setting.metadata.sorted_shortcut_ids'),\n\n  overviewDisplayFirst: alias('setting.metadata.overview_display_first'),\n\n  shortcuts: alias('setting.shortcuts'),\n\n  // SERVICES\n\n  ajax: service(),\n\n  session: service(),\n\n  store: service(),\n\n  name: attr('string'),\n\n  start_date: attr('only-date'),\n\n  end_date: attr('only-date'),\n\n  active: attr('boolean', {\n    defaultValue() {\n      return true;\n    },\n  }),\n\n  metadata: attr({\n    defaultValue() {\n      return {};\n    },\n  }),\n\n  imageUploaded: alias('metadata.image_uploaded'),\n\n  aiChatDisabled: attr('boolean'),\n\n  created: attr('date'),\n\n  updated: attr('date'),\n\n  // INTERNAL\n\n  licensesHaveChanged: false,\n\n  missingLicenseProductsIsReloading: false,\n\n  // RELATIONS\n\n  setting: belongsTo('setting', { async: true, inverse: null }),\n\n  users: hasMany('user', { async: true, inverse: null }),\n\n  teachers: hasMany('user', { async: true, inverse: null }),\n\n  groups: hasMany('group', { async: true, inverse: null }),\n\n  school: belongsTo('school', { async: true, inverse: null }),\n\n  products: hasMany('product', { async: true, inverse: null }),\n\n  missions: hasMany('mission', { async: true, inverse: 'course' }),\n\n  missingLicenseProducts: hasMany('missing-license-product', {\n    async: true,\n    inverse: null,\n  }),\n\n  is_new: attr('boolean', {\n    defaultValue() {\n      return false;\n    },\n  }),\n\n  // PROPERTIES\n\n  hasLicenseWarnings: computed(\n    'session.user.isTeacher',\n    'school.metadata.external_licenses',\n    'usersMissingLicenses.length',\n    function () {\n      if (!this.session.user?.isTeacher) return false;\n      if (this.school?.get('metadata.external_licenses')) return false;\n      return this.usersMissingLicenses?.length > 0;\n    }\n  ),\n\n  numUsers: computed('users.{[],isFulfilled}', function () {\n    return (this.hasMany('users').ids() || []).length;\n  }),\n\n  allBooks: computed('products.@each.books', function () {\n    const promise = resolve(this.products)\n      .then((products) => all(products.map((product) => product.userBooks)))\n      .then((productBooks) => productBooks.flat());\n\n    return ArrayPromiseProxy.create({ promise });\n  }),\n\n  hasExternalBooks: computed('allBooks.@each.type', function () {\n    return this.allBooks?.filterBy('type', 'books_external')?.length > 0;\n  }),\n\n  hasInternalBooks: computed('allBooks.@each.type', function () {\n    return this.allBooks?.filterBy('type', 'books')?.length > 0;\n  }),\n\n  usersMissingLicenses: computed(\n    'missingLicenseProducts.{[],isFulfilled}',\n    'session.user.isTeacher',\n    'licensesHaveChanged',\n    function () {\n      let promise;\n\n      if (!this.get('session.user.isTeacher')) {\n        promise = resolve(A());\n      } else if (\n        this.licensesHaveChanged &&\n        this.hasMany('missingLicenseProducts').value() !== null\n      ) {\n        promise = this.reloadMissingLicenseProducts();\n      } else {\n        promise = this.missingLicenseProducts;\n      }\n\n      return ArrayPromiseProxy.create({\n        promise: promise.then((arr) => arr.sortBy('product.title')),\n      });\n    }\n  ),\n\n  students: computed(\n    'users.{[],isFulfilled}',\n    'teachers.{[],isFulfilled}',\n    function () {\n      const users = this.users || A();\n      const teachers = this.teachers || A();\n\n      return users.filter((user) => !teachers.includes(user));\n    }\n  ),\n\n  books: computed(\n    'hiddenBooks.[]',\n    'products.[]',\n    'session.user.isTeacher',\n    'setting.books.[]',\n    function () {\n      const promise = all([\n        resolve(this.setting)\n          .then((setting) => resolve(setting?.books))\n          .catch(() => []),\n        resolve(this.setting)\n          .then((setting) => resolve(setting?.hiddenBooks))\n          .catch(() => []),\n        this.products,\n      ])\n        .then(([settingBooks, hiddenBooks, products]) => {\n          // use old books relation if present,\n          // it is removed when shown books are altered\n          if (settingBooks?.length > 0) return settingBooks;\n\n          return all(\n            products\n              .sortBy('title')\n              .map((product) =>\n                resolve(product.userBooks).then((productBooks) =>\n                  productBooks.filter((book) => !hiddenBooks.includes(book))\n                )\n              )\n          );\n        })\n        .then((books) => books.flat().uniqBy('id'))\n        .catch(() => []);\n\n      return ArrayPromiseProxy.create({ promise });\n    }\n  ),\n\n  firstProductImage: computed('products.@each.image', function () {\n    const products = this.products;\n    const productsWithImage = products.filter(\n      (product) =>\n        product.get('metadata.background_type') !== 'color' &&\n        product.get('image')\n    );\n\n    if (productsWithImage.length > 0) {\n      return productsWithImage.get('firstObject.image');\n    }\n\n    return null;\n  }),\n\n  coverImage: computed(\n    'cover_url',\n    'firstProductImage.imageURL',\n    'imageUploaded',\n    function () {\n      if (this.get('imageUploaded')) {\n        return (\n          `${config.imgProcessingEndpoint}?url=` +\n          encodeURIComponent(this.cover_url) +\n          '&h=480&w=640&embed=true'\n        );\n      } else {\n        return this.firstProductImage\n          ? imageSource(this.get('firstProductImage.imageURL'), {\n              preset: 'small',\n            })\n          : null;\n      }\n    }\n  ),\n\n  coverBackground: computed(\n    'cover_url',\n    'firstProductImage.imageURL',\n    'imageUploaded',\n    function () {\n      if (this.get('imageUploaded')) {\n        return (\n          `${config.imgProcessingEndpoint}?url=` +\n          encodeURIComponent(this.cover_url) +\n          '&w=1920&h=500&embed=true'\n        );\n      } else {\n        return this.firstProductImage\n          ? imageSource(this.get('firstProductImage.imageURL'), {\n              preset: 'landscape',\n            })\n          : null;\n      }\n    }\n  ),\n\n  isComing: computed('start_date', 'end_date', function () {\n    return moment().isBefore(moment(this.start_date).format('YYYY-MM-DD'));\n  }),\n\n  // METHODS\n\n  newMission(fields) {\n    const store = this.store;\n    const user = this.session.user;\n\n    return store.createRecord('mission', {\n      user,\n      ...fields,\n      course: this,\n    });\n  },\n\n  async sortMissions(missions) {\n    this.sortedMissionIds = missions.mapBy('id');\n    const setting = await resolve(this.setting);\n    if (!setting) return;\n    return setting.save();\n  },\n\n  async sortShortcuts(shortcuts) {\n    this.sortedShortcutIds = shortcuts.mapBy('id');\n    const setting = await resolve(this.setting);\n    if (!setting) return;\n    return setting.save();\n  },\n\n  reloadMissingLicenseProducts() {\n    if (this.missingLicenseProductsIsReloading) {\n      return this.missingLicenseProducts;\n    }\n\n    this.set('missingLicenseProductsIsReloading', true);\n\n    return this.missingLicenseProducts\n      .reload()\n      .then((missingLicenseProducts) => {\n        this.set('missingLicenseProductsIsReloading', false);\n        this.set('licensesHaveChanged', false);\n\n        return missingLicenseProducts;\n      });\n  },\n});\n","import EmberObject, { get as proxyGet } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\n\n// eslint-disable-next-line ember/no-mixins\nimport Userable from '../mixins/userable';\nimport Model from './model';\n\nexport default class CustomContentModel extends Model.extend(Userable) {\n  // SETUP\n\n  @service store;\n\n  // RELATIONSHIPS\n\n  @belongsTo('course', { async: true, inverse: null }) course;\n\n  @belongsTo('entity', { async: true, inverse: null }) entity;\n\n  @hasMany('entity', { async: true, inverse: null }) includedEntities;\n\n  @hasMany('teacher-assignment', { async: true, inverse: null })\n  includedTeacherAssignments;\n\n  @hasMany('wordlist', { async: true, inverse: null }) includedWordlists;\n\n  @hasMany('mission', { async: true, inverse: null }) missions;\n\n  // ATTRIBUTES\n\n  @attr('string') title;\n\n  @attr('boolean', { defaultValue: false }) populated;\n\n  @attr('number', { defaultValue: 0 }) sort;\n\n  @attr('array', {\n    defaultValue() {\n      return [];\n    },\n  })\n  includedEntitySettings;\n\n  // PROPERTIES\n\n  get titleWithFallback() {\n    const title = this.title;\n\n    if (isPresent(title)) {\n      return title;\n    }\n\n    // eslint-disable-next-line ember/no-get\n    return proxyGet(this.entity, 'title');\n  }\n\n  // METHODS\n\n  async populate() {\n    if (this.populated) {\n      return this;\n    }\n\n    const entity = await this.entity;\n\n    const [\n      includedEntities,\n      includedTeacherAssignments,\n      includedWordlists,\n      descendents,\n      teacherAssignments,\n      wordlists,\n    ] = await Promise.all([\n      this.includedEntities,\n      this.includedTeacherAssignments,\n      this.includedWordlists,\n      entity.customizableDescendents,\n      this.#loadTeacherAssignments(),\n      this.#loadWordlists(),\n    ]);\n\n    includedTeacherAssignments.setObjects(\n      teacherAssignments\n        .filterBy('isPublished')\n        .filter((teacherAssignment) => teacherAssignment.hasContent(entity))\n    );\n\n    includedWordlists.setObjects(\n      wordlists\n        .filterBy('isPublished')\n        .filter((wordlist) => wordlist.hasContent(entity))\n    );\n\n    includedEntities.setObjects(descendents);\n\n    descendents.forEach((descendent) => {\n      this.includedEntitySettings.addObject(\n        this.#getDefaultSettingsForIncludedEntity(descendent)\n      );\n    });\n\n    this.populated = true;\n\n    return this;\n  }\n\n  // PRIVATE\n\n  #getDefaultSettingsForIncludedEntity(entity) {\n    // eslint-disable-next-line ember/no-get\n    const entityId = proxyGet(entity, 'id');\n\n    // eslint-disable-next-line ember/no-get\n    if (proxyGet(entity, 'isDiagnosis')) {\n      return EmberObject.create({\n        entityId,\n        numberOfTries: null,\n        timeAllowed: null,\n      });\n    }\n\n    return EmberObject.create({\n      entityId,\n    });\n  }\n\n  async #loadTeacherAssignments() {\n    const teacherAssignments = await this.store.findAll('teacher-assignment');\n    await Promise.all(\n      teacherAssignments.map(async (teacherAssignment) => {\n        await Promise.all([\n          teacherAssignment.books,\n          teacherAssignment.contents,\n        ]);\n      })\n    );\n    return teacherAssignments;\n  }\n\n  async #loadWordlists() {\n    const wordlists = await this.store.findAll('wordlist');\n    await Promise.all(\n      wordlists.map(async (wordlist) => {\n        await Promise.all([wordlist.books, wordlist.contents]);\n      })\n    );\n    return wordlists;\n  }\n}\n","import { attr, hasMany } from '@ember-data/model';\nimport { cached } from '@glimmer/tracking';\n\nimport extractFootnotesFromEditorValue from '../utils/extract-footnotes-from-editor-value';\nimport Model from './model';\n\nfunction extractFootnotesFromComponents(components) {\n  let notes = [];\n\n  return components\n    .map((item) => {\n      switch (item.component) {\n        case 'paragraph':\n        case 'heading':\n        case 'image':\n        case 'video':\n        case 'audio':\n        case 'canvas':\n        case 'interactive_image':\n          return extractFootnotesFromEditorValue(item.value);\n        case 'list':\n        case 'gallery':\n          return item.value\n            ?.map((x) => extractFootnotesFromEditorValue(x.value))\n            .flat();\n        case 'table':\n          item.rows?.forEach((row) => {\n            row.columns?.forEach((column) => {\n              notes.push(...extractFootnotesFromEditorValue(column?.value));\n            });\n          });\n\n          notes.push(...extractFootnotesFromEditorValue(item.caption));\n\n          return notes;\n        default:\n          break;\n      }\n    })\n    .flat()\n    .compact();\n}\n\nexport default class EditorModel extends Model {\n  // RELATIONSHIPS\n\n  @hasMany({ async: true, inverse: null }) materials;\n\n  // ATTRIBUTES\n\n  @attr() rows;\n\n  @attr() metadata;\n\n  // PROPERTIES\n\n  get components() {\n    return this.rows\n      ?.sortBy('index')\n      ?.mapBy('columns')\n      ?.flat()\n      ?.sortBy('index')\n      ?.mapBy('components')\n      ?.flat();\n  }\n\n  @cached\n  get footnotes() {\n    return extractFootnotesFromComponents(this.components);\n  }\n}\n","import EmberObject, { computed } from '@ember/object';\nimport { alias, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport DS from 'ember-data';\nimport { all, resolve } from 'rsvp';\n\nimport Model from './model';\n\nconst { attr, belongsTo, hasMany, PromiseArray, PromiseObject } = DS;\n\nfunction createPromiseObject(promise) {\n  return PromiseObject.create({ promise });\n}\n\nfunction createPromiseArray(promise) {\n  return PromiseArray.create({ promise });\n}\n\nconst SV_SE = 'sv_SE';\n\nconst ALLOWED_TYPES_FOR_HIDE_SORT_NUMBERS = [\n  'archives',\n  'areas',\n  'contents',\n  'interactives',\n  'materials',\n];\n\nconst ALLOWED_TYPES_FOR_HIDE_SECTION_SORT_NUMBERS = [\n  'collections',\n  'glossaries',\n  'sections',\n];\n\nconst ALLOWED_TYPES_FOR_HIDE_ASSIGNMENT_SORT_NUMBERS = [\n  'assignments',\n  'exercises',\n  'studies',\n];\n\n// The entire path must exist for each file\nconst DEFAULT_IMAGES = [\n  { name: 'archives', path: '/assets/images/defaults/archives.svg' },\n  { name: 'areas', path: '/assets/images/defaults/areas.svg' },\n  {\n    name: 'contents-chapter',\n    path: '/assets/images/defaults/contents-chapter.svg',\n  },\n  {\n    name: 'contents-story',\n    path: '/assets/images/defaults/contents-story.svg',\n  },\n  {\n    name: 'contents-workflow',\n    path: '/assets/images/defaults/contents-workflow.svg',\n  },\n  {\n    name: 'interactives',\n    path: '/assets/images/defaults/interactives.svg',\n  },\n];\n\nexport default Model.extend({\n  session: service(),\n\n  intl: service(),\n\n  store: service(),\n\n  contextHelper: service(),\n\n  // ATTRIBUTES\n\n  title: attr(),\n\n  heading: attr(),\n\n  body: attr(),\n\n  type: attr(),\n\n  breadcrumb: attr(),\n\n  metadata: attr(),\n\n  template: attr(),\n\n  sort: attr(),\n\n  sortBy: attr('string'),\n\n  url: attr('string'),\n\n  featured_image: attr('string'),\n\n  edition: attr(),\n\n  published: attr('date'),\n\n  latestUpdated: attr('date'),\n\n  questionHtml: attr('string'),\n\n  document_id: attr('string'),\n\n  // TODO Remove:\n  book_id: attr(),\n  parent_id: attr(),\n  parent_type: attr(),\n  children_ids: attr(),\n\n  space: attr(),\n\n  meta: attr(),\n\n  childrenSum: attr('number'),\n\n  // RELATIONSHIPS\n\n  parent: belongsTo('entity', { async: true, inverse: null }),\n\n  book: belongsTo('entity', { async: true, inverse: null }),\n\n  ancestors: hasMany('entity', { async: true, inverse: null }),\n\n  descendents: hasMany('entity', { async: true, inverse: null }),\n\n  children: hasMany('entity', { async: true, inverse: null }),\n\n  materials: hasMany('material', { async: true, inverse: null }),\n\n  guidances: hasMany('material', { async: true, inverse: null }),\n\n  tagFilters: hasMany('material', { async: true, inverse: null }),\n\n  editors: hasMany('editor', { async: true, inverse: null }),\n\n  contenteditor: belongsTo('editor', { async: true, inverse: null }), // TODO Rename to content editor\n\n  coverImage: belongsTo('material', { async: false, inverse: null }),\n\n  logo: belongsTo('material', { async: false, inverse: null }),\n\n  image: belongsTo('material', { async: false, inverse: null }),\n\n  audio: belongsTo('material', { async: false, inverse: null }),\n\n  cat: belongsTo('category', { async: false, inverse: null }), // TODO: Rename to category.\n\n  category: alias('cat'),\n\n  categories: hasMany('category', { async: true, inverse: null }),\n\n  answer: belongsTo('answer', { inverse: null, async: false }),\n\n  // Used for temporarely created entities by user\n  owner: belongsTo('user', { inverse: null, async: false }),\n\n  products: hasMany('product', { async: true, inverse: null }),\n\n  isTeacherCollection: attr('boolean'),\n\n  isTeacherAssignment: attr('boolean'),\n\n  teacherAssignment: belongsTo('teacher-assignment', {\n    async: false,\n    inverse: null,\n  }),\n\n  selectedMaterial: belongsTo('material', { async: true, inverse: null }),\n\n  // PROPERTIES\n\n  subtitle: computed(\n    'book.body.language',\n    'body.{language,pages,subtitle,subtitle_type}',\n    function () {\n      if (this.body?.subtitle_type === 'pages' && this.body?.pages) {\n        const lang =\n          this.body?.language || this.book?.get('body.language') || SV_SE;\n\n        switch (lang) {\n          case 'de_DE':\n            return `S. ${this.body.pages}`;\n          case 'en_GB':\n          case 'en_US':\n          case 'es_ES':\n          case 'it_IT':\n            if (this.body.pages.indexOf('-') === -1) {\n              // single page\n              return `p. ${this.body.pages}`;\n            } else {\n              // range of pages\n              return `pp. ${this.body.pages}`;\n            }\n          case 'fr_FR':\n            return `p. ${this.body.pages}`;\n          default:\n            return `s. ${this.body.pages}`;\n        }\n      } else if (this.body?.subtitle_type !== 'pages' && this.body?.subtitle) {\n        return this.body.subtitle;\n      }\n\n      return null;\n    }\n  ),\n\n  footnotes: readOnly('contenteditor.footnotes'),\n\n  hideSortNumbers: computed(\n    'type',\n    'body.hide_sort_numbers',\n    'book.hideSortNumbers',\n    function () {\n      if (this.type === 'books') {\n        return Boolean(this.body?.hide_sort_numbers);\n      } else if (ALLOWED_TYPES_FOR_HIDE_SORT_NUMBERS.includes(this.type)) {\n        // get is needed here since book is a proxy\n        return Boolean(this.get('book.hideSortNumbers'));\n      } else {\n        return false;\n      }\n    }\n  ),\n\n  hideSectionSortNumbers: computed(\n    'type',\n    'body.hide_section_sort_numbers',\n    'book.hideSectionSortNumbers',\n    function () {\n      if (this.type === 'books') {\n        return Boolean(this.body?.hide_section_sort_numbers);\n      } else if (\n        ALLOWED_TYPES_FOR_HIDE_SECTION_SORT_NUMBERS.includes(this.type)\n      ) {\n        // get is needed here since book is a proxy\n        return Boolean(this.get('book.hideSectionSortNumbers'));\n      } else {\n        return false;\n      }\n    }\n  ),\n\n  hideAssignmentSortNumbers: computed(\n    'type',\n    'body.hide_assignment_sort_numbers',\n    'book.hideAssignmentSortNumbers',\n    function () {\n      if (this.type === 'books') {\n        return Boolean(this.body?.hide_assignment_sort_numbers);\n      } else if (\n        ALLOWED_TYPES_FOR_HIDE_ASSIGNMENT_SORT_NUMBERS.includes(this.type)\n      ) {\n        // get is needed here since book is a proxy\n        return Boolean(this.get('book.hideAssignmentSortNumbers'));\n      } else {\n        return false;\n      }\n    }\n  ),\n\n  activeEntitySettings: computed(\n    'contextHelper.{inMission,activeCustomContent.includedEntitySettings.[]}',\n    'id',\n    function () {\n      if (\n        this.contextHelper.inMission &&\n        this.contextHelper.activeCustomContent?.includedEntitySettings\n      ) {\n        return this.contextHelper.activeCustomContent.includedEntitySettings.findBy(\n          'entityId',\n          this.id\n        );\n      }\n\n      return null;\n    }\n  ),\n\n  pointsRequired: computed('body.points_required', function () {\n    return this.body?.points_required ?? 0;\n  }),\n\n  timeAllowed: computed(\n    'activeEntitySettings.timeAllowed',\n    'body.time_allowed',\n    function () {\n      if (this.activeEntitySettings?.timeAllowed) {\n        return this.activeEntitySettings.timeAllowed;\n      }\n\n      return this.body?.time_allowed ?? 30;\n    }\n  ),\n\n  allowedAttempts: computed(\n    'activeEntitySettings.numberOfTries',\n    'body.num_tries',\n    function () {\n      if (this.activeEntitySettings?.numberOfTries) {\n        return this.activeEntitySettings.numberOfTries;\n      }\n\n      return this.body?.num_tries ?? 1;\n    }\n  ),\n\n  // NOTE This should be a relation.\n  product: computed(\n    'products.[]',\n    'session.user.licenseProducts.[]',\n    function () {\n      return createPromiseObject(\n        all([this.products, this.get('session.user.licenseProducts')]).then(\n          ([products, licenseProducts]) => {\n            const avialableProducts = products.filter((product) =>\n              licenseProducts.mapBy('content').includes(product)\n            );\n\n            const firstProduct = avialableProducts.get('firstObject');\n\n            if (firstProduct) {\n              return firstProduct;\n            }\n\n            return null;\n          }\n        )\n      );\n    }\n  ),\n\n  // NOTE This should be a relation.\n  video: computed('body.video', 'store', function () {\n    const videoId = this.get('body.video');\n\n    if (videoId) {\n      return createPromiseObject(this.store.findRecord('material', videoId));\n    }\n\n    return createPromiseObject(resolve(null));\n  }),\n\n  typeLabel: computed('type', 'intl.locale', function () {\n    if (!this.type) {\n      return null;\n    }\n\n    return this.intl.t(\n      ['models', 'entity', 'typeLabel', camelize(this.type)].join('.')\n    );\n  }),\n\n  canHaveCustomizableChildren: computed(\n    'schema',\n    'template',\n    'type',\n    function () {\n      const { type, template } = this.getProperties('type', 'template');\n\n      switch (type) {\n        case 'collections':\n          return ['standard', 'flow'].includes(template);\n        case 'contents':\n          return ['chapter', 'story', 'workflow'].includes(template);\n        case 'sections':\n          return true;\n        case 'interactives':\n          return true;\n        default:\n          return false;\n      }\n    }\n  ),\n\n  defaultImage: computed('type', 'template', function () {\n    const templateObj = DEFAULT_IMAGES.findBy(\n      'name',\n      `${this.type}-${this.template}`\n    );\n    const typeObj = DEFAULT_IMAGES.findBy('name', this.type);\n\n    if (templateObj && templateObj.path) {\n      return templateObj.path;\n    } else if (typeObj && typeObj.path) {\n      return typeObj.path;\n    } else {\n      return null;\n    }\n  }),\n\n  featuredImage: computed(\n    'created',\n    'featured_image',\n    'image.updated',\n    'defaultImage',\n    'updated',\n    function () {\n      if (this.featured_image) {\n        let updated = this.updated;\n\n        if (this.get('image.updated')) {\n          updated = this.get('image.updated');\n        }\n\n        if (!updated) {\n          updated = this.created;\n        }\n\n        return (\n          this.featured_image + '?hash=' + this.generateHash(updated.toString())\n        );\n      }\n\n      return this.defaultImage;\n    }\n  ),\n\n  level: null,\n\n  copyrightedMaterialEntityGroups: computed(\n    'materials.[]',\n    'contenteditor',\n    'children.[]',\n    function () {\n      const groups = [];\n\n      const addMaterials = async (entity, model, sort) => {\n        if (model) {\n          const ids = model.hasMany('materials').ids();\n          const materials = [];\n\n          await all(\n            ids.map(async (id) => {\n              let material;\n\n              try {\n                material = await this.store.findRecord('material', id);\n              } catch (error) {\n                console.error(error);\n              }\n\n              // DINO-3771, if the template changes from story to something else remove featured image\n              const parent = await entity.parent;\n              if (\n                parent?.type === 'contents' &&\n                parent?.template !== 'story' &&\n                entity?.image?.id === id\n              ) {\n                return;\n              }\n\n              if (material?.metadata?.copyright) {\n                materials.push(material);\n              }\n            })\n          );\n\n          groups.addObjects(\n            materials.map((material) => {\n              return {\n                entity,\n                material,\n                sort,\n              };\n            })\n          );\n        }\n      };\n\n      const addEditors = async (entity, sort) => {\n        if (entity) {\n          const ids = [];\n\n          if (entity.belongsTo('contenteditor').id()) {\n            ids.push(entity.belongsTo('contenteditor').id());\n          }\n\n          entity.body?.exercise?.assignments?.forEach((assignment) => {\n            if (assignment?.content?.solution_editor_id) {\n              ids.push(assignment.content.solution_editor_id);\n            }\n          });\n\n          await all(\n            ids.map(async (id) => {\n              let editor;\n\n              try {\n                editor = await this.store.findRecord('editor', id);\n              } catch (error) {\n                console.error(error);\n              }\n\n              if (editor) {\n                await addMaterials(entity, editor, sort);\n              }\n            })\n          );\n        }\n      };\n\n      const addChildren = async (entity) => {\n        if (['contents', 'interactives'].includes(entity?.type)) {\n          const ids = entity.hasMany('children').ids();\n          const children = [];\n\n          await all(\n            ids.map(async (id) => {\n              let child;\n\n              try {\n                child = await this.store.findRecord('entity', id);\n              } catch (error) {\n                console.error(error);\n              }\n\n              if (child) {\n                children.push(child);\n              }\n            })\n          );\n\n          if (entity.type === 'contents') {\n            return all(children.map((x) => addEntity(x, entity.sort)));\n          } else {\n            return all(children.map((x) => addMaterials(x, x, x.sort)));\n          }\n        }\n      };\n\n      const addEntity = (entity, sort) => {\n        return all([\n          addMaterials(entity, entity, entity.sort + sort),\n          addEditors(entity, entity.sort + sort),\n          addChildren(entity),\n        ]);\n      };\n\n      return PromiseArray.create({\n        promise: addEntity(this, 0).then(() => groups.sortBy('sort')),\n      });\n    }\n  ),\n\n  isCarousel: computed('type', 'template', function () {\n    return this.type === 'collections' && this.template === 'carousel';\n  }),\n\n  isDiagnosis: computed('type', 'template', function () {\n    return this.type === 'collections' && this.template === 'diagnosis_part';\n  }),\n\n  isFlow: computed('type', 'template', function () {\n    return this.type === 'collections' && this.template === 'flow';\n  }),\n\n  isStandard: computed('type', 'template', function () {\n    return this.type === 'collections' && this.template === 'standard';\n  }),\n\n  /*\n  scoreMax: computed('body.exercise.assignments.[]', function() {\n    const assignments = this.body.exercise && this.body.exercise.assignments;\n\n    if (!assignments) {\n      return;\n    }\n\n    return MULTIPLE_ASSIGNMENTS.includes(assignments.get('firstObject.template'))\n      ? assignments.get('firstObject.content.objects.length')\n      : assignments.length;\n  }),\n  */\n\n  scoreMax: 1,\n\n  versions: computed('children.[]', function () {\n    const promise = this.children.then((children) => {\n      return all(children.getEach('contenteditor')).then(() => {\n        const versions = [];\n\n        const categories = children\n          .filterBy('type', 'sections')\n          .uniqBy('category');\n\n        categories.map((category) => {\n          const version = EmberObject.create({\n            version: category.get('category.name'),\n            sections: children\n              .filter(\n                (x) =>\n                  x.get('type') === 'sections' &&\n                  x.get('category.id') === category.get('category.id')\n              )\n              .get('length'),\n            words: 0,\n            minutesToRead: 0,\n          });\n\n          children.map((child) => {\n            if (\n              child.get('type') === 'sections' &&\n              child.get('category') === category.get('category')\n            ) {\n              child.get('contenteditor').then((editor) => {\n                if (child.get('heading') && child.get('heading').length > 0) {\n                  version.incrementProperty(\n                    'words',\n                    child.get('heading').split(' ').length\n                  );\n                }\n\n                if (editor.get('metadata') && editor.get('metadata.words')) {\n                  version.incrementProperty(\n                    'words',\n                    editor.get('metadata.words')\n                  );\n                }\n\n                version.minutesToRead = Math.max(\n                  1,\n                  Math.ceil(parseInt(version.words) / 120)\n                );\n              });\n            }\n          });\n\n          versions.addObject(version);\n        });\n\n        return versions;\n      });\n    });\n\n    return createPromiseArray(promise);\n  }),\n\n  sectionRecordedSpeech: computed('body.section_recorded_speech', function () {\n    if (this.get('body.section_recorded_speech') === true) {\n      return true;\n    } else {\n      return false;\n    }\n  }),\n\n  backgroundType: alias('body.background_type'),\n\n  backgroundColor: alias('body.background_color'),\n\n  textColor: alias('body.text_color'),\n\n  adaptUiFor: alias('body.adapt_ui_for'),\n\n  // METHODS\n\n  transformToWordlist() {\n    if (this.type === 'glossaries') {\n      const store = this.store;\n\n      return all([this.book, this.parent]).then(([book, parent]) => {\n        let wordlist = store.peekRecord('wordlist', this.id);\n\n        if (!wordlist)\n          wordlist = store.createRecord('wordlist', { id: this.id });\n\n        wordlist.name = this.title;\n        wordlist.language =\n          this.body?.language || book?.body?.language || SV_SE;\n        wordlist.type = this.template || 'glossaries';\n        wordlist.category = this.category;\n        wordlist.public = true;\n        wordlist.created = null;\n        wordlist.set('isTransformed', true);\n        wordlist.entity = this;\n        wordlist.books = [book];\n        wordlist.contents = [parent];\n\n        return this.materials\n          .then((materials) => {\n            const words = materials.map((material) => {\n              const wordId = `${wordlist.id}-${material.id}`;\n              let word = store.peekRecord('word', wordId);\n\n              if (!word) word = store.createRecord('word', { id: wordId });\n\n              word.sort = this.body?.words?.indexOf(material?.id) + 1;\n              word.word = material.name;\n              word.translation = material.metadata?.translation;\n              word.explanation = material.metadata?.explanation;\n              word.examples = material.metadata?.examples;\n              word.wordClass = material.metadata?.word_class;\n              word.wordConstruction = material.metadata?.word_construction;\n\n              return word;\n            });\n\n            wordlist.words.addObjects(words);\n          })\n          .then(() => wordlist);\n      });\n    }\n  },\n\n  customizableDescendents: computed(\n    'canHaveCustomizableChildren',\n    'children.[]',\n    function () {\n      if (this.canHaveCustomizableChildren) {\n        return createPromiseArray(\n          this.children.then((children) => {\n            return all(children.getEach('customizableDescendents')).then(\n              (descendents) => {\n                return [...children.toArray(), ...descendents.flat()]\n                  .rejectBy('isTeacherAssignment')\n                  .rejectBy('isTeacherCollection');\n              }\n            );\n          })\n        );\n      }\n\n      return createPromiseArray(resolve([]));\n    }\n  ),\n\n  eachParent(callback) {\n    return this.parent\n      .then((parent) => {\n        if (parent) {\n          if (callback != null) {\n            callback(parent);\n          }\n          return parent.eachParent(callback);\n        }\n      })\n      .catch(() => {});\n  },\n\n  getParents() {\n    const parents = [];\n\n    const add = (parent) => {\n      parents.addObject(parent);\n    };\n\n    return this.eachParent(add).then(() => {\n      return all(parents);\n    });\n  },\n\n  // PRIVATE\n\n  generateHash(s) {\n    return s.split('').reduce(function (a, b) {\n      a = (a << 5) - a + b.charCodeAt(0);\n      return a & a;\n    }, 0);\n  },\n});\n","import { attr } from '@ember-data/model';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport ContentableModel from 'babel/models/contentable';\nimport urlHelper from 'babel/utils/urls';\nimport MultipartUpload from 'compton/utils/multipart-upload';\nimport { toQueryString } from 'compton/utils/object';\nimport { reject } from 'rsvp';\n\nconst AUDIO = 'audio';\nconst VIDEO = 'video';\nconst IMAGE = 'image';\nconst DOCUMENT = 'document';\nconst AUDIO_RECORDING = 'audio-recording';\n\nconst MEDIA_TYPES = [AUDIO, VIDEO, IMAGE, AUDIO_RECORDING];\n\nconst GOOGLE_DOCS_ENDPOINT = 'https://docs.google.com/gview';\n\nconst SIGNED_URL_ENDPOINT = `${config.endpoint}/api/v1/meta/files/upload-url`;\n\nexport default class FileModel extends ContentableModel {\n  // SETUP\n\n  @service ajax;\n\n  @service intl;\n\n  validations = {\n    name: {\n      presence: {\n        message: function (_, __, record) {\n          return record.intl.t('models.file.validations.name.presence');\n        },\n      },\n    },\n    externalUrl: {\n      custom: {\n        validation: function (_, __, model) {\n          if (model.get('type') !== 'external') {\n            return true;\n          }\n          if (!model.get('externalUrl')) {\n            return false;\n          }\n          return urlHelper.isValidURL(model.get('externalUrl'));\n        },\n        message: function (_, __, record) {\n          return record.get('intl').t('models.file.validations.url.valid');\n        },\n      },\n    },\n  };\n\n  // ATTRIBUTES\n\n  @attr('string') name;\n\n  @attr('string') filename;\n\n  @attr('number') filesize;\n\n  @attr('string') type;\n\n  @attr('string') url;\n\n  @attr('string') userId;\n\n  @attr('string') externalType;\n\n  @attr('string') externalUrl;\n\n  @attr('boolean') recorded;\n\n  @attr('object', {\n    defaultValue() {\n      return {};\n    },\n  })\n  metadata;\n\n  // PROPERTIES\n\n  @tracked upload;\n\n  get title() {\n    return this.name;\n  }\n\n  get mime() {\n    return this.metadata?.mime;\n  }\n\n  get titleWithFallback() {\n    return this.title || this.intl.t('models.file.titleWithFallback');\n  }\n\n  get source() {\n    const url = this.url;\n\n    if (this.type === DOCUMENT) {\n      const hl = this.intl.locale;\n\n      return [\n        GOOGLE_DOCS_ENDPOINT,\n        toQueryString({ hl, url, embedded: true }),\n      ].join('?');\n    }\n\n    return url;\n  }\n\n  // METHODS\n\n  isUser(user) {\n    return this.userId === user.id;\n  }\n\n  async performUpload(file) {\n    let contentType = file.type;\n\n    // Since pages files gives no type on file.type\n    if (!contentType && file.name?.endsWith('.pages')) {\n      contentType = 'application/x-iwork-pages-sffpages';\n    }\n\n    const getSignedUrl = this.getSignedUrl;\n\n    const upload = new MultipartUpload({\n      file,\n      contentType,\n      contentLength: file.size,\n      canSplitFile: false,\n      returnETag: false,\n      getSignedUrl,\n    });\n\n    this.upload = upload;\n\n    try {\n      await upload.perform();\n    } catch (err) {\n      return reject(err);\n    }\n\n    const type = this.recorded\n      ? AUDIO_RECORDING\n      : file.type.split('/').firstObject;\n\n    this.filename = encodeURI(file.name);\n    this.filesize = file.size;\n    this.type = type && MEDIA_TYPES.includes(type) ? type : DOCUMENT;\n\n    if (!file.metadata) file.metadata = {};\n\n    this.metadata.mime = file.type;\n\n    return this.save().finally(() => {\n      this.upload = null;\n    });\n  }\n\n  abortUpload() {\n    const upload = this.upload;\n\n    if (upload) {\n      upload.abort();\n    }\n  }\n\n  @action getSignedUrl({ mime_type, file_size }) {\n    return this.ajax\n      .request(SIGNED_URL_ENDPOINT, true, {\n        type: 'POST',\n        data: {\n          contentType: mime_type,\n          contentLength: file_size,\n          id: this.id,\n          name: encodeURI(this.name),\n        },\n      })\n      .then(({ url }) => url);\n  }\n}\n","import { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr, hasMany, belongsTo } = DS;\n\nexport default Model.extend({\n  name: attr('string'),\n\n  type: attr('string'),\n\n  created: attr('date'),\n\n  updated: attr('date'),\n\n  metadata: attr({\n    defaultValue() {\n      return {};\n    },\n  }),\n\n  num_students: attr('number'),\n\n  // RELATIONS\n\n  users: hasMany('user', { async: true, inverse: null }),\n\n  school: belongsTo('school', { async: true, inverse: null }),\n\n  userIds: computed('users.[]', function () {\n    return this.hasMany('users').ids();\n  }),\n});\n","import { attr, belongsTo, hasMany } from '@ember-data/model';\n\nimport Model from './model';\n\nexport default class HelpListModel extends Model {\n  @belongsTo('setting', { async: true, inverse: null }) setting;\n\n  @hasMany('user', { async: true, inverse: null }) users;\n\n  @attr('date') createdAt;\n}\n","import { inject as service } from '@ember/service';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\nimport { cached } from '@glimmer/tracking';\nimport Model from 'babel/models/model';\nimport {\n  correctExercise,\n  emptyAnswer,\n  getNumCorrectAnswers,\n  getNumStartedAnswers,\n  getNumSubmittedAnswers,\n} from 'babel/utils/assignments';\nimport sum from 'compton/utils/array-sum';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class InteractiveModel extends Model {\n  // SERVICES\n\n  @service assignmentEvents;\n\n  @service session;\n\n  @service store;\n\n  @service missionMode;\n\n  // ATTRIBUTES\n\n  @attr('string') document_id;\n\n  @attr('date') ended;\n\n  @attr('number') score;\n\n  @attr('date') started;\n\n  @attr('number') attempt;\n\n  @attr('number') progress;\n\n  @attr('string') type;\n\n  // RELATIONS\n\n  @hasMany('answer', { async: true, inverse: null }) answers;\n\n  @belongsTo('entity', { async: true, inverse: null }) currentExercise;\n\n  @belongsTo('entity', { async: true, inverse: null }) entity;\n\n  @belongsTo('entity', { async: true, inverse: null }) book;\n\n  @belongsTo('entity', { async: true, inverse: null }) area;\n\n  @belongsTo('entity', { async: true, inverse: null }) content;\n\n  @belongsTo('user', { async: true, inverse: null }) user;\n\n  @hasMany('entity', { async: true, inverse: null }) correctExercises;\n\n  // PROPERTIES\n\n  @cached\n  get answersProxy() {\n    const exerciseIds = this.exercises.map((exercise) => exercise.id);\n    const teacherAssignmentIds = this.exercises\n      .filter((exercise) => exercise.isTeacherAssignment)\n      .map((exercise) => exercise.belongsTo('teacherAssignment').id());\n\n    const promise = resolve(this.answers).then((answers) =>\n      []\n        .concat(\n          exerciseIds.map((id) =>\n            answers.find((answer) => answer.belongsTo('entity').id() === id)\n          ),\n          teacherAssignmentIds.map((id) =>\n            answers.find(\n              (answer) => answer.belongsTo('teacherAssignment').id() === id\n            )\n          )\n        )\n        .filter((answer) => answer)\n    );\n\n    return load(promise, this);\n  }\n\n  get resolvedAnswers() {\n    return this.answersProxy.isResolved ? this.answersProxy.value : [];\n  }\n\n  @cached\n  get entityProxy() {\n    return load(resolve(this.entity), this);\n  }\n\n  get resolvedEntity() {\n    return this.entityProxy.isResolved ? this.entityProxy.value : null;\n  }\n\n  get pointsRequired() {\n    return this.resolvedEntity?.pointsRequired;\n  }\n\n  get isDiagnosis() {\n    return this.type === 'diagnosis_part';\n  }\n\n  @cached\n  get exercisesProxy() {\n    let promise = resolve([]);\n\n    if (this.resolvedEntity) {\n      promise = resolve(this.resolvedEntity.children).then((children) =>\n        this.missionMode.allowedEntities(children)\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get exercises() {\n    return this.exercisesProxy.isResolved ? this.exercisesProxy.value : [];\n  }\n\n  get numExercises() {\n    return this.exercises.length;\n  }\n\n  @cached\n  get attemptExercisesProxy() {\n    let promise = resolve([]);\n\n    if (this.exercises.length > 0) {\n      promise = resolve(this.correctExercises).then((correctExercises) =>\n        this.exercises.filter(\n          (exercise) => !correctExercises.includes(exercise)\n        )\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get attemptExercises() {\n    return this.attemptExercisesProxy.isResolved\n      ? this.attemptExercisesProxy.value\n      : [];\n  }\n\n  get numAttemptExercises() {\n    return this.attemptExercises.length;\n  }\n\n  get attemptAnswers() {\n    const exerciseIds = this.attemptExercises.map((exercise) => exercise.id);\n\n    return this.resolvedAnswers.filter((answer) =>\n      exerciseIds.includes(answer.belongsTo('entity').id())\n    );\n  }\n\n  get numStartedAnswers() {\n    return getNumStartedAnswers(this.resolvedAnswers);\n  }\n\n  get numSubmittedAnswers() {\n    return getNumSubmittedAnswers(this.resolvedAnswers);\n  }\n\n  get numSubmittedAttemptAnswers() {\n    return getNumSubmittedAnswers(this.attemptAnswers);\n  }\n\n  get numCorrectAnswers() {\n    return getNumCorrectAnswers(this.resolvedAnswers);\n  }\n\n  get numCorrectAttemptAnswers() {\n    return getNumCorrectAnswers(this.attemptAnswers);\n  }\n\n  get isStarted() {\n    return this.attempt > 1 || this.numStartedAnswers > 0;\n  }\n\n  get isCompleted() {\n    if (this.numExercises < 1) return false;\n\n    let requiredPoints = this.numExercises;\n\n    if (this.isDiagnosis && this.pointsRequired) {\n      requiredPoints = this.pointsRequired;\n    }\n\n    return this.numCorrectAnswers >= requiredPoints;\n  }\n\n  get isActive() {\n    if (!this.started) {\n      return false;\n    }\n\n    if (this.ended) {\n      return false;\n    }\n\n    if (!this.isDiagnosis) {\n      return this.numStartedAnswers > 0 && !this.isCompleted;\n    }\n\n    if (!this.resolvedEntity?.timeAllowed) {\n      return false;\n    }\n\n    if (\n      new Date().getTime() <=\n      new Date(this.started).getTime() + this.resolvedEntity.timeAllowed * 60000\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get isAborted() {\n    if (this.isActive || this.ended) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // METHODS\n\n  async createAnswers(exercises) {\n    const answers = await all(\n      exercises.map((exercise) => {\n        const assignments = exercise.body?.exercise?.assignments?.map(\n          (assignment) => emptyAnswer(assignment)\n        );\n\n        const answer = this.store.createRecord('answer', {\n          user: this.session.user,\n          entity: exercise,\n          type: 'diagnosis',\n          book_id: this.book_id,\n          area_id: this.area_id,\n          content_id: this.content_id,\n          collection_id: this.node_id,\n          status: 'not-started',\n          document_id: exercise.document_id,\n          assignments,\n        });\n\n        return answer.save();\n      })\n    );\n\n    this.answers = answers;\n  }\n\n  async turnIn() {\n    if (this.assignmentEvents.autoSaveAnswer.isRunning) {\n      this.assignmentEvents.autoSaveAnswer.cancelAll();\n    }\n\n    if (this.assignmentEvents.saveAnswer.isRunning) {\n      this.assignmentEvents.saveAnswer.cancelAll();\n    }\n\n    const answers = await resolve(this.answers);\n    const items = await all(answers.map((answer) => this.handleAnswer(answer)));\n\n    this.ended = new Date();\n    this.score = items.filter(\n      (item) => item.answer.status === 'correct'\n    ).length;\n    this.scoreMax = sum(items.mapBy('entity.scoreMax'));\n\n    await this.save();\n  }\n\n  async handleAnswer(answer) {\n    const entity = await resolve(answer.entity);\n\n    correctExercise(entity, answer);\n\n    await answer.save();\n\n    return { answer, entity };\n  }\n\n  async save() {\n    if (this.session.inPreviewMode) return this;\n    return super.save(...arguments);\n  }\n\n  reload() {\n    if (this.session.inPreviewMode) return this;\n    return super.reload(...arguments);\n  }\n}\n","import { computed } from '@ember/object';\nimport { notEmpty, readOnly } from '@ember/object/computed';\nimport DS from 'ember-data';\nimport moment from 'moment';\n\nimport Model from './model';\n\nconst { attr, belongsTo } = DS;\n\nexport default Model.extend({\n  // RELATIONSHIPS\n\n  user: belongsTo('user', { async: true, inverse: null }),\n\n  product: belongsTo('product', { async: true, inverse: null }),\n\n  school: belongsTo('school', { async: true, inverse: null }),\n\n  // ATTRIBUTES\n\n  isbn: attr('string'),\n\n  type: attr('string'),\n\n  agreed_num_users: attr('number'),\n\n  active_from: attr('only-date'),\n\n  active_until: attr('only-date'),\n\n  subscription_id: attr('string'),\n\n  subscription_renewal_date: attr('only-date'),\n\n  is_demo: attr('boolean'),\n\n  unlimited: attr('boolean'),\n\n  is_expired: attr('boolean'),\n\n  extended: attr('boolean'),\n\n  demo_used: attr('boolean'),\n\n  provider: attr('string'),\n\n  is_new: attr('boolean', {\n    defaultValue() {\n      return false;\n    },\n  }),\n\n  // PROPERTIES\n\n  is_external: computed('provider', function () {\n    return this.get('provider') ? true : false;\n  }),\n\n  is_private: computed('school', function () {\n    return this.belongsTo('school').id() ? false : true;\n  }),\n\n  activeFrom: readOnly('active_from'),\n\n  activeUntil: readOnly('active_until'),\n\n  isDemo: readOnly('is_demo'),\n\n  agreedNumberOfUsers: readOnly('agreed_num_users'),\n\n  numberOfUsesLeft: computed(\n    'unlimited',\n    'agreedNumberOfUsers',\n    'userIds.length',\n    function () {\n      if (this.get('unlimited')) {\n        return Infinity;\n      }\n\n      return Math.max(\n        this.get('agreedNumberOfUsers') - this.get('userIds.length'),\n        0\n      );\n    }\n  ),\n\n  // NOTE The \"type\" attribute is not reliable as it returns a empty string\n  // when it's not \"shared\".\n  kind: computed('type', function () {\n    if (this.get('type') === 'shared') {\n      return 'shared';\n    }\n\n    return 'personal';\n  }),\n\n  is_active: computed('activeFrom', 'activeUntil', function () {\n    return moment().isBetween(\n      this.get('activeFrom'),\n      this.get('activeUntil'),\n      'day',\n      '[]'\n    );\n  }),\n\n  isActive: readOnly('is_active'),\n\n  isExpired: readOnly('is_expired'),\n\n  isExhausted: computed('unlimited', 'numberOfUsesLeft', function () {\n    if (this.get('unlimited')) {\n      return false;\n    }\n\n    return this.get('numberOfUsesLeft') === 0;\n  }),\n\n  daysLeft: computed('activeUntil', function () {\n    return Math.max(moment(this.get('activeUntil')).diff(moment(), 'days'), 0);\n  }),\n\n  userIds: computed('users.[]', function () {\n    return this.hasMany('users').ids();\n  }),\n\n  hasUsers: notEmpty('userIds'),\n\n  hasUser: notEmpty('user.id'),\n\n  subscriptionIsActive: computed(\n    'subscription_id',\n    'subscription_renewal_date',\n    'isExpired',\n    function () {\n      const subscriptionId = this.get('subscription_id');\n      const subscriptionRenewalDate = this.get('subscription_renewal_date');\n      const isExpired = this.get('isExpired');\n\n      return (\n        !isExpired &&\n        subscriptionId &&\n        subscriptionRenewalDate &&\n        moment(subscriptionRenewalDate, 'day').isSameOrAfter(moment(), 'day')\n      );\n    }\n  ),\n\n  subscriptionIsEnded: computed(\n    'subscription_id',\n    'subscription_renewal_date',\n    'isExpired',\n    function () {\n      const subscriptionId = this.get('subscription_id');\n      const subscriptionRenewalDate = this.get('subscription_renewal_date');\n      const isExpired = this.get('isExpired');\n\n      return !isExpired && subscriptionId && !subscriptionRenewalDate;\n    }\n  ),\n\n  subscriptionHasPendingPayment: computed(\n    'subscription_id',\n    'subscription_renewal_date',\n    'isExpired',\n    function () {\n      const subscriptionId = this.get('subscription_id');\n      const subscriptionRenewalDate = this.get('subscription_renewal_date');\n      const isExpired = this.get('isExpired');\n\n      return (\n        !isExpired &&\n        subscriptionId &&\n        subscriptionRenewalDate &&\n        moment(subscriptionRenewalDate, 'day').isBefore(moment(), 'day')\n      );\n    }\n  ),\n});\n","import EmberObject from '@ember/object';\nimport DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr } = DS;\n\nexport default Model.extend({\n  service: attr('string'),\n\n  identifier: attr('string'),\n\n  metadata: attr('object', {\n    defaultValue() {\n      return EmberObject.create({ sortedCustomContentIds: [] });\n    },\n    camelizeDeserializedKeys: true,\n  }),\n});\n","import { computed } from '@ember/object';\nimport { alias, or, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport { isPresent } from '@ember/utils';\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\n\nimport Model from './model';\n\nconst { PromiseArray } = DS;\n\nfunction createPromiseArray(promise) {\n  return PromiseArray.create({ promise });\n}\n\nconst { attr } = DS;\n\nexport default Model.extend({\n  intl: service(),\n\n  store: service(),\n\n  // ATTRIBUTES\n\n  name: attr('string'),\n\n  metadata: attr(),\n\n  type: attr('string'),\n\n  category: attr('string'),\n\n  meta: attr(),\n\n  rank: attr('number'), // for search results\n\n  aiGenerated: attr('boolean', { defaultValue: false }),\n\n  // RELATIONS\n\n  entity: DS.belongsTo('entity', {\n    async: true,\n    inverse: null,\n  }),\n\n  editors: DS.hasMany('editor', {\n    async: true,\n    inverse: null,\n  }),\n\n  keywords: attr('array', {\n    defaultValue() {\n      return [];\n    },\n  }),\n\n  // ALIASES\n\n  imageURL: alias('imageUrl'),\n\n  imageUrl: computed('meta.image_url', 'updated', function () {\n    const updated = this.updated || new Date();\n    return (\n      this.get('meta.image_url') +\n      '?hash=' +\n      this.generateHash(updated.toString())\n    );\n  }),\n\n  copyright: readOnly('metadata.copyright'),\n\n  originalImageURL: computed(\n    // eslint-disable-next-line ember/use-brace-expansion\n    'meta.properties.mimetype',\n    'meta.{attachment_url,original_url}',\n    'updated',\n    function () {\n      const updated = this.updated || new Date();\n\n      if (this.get('meta.properties.mimetype') === 'image/svg+xml') {\n        return (\n          this.get('meta.original_url') +\n          '?hash=' +\n          this.generateHash(updated.toString())\n        );\n      } else {\n        return (\n          this.get('meta.attachment_url') +\n          '?hash=' +\n          this.generateHash(updated.toString())\n        );\n      }\n    }\n  ),\n\n  materials: computed(\n    'editors.@each.materials',\n    'metadata.markers',\n    'store',\n    'type',\n    function () {\n      let promise = Promise.resolve([]);\n      if (this.type === 'interactive_images') {\n        promise = Promise.all(\n          (this.metadata.markers || [])\n            .filterBy('material_id')\n            .map((marker) =>\n              this.store.findRecord('material', marker.material_id)\n            )\n        ).then((materials) => materials.uniq());\n      } else if (this.type === 'articles') {\n        promise = this.editors.then((editors) =>\n          Promise.all(editors.getEach('materials')).then((materials) =>\n            materials.invoke('toArray').flat()\n          )\n        );\n      }\n\n      return createPromiseArray(promise);\n    }\n  ),\n\n  copyrightedMaterials: computed(\n    'metadata.copyright',\n    'materials.@each.metadata',\n    function () {\n      return createPromiseArray(\n        this.materials.then((materials) => {\n          materials = materials.filter((material) =>\n            isPresent(material.metadata.copyright)\n          );\n\n          if (this.metadata?.copyright) {\n            materials.unshiftObject(this);\n          }\n\n          return materials;\n        })\n      );\n    }\n  ),\n\n  imageColor: computed(\n    'noShadow',\n    'meta.{image_colors.firstObject,properties.colors.firstObject}',\n    function () {\n      if (this.noShadow) {\n        return undefined;\n      }\n\n      return (\n        this.meta?.image_colors?.firstObject ||\n        this.meta?.properties?.colors?.firstObject\n      );\n    }\n  ),\n\n  backgroundColor: readOnly('imageColor'),\n\n  // PROPERTIES\n\n  nameWithFallback: computed('name', 'typeLabel', function () {\n    const { name } = this;\n\n    if (isPresent(name)) {\n      return name;\n    }\n\n    return this.typeLabel;\n  }),\n\n  typeLabel: computed('type', 'intl.locale', function () {\n    const { type } = this;\n\n    if (type) {\n      return this.intl.t(\n        ['models', 'material', 'typeLabel', camelize(type)].join('.')\n      );\n    }\n    return null;\n  }),\n\n  selected: false,\n\n  typeSingular: computed('type', function () {\n    return singularize(this.type);\n  }),\n\n  imageMimetype: readOnly('meta.image_mimetype'),\n\n  imageWidth: or('meta.image_width', 'metadata.width'),\n\n  imageHeight: or('meta.image_height', 'metadata.height'),\n\n  noShadow: or('meta.no_shadow', 'metadata.no_shadow'),\n\n  imageAspectRatio: computed('imageWidth', 'imageHeight', function () {\n    const { imageWidth, imageHeight } = this.getProperties(\n      'imageWidth',\n      'imageHeight'\n    );\n\n    if (imageWidth != null && imageHeight != null) {\n      return (imageHeight / imageWidth) * 100;\n    }\n\n    return null;\n  }),\n\n  imageIsPortrait: computed('imageWidth', 'imageHeight', function () {\n    const { imageWidth, imageHeight } = this.getProperties(\n      'imageWidth',\n      'imageHeight'\n    );\n    return imageWidth < imageHeight;\n  }),\n\n  generateHash(s) {\n    return s.split('').reduce(function (a, b) {\n      a = (a << 5) - a + b.charCodeAt(0);\n      return a & a;\n    }, 0);\n  },\n});\n","import DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr, belongsTo } = DS;\n\nexport default Model.extend({\n  status: attr('string'),\n\n  user: belongsTo('user', {\n    async: true,\n    inverse: null,\n  }),\n});\n","import { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nimport Model from './model';\n\nconst { belongsTo, hasMany } = DS;\n\nexport default Model.extend({\n  product: belongsTo('product', { async: true, inverse: null }),\n\n  items: hasMany('missing-license-item', { async: true, inverse: null }),\n\n  numMissing: computed('items.@each.status', function () {\n    return this.get('items').filterBy('status', 'expired').length;\n  }),\n});\n","// eslint-disable-next-line ember/no-computed-properties-in-native-classes\nimport { computed } from '@ember/object';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\n// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport DS from 'ember-data';\n\n// eslint-disable-next-line ember/no-mixins\nimport Userable from '../mixins/userable';\nimport Model from './model';\n\nconst { PromiseArray } = DS;\n\nexport const STATE = Object.freeze({\n  active: 'active',\n  ongoing: 'ongoing',\n  scheduled: 'scheduled',\n  ended: 'ended',\n  idle: 'idle',\n});\n\nfunction today() {\n  const today = new Date();\n  today.setHours(0, 0, 0, 0);\n  return today;\n}\n\nexport default class MissionModel extends Model.extend(Userable) {\n  // SETUP\n\n  @service router;\n  @service store;\n  @service intl;\n  @service session;\n\n  validations = {\n    title: {\n      presence: {\n        message: function (_, __, record) {\n          return record.intl.t('models.mission.validations.title.presence');\n        },\n      },\n    },\n  };\n\n  // RELATIONSHIPS\n\n  @belongsTo('course', { async: true, inverse: 'missions' }) course;\n\n  @hasMany('custom-content', { async: true, inverse: null }) customContents;\n\n  @hasMany('user', { async: true, inverse: null }) receivers;\n\n  @hasMany('file', { async: true, inverse: null }) files;\n\n  @hasMany('entity', { async: true, inverse: null }) linkedEntities;\n\n  // ATTRIBUTES\n\n  @attr('string') title;\n\n  @attr('string', { defaultValue: '' }) description;\n\n  @attr('boolean', { defaultValue: true }) active;\n\n  @attr('boolean', { defaultValue: true }) showDescription;\n\n  @attr('boolean', { defaultValue: false }) hideSolutions;\n\n  @attr('boolean', { defaultValue: false }) showKey;\n\n  @attr('boolean', { defaultValue: false }) hasReceivers;\n\n  @attr('only-date') startDate;\n\n  @attr('only-date') endDate;\n\n  @attr('array', {\n    defaultValue() {\n      return [];\n    },\n  })\n  sortedCustomContentIds;\n\n  get isTargeted() {\n    return this.hasReceivers;\n  }\n\n  @computed('customContents.[]', 'sortedCustomContentIds')\n  get sortedCustomContents() {\n    const promise = Promise.resolve(this.customContents).then(\n      (customContents) => {\n        const sortedCustomContentIds = this.sortedCustomContentIds;\n\n        if (sortedCustomContentIds && sortedCustomContentIds.length > 0) {\n          return sortedCustomContentIds\n            .map((id) => this.store.peekRecord('custom-content', id))\n            .compact();\n        }\n\n        return customContents ?? [];\n      }\n    );\n\n    return PromiseArray.create({ promise });\n  }\n\n  get hasCustomContents() {\n    return this.hasMany('customContents').ids().length > 0;\n  }\n\n  @computed('sortedCustomContents.@each.entity')\n  get entities() {\n    const promise = Promise.resolve(this.sortedCustomContents).then(\n      (customContents) => {\n        return Promise.all(\n          customContents.rejectBy('isDeleted').mapBy('entity')\n        );\n      }\n    );\n\n    return PromiseArray.create({ promise });\n  }\n\n  get hasDescription() {\n    return isPresent(this.description);\n  }\n\n  get isScheduled() {\n    return !!this.startDate;\n  }\n\n  get hasStarted() {\n    if (!this.startDate) {\n      return false;\n    }\n\n    return today() >= this.startDate;\n  }\n\n  get hasEnded() {\n    if (!this.endDate) {\n      return false;\n    }\n\n    return today() > this.endDate;\n  }\n\n  get isOngoing() {\n    return this.hasStarted && !this.hasEnded;\n  }\n\n  get isVisible() {\n    return this.active || this.isOngoing;\n  }\n\n  get canBeAudited() {\n    return !this.isScheduled || (this.isScheduled && this.hasStarted);\n  }\n\n  get state() {\n    if (this.active) {\n      return STATE.active;\n    } else if (this.isOngoing) {\n      return STATE.ongoing;\n    } else if (this.isScheduled) {\n      return STATE.scheduled;\n    } else if (this.hasEnded) {\n      return STATE.ended;\n    }\n    return STATE.idle;\n  }\n\n  get daysUntil() {\n    if (this.isScheduled) {\n      const today = new Date();\n      const time = this.startDate - today.getTime();\n      return Math.max(Math.ceil(time / (1000 * 3600 * 24)), 0);\n    }\n    return null;\n  }\n\n  get daysLeft() {\n    if (this.isOngoing) {\n      if (this.endDate) {\n        const today = new Date();\n        const time = this.endDate - today.getTime();\n        return Math.max(Math.ceil(time / (1000 * 3600 * 24)), 0);\n      }\n\n      return Infinity;\n    }\n\n    return null;\n  }\n\n  get isAccessible() {\n    const user = this.session.user;\n\n    if (user.isTeacher) {\n      return true;\n    }\n\n    if (this.isTargeted) {\n      return this.receivers.includes(user);\n    }\n\n    return true;\n  }\n\n  get shareableLink() {\n    const url = this.router.urlFor('master.missions', this.id);\n    return window.location.origin + url;\n  }\n\n  // ACTIONS\n\n  @action\n  async newCustomContent(fields) {\n    const course = await this.course;\n    return this.store.createRecord('custom-content', {\n      ...fields,\n      course,\n      user: this.session.user,\n      missions: [this],\n      includedEntities: [], // NOTE This is needed.\n    });\n  }\n\n  @action\n  addCustomContent(customContent) {\n    this.customContents.addObject(customContent);\n    this.sortedCustomContentIds.addObject(customContent.id);\n  }\n\n  @action\n  removeCustomContent(customContent) {\n    this.customContents.removeObject(customContent);\n    this.sortedCustomContentIds.removeObject(customContent.id);\n  }\n\n  @action\n  async addNewCustomContent(fields) {\n    const customContent = await this.newCustomContent(fields);\n    this.addCustomContent(customContent);\n    return customContent;\n  }\n}\n","import RootModel from 'babel/models/root-model';\nimport DS from 'ember-data';\n\nconst { attr } = DS;\n\nexport default RootModel.extend({\n  // ATTRIBUTES\n\n  created: attr('date', {\n    defaultValue() {\n      return new Date();\n    },\n  }),\n\n  updated: attr('date'),\n\n  duplicateAttributes() {\n    const attributes = {};\n\n    this.eachAttribute((name) => {\n      if (!['created', 'updated'].includes(name)) {\n        attributes[name] = this.get(name);\n      }\n    });\n\n    return attributes;\n  },\n\n  rollback() {\n    if (this.isNew) {\n      this.destroyRecord();\n    } else {\n      this.rollbackAttributes();\n      this.reload();\n    }\n  },\n});\n","import { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nimport { inject as service } from '@ember/service';\n\nimport Contentable from '../mixins/contentable';\nimport Userable from '../mixins/userable';\nimport Model from './model';\n\nconst { attr } = DS;\n\nexport default Model.extend(Contentable, Userable, {\n  // SETUP\n\n  intl: service(),\n\n  validations: {\n    title: {\n      presence: {\n        message: function(_, __, record) {\n          return record.get('intl').t('models.validations.presence');\n        }\n      }\n    }\n  },\n\n  // ATTRIBUTES\n\n  title: attr('string'),\n\n  content: attr('string'),\n\n  // PROPERTIES\n\n  titleWithFallback: computed('title', 'intl.locale', function() {\n    return (\n      this.get('title') || this.get('intl').t('models.note.nameWithFallback')\n    );\n  })\n});\n","import DS from 'ember-data';\n\nimport Model from './model';\n\nconst { attr } = DS;\n\nexport default Model.extend({\n  title: attr('string'),\n\n  type: attr('string'),\n\n  message: attr('string'),\n\n  body: attr(),\n\n  created: attr('date')\n});\n","import { action, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\n\nimport Userable from '../mixins/userable';\nimport ActivityItemModel from './activity-item';\n\nexport default class PostModel extends ActivityItemModel.extend(Userable) {\n  // SETUP\n\n  @service session;\n\n  static STATE = {\n    draft: 'DRAFT',\n    published: 'PUBLISHED',\n    deleted: 'DELETED',\n  };\n\n  // RELATIONSHIPS\n\n  @belongsTo('course', { async: true, inverse: null }) course;\n\n  @hasMany('entity', { async: true, inverse: null }) entities;\n\n  @hasMany('file', { async: true, inverse: null }) files;\n\n  @hasMany('user', { async: true, inverse: null }) receivers;\n\n  // ATTRIBUTES\n\n  @attr('boolean') hasReceivers;\n\n  @attr('string') postContent;\n\n  @attr('boolean') allowComments;\n\n  @attr('string', {\n    defaultValue() {\n      return PostModel.STATE.draft;\n    },\n  })\n  state; // DRAFT, PUBLISHED or DELETED\n\n  @attr('only-date') startDate;\n\n  // PROPERTIES\n\n  isPost = true; // ducktyping\n\n  get isPublished() {\n    return this.state === PostModel.STATE.published;\n  }\n\n  get isDraft() {\n    return this.state === PostModel.STATE.draft;\n  }\n\n  get isAccessible() {\n    const user = this.session?.user;\n\n    if (user.isTeacher) {\n      return true;\n    }\n\n    if (this.hasReceivers) {\n      return this.receivers.includes(user);\n    }\n\n    return true;\n  }\n\n  get hasMissingEntities() {\n    return get(this, 'entities.meta.num_not_found');\n  }\n\n  // METHODS\n\n  @action\n  async populateFromActivity() {\n    const activity = await this.activity;\n\n    if (activity) {\n      this.startDate = activity.startDate;\n    }\n  }\n}\n","import ArrayProxy from '@ember/array/proxy';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\nimport { inject as service } from '@ember/service';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\nimport Model from 'babel/models/model';\nimport { resolve } from 'rsvp';\n\nconst ArrayPromiseProxy = ArrayProxy.extend(PromiseProxyMixin);\n\nexport default Model.extend({\n  session: service(),\n\n  title: attr('string'),\n\n  type: attr('string'),\n\n  free: attr('boolean'),\n\n  disabledUntilPublished: attr('boolean'),\n\n  published: attr('boolean'),\n\n  for_trial: attr('boolean'),\n\n  for_single_day_trial: attr('boolean', {\n    defaultValue() {\n      return false;\n    },\n  }),\n\n  metadata: attr(),\n\n  fields: attr(),\n\n  subjects: attr(),\n\n  stages: attr(),\n\n  released: attr('only-date'),\n\n  externalUrl: attr('string'),\n\n  teachersOnly: attr('boolean'),\n\n  license_time: attr('number'),\n\n  unlimited_license_time: attr('boolean'),\n\n  hasProductPage: attr('boolean'),\n\n  // PROPERTIES\n\n  forTrial: readOnly('for_trial'),\n\n  // RELATIONSHIPS\n\n  books: hasMany('entity', { async: true, inverse: null }),\n\n  image: belongsTo('material', { async: true, inverse: null }),\n\n  cover: belongsTo('material', { async: true, inverse: null }),\n\n  // COMPUTED\n\n  isExtraMaterial: computed('free', 'unlimited_license_time', function () {\n    return this.get('free') && this.get('unlimited_license_time');\n  }),\n\n  authors: computed('metadata.authors', function () {\n    const authors = this.get('metadata.authors');\n\n    if (!authors) return [];\n\n    return authors.map((author) => {\n      const parts = author.split(',');\n\n      if (parts.length > 1) {\n        const lastName = parts.shift().trim();\n        const firstName = parts.join(',').trim();\n\n        return firstName + ' ' + lastName;\n      } else {\n        return author;\n      }\n    });\n  }),\n\n  illustrators: readOnly('metadata.illustrators'),\n\n  translators: readOnly('metadata.translators'),\n\n  userBooks: computed('books', 'session.user.isTeacher', function () {\n    return ArrayPromiseProxy.create({ promise: resolve(this.books) });\n  }),\n});\n","import { attr } from '@ember-data/model';\n\nimport Model from './model';\n\nexport default class RoleModel extends Model {\n  @attr() client_id;\n}\n","import Model from '@ember-data/model';\nimport { modelValidator } from 'ember-model-validator';\n\n@modelValidator\nexport default class RootModel extends Model {\n  mergedProperties = ['validations'];\n}\n","import DS from 'ember-data';\n\nimport Model from './model';\nconst { attr, hasMany } = DS;\n\nexport default Model.extend({\n  // ATTRIBUTES\n\n  name: attr('string'),\n\n  type: attr('string'),\n\n  provider: attr('string'),\n\n  providerId: attr('string'),\n\n  metadata: attr('object', {\n    defaultValue() {\n      return {};\n    },\n  }),\n\n  numUsers: attr('number'),\n\n  numStudents: attr('number'),\n\n  numTeachers: attr('number'),\n\n  schoolUnitCodes: attr({\n    defaultValue() {\n      return [];\n    },\n  }),\n\n  // RELATIONS\n\n  users: hasMany('user', { async: true, inverse: null }),\n\n  groups: hasMany('group', { async: true, inverse: null }),\n\n  courses: hasMany('course', { async: true, inverse: null }),\n\n  licenses: hasMany('license', { async: true, inverse: null }),\n});\n","import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n\nexport default class SettingModel extends Model {\n  @belongsTo('course', { async: false, inverse: null }) course;\n\n  // books is deprecated and is only user for setting up hiddenBooks\n  // for older courses. It can be removed in the future.\n  @hasMany('entity', { inverse: null, async: true }) books;\n\n  @hasMany('entity', { inverse: null, async: true }) hiddenBooks;\n\n  @hasMany('files', { async: true, inverse: null }) shortcutFiles;\n\n  @belongsTo('help-list', { async: true, inverse: null }) helpList;\n\n  @attr('boolean', {\n    defaultValue() {\n      return true;\n    },\n  })\n  showKey;\n\n  @attr('boolean', {\n    defaultValue() {\n      return true;\n    },\n  })\n  showDiagnosis;\n\n  @attr('string') cover_url;\n\n  @attr('date') created;\n\n  @attr('date') updated;\n\n  @attr({\n    defaultValue() {\n      return {\n        overview_display_first: 'shortcuts',\n        sorted_shortcut_ids: [],\n        sorted_mission_ids: [],\n      };\n    },\n  })\n  metadata;\n\n  @hasMany('entity') shortcuts;\n}\n","import EmberObject, { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { v4 as uuid } from 'ember-uuid';\n\nimport Contentable from '../mixins/contentable';\nimport Userable from '../mixins/userable';\nimport Model from './model';\n\nconst { attr, hasMany, belongsTo } = DS;\n\nexport default Model.extend(Contentable, Userable, {\n  // SETUP\n\n  intl: service(),\n\n  store: service(),\n\n  validations: {\n    title: {\n      presence: {\n        message: function (_, __, record) {\n          return record.get('intl').t('models.validations.presence');\n        },\n      },\n    },\n  },\n\n  // RELATIONSHIPS\n\n  files: hasMany('file', { async: true, inverse: null }),\n\n  school: belongsTo('school', { async: true, inverse: null }),\n\n  image: attr('string'),\n\n  // ATTRIBUTES\n\n  title: attr('string'),\n\n  questionHtml: attr('string'),\n\n  public: attr('boolean', { defaultValue: false }),\n\n  level: attr('number'),\n\n  exercise: attr('object', {\n    camelizeDeserializedKeys: true,\n    defaultValue() {\n      return EmberObject.create({\n        assignments: [],\n        type: null,\n        badge: null,\n      });\n    },\n  }),\n\n  // PROPERTIES\n\n  isPublished: alias('public'),\n\n  titleWithFallback: computed('title', 'intl.locale', function () {\n    const title = this.get('title');\n\n    if (title) {\n      return title;\n    }\n\n    return this.get('intl').t('models.teacherAssignment.titleWithFallback');\n  }),\n\n  readOnly: false,\n\n  // METHODS\n\n  createAsEntity(content) {\n    if (!this.hasContent(content)) return;\n\n    const entity = this._findOrCreateEntity(content);\n\n    const collection = this._findOrCreateCollection(content);\n\n    collection.get('children').addObject(entity);\n\n    return entity;\n  },\n\n  updateAsEntity(content) {\n    if (this.hasContent(content)) {\n      this.createAsEntity(content);\n    } else {\n      this.deleteAsEntity(content);\n    }\n  },\n\n  deleteAsEntity(content) {\n    const collection = this._peekCollection(content);\n\n    if (collection) {\n      const entity = this.get('store').peekRecord('entity', this.get('id'));\n\n      if (entity && collection.get('children').includes(entity)) {\n        collection.get('children').removeObject(entity);\n      }\n\n      if (collection.get('children.length') === 0) {\n        content.get('children').removeObject(collection);\n      }\n    }\n  },\n\n  addNewExerciseAssigment(properties) {\n    const assigment = this._newExerciseAssigment(properties);\n    this.get('exercise.assignments').addObject(assigment);\n    return assigment;\n  },\n\n  addExerciseAssigment(assigment) {\n    this.get('exercise.assignments').addObject(assigment);\n  },\n\n  removeExerciseAssigment(assigment) {\n    this.get('exercise.assignments').removeObject(assigment);\n  },\n\n  // PRIVATE\n\n  _findOrCreateEntity(content) {\n    let entity = this.get('store').peekRecord('entity', this.get('id'));\n\n    const collection = this._findOrCreateCollection(content);\n\n    const attributes = this._getEntityAttributes(content, collection);\n\n    if (entity) {\n      entity.setProperties(attributes);\n      return entity;\n    }\n\n    return this.get('store').createRecord('entity', attributes);\n  },\n\n  _findOrCreateCollection(content) {\n    let collection = this._peekCollection(content);\n\n    if (collection) {\n      content.get('children').addObject(collection);\n      return collection;\n    }\n\n    collection = this.get('store').createRecord(\n      'entity',\n      this._getCollectionAttributes(content)\n    );\n\n    content.get('children').addObject(collection);\n\n    return collection;\n  },\n\n  _peekCollection(content) {\n    const userId = this.get('user.id');\n\n    if (!userId) {\n      const entity = this.get('store').peekRecord('entity', this.get('id'));\n      return entity?.get('parent');\n    }\n\n    return this.get('store')\n      .peekAll('entity')\n      .filterBy('type', 'collections')\n      .filterBy('parent.id', content.get('id'))\n      .filterBy('owner.id', userId)\n      .get('firstObject');\n  },\n\n  _getCollectionAttributes(content) {\n    return {\n      type: 'collections',\n      space: 'workspace',\n      title: this.get('user.showname'),\n      teacherAssignment: this,\n      owner: this.get('user'),\n      parent: content,\n      isTeacherCollection: true,\n    };\n  },\n\n  _getEntityAttributes(content, collection) {\n    return {\n      id: this.get('id'),\n      title: this.get('title'),\n      questionHtml: this.get('questionHtml'),\n\n      type: 'assignments',\n      template: 'assignment',\n\n      owner: this.get('user'),\n      teacherAssignment: this,\n      parent: collection,\n      files: this.get('files'),\n      book: content ? content.get('book') : null,\n      isPublished: this.get('isPublished'),\n      isTeacherAssignment: true,\n\n      body: {\n        exercise: this.get('exercise'),\n      },\n\n      // Legacy:\n\n      document_id: this.get('id'),\n      node_id: content ? content.get('id') : null,\n      book_id: content ? content.belongsTo('book').id() : null,\n    };\n  },\n\n  _newExerciseAssigment(attributes = {}) {\n    const index = this.get('exercise.assignments.length') + 1;\n\n    return EmberObject.create({\n      index,\n      uuid: uuid(),\n      template: 'editor',\n      audio: null,\n      content: EmberObject.create(),\n      settings: EmberObject.create(),\n      ...attributes,\n    });\n  },\n});\n","import DS from 'ember-data';\nimport { computed } from '@ember/object';\n\nimport Model from './model';\n\nconst { attr } = DS;\n\nexport default Model.extend({\n  user_id: attr('string'),\n  username: attr('string'),\n  firstname: attr('string'),\n  lastname: attr('string'),\n  role: attr('string'),\n\n  isbn: attr('string'),\n\n  class_id: attr('string'),\n  school_id: attr('string'),\n\n  license_id: attr('string'),\n  acquire_date: attr('date'),\n  active_from: attr('date'),\n  active_until: attr('date'),\n  is_demo: attr('boolean'),\n\n  is_private: attr('boolean'),\n  has_agreement: attr('boolean'),\n  is_external: attr('boolean'),\n  is_expired: attr('boolean'),\n\n  extended: attr('boolean'),\n  extended_id: attr('string'),\n\n  demo_used: attr('boolean'),\n\n  text: attr('string'),\n  class: attr('string'),\n  showExtension: attr('boolean'),\n\n  showname: computed('firstname', 'lastname', 'username', function() {\n    if (this.firstname && this.lastname) {\n      return `${this.firstname} ${this.lastname}`;\n    } else if (this.firstname && !this.lastname) {\n      return this.firstname;\n    } else if (this.lastname && !this.firstname) {\n      return this.lastname;\n    } else {\n      return this.username;\n    }\n  })\n});\n","import { computed } from '@ember/object';\nimport { mapBy } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { attr, belongsTo, hasMany } from '@ember-data/model';\nimport Model from 'babel/models/model';\nimport integrations from 'babel/rules/integrations';\n\nexport default Model.extend({\n  intl: service(),\n\n  // ATTRIBUTES\n\n  username: attr('string'),\n\n  firstname: attr('string'),\n\n  lastname: attr('string'),\n\n  avatar: attr(),\n\n  provider: attr('string'),\n\n  role: attr('string', {\n    defaultValue() {\n      return 'test';\n    },\n  }),\n\n  email: attr('string'),\n\n  metadata: attr('object', {\n    defaultValue() {\n      return {};\n    },\n  }),\n\n  // RELATIONS\n\n  school: belongsTo('school', { async: true, inverse: null }),\n\n  schools: hasMany('school', { async: true, inverse: null }),\n\n  books: hasMany('entities', { async: true, inverse: null }),\n\n  courses: hasMany('course', { async: true, inverse: null }),\n\n  licenses: hasMany('license', { async: true, inverse: null }),\n\n  class: belongsTo('group', { async: true, inverse: null }),\n\n  groups: hasMany('group', { async: true, inverse: null }),\n\n  logins: hasMany('login', { async: true, inverse: null }),\n\n  roles: hasMany('role', { async: true, inverse: null }),\n\n  // COMPUTED\n\n  serviceProvider: computed('provider', function () {\n    const provider = this.get('provider');\n\n    if (provider && integrations[provider]) {\n      return integrations[provider];\n    }\n\n    return null;\n  }),\n\n  isTeacher: computed('role', function () {\n    return this.get('role') === 'teacher';\n  }),\n\n  isStudent: computed('role', function () {\n    return this.get('role') === 'student';\n  }),\n\n  isTestUser: computed('role', function () {\n    return this.get('role') === 'test';\n  }),\n\n  isPrivateUser: computed('role', function () {\n    return this.get('role') === 'private';\n  }),\n\n  hasSchool: computed('school', function () {\n    return this.belongsTo('school').id() ? true : false;\n  }),\n\n  isTeacherForSchool: computed('isTeacher', 'hasSchool', function () {\n    return this.get('hasSchool') && this.get('isTeacher');\n  }),\n\n  isTeacherWithoutSchool: computed('isTeacher', 'hasSchool', function () {\n    return !this.get('hasSchool') && this.get('isTeacher');\n  }),\n\n  isStudentWithoutSchool: computed('isStudent', 'hasSchool', function () {\n    return !this.get('hasSchool') && this.get('isStudent');\n  }),\n\n  showname: computed('firstname', 'lastname', 'username', function () {\n    if (this.firstname && this.lastname) {\n      return `${this.firstname} ${this.lastname}`;\n    } else if (this.firstname && !this.lastname) {\n      return this.firstname;\n    } else if (this.lastname && !this.firstname) {\n      return this.lastname;\n    } else {\n      return this.username;\n    }\n  }),\n\n  initials: computed('firstname', 'lastname', 'username', function () {\n    let initials = '';\n\n    if (this.firstname) {\n      initials += this.firstname.substring(0, 1).toUpperCase();\n    }\n\n    if (this.lastname) {\n      initials += this.lastname.substring(0, 1).toUpperCase();\n    }\n\n    if (initials.length === 0 && this.username) {\n      initials += this.username.substring(0, 2).toUpperCase();\n    }\n\n    return initials;\n  }),\n\n  listname: computed('firstname', 'lastname', 'intl.locale', function () {\n    let firstname = this.get('firstname');\n    let lastname = this.get('lastname');\n\n    if (!firstname) {\n      firstname = '';\n    }\n\n    if (!lastname) {\n      lastname = '';\n    }\n\n    if (firstname.trim() === '' && lastname.trim() === '') {\n      return htmlSafe(\n        '<em class=\"dimmed\">' +\n          this.get('intl').t('models.user.nameMissing') +\n          '</em>'\n      );\n    }\n\n    return firstname.trim() !== '' && lastname.trim() !== ''\n      ? `${lastname}, ${firstname}`\n      : `${lastname}${firstname}`;\n  }),\n\n  language: computed('metadata.language', {\n    get() {\n      return this.get('metadata.language') || 'sv';\n    },\n    set(key, val) {\n      this.set('metadata.language', val);\n      return val;\n    },\n  }),\n\n  activeSchoolApplications: computed('schoolApplications', function () {\n    return this.schoolApplications.then((schoolApplications) =>\n      schoolApplications.filter((application) => application.is_active)\n    );\n  }),\n\n  licenseProducts: mapBy('licenses', 'product'),\n\n  getPreferredTextVersion(book_id) {\n    return this.metadata?.preferred_text_versions?.find(\n      (item) => item.book_id === book_id\n    )?.category_id;\n  },\n\n  savePreferredTextVersion(book_id, category_id) {\n    if (!book_id || !category_id) return;\n\n    let metadata = this.metadata;\n\n    if (!metadata) metadata = {};\n\n    if (!metadata.preferred_text_versions) {\n      metadata.preferred_text_versions = [];\n    }\n\n    const saved = metadata.preferred_text_versions.find(\n      (item) => item.book_id === book_id\n    );\n\n    let changed = false;\n\n    if (saved) {\n      if (saved.category_id !== category_id) {\n        saved.category_id = category_id;\n        changed = true;\n      }\n    } else {\n      metadata.preferred_text_versions.push({ book_id, category_id });\n      changed = true;\n    }\n\n    if (changed) {\n      this.metadata = metadata;\n      return this.save();\n    }\n  },\n});\n","import { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { resolve } from 'rsvp';\n\nimport Model from './model';\n\nconst { attr, belongsTo } = DS;\n\nexport default Model.extend({\n  // SETUP\n\n  intl: service(),\n\n  store: service(),\n\n  validations: {\n    word: {\n      presence: {\n        message: function (_, __, record) {\n          return record.get('intl').t('models.validations.presence');\n        },\n      },\n    },\n  },\n\n  // RELATIONSHIPS\n\n  wordlist: belongsTo('wordlist', { async: true, inverse: 'words' }),\n\n  // ATTRIBUTES\n\n  word: attr('string'),\n\n  explanation: attr('string'),\n\n  translation: attr('string'),\n\n  wordClass: attr('string'),\n\n  examples: attr('string'),\n\n  wordConstruction: attr('string'),\n\n  sort: attr('number'),\n\n  // PROPERTIES\n\n  readOnly: false,\n\n  // METHODS\n\n  duplicate() {\n    return resolve(\n      this.get('store').createRecord('word', {\n        ...this.duplicateAttributes(),\n      })\n    );\n  },\n\n  // LEGACY\n\n  word_class: alias('wordClass'),\n  word_construction: alias('wordConstruction'),\n});\n","import { computed } from '@ember/object';\nimport { alias, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { all, hash } from 'rsvp';\n\nimport Contentable from '../mixins/contentable';\nimport Userable from '../mixins/userable';\nimport Model from './model';\n\nconst { attr, hasMany } = DS;\n\nexport default Model.extend(Contentable, Userable, {\n  // SETUP\n\n  session: service(),\n\n  intl: service(),\n\n  store: service(),\n\n  validations: {\n    name: {\n      presence: {\n        message: function (_, __, record) {\n          return record.get('intl').t('models.validations.presence');\n        },\n      },\n    },\n  },\n\n  // RELATIONSHIPS\n\n  words: hasMany('word', { async: true, inverse: 'wordlist' }),\n\n  // ATTRIBUTES\n\n  name: attr('string'),\n\n  language: attr('string'),\n\n  type: attr('string', { defaultValue: 'glossaries' }),\n\n  public: attr('boolean', { defaultValue: false }),\n\n  // PROPERTIES\n\n  title: alias('name'),\n\n  isPublished: alias('public'),\n\n  isBusy: false,\n\n  isTransformed: false,\n\n  category: null,\n\n  isReadOnly: computed('isTransformed', 'isOwner', function () {\n    return this.get('isTransformed') || !this.get('isOwner');\n  }),\n\n  isQuizable: computed(\n    'type',\n    'words.@each.{explanation,translation}',\n    function () {\n      const { type, words } = this.getProperties('type', 'words');\n\n      if (type === 'concepts' && words.any((word) => word.get('explanation'))) {\n        return true;\n      }\n\n      if (\n        type === 'glossaries' &&\n        words.any((word) => word.get('translation'))\n      ) {\n        return true;\n      }\n\n      return false;\n    }\n  ),\n\n  nameWithFallback: computed('name', 'intl.locale', function () {\n    return (\n      this.get('name') || this.get('intl').t('models.wordlist.nameWithFallback')\n    );\n  }),\n\n  titleWithFallback: readOnly('nameWithFallback'),\n\n  sortedWords: computed('words.[]', 'readOnly', function () {\n    const words = this.get('words');\n\n    if (this.get('readOnly')) return words;\n\n    return words.sortBy('word');\n  }),\n\n  // METHODS\n\n  async duplicate(content) {\n    return all([content.get('book'), this.get('words')]).then(\n      ([book, words]) => {\n        return all(words.invoke('duplicate')).then((duplicatedWords) => {\n          const language = book.body.language || 'sv_SE';\n\n          const wordlist = this.get('store').createRecord('wordlist', {\n            ...this.duplicateAttributes(),\n            user: this.get('session.user'),\n            books: [book],\n            contents: [content],\n            words: duplicatedWords,\n            language,\n          });\n\n          duplicatedWords.setEach('wordlist', wordlist);\n\n          if (this.get('session.user.isTeacher')) {\n            wordlist.set('public', false);\n          }\n\n          wordlist.set('isBusy', true);\n\n          return wordlist.save().then(() => {\n            return all(duplicatedWords.invoke('save')).then(() => {\n              return wordlist.get('words').then((relation) => {\n                return relation.reload().then(() => {\n                  wordlist.set('isBusy', false);\n\n                  return wordlist;\n                });\n              });\n            });\n          });\n        });\n      }\n    );\n  },\n});\n","import { assert } from '@ember/debug';\nimport { modifier } from 'ember-modifier';\n\nfunction collectionIndex(element, [collection]) {\n  assert('You must pass a collection', collection);\n\n  const id = element.getAttribute('data-id');\n\n  if (id !== collection.id) {\n    if (id) element.parentNode.scrollTo(0, 0);\n\n    element.setAttribute('data-id', collection.id);\n  }\n}\n\nexport default modifier(collectionIndex, { eager: false });\n","import { getRect } from 'compton/utils/dom';\nimport { modifier } from 'ember-modifier';\n\nfunction fitWithinWindow(element, positional, named) {\n  const margin = named.margin ?? 0;\n\n  const initialRect = getRect(element);\n\n  function resize() {\n    const windowRect = getRect(window);\n\n    const widthPercent = windowRect.width / initialRect.width;\n    const heightPercent = windowRect.height / initialRect.height;\n    const percent = Math.min(widthPercent, heightPercent);\n\n    element.style.width = initialRect.width * percent - margin * 2 + 'px';\n    element.style.maxHeight = initialRect.height * percent - margin * 2 + 'px';\n  }\n\n  resize();\n\n  window.addEventListener('resize', resize);\n\n  return () => {\n    window.removeEventListener('resize', resize);\n  };\n}\n\nexport default modifier(fitWithinWindow, { eager: false });\n","import { modifier } from 'ember-modifier';\n\nfunction removeHighlighting(text) {\n  return text.replace(/(<mark class=\"highlight\">|<\\/mark>)/gim, '');\n}\n\nfunction highlightTerm(term, text) {\n  if (!term?.length) {\n    return text;\n  }\n\n  // Escape regex chars\n  term = term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n  const regex = new RegExp(term, 'gi');\n  return text.replace(regex, '<mark class=\"highlight\">$&</mark>');\n}\n\nfunction highlightTerms(element, [terms]) {\n  if (!element.classList.contains('highlight-terms')) {\n    element.classList.add('highlight-terms');\n  }\n\n  let text = removeHighlighting(element.innerHTML);\n\n  text = highlightTerm(terms.join(' '), text);\n\n  element.innerHTML = text;\n\n  return () => {\n    if (element.classList.contains('highlight-terms')) {\n      element.classList.remove('highlight-terms');\n    }\n\n    let text = removeHighlighting(element.innerHTML);\n    element.innerHTML = text;\n  };\n}\n\nexport default modifier(highlightTerms, { eager: false });\n","import EmberRouter from '@ember/routing/router';\nimport config from 'babel/config/environment';\n\nclass Router extends EmberRouter {\n  location = config.locationType;\n  rootURL = config.rootURL;\n}\n\nRouter.map(function () {\n  // NOT AUTHENTICATED\n  this.route('login');\n\n  this.route('logout');\n\n  this.route('activate', { path: '/activate/:link_hash' });\n\n  this.route('invalidate');\n\n  // AUTHENTICATED\n\n  this.route('embed-audit-collection');\n\n  this.route('master', { path: '/' }, function () {\n    this.route('nodes', { path: 'nodes/:node_id', resetNamespace: true });\n\n    // COURSES\n\n    this.route('courses', function () {\n      this.route('new');\n\n      this.route('show', { path: ':course_id' }, function () {\n        this.route('books');\n        this.route('settings');\n        this.route('my-results');\n        this.route('missions');\n\n        // Keep this route for legacy reasons\n        this.route('todos');\n\n        this.route('audit', function () {\n          this.route('overview');\n          this.route('inbox');\n          this.route('log');\n          this.route('comments');\n\n          this.route('missions', function () {\n            this.route('show', { path: ':mission_id' });\n          });\n\n          // Keep these routes for legacy reasons\n          this.route('todos', function () {\n            this.route('show', { path: ':todo_id' });\n          });\n        });\n      });\n    });\n\n    this.route('course-settings', { path: 'course-settings/:course_id' });\n\n    // Keep this route for legacy reasons\n    this.route('todos', { path: 'todos/:todo_id' });\n\n    this.route('missions', { path: 'missions/:mission_id' });\n\n    this.route('products', { path: '/products/:product_id' }, function () {\n      this.route('my-results');\n    });\n\n    this.route('profile', function () {\n      this.route('settings');\n    });\n\n    this.route('admin', function () {\n      this.route('books');\n    });\n\n    this.route('books', { path: 'books/:book_id' });\n\n    this.route('areas', { path: 'areas/:area_id' });\n\n    this.route('archives', { path: 'archives/:archive_id' }, function () {\n      this.route('folders', { path: 'folders/:folder_id' }, function () {\n        this.route('materials', { path: 'materials/:material_id' });\n      });\n    });\n\n    this.route('contents', { path: 'contents/:content_id' }, function () {\n      // NOTE Route to redirect legacy section urls.\n      this.route('sections', { path: '*path' });\n\n      this.route('assignments', function () {\n        this.route('new');\n        this.route('show', { path: ':assignment_id' });\n        this.route('edit', { path: ':assignment_id/edit' });\n      });\n\n      this.route('notes', function () {\n        this.route('new');\n        this.route('edit', { path: ':note_id' });\n      });\n\n      this.route('wordlists', function () {\n        this.route('new');\n        this.route('show', { path: ':wordlist_id' }, function () {\n          this.route('words', function () {\n            this.route('new');\n            this.route('show', { path: ':word_id' });\n            this.route('edit', { path: ':word_id/edit' });\n          });\n        });\n        this.route('edit', { path: ':wordlist_id/edit' });\n      });\n    });\n\n    this.route(\n      'interactives',\n      { path: 'interactives/:interactive_id' },\n      function () {\n        this.route(\n          'diagnoses',\n          { path: 'diagnoses/:diagnosis_id' },\n          function () {\n            this.route('show', { path: 'show/:result_id' });\n            this.route('done', { path: 'done/:result_id' }, function () {\n              this.route('audit');\n            });\n          }\n        );\n\n        this.route(\n          'practices',\n          { path: 'practices/:practice_id' },\n          function () {\n            this.route('show', { path: 'show/:practice_show_id' });\n          }\n        );\n      }\n    );\n\n    this.route('materials', { path: 'materials/:material_id' });\n\n    this.route('error');\n\n    this.route('forbidden');\n  });\n\n  this.route('url-resolve', { path: '*url' });\n\n  this.route('404');\n});\n\nexport default Router;\n","import { service } from '@ember/service';\nimport AuthenticatedRoute from 'babel/routes/authenticated-route';\n\nexport default class NotFoundRoute extends AuthenticatedRoute {\n  @service contextHelper;\n\n  @service intl;\n\n  setupController() {\n    super.setupController(...arguments);\n    this.contextHelper.setActive(\n      'pageTitle',\n      this.intl.t('services.contextHelper.pageTitle.notFound')\n    );\n  }\n\n  resetController() {\n    super.resetController(...arguments);\n    this.contextHelper.setActive('pageTitle', null);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { redirectToNokportal } from 'babel/utils/redirect';\n\nexport default class ActivateRoute extends Route {\n  beforeModel(transition) {\n    redirectToNokportal(transition);\n  }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport {\n  ForbiddenError,\n  NotFoundError,\n  ServerError,\n} from '@ember-data/adapter/error';\nimport config from 'babel/config/environment';\nimport { MissingContentError } from 'babel/utils/errors';\nimport {\n  generateCodeVerifier,\n  generatePkceChallenge,\n} from 'ember-simple-auth-oidc/utils/pkce';\nimport uuid from 'uuid';\n\nexport default class ApplicationRoute extends Route {\n  @service router;\n\n  @service store;\n\n  @service session;\n\n  @service pusher;\n\n  @service appUpdate;\n\n  constructor() {\n    super(...arguments);\n\n    this.setupTracking();\n  }\n\n  async beforeModel(transition) {\n    await this.session.setup();\n\n    this.appUpdate.initialize();\n    this.pusher.subscribe();\n\n    if (transition.to && transition.to.queryParams.provider) {\n      let idp = null;\n\n      // LEGACY: Needed until drop for v1 link support\n      let arbetsuppgift = null;\n\n      let url = window.location.pathname;\n\n      if (transition.to.queryParams.url) {\n        url = transition.to.queryParams.url;\n      }\n\n      if (transition.to.queryParams.idp) {\n        idp = transition.to.queryParams.idp;\n      }\n\n      if (transition.to.queryParams.arbetsuppgift) {\n        arbetsuppgift = transition.to.queryParams.arbetsuppgift;\n        url = `${url}?arbetsuppgift=${arbetsuppgift}`;\n      }\n\n      const isLoggedIn = this.session.isAuthenticated;\n\n      /*\n      // TODO: Make this work to make the page load faster after login.\n      // Kunskapsskolan redirects to the old Urls, which mean they will get an extra unnecessary redirect after logging in\n\n      // Before: /contents/{content_id}/sections/{section_id}\n      // After: /contents/{content_id}?section={section_id}\n      const contentsRegex = new RegExp('\\/?contents\\/([A-Za-z-0-9]*)\\/sections\\/([A-Za-z-0-9]*)\\/?$');\n\n      // Before: /contents/{content_id}/sections/{section_id}/workspace/exercises/{exercise_id}\n      // After: /contents/{content_id}/assignments/{exercise_id/}?section={section_id}\n      const contentsSectionsRegex = new RegExp('\\/?contents\\/([A-Za-z-0-9]*)\\/sections\\/([A-Za-z-0-9]*)\\/workspace\\/exercises\\/([A-Za-z-0-9]*)\\/?$');\n\n      if (contentsRegex.test(url)) {\n        console.log('TODO: Fix contents');\n      } else if (contentsSectionsRegex.test(url)) {\n        console.log('TODO: Fix contents with section');\n      }\n      */\n\n      const queryParams = { ...transition.to.queryParams };\n      delete queryParams.provider;\n      delete queryParams.idp;\n\n      const queryString = Object.keys(queryParams).map(\n        (x) => `${x}=${queryParams[x]}`\n      );\n\n      url += `?${queryString}`;\n\n      if (isLoggedIn) {\n        window.location = url;\n      } else if (transition.to.queryParams.provider?.length && !idp) {\n        transition.abort();\n\n        const state = uuid.v4();\n        this.session.set('data.state', state);\n        this.session.set('data.nextURL', url);\n\n        const searchParams = new URLSearchParams({\n          client_id: config['ember-simple-auth-oidc'].clientId,\n          redirect_uri: `${location.protocol}//${location.host}/login`,\n          response_type: 'code',\n          state,\n          scope: 'openid profile offline_access',\n          prompt: 'consent',\n          acr_values: `idp:${transition.to.queryParams.provider}`,\n        });\n\n        if (config['ember-simple-auth-oidc'].enablePkce) {\n          let verifier = this.session.data.pkceCodeVerifier;\n\n          if (!verifier) {\n            verifier = generateCodeVerifier(96);\n            this.session.set('data.pkceCodeVerifier', verifier);\n          }\n\n          searchParams.append(\n            'code_challenge',\n            generatePkceChallenge(verifier)\n          );\n          searchParams.append('code_challenge_method', 'S256');\n        }\n\n        const authHost = config['ember-simple-auth-oidc'].host;\n\n        window.location = `${`${authHost}/auth`}?${searchParams}`;\n      } else {\n        transition.abort();\n\n        this.session.set('data.nextURL', url);\n\n        window.location = `${config['ember-simple-auth-oidc'].host}/signin-skolfederation?idp=${idp}&url=${url}`;\n      }\n    }\n  }\n\n  @action\n  loading(transition) {\n    // eslint-disable-next-line ember/no-controller-access-in-routes\n    const controller = this.controllerFor('application');\n\n    controller.isLoading = true;\n\n    transition.promise.finally(() => {\n      controller.isLoading = false;\n    });\n\n    return true;\n  }\n\n  @action\n  didTransition() {\n    // Unregister all service-workers\n    if ('serviceWorker' in navigator) {\n      navigator.serviceWorker.getRegistrations().then(function (registrations) {\n        for (let registration of registrations) {\n          registration.unregister();\n        }\n      });\n    }\n  }\n\n  @action\n  error(err) {\n    if (err instanceof MissingContentError) {\n      if (err.redirectTarget) {\n        this.router.transitionTo(err.redirectTarget);\n        return false;\n      }\n    }\n\n    if (err instanceof ForbiddenError) {\n      this.router.transitionTo('master.forbidden');\n    }\n\n    if (err instanceof NotFoundError) {\n      this.router.transitionTo('404');\n    }\n\n    if (err instanceof ServerError) {\n      this.router.transitionTo('master.error').then(() => {\n        // eslint-disable-next-line ember/no-controller-access-in-routes\n        const controller = this.controllerFor('master.error');\n\n        if (controller) {\n          controller.error = err;\n        }\n      });\n    }\n\n    return true;\n  }\n\n  setupTracking() {\n    if (\n      !config.matomo.endpoint ||\n      !config.matomo.site_id ||\n      // Looks like they are always strings\n      config.matomo.endpoint === 'null' ||\n      config.matomo.site_id === 'null'\n    ) {\n      return;\n    }\n\n    // Initialize Matomo script\n    const _paq = (window._paq = window._paq || []);\n\n    (function () {\n      _paq.push(['setDomains', config.matomo.domains]);\n      _paq.push(['enableCrossDomainLinking']);\n      _paq.push(['setConversionAttributionFirstReferrer', true]);\n      _paq.push(['setTrackerUrl', `${config.matomo.endpoint}/matomo.php`]);\n      _paq.push(['setSiteId', config.matomo.site_id]);\n      _paq.push(['enableLinkTracking']);\n\n      const d = document,\n        g = d.createElement('script'),\n        s = d.getElementsByTagName('script')[0];\n      g.async = true;\n      g.src = `${config.matomo.endpoint}/matomo.js`;\n      s.parentNode.insertBefore(g, s);\n    })();\n\n    // Listen to route changes\n    this.router.on('routeDidChange', (transition) => {\n      // Need a timeout to wait the title to be updated\n      setTimeout(() => {\n        const _paq = window._paq;\n        if (!_paq) return;\n\n        // Track user id\n        const userId = this.session?.data?.authenticated?.userinfo?.sub;\n\n        if (userId) {\n          _paq.push(['setUserId', userId]);\n        }\n\n        // Track pages\n        _paq.push([\n          'setCustomUrl',\n          `${window.location.origin}${this.router.currentURL}`,\n        ]);\n\n        // Reversing the title to get the hierarchy right\n        const splitTitle = document.title.split(' | ').reverse();\n\n        // The reason we are adding the last part of the title twice is so matomo can show the \"first\" page of the hierarchy\n        // under the same title instead of being outside. It means that pages with no hierarchy (sections, exercises, etc) will\n        // show a \"+\" (in matomo) as if it was a hierarchy, but it will just show the same title twice (which is not problematic).\n        if (splitTitle.length > 0) {\n          splitTitle.push(splitTitle[splitTitle.length - 1]);\n        }\n\n        const title = splitTitle.join(' | ');\n\n        _paq.push(['trackPageView', title]);\n\n        const transitionTarget = transition?.to?.name?.split('.') || [];\n\n        // If we are on a content page with an exercise or wordlist open\n        // we log the exercise or wordlist as a separate title. We are\n        // never interested in teacher created content.\n        if (\n          transitionTarget.length > 3 &&\n          transitionTarget[0] === 'master' &&\n          transitionTarget[1] === 'contents'\n        ) {\n          if (\n            transitionTarget[2] === 'assignments' &&\n            transitionTarget[3] === 'show'\n          ) {\n            const id = transition?.to?.params?.assignment_id;\n            if (!id) return;\n\n            const exercise = this.store.peekRecord('entity', id);\n            if (!exercise || exercise.teacherAssignment) return;\n\n            let exerciseTitle = splitTitle.slice(0, splitTitle.length - 2);\n\n            exerciseTitle.push(\n              exercise.get('parent.title'),\n              `${exercise.sort}. ${exercise.title}`,\n              `${exercise.sort}. ${exercise.title}`\n            );\n\n            exerciseTitle = exerciseTitle.join(' | ');\n\n            _paq.push(['trackPageView', exerciseTitle]);\n          } else if (\n            transitionTarget[2] === 'wordlists' &&\n            transitionTarget[3] === 'show'\n          ) {\n            const id = transition?.to?.parent?.params?.wordlist_id;\n            if (!id) return;\n\n            const wordlist = this.store.peekRecord('wordlist', id);\n            if (!wordlist || !wordlist.isTransformed) return;\n\n            let wordlistTitle = splitTitle.slice(0, splitTitle.length - 2);\n\n            wordlistTitle.push(wordlist.title, wordlist.title);\n\n            wordlistTitle = wordlistTitle.join(' | ');\n\n            _paq.push(['trackPageView', wordlistTitle]);\n          }\n        }\n      }, 100);\n    });\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class AuthenticatedRoute extends Route {\n  @service intl;\n\n  @service notice;\n\n  @service pusher;\n\n  @service session;\n\n  @service groupsOnboarding;\n\n  @service speakerSession;\n\n  async beforeModel(transition) {\n    const authenticated = await this.session.requireAuthentication(\n      transition,\n      'login'\n    );\n\n    if (authenticated) {\n      this.sessionAuthenticated();\n      await this.session.load();\n      this.intl.setLocale(this.session.user?.metadata?.language ?? 'sv');\n      this.pusher.subscribe();\n      this.notice.addListener();\n      this.notice.getMessages();\n    }\n  }\n\n  sessionAuthenticated() {\n    if (this.session?.data?.nextURL) {\n      const expires = this.session?.data?.nextURLExpires;\n\n      if (expires) {\n        const date = new Date();\n        const time = date.getTime();\n\n        if (time > expires) {\n          this.session.data.nextURL = null;\n        }\n      }\n    }\n\n    // Reset ILT access\n    // Access will be checked again the next time user opens an ILT enabled content\n    // Note that this same reset is done in when the school changes\n    this.speakerSession.reset();\n  }\n}\n","import { inject as service } from '@ember/service';\nimport AuthenticatedRoute from 'babel/routes/authenticated-route';\nimport answerRules from 'babel/rules/answers';\nimport { all, resolve } from 'rsvp';\n\nconst DEFAULT_MODE = 'assignments';\nconst VALID_MODES = [\n  'assignments',\n  'students',\n  'compare',\n  'inbox',\n  'inbox-single',\n  'comments',\n];\n\nconst INVALID_PARAMS_LOG_PREFIX = '[embed-audit] Invalid params';\n\nfunction parseBoolean(value) {\n  if (typeof value === 'boolean') {\n    return value;\n  }\n\n  if (typeof value === 'string') {\n    return ['true', '1', 'yes'].includes(value.toLowerCase());\n  }\n\n  return false;\n}\n\nfunction parseList(value) {\n  if (Array.isArray(value)) {\n    return value.filter(Boolean);\n  }\n\n  if (!value || typeof value !== 'string') {\n    return [];\n  }\n\n  return value\n    .split(',')\n    .map((entry) => entry.trim())\n    .filter(Boolean);\n}\n\nasync function filterStudentsWithAnswers({\n  students,\n  resolvedStudents,\n  answers,\n  exercise,\n}) {\n  if (!exercise) {\n    return { students, resolvedStudents };\n  }\n\n  const isTeacherAssignment = exercise.isTeacherAssignment;\n  const teacherAssignment = isTeacherAssignment\n    ? await resolve(exercise.teacherAssignment).catch(() => null)\n    : null;\n  const teacherAssignmentId = teacherAssignment?.id;\n  const entityId = exercise.id;\n\n  const answerUserIds = await all(\n    answers.map(async (answer) => {\n      if (isTeacherAssignment) {\n        const answerTeacherAssignment = await resolve(\n          answer.teacherAssignment\n        ).catch(() => null);\n\n        if (\n          !answerTeacherAssignment ||\n          answerTeacherAssignment.id !== teacherAssignmentId\n        ) {\n          return null;\n        }\n      } else if (answer.node_id !== entityId) {\n        return null;\n      }\n\n      const answerUser = await resolve(answer.user).catch(() => null);\n\n      return answerUser?.id || null;\n    })\n  );\n\n  const userIdsWithAnswers = new Set(answerUserIds.filter(Boolean));\n\n  return {\n    students: students.filter((studentId) => userIdsWithAnswers.has(studentId)),\n    resolvedStudents: resolvedStudents.filter((student) =>\n      userIdsWithAnswers.has(student.id)\n    ),\n  };\n}\n\nexport default class EmbedAuditCollectionRoute extends AuthenticatedRoute {\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  queryParams = {\n    answer_id: {\n      refreshModel: true,\n    },\n    course_id: {\n      refreshModel: true,\n    },\n    exercise_id: {\n      refreshModel: true,\n    },\n    teacher_assignment_id: {\n      refreshModel: true,\n    },\n    student_id: {\n      refreshModel: true,\n    },\n    mode: {\n      refreshModel: true,\n    },\n    all_users: {\n      refreshModel: true,\n    },\n    custom_content_id: {\n      refreshModel: true,\n    },\n    included_entity_ids: {\n      refreshModel: true,\n    },\n  };\n\n  async beforeModel(transition) {\n    await super.beforeModel(...arguments);\n\n    if (!this.session.user?.isTeacher) {\n      const courseId = transition?.to?.queryParams?.course_id;\n\n      if (courseId) {\n        return this.router.transitionTo('master.courses.show', courseId);\n      }\n\n      return this.router.transitionTo('master');\n    }\n  }\n\n  async model(_params, transition) {\n    const queryParams = transition?.to?.queryParams || {};\n    const courseId = queryParams.course_id;\n    const exerciseId = queryParams.exercise_id;\n    const teacherAssignmentId = queryParams.teacher_assignment_id;\n\n    const mode = VALID_MODES.includes(queryParams.mode)\n      ? queryParams.mode\n      : DEFAULT_MODE;\n\n    const allUsers = parseBoolean(queryParams.all_users);\n\n    if (!courseId || (!exerciseId && !teacherAssignmentId)) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'missing_required_query_params',\n        queryParams,\n        courseId,\n        exerciseId,\n        teacherAssignmentId,\n      });\n\n      return this.#buildEmptyModel({\n        queryParams,\n        allUsers,\n        mode,\n      });\n    }\n\n    const course = await this.store.findRecord('course', courseId);\n\n    const students = [];\n    const resolvedStudents = [];\n    const users = await resolve(course.users);\n\n    users.forEach((student) => {\n      if (student.role !== 'student' || students.includes(student.id)) {\n        return;\n      }\n\n      students.push(student.id);\n      resolvedStudents.push(student);\n    });\n\n    const [exercise, customContent, includedEntities] = await all([\n      this.#loadExercise({\n        exerciseId,\n        teacherAssignmentId,\n        course,\n      }),\n      this.#loadCustomContent(queryParams.custom_content_id),\n      this.#loadIncludedEntities(queryParams.included_entity_ids),\n    ]);\n\n    let collection = null;\n\n    if (exercise) {\n      try {\n        collection = await resolve(exercise.parent);\n      } catch (err) {\n        console.error(INVALID_PARAMS_LOG_PREFIX, {\n          reason: 'exercise_parent_resolution_failed',\n          queryParams,\n          courseId,\n          exerciseId,\n          teacherAssignmentId,\n          resolvedExerciseId: exercise.id,\n          error: err,\n        });\n        collection = null;\n      }\n    }\n\n    if (!collection || !exercise) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'missing_collection_or_exercise',\n        queryParams,\n        courseId,\n        exerciseId,\n        teacherAssignmentId,\n        missingExercise: !exercise,\n        missingCollection: !collection,\n        exerciseHadParent: exercise ? Boolean(exercise.parent) : null,\n        resolvedCollectionId: collection?.id || null,\n        resolvedExerciseId: exercise?.id || null,\n      });\n\n      return this.#buildEmptyModel({\n        queryParams,\n        students,\n        resolvedStudents,\n        collection,\n        customContent,\n        exercise,\n        includedEntities,\n        allUsers,\n        mode,\n      });\n    }\n\n    if (teacherAssignmentId && exercise.isTeacherAssignment) {\n      const courseTeacherAssignmentEntities =\n        await this.#loadCourseTeacherAssignmentEntities({\n          course,\n          collection,\n          exercise,\n          selectedTeacherAssignmentId: teacherAssignmentId,\n        });\n\n      const collectionChildren = collection.get('children');\n\n      courseTeacherAssignmentEntities.forEach((entity) => {\n        collectionChildren.addObject(entity);\n      });\n\n      const sortedChildren = collectionChildren\n        .toArray()\n        .sort((left, right) =>\n          (left?.title || '').localeCompare(right?.title || '')\n        );\n\n      collectionChildren.clear();\n      collectionChildren.addObjects(sortedChildren);\n    }\n\n    await all([\n      resolve(collection.children).catch(() => []),\n      resolve(exercise.children).catch(() => []),\n    ]);\n\n    const answers = await this.#loadAnswers({\n      students,\n      mode,\n      collection,\n      exercise,\n      selectedStudent: queryParams.student_id || null,\n    });\n\n    let filteredStudents = students;\n    let filteredResolvedStudents = resolvedStudents;\n\n    if (mode === 'inbox') {\n      const filteredResult = await filterStudentsWithAnswers({\n        students,\n        resolvedStudents,\n        answers,\n        exercise,\n      });\n\n      filteredStudents = filteredResult.students;\n      filteredResolvedStudents = filteredResult.resolvedStudents;\n    }\n\n    await this.#preloadAnswers(answers);\n\n    return {\n      students: filteredStudents,\n      resolvedStudents: filteredResolvedStudents,\n      collection,\n      customContent,\n      exercise,\n      selectedStudent: queryParams.student_id || null,\n      selectedAnswerId: queryParams.answer_id || null,\n      answers,\n      includedEntities,\n      allUsers,\n      mode,\n    };\n  }\n\n  setupController() {\n    super.setupController(...arguments);\n\n    // eslint-disable-next-line ember/no-controller-access-in-routes\n    this.controllerFor('application').languageChanged();\n  }\n\n  async #loadAnswers({\n    students,\n    mode,\n    collection,\n    exercise,\n    selectedStudent,\n  }) {\n    void mode;\n\n    if (!students?.length || !exercise) {\n      return [];\n    }\n\n    const selectedStudents = selectedStudent ? [selectedStudent] : students;\n\n    if (selectedStudents.length === 0) {\n      return [];\n    }\n\n    const filter = {\n      user_id: selectedStudents.join(','),\n      all: true,\n      status: answerRules.startedStatuses,\n    };\n\n    if (exercise.isTeacherAssignment) {\n      const children = await resolve(collection?.children).catch(() => []);\n      const collectionChildren = Array.isArray(children)\n        ? children\n        : children?.toArray?.() || [];\n\n      let teacherAssignmentIds = collectionChildren\n        .filter((entity) => entity?.isTeacherAssignment)\n        .map((entity) => entity.id)\n        .filter(Boolean);\n\n      if (teacherAssignmentIds.length === 0) {\n        const teacherAssignment = await resolve(\n          exercise.teacherAssignment\n        ).catch(() => null);\n\n        const teacherAssignmentId = teacherAssignment?.id || exercise.id;\n\n        if (teacherAssignmentId) {\n          teacherAssignmentIds = [teacherAssignmentId];\n        }\n      }\n\n      if (teacherAssignmentIds.length === 0) {\n        return [];\n      }\n\n      filter.type = 'teacher_assignment';\n      filter.teacher_assignment_id = [...new Set(teacherAssignmentIds)];\n    } else {\n      if (!collection?.id) {\n        return [];\n      }\n\n      if (collection.isDiagnosis) {\n        return this.#loadDiagnosisAnswers({\n          collectionId: collection.id,\n          selectedStudents: students,\n        });\n      }\n\n      filter.type = 'standard';\n      filter.collection_id = collection.id;\n    }\n\n    const page = { size: 1000, number: 0 };\n\n    let answersResult;\n\n    try {\n      answersResult = await this.store.query('answer', {\n        page,\n        filter,\n      });\n    } catch (err) {\n      return [];\n    }\n\n    const answers = [...answersResult];\n    const numPages =\n      answersResult?.meta?.totalPages || answersResult?.meta?.total_pages || 0;\n\n    if (numPages > 1) {\n      const responses = await all(\n        Array.from({ length: numPages - 1 }, (_value, index) => index + 2).map(\n          (pageNumber) =>\n            this.store\n              .query('answer', {\n                page: {\n                  size: page.size,\n                  number: pageNumber,\n                },\n                filter,\n              })\n              .catch(() => [])\n        )\n      );\n\n      responses.forEach((response) => {\n        answers.push(...response);\n      });\n    }\n\n    return answers;\n  }\n\n  async #loadDiagnosisAnswers({ collectionId, selectedStudents }) {\n    if (!collectionId || selectedStudents.length === 0) {\n      return [];\n    }\n\n    const filter = {\n      user_id: selectedStudents.join(','),\n      node_id: collectionId,\n      all: true,\n      type: 'diagnosis_part',\n    };\n\n    const page = { size: 1000, number: 0 };\n\n    let interactivesResult;\n\n    try {\n      interactivesResult = await this.store.query('interactive', {\n        page,\n        filter,\n      });\n    } catch (err) {\n      return [];\n    }\n\n    const interactives = [...interactivesResult];\n    const numPages =\n      interactivesResult?.meta?.totalPages ||\n      interactivesResult?.meta?.total_pages ||\n      0;\n\n    if (numPages > 1) {\n      const responses = await all(\n        Array.from({ length: numPages - 1 }, (_value, index) => index + 2).map(\n          (pageNumber) =>\n            this.store\n              .query('interactive', {\n                page: {\n                  size: page.size,\n                  number: pageNumber,\n                },\n                filter,\n              })\n              .catch(() => [])\n        )\n      );\n\n      responses.forEach((response) => {\n        interactives.push(...response);\n      });\n    }\n\n    const latestInteractiveByUser = new Map();\n\n    interactives.forEach((interactive) => {\n      const userId = interactive.belongsTo('user').id();\n\n      if (!userId) {\n        return;\n      }\n\n      const current = latestInteractiveByUser.get(userId);\n\n      if (\n        !current ||\n        Number(interactive.attempt || 0) > Number(current.attempt || 0)\n      ) {\n        latestInteractiveByUser.set(userId, interactive);\n      }\n    });\n\n    const answers = [];\n\n    const answersByInteractive = await all(\n      Array.from(latestInteractiveByUser.values()).map((interactive) =>\n        resolve(interactive.answers).catch(() => [])\n      )\n    );\n\n    answersByInteractive.forEach((list) => {\n      const resolvedList = Array.isArray(list) ? list : list?.toArray?.() || [];\n      answers.push(...resolvedList);\n    });\n\n    return answers;\n  }\n\n  async #loadExercise({ exerciseId, teacherAssignmentId, course }) {\n    if (exerciseId) {\n      return this.store.findRecord('entity', exerciseId).catch(() => null);\n    }\n\n    return this.#loadTeacherAssignmentAsEntity(teacherAssignmentId, course);\n  }\n\n  async #loadTeacherAssignmentAsEntity(teacherAssignmentId, course) {\n    if (!teacherAssignmentId) {\n      return null;\n    }\n\n    let teacherAssignment;\n\n    try {\n      teacherAssignment = await this.store.findRecord(\n        'teacher-assignment',\n        teacherAssignmentId\n      );\n    } catch (err) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'teacher_assignment_not_found',\n        teacherAssignmentId,\n        error: err,\n      });\n\n      return null;\n    }\n\n    return this.#createTeacherAssignmentEntity(teacherAssignment, course);\n  }\n\n  async #loadCourseTeacherAssignmentEntities({\n    course,\n    collection,\n    exercise,\n    selectedTeacherAssignmentId,\n  }) {\n    const [\n      selectedTeacherAssignment,\n      selectedCollectionParent,\n      teacherAssignments,\n    ] = await all([\n      resolve(exercise.teacherAssignment).catch(() => null),\n      resolve(collection.parent).catch(() => null),\n      this.store\n        .findAll('teacher-assignment', { reload: true })\n        .catch(() => []),\n    ]);\n\n    const selectedTeacherId =\n      selectedTeacherAssignment?.belongsTo('user')?.id() ||\n      selectedTeacherAssignment?.userId;\n\n    if (!selectedTeacherId) {\n      return [];\n    }\n\n    const selectedBookId = selectedCollectionParent?.belongsTo('book')?.id();\n\n    const assignmentList = Array.isArray(teacherAssignments)\n      ? teacherAssignments\n      : teacherAssignments?.toArray?.() || [];\n\n    const courseTeacherAssignments = assignmentList\n      .filter((teacherAssignment) => {\n        const teacherAssignmentUserId =\n          teacherAssignment?.belongsTo('user')?.id() ||\n          teacherAssignment?.userId;\n\n        return (\n          teacherAssignmentUserId === selectedTeacherId &&\n          teacherAssignment.id !== selectedTeacherAssignmentId &&\n          teacherAssignment.isPublished\n        );\n      })\n      .sort((left, right) =>\n        (left?.title || '').localeCompare(right?.title || '')\n      );\n\n    const entities = await all(\n      courseTeacherAssignments.map((teacherAssignment) =>\n        this.#createTeacherAssignmentEntity(\n          teacherAssignment,\n          course,\n          selectedBookId\n        )\n      )\n    );\n\n    return entities.filter(Boolean);\n  }\n\n  async #createTeacherAssignmentEntity(\n    teacherAssignment,\n    course,\n    selectedBookId\n  ) {\n    if (!teacherAssignment) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'teacher_assignment_missing',\n      });\n\n      return null;\n    }\n\n    await resolve(teacherAssignment.user).catch(() => null);\n\n    const content = await this.#resolveTeacherAssignmentContent(\n      teacherAssignment,\n      course\n    );\n\n    if (!content) {\n      return null;\n    }\n\n    if (selectedBookId) {\n      const bookId = content.belongsTo('book').id();\n\n      if (bookId && bookId !== selectedBookId) {\n        console.error(INVALID_PARAMS_LOG_PREFIX, {\n          reason: 'teacher_assignment_content_book_mismatch',\n          teacherAssignmentId: teacherAssignment.id,\n          selectedBookId,\n          contentBookId: bookId,\n        });\n\n        return null;\n      }\n    }\n\n    const entity = teacherAssignment.createAsEntity(content);\n\n    if (!entity) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'teacher_assignment_entity_creation_failed',\n        teacherAssignmentId: teacherAssignment.id,\n        contentId: content?.id || null,\n      });\n\n      return null;\n    }\n\n    return entity;\n  }\n\n  async #resolveTeacherAssignmentContent(teacherAssignment, course) {\n    const [contents, courseBooks] = await all([\n      resolve(teacherAssignment.contents).catch(() => []),\n      resolve(course.books).catch(() => []),\n    ]);\n\n    const contentList = Array.isArray(contents)\n      ? contents\n      : contents?.toArray?.() || [];\n\n    if (contentList.length === 0) {\n      console.error(INVALID_PARAMS_LOG_PREFIX, {\n        reason: 'teacher_assignment_has_no_contents',\n        teacherAssignmentId: teacherAssignment?.id || null,\n        courseId: course?.id || null,\n      });\n\n      return null;\n    }\n\n    const courseBookIds = (\n      Array.isArray(courseBooks) ? courseBooks : courseBooks?.toArray?.() || []\n    ).map((book) => book.id);\n\n    if (courseBookIds.length === 0) {\n      return contentList[0];\n    }\n\n    return (\n      contentList.find((content) =>\n        courseBookIds.includes(content.belongsTo('book').id())\n      ) || contentList[0]\n    );\n  }\n\n  async #preloadAnswers(answers) {\n    if (!answers?.length) {\n      return;\n    }\n\n    await all(\n      answers.map((answer) =>\n        all([\n          resolve(answer.user).catch(() => null),\n          resolve(answer.teacherAssignment).catch(() => null),\n        ])\n      )\n    );\n  }\n\n  #buildEmptyModel({\n    queryParams,\n    allUsers,\n    mode,\n    students = [],\n    resolvedStudents = [],\n    collection = null,\n    customContent = null,\n    exercise = null,\n    answers = [],\n    includedEntities = null,\n  }) {\n    return {\n      students,\n      resolvedStudents,\n      collection,\n      customContent,\n      exercise,\n      selectedStudent: queryParams.student_id || null,\n      answers,\n      includedEntities,\n      allUsers,\n      mode,\n    };\n  }\n\n  async #loadCustomContent(customContentId) {\n    if (!customContentId) {\n      return null;\n    }\n\n    try {\n      return await this.store.findRecord('custom-content', customContentId);\n    } catch (err) {\n      return null;\n    }\n  }\n\n  async #loadIncludedEntities(includedEntityIds) {\n    const entityIds = parseList(includedEntityIds);\n\n    if (entityIds.length === 0) {\n      return null;\n    }\n\n    const entities = await all(\n      entityIds.map((entityId) =>\n        this.store.findRecord('entity', entityId).catch(() => null)\n      )\n    );\n\n    return entities.filter(Boolean);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\n\nexport default class EntityContextRoute extends Route {\n  @service contextHelper;\n\n  @service entityContext;\n\n  setupController(controller, { model, closeUrl, returnUrl }) {\n    super.setupController(...arguments);\n\n    this.entityContext.setEntityContext(model);\n\n    if (closeUrl) {\n      this.contextHelper.setCloseUrl(closeUrl);\n    } else {\n      this.contextHelper.setCloseUrl(null);\n    }\n\n    if (returnUrl) {\n      this.contextHelper.setReturnUrl(returnUrl);\n    } else {\n      this.contextHelper.setReturnUrl(null);\n    }\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.entityContext.resetEntityContext();\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class InvalidateRoute extends Route {\n  @service session;\n\n  beforeModel() {\n    // session.restore() is moved from initializer to here to be able to catch exception\n    // in incognito mode, as it tries to access localStorage\n    this.session\n      .restore()\n      .then(() => this.session.invalidateSession())\n      .then(() => {\n        window.parent.postMessage('session_invalidated', '*');\n      })\n      .catch(() => {\n        window.parent.postMessage('session_invalidation_error', '*');\n      });\n  }\n}\n","import OIDCAuthenticationRoute from 'ember-simple-auth-oidc/routes/oidc-authentication';\nimport getAbsoluteUrl from 'ember-simple-auth-oidc/utils/absolute-url';\nimport {\n  generateCodeVerifier,\n  generatePkceChallenge,\n} from 'ember-simple-auth-oidc/utils/pkce';\nimport { v4 } from 'uuid';\n\nexport default class LoginRoute extends OIDCAuthenticationRoute {\n  /**\n   * Overwrites beforeModel\n   * This overwrite handles the case where transition.from is empty,\n   * which is not handled in ember-simple-auth-oidc.\n   */\n  beforeModel(transition) {\n    let target = 'master';\n\n    if (transition.from) {\n      target = transition.from.name;\n    }\n\n    this.session.prohibitAuthentication(target);\n\n    // PKCE Verifier has to be set in session, because we redirect to keycloak and back\n    if (this.config.enablePkce) {\n      let pkceCodeVerifier = this.session.data.pkceCodeVerifier;\n\n      if (!pkceCodeVerifier) {\n        pkceCodeVerifier = generateCodeVerifier(96);\n        this.session.set('data.pkceCodeVerifier', pkceCodeVerifier);\n      }\n    }\n  }\n\n  /**\n   * Overwrites afterModel to check if queryParams.error from oidc-provider on prompt=none\n   */\n  async afterModel(_, transition) {\n    const queryParams = transition.to\n      ? transition.to.queryParams\n      : transition.queryParams;\n\n    // errors when prompt=none fails, https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n    if (\n      queryParams?.error === 'login_required' ||\n      queryParams?.error === 'consent_required' ||\n      queryParams?.error === 'interaction_required'\n    ) {\n      // if error from prompt=none check if we have a savedUrl, when savedUrl let this be handled by ember-simple-auth-oidc\n      // otherwise redirect to landingpage\n      const savedUrl = this.session.get('data.nextURL');\n      if (!savedUrl) return location.replace('/');\n    }\n\n    return super.afterModel(...arguments);\n  }\n\n  /**\n   * Overwrites _handleRedirectRequest\n   * The code is unchanged with the exception of the key \"prompt\"\n   * being added to \"search\" and the \"savedUrl\" being checked\n   * before setting nextUrl.\n   */\n  _handleRedirectRequest(queryParams) {\n    const state = v4();\n\n    // Store state to session data\n    this.session.set('data.state', state);\n\n    /**\n     * Store the `nextURL` in the localstorage so when the user returns after\n     * the login he can be sent to the initial destination.\n     */\n    const url = this.session.attemptedTransition?.intent?.url;\n    const savedUrl = this.session.get('data.nextURL');\n\n    if ((url && url !== '/') || !savedUrl) {\n      this.session.set('data.nextURL', url);\n    }\n\n    // forward `login_hint` query param if present\n    const key = this.config.loginHintName || 'login_hint';\n\n    let search = [\n      `client_id=${this.config.clientId}`,\n      `redirect_uri=${this.redirectUri}`,\n      `response_type=code`,\n      `state=${state}`,\n      `scope=${this.config.scope}`,\n      queryParams[key] ? `${key}=${queryParams[key]}` : null,\n    ];\n\n    if (this.config.enablePkce) {\n      const pkceChallenge = generatePkceChallenge(\n        this.session.data.pkceCodeVerifier\n      );\n      search.push(`code_challenge=${pkceChallenge}`);\n      search.push('code_challenge_method=S256');\n    }\n\n    search = search.filter(Boolean).join('&');\n\n    this._redirectToUrl(\n      `${getAbsoluteUrl(this.config.host)}${this.config.authEndpoint}?${search}`\n    );\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class LogoutRoute extends Route {\n  @service session;\n\n  beforeModel() {\n    return this.session.singleLogout();\n  }\n}\n","import { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport AuthenticatedRoute from 'babel/routes/authenticated-route';\n\nexport default class MasterRoute extends AuthenticatedRoute {\n  @service pusher;\n\n  @service router;\n\n  @service intl;\n\n  @service ajax;\n\n  @service session;\n\n  async beforeModel(transition) {\n    await super.beforeModel(...arguments);\n\n    // Activate preview mode (for superadmins)\n    if (transition.to && transition.to.queryParams.preview) {\n      this.session.inPreviewMode = true;\n    }\n  }\n\n  @action\n  didTransition() {\n    this.controller.drawerIsOpen = false;\n  }\n}\n","import Route from '@ember/routing/route';\nimport { redirectToNokportal } from 'babel/utils/redirect';\n\nexport default class MasterAdminRoute extends Route {\n  beforeModel(transition) {\n    redirectToNokportal(transition);\n  }\n}\n","import { service } from '@ember/service';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n// eslint-disable-next-line ember/no-mixins\nimport PageViewTracker from 'babel/mixins/page-view-tracker';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport { all, resolve } from 'rsvp';\n\nexport default class MasterArchivesRoute extends EntityContextRoute.extend(\n  EntityRouteSupport,\n  PageViewTracker\n) {\n  @service pageviews;\n\n  materials;\n\n  async model() {\n    const model = await super.model(...arguments);\n    const archive = model.model;\n    const folders = await archive.children;\n\n    this.materials = await all(\n      folders.map((folder) =>\n        resolve(folder.materials).then((materials) => {\n          materials.forEach((material) => {\n            material.folder = folder;\n          });\n\n          return materials.toArray();\n        })\n      )\n    ).then((materials) => materials.flat());\n\n    return model;\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n\n    controller.model = {\n      archive: model.model,\n      folder: null,\n      materials: this.materials,\n    };\n  }\n}\n","import Route from '@ember/routing/route';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n\nexport default class MasterArchivesFoldersRoute extends Route.extend(\n  EntityRouteSupport\n) {\n  setupController(controller, { model: folder }) {\n    super.setupController(...arguments);\n    // eslint-disable-next-line ember/no-controller-access-in-routes\n    this.controllerFor('master.archives').set('model.folder', folder);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterArchivesFoldersMaterialsController extends Route {\n  @service pageviews;\n\n  @service store;\n\n  model({ material_id }) {\n    return this.store.findRecord('material', material_id);\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n\n    const { model: folder, book } = this.modelFor('master.archives.folders');\n\n    this.pageviews.logPageView(folder, book, folder.get('parent'), {\n      material: model.get('id'),\n    });\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default class MasterArchivesRoute extends Route {\n  setupController() {\n    super.setupController(...arguments);\n    // eslint-disable-next-line ember/no-controller-access-in-routes\n    this.controllerFor('master.archives').set('model.folder', null);\n  }\n}\n","// eslint-disable-next-line ember/no-mixins\nimport config from 'babel/config/environment';\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n// eslint-disable-next-line ember/no-mixins\nimport PageViewTracker from 'babel/mixins/page-view-tracker';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\n\nexport default class MasterAreasRoute extends EntityContextRoute.extend(\n  EntityRouteSupport,\n  PageViewTracker\n) {\n  beforeModel({ to }) {\n    if (config.redirectToVue && to?.params?.area_id) {\n      window.location = `/areas/${to.params.area_id}`;\n    }\n  }\n}\n","// eslint-disable-next-line ember/no-mixins\nimport { service } from '@ember/service';\nimport config from 'babel/config/environment';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n// eslint-disable-next-line ember/no-mixins\nimport PageViewTracker from 'babel/mixins/page-view-tracker';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport { trackBookPageWithoutLicense } from 'babel/utils/matomo-events';\n\nexport default class MasterBooksRoute extends EntityContextRoute.extend(\n  EntityRouteSupport,\n  PageViewTracker\n) {\n  @service session;\n\n  async afterModel(model, transition) {\n    super.afterModel(model, transition);\n\n    const products = (await model?.book?.products) ?? [];\n    const licenses = (await this.session?.user?.licenses) ?? [];\n    const isbns = new Set(licenses.map((l) => l.isbn));\n    const productIds = products.map((p) => p.id);\n\n    const noLicense = productIds.every((productId) => !isbns.has(productId));\n\n    if (noLicense) {\n      trackBookPageWithoutLicense(\n        model?.book?.id,\n        model?.book?.title,\n        document.referrer\n      );\n    }\n  }\n\n  beforeModel({ to }) {\n    if (config.redirectToVue && to?.params?.book_id) {\n      window.location = `/books/${to.params.book_id}`;\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport { service } from '@ember/service';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n// eslint-disable-next-line ember/no-mixins\nimport PageViewTracker from 'babel/mixins/page-view-tracker';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport refreshRouteAndNotifyExerciseChange from 'babel/utils/refresh-route-and-notify-exercise-change';\nimport { all, hash, resolve } from 'rsvp';\n\nconst WORKSPACE_ROUTE_NAMES = ['assignments', 'wordlists', '.notes'];\n\nfunction transitionIsWithinWorkspace(transition) {\n  const { from, to } = transition;\n\n  if (from && to) {\n    return (\n      WORKSPACE_ROUTE_NAMES.any((x) => from.name.includes(x)) ||\n      WORKSPACE_ROUTE_NAMES.any((x) => to.name.includes(x))\n    );\n  }\n  return false;\n}\n\nexport default class ContentsRoute extends EntityContextRoute.extend(\n  EntityRouteSupport,\n  PageViewTracker\n) {\n  // SETUP\n\n  @service router;\n\n  @service speaker;\n\n  @service courseContext;\n\n  @service contextHelper;\n\n  @service pusher;\n\n  @service store;\n\n  // PROPERTIES\n\n  includeGrandchildren = true;\n\n  includeCategories = true;\n\n  // HOOKS\n\n  afterModel({ model, teacherAssignments, wordlists }) {\n    super.afterModel(...arguments);\n\n    return hash({\n      ...model.getProperties('categories', 'video', 'children'),\n      teacherAssignmentUsers: all(teacherAssignments.getEach('user')),\n      wordlistUsers: all(wordlists.getEach('user')),\n    }).then(({ children }) => {\n      return all(\n        children\n          .filterBy('type', 'collections')\n          .map((collection) => getCollectionData(this.store, collection))\n      );\n    });\n  }\n\n  deactivate() {\n    super.deactivate(...arguments);\n    const imageCache = document.getElementById('image-cache-content-story');\n    imageCache?.remove();\n  }\n\n  setupController(controller, { model }) {\n    super.setupController(...arguments);\n\n    controller.setActiveSectionIdIfNeeded();\n    controller.set('isActive', true);\n\n    this.courseContext.storeVisitedContent(model?.id);\n\n    this.pusher.on('teacher-assignment', this.handleTeacherAssignment);\n    this.pusher.on('custom-content', this.reload);\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      controller.set('isActive', false);\n\n      controller.setProperties({\n        activeSectionId: null,\n        missionId: null,\n        customContentId: null,\n        openCustomContent: null,\n        activeExerciseId: null,\n        viewAs: null,\n      });\n    }\n\n    this.pusher.off('teacher-assignment', this.handleTeacherAssignment);\n    this.pusher.off('custom-content', this.reload);\n\n    this.speaker.resetSpeakerActive();\n  }\n\n  // ACTIONS\n\n  @action\n  reload() {\n    refreshRouteAndNotifyExerciseChange(\n      this.router,\n      this.contextHelper,\n      'master.contents'\n    );\n  }\n\n  @action\n  handleTeacherAssignment(teacherAssignment, event) {\n    const content = this.context.model;\n\n    all([\n      resolve(teacherAssignment.contents).then((contents) => contents.reload()),\n      resolve(teacherAssignment.user),\n    ]).then(() => {\n      switch (event) {\n        case 'create':\n          teacherAssignment.createAsEntity(content);\n          break;\n        case 'update':\n          teacherAssignment.updateAsEntity(content);\n          break;\n        case 'willDelete':\n          teacherAssignment.deleteAsEntity(content);\n          break;\n      }\n    });\n  }\n\n  @action\n  willTransition(transition) {\n    const controller = this.controllerFor('master.contents');\n\n    const lastTransitionWasWithinWorkspace =\n      transitionIsWithinWorkspace(transition);\n\n    controller.set(\n      'lastTransitionWasWithinWorkspace',\n      lastTransitionWasWithinWorkspace\n    );\n\n    if (lastTransitionWasWithinWorkspace) {\n      later(controller, 'set', 'lastTransitionWasWithinWorkspace', false);\n    }\n\n    return true;\n  }\n}\n","import { ForbiddenError, NotFoundError } from '@ember-data/adapter/error';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { reject, resolve } from 'rsvp';\n\nexport default class MasterContentsAssignmentsEditRoute extends Route {\n  @service session;\n\n  @service store;\n\n  beforeModel() {\n    const user = this.session.user;\n\n    if (!user.isTeacher) {\n      return reject(ForbiddenError);\n    }\n  }\n\n  async model({ assignment_id }) {\n    let teacherAssignment;\n\n    try {\n      teacherAssignment = await this.store.findRecord(\n        'teacher-assignment',\n        assignment_id\n      );\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    await resolve(teacherAssignment.contents);\n\n    return teacherAssignment;\n  }\n\n  afterModel(model) {\n    const { model: content } = this.modelFor('master.contents');\n\n    if (!model.hasContent(content)) {\n      return reject(NotFoundError);\n    }\n  }\n\n  resetController(controller) {\n    const model = controller.model;\n\n    if (!model.isDestroyed && !model.isDestroying) {\n      model.rollback();\n    }\n  }\n}\n","import { ForbiddenError } from '@ember-data/adapter/error';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { reject } from 'rsvp';\n\nexport default class MasterContentsAssignmentsNewRoute extends Route {\n  @service session;\n\n  @service store;\n\n  beforeModel() {\n    const user = this.session.user;\n\n    if (!user.isTeacher) {\n      return reject(ForbiddenError);\n    }\n  }\n\n  model() {\n    const user = this.session.user;\n    const { model: content, book } = this.modelFor('master.contents');\n\n    const teacherAssignment = this.store.createRecord('teacher-assignment', {\n      user,\n      books: [book],\n      contents: [content],\n    });\n\n    teacherAssignment.addNewExerciseAssigment();\n\n    return teacherAssignment;\n  }\n\n  resetController(controller) {\n    controller.model?.rollback();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { NotFoundError } from '@ember-data/adapter/error';\nimport { MissingContentError } from 'babel/utils/errors';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { reject, resolve } from 'rsvp';\n\nexport default class MasterContentsAssignmentsShowRoute extends Route {\n  // SETUP\n\n  @service assignmentEvents;\n\n  @service missionMode;\n\n  @service pageviews;\n\n  @service router;\n\n  @service store;\n\n  @service entityContext;\n\n  // HOOKS\n\n  async model({ assignment_id }) {\n    let activeExercise, collection;\n\n    try {\n      activeExercise = await this.store.findRecord('entity', assignment_id);\n      collection = await resolve(activeExercise?.parent);\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    if (collection.template === 'carousel') {\n      // ignore passed in assignment_id for carousels -\n      // the interactive's current exercise should always win.\n      activeExercise = null;\n    }\n\n    let {\n      parent: content,\n      exercises,\n      book,\n      editor,\n    } = await getCollectionData(this.store, collection);\n\n    exercises = await this.missionMode.allowedEntities(exercises);\n\n    const {\n      interactive,\n      activeAnswer,\n      activeExercise: exerciseOverride,\n    } = await this.assignmentEvents.getOrCreateInteractiveForCollection(\n      collection,\n      activeExercise\n    );\n\n    activeExercise = exerciseOverride;\n\n    return {\n      book,\n      content,\n      collection,\n      exercises,\n      activeExercise,\n      editor,\n      answers: interactive.answers,\n      activeAnswer,\n    };\n  }\n\n  afterModel(\n    { activeExercise, book, collection, content, exercises },\n    transition\n  ) {\n    if (activeExercise.id !== transition.to.params.assignment_id) {\n      // if the interactive's current exercise is different than\n      // the current route we redirect to the correct exercise.\n\n      return this.router.replaceWith(\n        'master.contents.assignments.show',\n        activeExercise.id\n      );\n    }\n\n    const { model: contentModel } = this.modelFor('master.contents');\n\n    if (!exercises.includes(activeExercise) && content.id !== contentModel.id) {\n      return reject(NotFoundError);\n    }\n\n    const contentsRoute = transition.to.find(\n      (route) => route.name === 'master.contents'\n    );\n\n    this.pageviews.logPageView(activeExercise, book, collection, {\n      section: contentsRoute.queryParams.section,\n    });\n\n    // When switching between collections while the workspace is left open\n    // (using links in nav menu or done box) the interactive needs to be\n    // updated. Triggering an interactive-updated event allows us to catch\n    // this case in the entity-progress component and load the data as needed.\n    scheduleOnce(\n      'afterRender',\n      this,\n      this.triggerInteractiveUpdated,\n      collection.id\n    );\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n    this.entityContext.changeWorkspaceExercise(model.activeExercise);\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.entityContext.changeWorkspaceExercise();\n    }\n  }\n\n  triggerInteractiveUpdated(collectionId) {\n    this.assignmentEvents.trigger('interactive-updated', collectionId);\n  }\n}\n","import { NotFoundError } from '@ember-data/adapter/error';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { reject, resolve } from 'rsvp';\n\nexport default class MasterContentsNotesEditRoute extends Route {\n  @service store;\n\n  async model({ note_id }) {\n    let note;\n\n    try {\n      note = await this.store.findRecord('note', note_id);\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    await resolve(note.books);\n\n    return note;\n  }\n\n  afterModel(model) {\n    const { book } = this.modelFor('master.contents');\n\n    if (!model.hasBook(book)) {\n      return reject(NotFoundError);\n    }\n  }\n\n  resetController(controller) {\n    const model = controller.model;\n\n    if (!model.isDestroyed && !model.isDestroying) {\n      model.rollback();\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterContentsNotesNewRoute extends Route {\n  @service session;\n\n  @service store;\n\n  model() {\n    const user = this.session.user;\n\n    const { model: content, book } = this.modelFor('master.contents');\n\n    return this.store.createRecord('note', {\n      user,\n      books: [book],\n      contents: [content],\n    });\n  }\n\n  resetController(controller) {\n    controller.model?.rollback();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nconst CONTENTS_ROUTE_NAME = 'master.contents';\nconst SLASH = '/';\nconst QUESTION_MARK = '?';\n\nexport default Route.extend({\n  // SETUP\n\n  router: service(),\n\n  // HOOKS\n\n  model({ path }, transition) {\n    const { content_id } = this.paramsFor(CONTENTS_ROUTE_NAME);\n\n    const [section, ...segments] = path\n      .split(SLASH)\n      .compact()\n      .without('sections')\n      .without('workspace')\n      .without('show');\n\n    const router = this.router;\n\n    const { exercise_id, ...queryParams } = transition.to.queryParams;\n\n    let url = router.urlFor(CONTENTS_ROUTE_NAME, content_id, {\n      queryParams: { section, exercise: exercise_id, ...queryParams },\n    });\n\n    if (segments.get('length') > 0) {\n      const [base, query] = url.split(QUESTION_MARK);\n      url =\n        base +\n        SLASH +\n        segments.join(SLASH).replace('exercises', 'assignments') +\n        QUESTION_MARK +\n        query;\n    }\n\n    if (this.router.recognize(url)) {\n      return this.router.replaceWith(url);\n    }\n  },\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { ForbiddenError, NotFoundError } from '@ember-data/adapter/error';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { all, reject, resolve } from 'rsvp';\n\nexport default class MasterContentsWordlistsEditRoute extends Route {\n  @service session;\n\n  @service contextHelper;\n\n  @service missionMode;\n\n  @service store;\n\n  async model({ wordlist_id }) {\n    let wordlist;\n\n    try {\n      wordlist = await this.store.findRecord('wordlist', wordlist_id);\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    await resolve(wordlist.books);\n\n    return wordlist;\n  }\n\n  async afterModel(model) {\n    const { book } = this.modelFor('master.contents');\n\n    if (this.contextHelper.activeCustomContent) {\n      await all([\n        this.contextHelper.activeCustomContent.includedEntities,\n        this.contextHelper.activeCustomContent.includedWordlists,\n      ]);\n    }\n\n    if (!model.hasBook(book) || !this.missionMode.wordlistIsAllowed(model)) {\n      return reject(NotFoundError);\n    }\n\n    if (!model.isUser(this.session.user)) {\n      return reject(ForbiddenError);\n    }\n  }\n\n  resetController(controller) {\n    const model = controller.model;\n\n    if (!model.isDestroyed && !model.isDestroying) {\n      model.rollbackAttributes();\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterContentsWordlistsNewRoute extends Route {\n  @service session;\n\n  @service store;\n\n  model() {\n    const user = this.session.user;\n\n    const { model: content, book } = this.modelFor('master.contents');\n    const language = book.body.language || 'sv_SE';\n\n    return this.store.createRecord('wordlist', {\n      user,\n      books: [book],\n      contents: [content],\n      language,\n      type: language === 'sv_SE' ? 'concepts' : 'glossaries',\n    });\n  }\n\n  resetController(controller) {\n    controller.model.rollback();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { NotFoundError } from '@ember-data/adapter/error';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { all, reject, resolve } from 'rsvp';\n\nexport default class MasterContentsWordlistsShowRoute extends Route {\n  @service contextHelper;\n\n  @service missionMode;\n\n  @service pageviews;\n\n  @service store;\n\n  async model({ wordlist_id }) {\n    let wordlist;\n\n    try {\n      wordlist = await this.store.findRecord('wordlist', wordlist_id);\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    await all([wordlist.words, wordlist.books]);\n\n    return wordlist;\n  }\n\n  async afterModel(model, transition) {\n    const { book } = this.modelFor('master.contents');\n\n    if (this.contextHelper.activeCustomContent) {\n      await all([\n        this.contextHelper.activeCustomContent.includedEntities,\n        this.contextHelper.activeCustomContent.includedWordlists,\n      ]);\n    }\n\n    if (!model.hasBook(book) || !this.missionMode.wordlistIsAllowed(model)) {\n      return reject(NotFoundError);\n    }\n\n    if (model.isTransformed) {\n      return resolve(model.entity.parent).then((parent) => {\n        const contentsRoute = transition.to.find(\n          (route) => route.name === 'master.contents'\n        );\n\n        this.pageviews.logPageView(model, book, parent, {\n          section: contentsRoute.queryParams.section,\n        });\n\n        return model.words;\n      });\n    }\n\n    return model.words;\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default class MasterContentsWordlistsShowIndexRoute extends Route {\n  queryParams = {\n    quiz: {\n      refreshModel: true,\n    },\n  };\n\n  model({ quiz }) {\n    const wordlist = this.modelFor('master.contents.wordlists.show');\n    return { wordlist, quiz };\n  }\n\n  resetController(controller, isExiting) {\n    if (isExiting) {\n      controller.quiz = null;\n    }\n  }\n}\n","import { ForbiddenError, NotFoundError } from '@ember-data/adapter/error';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { reject, resolve } from 'rsvp';\n\nexport default class MasterContentsWordlistsShowWordsEditRoute extends Route {\n  @service session;\n\n  @service store;\n\n  async model({ word_id }) {\n    let word;\n\n    try {\n      word = await this.store.findRecord('word', word_id);\n    } catch (err) {\n      return reject(new MissingContentError());\n    }\n\n    return word;\n  }\n\n  afterModel(model) {\n    return resolve(model.wordlist).then((wordlist) => {\n      if (wordlist !== this.modelFor('master.contents.wordlists.show')) {\n        return reject(NotFoundError);\n      }\n\n      if (!wordlist.isUser(this.session.user)) {\n        return reject(ForbiddenError);\n      }\n    });\n  }\n\n  resetController(controller) {\n    const model = controller.model;\n\n    if (!model.isDestroyed && !model.isDestroying) {\n      model.rollback();\n    }\n  }\n}\n","import { ForbiddenError } from '@ember-data/adapter/error';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { reject, resolve } from 'rsvp';\n\nexport default class MasterContentsWordlistsShowWordsNewRoute extends Route {\n  @service session;\n\n  @service store;\n\n  model() {\n    const wordlist = this.modelFor('master.contents.wordlists.show');\n    return this.store.createRecord('word', { wordlist });\n  }\n\n  afterModel(model) {\n    return resolve(model.wordlist).then((wordlist) => {\n      if (!wordlist.isUser(this.session.user)) {\n        return reject(ForbiddenError);\n      }\n    });\n  }\n\n  resetController(controller) {\n    controller.model.rollback();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { redirectToNokportal } from 'babel/utils/redirect';\n\nexport default class CourseSettings extends Route {\n  beforeModel(transition) {\n    redirectToNokportal(transition);\n  }\n\n  model() {}\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\nimport { all, hash } from 'rsvp';\n\nexport default class CoursesRoute extends Route {\n  @service store;\n\n  model() {\n    return hash({\n      teacherAssignments: this.store\n        .findAll('teacher-assignment')\n        .then((teacherAssignments) =>\n          all(\n            teacherAssignments.map((teacherAssignment) =>\n              all([\n                teacherAssignment.get('books'),\n                teacherAssignment.get('contents'),\n              ])\n            )\n          ).then(() => teacherAssignments)\n        ),\n      wordlists: this.store\n        .findAll('wordlist')\n        .then((wordlists) =>\n          all(\n            wordlists.map((wordlist) =>\n              all([wordlist.get('books'), wordlist.get('contents')])\n            )\n          ).then(() => wordlists)\n        ),\n    });\n  }\n}\n","import Route from '@ember/routing/route';\nimport { redirectToNokportal } from 'babel/utils/redirect';\n\nexport default class CoursesNewRoute extends Route {\n  beforeModel(transition) {\n    redirectToNokportal(transition);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { all, resolve } from 'rsvp';\n\nconst VUE_QUERY_PARAMS_ALLOWLIST = new Set([\n  'createMission',\n  'contentId',\n  'missionTitle',\n]);\n\nconst VUE_ROUTE_MAP = {\n  'master.courses.show.index': 'content',\n  'master.courses.show.books': 'content',\n  'master.courses.show.missions': 'missions',\n  'master.courses.show.my-results': 'my-results',\n  'master.courses.show.settings': 'settings',\n  'master.courses.show.audit.index': 'audit',\n  'master.courses.show.audit.overview': 'audit',\n  'master.courses.show.audit.inbox': 'audit',\n  'master.courses.show.audit.log': 'audit',\n  'master.courses.show.audit.comments': 'audit',\n  'master.courses.show.audit.missions.index': 'audit',\n  'master.courses.show.audit.missions.show': 'audit',\n  'master.courses.show.audit.todos.index': 'audit',\n  'master.courses.show.audit.todos.show': 'audit',\n};\n\nexport default class MasterCoursesShowRoute extends Route {\n  @service session;\n\n  @service courseContext;\n\n  @service productContext;\n\n  @service store;\n\n  afterModel(course, transition) {\n    if (!config.redirectToVue) return;\n\n    if (course.products.length > 1) {\n      window.location = config.nokPortalURL;\n      return;\n    }\n\n    const segment = VUE_ROUTE_MAP[transition.to.name];\n    if (!segment) return;\n\n    const isbn = course.products.firstObject?.id;\n    if (!isbn) return;\n\n    const extraParams = Object.entries(transition.to.queryParams ?? {})\n      .filter(([k, v]) => VUE_QUERY_PARAMS_ALLOWLIST.has(k) && v != null)\n      .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n      .join('&');\n\n    const qs = extraParams\n      ? `?course_id=${course.id}&${extraParams}`\n      : `?course_id=${course.id}`;\n\n    window.location = `/products/${isbn}/${segment}${qs}`;\n  }\n\n  async model(params) {\n    const course = await this.store.findRecord('course', params.course_id);\n    const user = this.session.user;\n\n    await all([course, course.products, user.licenses]);\n    await resolve(course.usersMissingLicenses);\n\n    return course;\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n\n    this.courseContext.removeAllContext();\n    this.productContext.removeAllContext();\n\n    this.courseContext.setCurrentCourse(model);\n\n    // eslint-disable-next-line ember/no-controller-access-in-routes\n    this.controllerFor('application').languageChanged();\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.courseContext.setCurrentCourse(null);\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { all, hash, resolve } from 'rsvp';\n\nexport default class MasterCoursesShowAuditRoute extends Route {\n  @service router;\n\n  @service store;\n\n  @service session;\n\n  async beforeModel() {\n    super.beforeModel(...arguments);\n\n    if (!this.session.user?.isTeacher) {\n      return this.router.transitionTo('master.courses.show');\n    }\n  }\n\n  async model() {\n    const course = this.modelFor('master.courses.show');\n\n    const setting = await course.setting;\n    await setting?.hiddenBooks;\n\n    let [groups, teachers, teacherAssignments] = await all([\n      course.groups,\n      course.teachers,\n      this.store.findAll('teacher-assignment'),\n      course.books,\n    ]);\n\n    groups = groups.sortBy('name');\n\n    const teacherIds = teachers.map((teacher) => teacher.id);\n\n    teacherAssignments = teacherAssignments\n      .filter((teacherAssignment) =>\n        teacherIds.includes(teacherAssignment.userId)\n      )\n      .sortBy('title');\n\n    const students = [];\n\n    await all(\n      groups.map((group) =>\n        resolve(group.users).then((users) =>\n          students.push(\n            ...users\n              .filter(\n                (user) => user.role === 'student' && !students.includes(user.id)\n              )\n              .map((user) => user.id)\n          )\n        )\n      )\n    );\n\n    return hash({ course, groups, students, teacherAssignments });\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n  model() {\n    return this.modelFor('master.courses.show.audit');\n  },\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n  model() {\n    return this.modelFor('master.courses.show.audit');\n  },\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class CourseAuditIndex extends Route {\n  @service store;\n\n  async model() {\n    const course = this.modelFor('master.courses.show');\n\n    const [missions, students] = await Promise.all([\n      this.store.query('mission', {\n        filter: {\n          scope: 'auditable',\n          course_id: course?.id,\n          'custom_contents <>': '{}',\n        },\n        page: {\n          number: 1,\n          size: 1,\n        },\n      }),\n      course.get('users'),\n    ]);\n\n    return { students, hasMissions: missions.get('length') > 0 };\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n  model() {\n    return this.modelFor('master.courses.show.audit');\n  },\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { all, resolve } from 'rsvp';\n\nexport default class MasterCoursesShowAuditMissionsIndexRoute extends Route {\n  @service store;\n\n  queryParams = {\n    page: {\n      refreshModel: true,\n    },\n  };\n\n  model({ page }) {\n    const course = this.modelFor('master.courses.show');\n\n    return this.store.query('mission', {\n      filter: {\n        scope: 'auditable',\n        course_id: course?.id,\n        'custom_contents <>': '{}',\n      },\n      page: {\n        number: page,\n        size: 12,\n      },\n    });\n  }\n\n  afterModel(model) {\n    return all([\n      all(model.getEach('customContents')).then((parts) =>\n        all(parts.map((part) => part.getEach('entity')).flat()).catch(resolve)\n      ),\n      ...model.getEach('receivers'),\n    ]);\n  }\n}\n","import { A } from '@ember/array';\nimport EmberObject, { get } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { all, hash, resolve } from 'rsvp';\n\nexport default Route.extend({\n  store: service(),\n\n  model({ mission_id }) {\n    const model = this.modelFor('master.courses.show.audit');\n\n    return all([\n      this.store.findRecord('mission', mission_id),\n      this.store.findAll('teacher-assignment'),\n      get(model, 'course.teachers'),\n      get(model, 'course.allBooks'),\n    ]).then(([mission, teacherAssignments, teachers, allowedBooks]) =>\n      all([\n        mission.get('customContents').then((customContents) =>\n          all(\n            customContents.map((customContent) =>\n              customContent.get('entity').then((entity) => {\n                const promises = [\n                  entity.get('book'),\n                  entity.get('children'),\n                  customContent.get('includedTeacherAssignments'),\n                ];\n\n                teacherAssignments\n                  .sortBy('title')\n                  .forEach((teacherAssignment) => {\n                    if (teacherAssignment.hasContent(entity)) {\n                      promises.push(\n                        teacherAssignment.get('user').then((user) => {\n                          if (teachers.includes(user)) {\n                            return teacherAssignment.createAsEntity(entity);\n                          }\n                        })\n                      );\n                    }\n                  });\n\n                return all(promises).then(([book]) => {\n                  if (book && allowedBooks && !allowedBooks.includes(book)) {\n                    customContent.set('entity', null);\n                    customContent.set('error', 'invalid');\n                  }\n                });\n              })\n            )\n          ).catch(resolve)\n        ),\n        mission.get('receivers'),\n      ]).then((responses) => {\n        let groups = A();\n        let students = responses.pop();\n\n        if (students && students.length > 0) {\n          const group = EmberObject.create();\n          group.set('users', students);\n          groups.addObject(group);\n\n          students = students.map((x) => x.get('id'));\n        } else {\n          groups = model.groups.sortBy('name');\n          students = model.students;\n        }\n\n        return hash({\n          course: model.course,\n          groups,\n          students,\n          mission,\n        });\n      })\n    );\n  },\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n  model() {\n    return this.modelFor('master.courses.show.audit');\n  },\n});\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\n\nexport default class MasterCoursesShowAuditTodosIndexRoute extends Route {\n  @service router;\n\n  redirect() {\n    this.router.replaceWith('master.courses.show.audit.missions');\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\n\nexport default class MasterCoursesShowAuditTodosShowRoute extends Route {\n  @service router;\n\n  model({ todo_id }) {\n    this.router.replaceWith('master.courses.show.audit.missions.show', todo_id);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\nimport { hash, resolve } from 'rsvp';\n\nexport default class MasterCoursesShowBookRoute extends Route {\n  @service session;\n\n  async model() {\n    const course = this.modelFor('master.courses.show');\n\n    const productBooks = [];\n\n    const products = course.products.sortBy('title');\n\n    for (const product of products) {\n      const books = await product.userBooks;\n      productBooks.push(...books.toArray());\n    }\n\n    const setting = await resolve(course.setting);\n    const settingBooks = await resolve(setting?.books).catch(() => []);\n\n    if (settingBooks?.length > 0 && this.session.user.isTeacher) {\n      const hiddenBooks = productBooks.filter(\n        (book) => !settingBooks.map((obj) => obj.id).includes(book.id)\n      );\n\n      setting.hiddenBooks = hiddenBooks;\n      setting.books = [];\n\n      await setting.save();\n    }\n\n    return hash({\n      course,\n      productBooks,\n    });\n  }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterCoursesShowIndexRoute extends Route {\n  @service store;\n  @service session;\n  @service pusher;\n\n  async model() {\n    const courses = this.modelFor('master.courses');\n    const course = this.modelFor('master.courses.show');\n\n    const [missions, shortcuts, teacherAssignments, wordlists] =\n      await Promise.all([\n        this.store.query('mission', {\n          filter: {\n            course_id: course.id,\n            scope: 'visible',\n          },\n          order: [\n            {\n              field: 'created',\n              direction: 'DESC',\n            },\n          ],\n        }),\n        course.shortcuts,\n        courses.teacherAssignments,\n        courses.wordlists,\n      ]);\n\n    const customContents = await Promise.all(\n      missions.flatMap((mission) => mission.customContents)\n    );\n    const entities = await Promise.all(\n      customContents.map((customContent) => customContent.entity)\n    );\n    await Promise.all(entities.map((entity) => entity?.image));\n\n    return {\n      course,\n      courses,\n      missions,\n      shortcuts,\n      teacherAssignments,\n      wordlists,\n    };\n  }\n\n  setupController() {\n    super.setupController(...arguments);\n\n    this.pusher.on('didReceiveMission', this.handleDidReceiveMission);\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.pusher.off('didReceiveMission', this.handleDidReceiveMission);\n      controller.expandedMissions = [];\n      controller.isCourseMissionActivateModalOpen = false;\n      controller.isCourseMissionCopyModalOpen = false;\n    }\n  }\n\n  @action\n  handleDidReceiveMission() {\n    this.refresh();\n  }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterCoursesShowMissionsRoute extends Route {\n  @service store;\n  @service router;\n  @service session;\n  @service pusher;\n\n  queryParams = {\n    page: {\n      refreshModel: true,\n    },\n    sortBy: {\n      refreshModel: true,\n    },\n    sortDirection: {\n      refreshModel: true,\n    },\n    scope: {\n      refreshModel: true,\n    },\n    createMission: {\n      refreshModel: true,\n    },\n    contentId: {\n      refreshModel: true,\n    },\n    missionTitle: {\n      refreshModel: true,\n    },\n  };\n\n  async beforeModel() {\n    super.beforeModel(...arguments);\n\n    if (!this.session.user?.isTeacher) {\n      return this.router.transitionTo('master.courses.show');\n    }\n  }\n\n  async model({\n    scope,\n    sortBy,\n    sortDirection,\n    page,\n    createMission,\n    contentId,\n    missionTitle,\n  }) {\n    const courses = this.modelFor('master.courses');\n    const course = this.modelFor('master.courses.show');\n\n    const [missions, teacherAssignments, wordlists, setting] =\n      await Promise.all([\n        this.store.query('mission', {\n          filter: {\n            scope,\n            course_id: course.id,\n          },\n          order: [\n            {\n              field: sortBy,\n              direction: sortDirection.toUpperCase(),\n            },\n          ],\n          page: {\n            size: 20,\n            number: page,\n          },\n        }),\n        courses.teacherAssignments,\n        courses.wordlists,\n        course.setting,\n      ]);\n\n    const customContents = await Promise.all(\n      missions.flatMap((mission) => mission.customContents)\n    );\n    const entities = await Promise.all(\n      customContents.map((customContent) => customContent.entity)\n    );\n    await Promise.all(entities.map((entity) => entity?.image));\n\n    return {\n      missions,\n      teacherAssignments,\n      wordlists,\n      course,\n      setting,\n      query: {\n        scope,\n        sortBy,\n        sortDirection,\n        page,\n        createMission,\n        contentId,\n        missionTitle,\n      },\n    };\n  }\n\n  setupController(controller) {\n    super.setupController(...arguments);\n    controller.setupMission();\n    this.pusher.on('didReceiveMission', this.handleDidReceiveMission);\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.pusher.off('didReceiveMission', this.handleDidReceiveMission);\n      controller.resetQueryParams();\n      controller.expandedMissions = [];\n    }\n  }\n\n  @action\n  handleDidReceiveMission() {\n    this.refresh();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { resolve } from 'rsvp';\n\nexport default class MyResultsRoute extends Route {\n  // METHODS\n\n  model() {\n    const course = this.modelFor('master.courses.show');\n    return resolve(course.books).then(() => course);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\nimport { hash } from 'rsvp';\n\nexport default class MasterCoursesShowSettingsRoute extends Route {\n  @service router;\n\n  @service session;\n\n  async beforeModel() {\n    super.beforeModel(...arguments);\n\n    if (!this.session.user?.isTeacher) {\n      return this.router.transitionTo('master.courses.show');\n    }\n  }\n\n  model() {\n    const course = this.modelFor('master.courses.show');\n\n    return hash({\n      course,\n    });\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default class MasterCoursesShowTodosRoute extends Route {\n  redirect() {\n    this.replaceWith('master.courses.show.missions');\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\n\nexport default class ErrorRoute extends Route {\n  @service contextHelper;\n\n  @service intl;\n\n  setupController() {\n    super.setupController(...arguments);\n    this.contextHelper.setActive(\n      'pageTitle',\n      this.intl.t('services.contextHelper.pageTitle.error')\n    );\n  }\n\n  resetController() {\n    super.resetController(...arguments);\n    this.contextHelper.setActive('pageTitle', null);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { redirectToNokportal } from 'babel/utils/redirect';\nimport { all } from 'rsvp';\n\nexport default class MasterIndexRoute extends Route {\n  @service contextHelper;\n\n  @service intl;\n\n  @service session;\n\n  @service store;\n\n  beforeModel(transistion) {\n    redirectToNokportal(transistion);\n  }\n\n  async model() {\n    const user = this.session.user;\n\n    if (!user) {\n      return this.session.singleLogout();\n    }\n\n    const [licenses, courses] = await all([user.licenses, user.courses]);\n    let products = await all(licenses.map((license) => license.product));\n\n    products = products.filter((product) => product);\n\n    await all(\n      products.map((product) => {\n        let bookPromises = [];\n\n        const bookIds = product.hasMany('books').ids();\n\n        if (bookIds) {\n          bookPromises = bookIds.map((bookId) =>\n            this.store.findRecord('entity', bookId).catch(() => {})\n          );\n        }\n\n        return all([product.image, product.cover, all(bookPromises)]);\n      })\n    );\n\n    return { courses, products };\n  }\n\n  setupController() {\n    super.setupController(...arguments);\n    this.contextHelper.setActive(\n      'pageTitle',\n      this.intl.t('services.contextHelper.pageTitle.homescreen')\n    );\n  }\n\n  resetController() {\n    super.resetController(...arguments);\n    this.contextHelper.setActive('pageTitle', null);\n  }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { service } from '@ember/service';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\nimport refreshRouteAndNotifyExerciseChange from 'babel/utils/refresh-route-and-notify-exercise-change';\n\nexport default class Interatives extends Route.extend(EntityRouteSupport) {\n  @service contextHelper;\n\n  @service pusher;\n\n  @service router;\n\n  includeGrandchildren = true;\n\n  setupController(controller, { closeUrl }) {\n    super.setupController(...arguments);\n    controller.set('closeUrl', closeUrl);\n    this.contextHelper.setCloseUrl(closeUrl);\n    this.pusher.on('custom-content', this.reload);\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      controller.set('closeUrl', null);\n      controller.set('customContentId', null);\n      controller.set('openCustomContent', null);\n      controller.set('missionId', null);\n      this.contextHelper.setCloseUrl(null);\n    }\n\n    this.pusher.off('custom-content', this.reload);\n  }\n\n  @action\n  reload() {\n    refreshRouteAndNotifyExerciseChange(\n      this.router,\n      this.contextHelper,\n      'master.interactives'\n    );\n  }\n}\n","import { service } from '@ember/service';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport { MissingContentError } from 'babel/utils/errors';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { reject } from 'rsvp';\n\nexport default class MasterInteractivesDiagnosesRoute extends EntityContextRoute {\n  @service contextHelper;\n\n  @service pageviews;\n\n  @service store;\n\n  async model({ diagnosis_id }, transition) {\n    let collection;\n\n    try {\n      collection = await this.store.findRecord('entity', diagnosis_id);\n    } catch (err) {\n      return reject(\n        new MissingContentError(err.message, 'master.interactives')\n      );\n    }\n\n    const { parent: interactive, book } = await getCollectionData(\n      this.store,\n      collection\n    );\n\n    return {\n      collection,\n      interactive,\n      book,\n      closeUrl: transition?.to?.queryParams?.close_url,\n    };\n  }\n\n  afterModel(model) {\n    this.pageviews.logPageView(model.collection, model.book, model.interactive);\n  }\n\n  setupController(controller, model) {\n    super.setupController(controller, {\n      model: model.collection,\n      closeUrl: model.closeUrl ?? this.contextHelper.closeUrl,\n    });\n\n    controller.model = model;\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { all } from 'rsvp';\n\nexport default class MasterInteractivesDiagnosesDoneRoute extends Route {\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  async model({ result_id }) {\n    const attempt = await this.store.findRecord('interactive', result_id);\n    const [collection] = await all([attempt.entity, attempt.entityProxy]);\n\n    const attempts = await this.store.query('interactive', {\n      filter: {\n        node_id: collection.id,\n        user_id: this.session.user.id,\n        all: true,\n        type: 'diagnosis_part',\n      },\n    });\n\n    const answers = await this.store.query('answer', {\n      filter: {\n        id: attempt.hasMany('answers').ids(),\n      },\n    });\n\n    if (attempts.findBy('isActive')) {\n      return this.router.replaceWith('master.interactives.index');\n    }\n\n    const {\n      parent: interactive,\n      exercises,\n      book,\n      editor,\n    } = await getCollectionData(this.store, collection);\n\n    return {\n      attempt,\n      book,\n      interactive,\n      collection,\n      exercises,\n      answers,\n      editor,\n    };\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterInteractivesDiagnosesIndexRoute extends Route {\n  @service assignmentEvents;\n  @service session;\n  @service store;\n  @service router;\n\n  async model() {\n    const { collection, interactive } = this.modelFor(\n      'master.interactives.diagnoses'\n    );\n\n    const query = {\n      filter: {\n        node_id: collection?.id,\n        user_id: this.session.user.id,\n        all: true,\n        type: 'diagnosis_part',\n      },\n    };\n\n    const results = await this.store.query('interactive', query);\n\n    const exercises = await collection.children;\n\n    return {\n      collection,\n      interactive,\n      results,\n      exercises,\n    };\n  }\n\n  afterModel(model) {\n    // Route to diagnosis if there is an active attempt\n    if (model.results?.firstObject?.isActive) {\n      return this.router.replaceWith(\n        'master.interactives.diagnoses.show',\n        model.interactive?.id,\n        model.collection?.id,\n        model.results?.firstObject?.id\n      );\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { all } from 'rsvp';\n\nexport default class MasterInteractivesDiagnosesShowRoute extends Route {\n  @service diagnosis;\n\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  async model({ result_id }) {\n    const attempt = await this.store.findRecord('interactive', result_id);\n\n    const [answers] = await all([\n      attempt.answers,\n      attempt.entity,\n      attempt.entityProxy,\n    ]);\n\n    if (!attempt.isActive) {\n      return this.router.replaceWith('master.interactives.index');\n    }\n\n    const { collection } = this.modelFor('master.interactives.diagnoses');\n\n    const {\n      parent: interactive,\n      exercises,\n      book,\n      editor,\n    } = await getCollectionData(this.store, collection);\n\n    return {\n      attempt,\n      book,\n      interactive,\n      collection,\n      exercises,\n      editor,\n      answers,\n    };\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.diagnosis.endDiagnosis();\n    }\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n\n    this.diagnosis.startDiagnosis(model.attempt);\n  }\n}\n","import { action } from '@ember/object';\nimport { service } from '@ember/service';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\n\nexport default class MasterInteractivesIndexRoute extends EntityContextRoute {\n  @service router;\n\n  @service store;\n\n  @service speaker;\n\n  @service pageviews;\n\n  @service assignmentEvents;\n\n  model() {\n    return this.modelFor('master.interactives');\n  }\n\n  async afterModel({ model, closeUrl, returnUrl, mission }, transition) {\n    const { book, parent } = model;\n    this.pageviews.logPageView(model, book, parent);\n\n    if (model.children.length === 1) {\n      const exerciseId = transition?.to?.params?.practice_show_id;\n\n      if (exerciseId) {\n        return this.router.transitionTo(\n          'master.interactives.practices.show',\n          exerciseId\n        );\n      }\n\n      const collectionId = model.children?.firstObject?.id;\n\n      if (collectionId) {\n        const collection = await this.store.findRecord('entity', collectionId);\n        const targetRoute = collection.isDiagnosis\n          ? 'master.interactives.diagnoses.index'\n          : 'master.interactives.practices.index';\n\n        return this.router.transitionTo(targetRoute, collectionId, {\n          queryParams: { closeUrl, returnUrl, mission: mission?.id ?? null },\n        });\n      }\n    } else {\n      await this.assignmentEvents.getOrCreateInteractivesForCollections(\n        model.children\n      );\n    }\n  }\n\n  setupController(controller, { model }) {\n    super.setupController(...arguments);\n    controller.model = model;\n  }\n\n  @action\n  didTransition() {\n    this.speaker.resetSpeakerActive();\n    return true;\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport { MissingContentError } from 'babel/utils/errors';\nimport getCollectionData from 'babel/utils/get-collection-data';\nimport { reject } from 'rsvp';\n\nexport default class MasterInteractivesPracticesRoute extends Route {\n  @service assignmentEvents;\n\n  @service store;\n\n  async model({ practice_id }) {\n    let collection;\n\n    try {\n      collection = await this.store.findRecord('entity', practice_id);\n    } catch (err) {\n      return reject(\n        new MissingContentError(err.message, 'master.interactives')\n      );\n    }\n\n    let { parent, book, exercises, editor } = await getCollectionData(\n      this.store,\n      collection\n    );\n\n    const { activeExercise } =\n      await this.assignmentEvents.getOrCreateInteractiveForCollection(\n        collection\n      );\n\n    return {\n      activeExercise,\n      book,\n      collection,\n      editor,\n      exercises,\n      parent,\n    };\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterInteractivesPracticesIndexRoute extends Route {\n  // SETUP\n\n  @service router;\n\n  // HOOKS\n\n  beforeModel() {\n    const { activeExercise } = this.modelFor('master.interactives.practices');\n\n    if (activeExercise) {\n      return this.router.replaceWith(\n        'master.interactives.practices.show',\n        activeExercise.id\n      );\n    }\n\n    return this.router.replaceWith('master.interactives');\n  }\n}\n","import { service } from '@ember/service';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport { MissingContentError } from 'babel/utils/errors';\nimport { reject } from 'rsvp';\n\nexport default class MasterInteractivesPracticesShowRoute extends EntityContextRoute {\n  @service assignmentEvents;\n\n  @service pageviews;\n\n  @service router;\n\n  @service store;\n\n  @service missionMode;\n\n  async model({ practice_show_id }, transition) {\n    const { mission, customContent, closeUrl } = this.modelFor(\n      'master.interactives'\n    );\n\n    if (mission && customContent) {\n      this.missionMode.activate({ mission, customContent, closeUrl });\n    }\n\n    let { book, collection, exercises, editor, parent } = this.modelFor(\n      'master.interactives.practices'\n    );\n\n    let exercise;\n\n    if (practice_show_id !== 'carousel') {\n      if (collection?.isCarousel) {\n        return this.router.replaceWith(\n          'master.interactives.practices.show',\n          'carousel'\n        );\n      }\n\n      try {\n        exercise = await this.store.findRecord('entity', practice_show_id);\n      } catch (err) {\n        return reject(\n          new MissingContentError(\n            err.message,\n            'master.interactives.practices.index'\n          )\n        );\n      }\n    }\n\n    let collections = await parent.children;\n    collections = collections.toArray();\n\n    collections = await this.missionMode.allowedEntities(collections);\n    exercises = await this.missionMode.allowedEntities(exercises);\n\n    let { interactive, activeExercise, activeAnswer } =\n      await this.assignmentEvents.getOrCreateInteractiveForCollection(\n        collection,\n        exercise\n      );\n\n    if (!activeExercise) activeExercise = exercise;\n\n    this.pageviews.logPageView(activeExercise, book, collection);\n\n    return {\n      collection,\n      exercises,\n      activeExercise,\n      answers: interactive.answers,\n      activeAnswer,\n      book,\n      interactive: parent,\n      collections,\n      editor,\n      closeUrl: transition?.to?.queryParams?.close_url,\n    };\n  }\n\n  setupController(controller, model) {\n    super.setupController(controller, {\n      model: model.activeExercise,\n      closeUrl: model.closeUrl,\n    });\n\n    controller.model = model;\n  }\n}\n","import { service } from '@ember/service';\n// eslint-disable-next-line ember/no-mixins\nimport EntityRouteSupport from 'babel/mixins/entity-route-support';\n// eslint-disable-next-line ember/no-mixins\nimport PageViewTracker from 'babel/mixins/page-view-tracker';\nimport EntityContextRoute from 'babel/routes/entity-context-route';\nimport { resolve } from 'rsvp';\n\nexport default class MasterMaterialsRoute extends EntityContextRoute.extend(\n  EntityRouteSupport,\n  PageViewTracker\n) {\n  @service courseContext;\n\n  async model() {\n    const hash = await super.model(...arguments);\n    await resolve(hash.model?.selectedMaterial);\n    return hash;\n  }\n\n  setupController(controller, { model }) {\n    super.setupController(...arguments);\n    this.courseContext.storeVisitedContent(model?.id);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { all, resolve } from 'rsvp';\n\nexport default class MasterMissionsRoute extends Route {\n  @service contextHelper;\n  @service router;\n  @service store;\n  @service missionMode;\n\n  beforeModel({ to }) {\n    if (config.redirectToVue && to?.params?.mission_id) {\n      window.location = `/missions/${to.params.mission_id}`;\n    }\n  }\n\n  async model({ mission_id }, transition) {\n    const mission = await this.store.findRecord('mission', mission_id);\n\n    const [customContents] = await all([\n      mission.sortedCustomContents,\n      mission.course,\n      mission.receivers,\n    ]);\n\n    const items = await all(\n      customContents.map((customContent) =>\n        resolve(customContent.entity).then((entity) => ({\n          customContent,\n          entity,\n        }))\n      )\n    );\n\n    return { mission, items, closeUrl: transition?.to?.queryParams?.close_url };\n  }\n\n  resetController(controller, isExiting) {\n    super.resetController(...arguments);\n\n    if (isExiting) {\n      this.missionMode.deactivate();\n    }\n  }\n\n  setupController(controller, { mission, closeUrl }) {\n    super.setupController(...arguments);\n    this.missionMode.activate({ mission, closeUrl });\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { all } from 'rsvp';\n\nexport default class MasterProductsRoute extends Route {\n  @service ajax;\n\n  @service courseContext;\n\n  @service productContext;\n\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  beforeModel({ to }) {\n    if (config.redirectToVue && to?.parent?.params?.product_id) {\n      if (to?.name === 'master.products.my-results') {\n        window.location = `/products/${to.parent.params.product_id}/my-results`;\n      } else {\n        window.location = `/products/${to.parent.params.product_id}`;\n      }\n    }\n  }\n\n  async model({ product_id }) {\n    const [product, licenses] = await all([\n      this.store.findRecord('product', product_id),\n      this.session.user.licenses,\n    ]);\n\n    const license = (licenses ?? [])\n      .filter((license) => !license.is_expired && license.isActive)\n      .find((license) => license.isbn === product_id);\n\n    if (!license) {\n      await this._tryToAssignLicense(this.session.user.id, product_id);\n    }\n\n    return product;\n  }\n\n  async afterModel(model) {\n    const courses = await this.courseContext.fetchCoursesForProduct(model);\n\n    if (courses.length === 1) {\n      return this.router.transitionTo(\n        'master.courses.show.index',\n        courses.firstObject.id\n      );\n    }\n\n    if (model && !model.get('hasProductPage')) {\n      const books = await model.books;\n      const internalBooks = books.filterBy('type', 'books');\n\n      if (internalBooks.length > 0) {\n        return this.router.transitionTo(\n          'master.books',\n          books.filterBy('type', 'books').firstObject.id\n        );\n      }\n    }\n  }\n\n  setupController(controller, model) {\n    super.setupController(...arguments);\n\n    this.courseContext.removeAllContext();\n    this.productContext.removeAllContext();\n\n    this.productContext.setActiveProduct(model);\n  }\n\n  resetController(controller, isExiting) {\n    if (isExiting) {\n      this.productContext.setActiveProduct(null);\n    }\n  }\n\n  async _tryToAssignLicense(userId, isbn) {\n    try {\n      await this.ajax.request(\n        `${config.userApiEndpoint}/api/users/${userId}/find-license`,\n        true,\n        {\n          type: 'GET',\n          data: { isbn },\n        }\n      );\n\n      // Refresh the users licenses to keep the store in sync\n      await this.session.refreshUserLicenses();\n    } catch (err) {\n      // Ignore if a license could not be assigned.\n    }\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { all, reject, resolve } from 'rsvp';\n\nexport default Route.extend({\n  // METHODS\n\n  store: service(),\n\n  ajax: service('ajax'),\n\n  lastVisited: null,\n\n  async model() {\n    const product = this.modelFor('master.products');\n\n    if (!product) return reject();\n\n    let pageViews, lastVisited, continueVisited;\n\n    try {\n      pageViews = await this.fetchPageViews(product.userBooks);\n\n      lastVisited = pageViews.filter(\n        (item) => item.attributes.is_latest_location !== true\n      );\n\n      continueVisited = pageViews.find(\n        (item) => item.attributes.is_latest_location === true\n      );\n    } catch (err) {\n      // Page views are not critical for the route,\n      // API errors here should not stop the transition\n    }\n\n    return { product, lastVisited, continueVisited };\n  },\n\n  async fetchPageViews(books) {\n    await books;\n\n    const booksQuery = books\n      .map((item) => {\n        return `books[]=${item.id}&`;\n      })\n      .join('');\n\n    return this.ajax\n      .request(\n        `${config.endpoint}/api/v1/meta/page-views/latest?${booksQuery}`,\n        true,\n        {\n          type: 'GET',\n        }\n      )\n      .then((response) => {\n        const pageViews = response.data;\n\n        return all(\n          pageViews.map((pageView) => {\n            return this.store\n              .findRecord('entity', pageView.attributes.entity_id)\n              .then((entity) => {\n                if (pageView.attributes.is_latest_location === true) {\n                  // custom logic with entity\n                  return this.handleLatestLocation(pageView, entity);\n                }\n\n                return pageView;\n              })\n              .catch(() => null);\n          })\n        );\n      })\n      .then((results) => resolve(results.filter((x) => x)))\n      .then((pageViews) => this.handleExercisesInDiagnosis(pageViews));\n  },\n\n  async handleLatestLocation(pageView, entity) {\n    if (!entity) return null;\n\n    if (\n      !['contents', 'interactives', 'archives', 'materials'].includes(\n        pageView.attributes.type\n      )\n    ) {\n      entity = await this.getClosestContentEntity(entity);\n    }\n\n    if (!entity) return null;\n\n    pageView.attributes.title = entity.title;\n\n    if (entity.body.image) {\n      pageView.attributes.image = entity.body.image;\n    } else {\n      delete pageView.attributes.image;\n      pageView.attributes.default_image_name = this.getFallbackImage(entity);\n    }\n\n    pageView.attributes.subtitle = entity.template;\n\n    if (pageView.attributes.metadata) {\n      if (pageView.attributes.metadata.assignment) {\n        pageView.attributes.assignment_id =\n          pageView.attributes.metadata.assignment;\n      }\n\n      if (pageView.attributes.metadata.wordlist) {\n        pageView.attributes.wordlist_id = pageView.attributes.metadata.wordlist;\n      }\n\n      if (pageView.attributes.metadata.section) {\n        pageView.attributes.section_id = pageView.attributes.metadata.section;\n      }\n\n      if (pageView.attributes.metadata.material) {\n        pageView.attributes.material_id = pageView.attributes.metadata.material;\n      }\n    }\n\n    return pageView;\n  },\n\n  async getClosestContentEntity(entity) {\n    let parentEntity;\n\n    try {\n      parentEntity = await this.store.findRecord('entity', entity.parent_id);\n    } catch (err) {\n      return null;\n    }\n\n    if (!parentEntity) {\n      return null;\n    }\n\n    if (['contents', 'interactives', 'archives'].includes(parentEntity.type)) {\n      return parentEntity;\n    }\n\n    return this.getClosestContentEntity(parentEntity);\n  },\n\n  getFallbackImage(entity) {\n    const types = ['contents', 'interactives'];\n    const templates = ['chapter', 'story', 'workflow'];\n\n    let type = entity.type;\n    let template = entity.template;\n\n    if (!types.includes(type)) {\n      type = 'image';\n      template = 'missing';\n    }\n\n    if (templates.includes(template)) {\n      return `${type}-${template}`;\n    }\n\n    return type;\n  },\n\n  async handleExercisesInDiagnosis(pageViews) {\n    return await all(\n      pageViews.map(async (pageView) => {\n        if (pageView.attributes.type !== 'exercises') {\n          return pageView;\n        }\n\n        const parentEntity = await this.store.findRecord(\n          'entity',\n          pageView.attributes.parent_id\n        );\n\n        if (parentEntity.isDiagnosis) {\n          pageView.attributes.entity_id = parentEntity.id;\n          pageView.attributes.parent_id = parentEntity.parent_id;\n        }\n\n        return pageView;\n      })\n    );\n  },\n});\n","import Route from '@ember/routing/route';\nimport { resolve } from 'rsvp';\n\nexport default class MasterProductsMyResultsRoute extends Route {\n  async model() {\n    const product = this.modelFor('master.products');\n    const books = await resolve(product.userBooks);\n\n    return { product, books };\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterProfileIndexRoute extends Route {\n  @service router;\n\n  redirect() {\n    this.router.replaceWith('master.profile.settings');\n  }\n}\n","import Route from '@ember/routing/route';\nimport { redirectToNokportal } from 'babel/utils/redirect';\n\nexport default class MasterProfileSettingsRoute extends Route {\n  beforeModel(transition) {\n    redirectToNokportal(transition);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class MasterTodosRoute extends Route {\n  @service router;\n\n  beforeModel(transition) {\n    const { todo_id } = transition.to.params;\n    return this.router.replaceWith('master.missions', todo_id);\n  }\n}\n","import { action } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport ForbiddenError from '@ember-data/adapter/error';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport getUserLicenseForEntity from 'babel/utils/get-user-license-for-entity';\nimport routeArgsForEntity from 'babel/utils/route-args-for-entity';\nimport { all, reject, resolve } from 'rsvp';\n\nexport default class NodesRoute extends Route {\n  queryParams = {\n    content: {\n      refreshModel: true,\n    },\n    transition: {\n      refreshModel: true,\n    },\n  };\n\n  @service missionMode;\n\n  @service router;\n\n  @service session;\n\n  @service ajax;\n\n  @service store;\n\n  @tracked nodeId;\n\n  model({ node_id, content }) {\n    this.nodeId = node_id;\n\n    if (this.session.isAuthenticated) {\n      return this.store.findRecord('entity', node_id).catch((err) => {\n        if (content) {\n          return all([\n            this.store.findRecord('entity', content),\n            this.store.findRecord('teacher-assignment', node_id),\n          ]).then(([content, assignment]) =>\n            resolve(assignment.contents).then(() =>\n              assignment.createAsEntity(content)\n            )\n          );\n        }\n\n        return reject(err);\n      });\n    } else {\n      return this.ajax\n        .request(\n          `${config.endpoint}/api/v1/content/entities/${node_id}/preview`,\n          false,\n          {\n            type: 'GET',\n          }\n        )\n        .catch(() => {});\n    }\n  }\n\n  async afterModel(model, transition) {\n    if (!model) {\n      this.router.transitionTo('404');\n    } else if (this.session.isAuthenticated) {\n      if (this.session.inPreviewMode) {\n        if (['assignments', 'exercises', 'studies'].includes(model.type)) {\n          // When previewing an exercise we should always view it as though\n          // the parent had template='standard'.\n          const collection = await model.parent;\n\n          if (\n            collection.type === 'collections' &&\n            collection.template !== 'standard'\n          ) {\n            collection.template = 'standard';\n          }\n        }\n      }\n\n      const {\n        transition: transitionTo,\n        todoId,\n        customContentId,\n        ...queryParams\n      } = transition.to.queryParams;\n\n      if (todoId) {\n        queryParams.mission = todoId;\n      }\n      if (customContentId) {\n        queryParams.custom_content = customContentId;\n      }\n\n      return routeArgsForEntity(model, queryParams, this.missionMode).then(\n        (routeArgs) => {\n          if (transitionTo) {\n            return this.router.transitionTo(...routeArgs);\n          } else {\n            return this.router.replaceWith(...routeArgs);\n          }\n        }\n      );\n    }\n  }\n\n  @action\n  error(err, transition) {\n    if (err instanceof ForbiddenError) {\n      return getUserLicenseForEntity(\n        this.nodeId,\n        this.session,\n        this.ajax,\n        config.endpoint,\n        config.userApiEndpoint,\n        transition\n      ).catch((err) => {\n        if (err && err.name === 'TransitionAborted') {\n          return false;\n        }\n\n        this.router.transitionTo('master.forbidden');\n      });\n    }\n\n    return true;\n  }\n}\n","import { inject as service } from '@ember/service';\nimport AuthenticatedRoute from 'babel/routes/authenticated-route';\nimport isUuid from 'compton/utils/is-uuid';\n\nexport default class UrlResolveRoute extends AuthenticatedRoute {\n  @service router;\n\n  @service store;\n\n  model(params) {\n    let url = params.url;\n\n    if (isUuid(url)) {\n      return this.router.transitionTo('nodes', url);\n    }\n\n    if (!url.startsWith('inloggad/')) {\n      return this.store.query('entity', { filter: { url } });\n    }\n\n    if (window && window.location) {\n      if (\n        window.location.search &&\n        window.location.search.indexOf('arbetsuppgift') === 1\n      ) {\n        url += window.location.search;\n      }\n\n      if (window.location.hash) {\n        url += window.location.hash;\n      }\n    }\n\n    url = url.split('/').splice(2).join('/');\n\n    // remove #chap0 from url as first section is saved without hash\n    url = url.replace(/#chap0$/i, '');\n\n    if (url) {\n      return this.store.query('entity', { filter: { url: { endsWith: url } } });\n    } else {\n      return;\n    }\n  }\n\n  afterModel(model) {\n    if (model?.firstObject) {\n      this.router.transitionTo('nodes', model.firstObject);\n    } else {\n      this.router.transitionTo('404');\n    }\n  }\n}\n","export default {\n  \"statuses\": [\n    \"audited\",\n    \"completed\",\n    \"correct\",\n    \"incomplete\",\n    \"not-started\",\n    \"started\",\n    \"teacher-correct\",\n    \"teacher-wrong\",\n    \"turned-in\",\n    \"wrong\"\n  ],\n  \"startedStatuses\": [\n    \"audited\",\n    \"completed\",\n    \"correct\",\n    \"incomplete\",\n    \"started\",\n    \"teacher-correct\",\n    \"teacher-wrong\",\n    \"turned-in\",\n    \"wrong\"\n  ]\n};","export default {\n  \"archives\": [],\n  \"areas\": [],\n  \"assignments\": [],\n  \"books\": [],\n  \"books_external\": [],\n  \"collections\": [],\n  \"contents\": [],\n  \"exercises\": [],\n  \"folders\": [],\n  \"glossaries\": [],\n  \"interactives\": [],\n  \"materials\": [],\n  \"root\": [],\n  \"sections\": [],\n  \"studies\": []\n};","export default {\n  \"skolon\": {\n    \"name\": \"Skolon\",\n    \"uri\": \"https://skolon.com/\",\n    \"userCanNotSetPassword\": true,\n    \"userCanNotEnterName\": true,\n    \"userCanNotAddLicenses\": false,\n    \"userCanNotAddLoginProviders\": true\n  },\n  \"itslearning\": {\n    \"name\": \"Itslearning\",\n    \"uri\": null,\n    \"userCanNotSetPassword\": true,\n    \"userCanNotEnterName\": true,\n    \"userCanNotAddLicenses\": false,\n    \"userCanNotAddLoginProviders\": true\n  },\n  \"canvas\": {\n    \"name\": \"Canvas\",\n    \"uri\": null,\n    \"userCanNotSetPassword\": true,\n    \"userCanNotEnterName\": true,\n    \"userCanNotAddLicenses\": false,\n    \"userCanNotAddLoginProviders\": true\n  },\n  \"skolfederation\": {\n    \"name\": \"Skolfederation\",\n    \"uri\": null,\n    \"userCanNotSetPassword\": true,\n    \"userCanNotEnterName\": true,\n    \"userCanNotAddLicenses\": false,\n    \"userCanNotAddLoginProviders\": true\n  },\n  \"hermods\": {\n    \"name\": \"Hermods\",\n    \"uri\": \"https://www.hermods.se/\",\n    \"userCanNotSetPassword\": false,\n    \"userCanNotEnterName\": false,\n    \"userCanNotAddLicenses\": false,\n    \"userCanNotAddLoginProviders\": false\n  }\n};","import { underscore } from '@ember/string';\nimport JSONAPISerializer from '@ember-data/serializer/json-api';\nimport { camelizeKeys } from 'compton/utils/object';\n\nexport default class ApplicationSerializer extends JSONAPISerializer {\n  serializeAttribute(snapshot, json, key, attribute) {\n    // do not serialize the attribute!\n    if (attribute.options && attribute.options.readOnly) {\n      return;\n    }\n\n    return super.serializeAttribute(...arguments);\n  }\n\n  keyForAttribute(attr) {\n    return underscore(attr);\n  }\n\n  keyForRelationship(attr) {\n    return underscore(attr);\n  }\n\n  normalizeArrayResponse() {\n    const response = super.normalizeArrayResponse(...arguments);\n\n    if (response.meta) {\n      // NOTE Just do an assign as we want to keep the old\n      // underscored keys for backward compibitlity.\n      Object.assign(response.meta, camelizeKeys(response.meta));\n    }\n\n    return response;\n  }\n}\n","import ApplicationSerializer from './application';\n\nconst METADATA_ATTRIBUTES = ['included_entity_settings'];\n\nexport default ApplicationSerializer.extend({\n  normalize(_, hash) {\n    const attributes = hash.attributes;\n\n    const metadata = attributes.metadata;\n\n    if (metadata) {\n      METADATA_ATTRIBUTES.forEach((k) => {\n        attributes[k] = attributes.metadata[k];\n      });\n\n      delete attributes.metadata;\n    }\n\n    return this._super(...arguments);\n  },\n\n  serialize() {\n    const json = this._super(...arguments);\n    const attributes = json.data.attributes;\n\n    const metadata = {};\n\n    METADATA_ATTRIBUTES.forEach((k) => {\n      metadata[k] = attributes[k];\n      delete attributes[k];\n    });\n\n    attributes.metadata = metadata;\n\n    return json;\n  }\n});\n","import { normalizeLegacyTemplateAttributeValues } from '@naturochkultur/detroit/utils/legacy-template-serialization';\nimport ApplicationSerializer from 'babel/serializers/application';\n\nexport default class EditorSerializer extends ApplicationSerializer {\n  normalize(typeClass, hash) {\n    const attributes = hash?.attributes;\n    const rows = (attributes?.parsed || []).concat(attributes?.rows || []);\n\n    rows.forEach((row) => {\n      if (!row) return;\n      normalizeLegacyTemplateAttributeValues(row);\n\n      row.columns?.forEach((column) => {\n        column?.components?.forEach((component) => {\n          if (!component) return;\n          normalizeLegacyTemplateAttributeValues(component);\n        });\n      });\n    });\n\n    return super.normalize(typeClass, hash);\n  }\n}\n","import { inject as service } from '@ember/service';\nimport ApplicationSerializer from 'babel/serializers/application';\nimport generateFallbackTitle from 'babel/utils/generate-fallback-title';\n\nconst INTERACTIVES_TYPE = 'interactives';\nconst LEGACY_INTERACTIVE_TEMPLATES = ['diagnosis', 'practice'];\n\nexport default class EntitySerializer extends ApplicationSerializer {\n  @service intl;\n\n  normalize(typeClass, hash) {\n    if (\n      hash?.attributes?.type === INTERACTIVES_TYPE &&\n      LEGACY_INTERACTIVE_TEMPLATES.includes(hash?.attributes?.template)\n    ) {\n      hash.attributes.template = 'interactive';\n    }\n\n    const entity = super.normalize(typeClass, hash);\n    const attrs = entity?.data?.attributes;\n\n    if (attrs && (!attrs.title || attrs.title === '')) {\n      entity.data.attributes.title = generateFallbackTitle(\n        attrs.type,\n        this.intl\n      );\n    }\n\n    return entity;\n  }\n}\n","import ApplicationSerializer from 'babel/serializers/application';\nimport sanitizeHTML from 'babel/utils/sanitize-html';\n\nexport default class MissionSerializer extends ApplicationSerializer {\n  normalize(_, hash) {\n    if (hash && hash.attributes) {\n      const attrs = ['title', 'description'];\n\n      // Temp fix.\n      const expectedValues = (\n        hash.relationships.custom_contents?.data || []\n      ).map((item) => item.id);\n\n      const sortedCustomContentIds =\n        hash.attributes.metadata?.sorted_custom_content_ids ??\n        hash.attributes.sorted_custom_content_ids ??\n        [];\n\n      expectedValues.forEach((id) => {\n        if (!sortedCustomContentIds.includes(id)) {\n          sortedCustomContentIds.push(id);\n        }\n      });\n\n      const result = [];\n\n      sortedCustomContentIds.forEach((id) => {\n        if (expectedValues.includes(id)) {\n          result.push(id);\n        }\n      });\n\n      hash.attributes.sorted_custom_content_ids = result;\n\n      attrs.forEach((name) => {\n        if (hash.attributes[name]) {\n          hash.attributes[name] = sanitizeHTML(hash.attributes[name]);\n        }\n      });\n    }\n\n    return super.normalize(...arguments);\n  }\n\n  serialize() {\n    const json = super.serialize(...arguments);\n\n    if (json.data.attributes.startDate == null) {\n      json.data.attributes.endDate = undefined;\n    }\n\n    // Temp fix.\n\n    json.data.attributes.metadata ??= {};\n\n    json.data.attributes.metadata.sorted_custom_content_ids =\n      json.data.attributes.sorted_custom_content_ids;\n\n    delete json.data.attributes.sorted_custom_content_ids;\n\n    return json;\n  }\n}\n","import ApplicationSerializer from 'babel/serializers/application';\nimport sanitizeHTML from 'babel/utils/sanitize-html';\n\nexport default ApplicationSerializer.extend({\n  normalize(_, hash) {\n    if (hash && hash.attributes) {\n      const attrs = ['title', 'content'];\n\n      attrs.forEach((name) => {\n        if (hash.attributes[name]) {\n          hash.attributes[name] = sanitizeHTML(hash.attributes[name]);\n        }\n      });\n    }\n\n    return this._super(...arguments);\n  }\n});\n","import ApplicationSerializer from 'babel/serializers/application';\nimport sanitizeHTML from 'babel/utils/sanitize-html';\n\nexport default ApplicationSerializer.extend({\n  normalize(_, hash) {\n    if (hash && hash.attributes) {\n      const attrs = [\n        'title', // title is not used but we sanitize in case it's re-introduced\n        'post_content'\n      ];\n\n      attrs.forEach((name) => {\n        if (hash.attributes[name]) {\n          hash.attributes[name] = sanitizeHTML(hash.attributes[name]);\n        }\n      });\n    }\n\n    return this._super(...arguments);\n  }\n});\n","import ApplicationSerializer from 'babel/serializers/application';\nimport sanitizeHTML from 'babel/utils/sanitize-html';\n\nexport default ApplicationSerializer.extend({\n  normalize(_, hash) {\n    if (hash && hash.attributes) {\n      const attrs = ['title', 'question_html'];\n\n      attrs.forEach((name) => {\n        if (hash.attributes[name]) {\n          hash.attributes[name] = sanitizeHTML(hash.attributes[name]);\n        }\n      });\n    }\n\n    return this._super(...arguments);\n  }\n});\n","import ApplicationSerializer from 'babel/serializers/application';\nimport sanitizeHTML from 'babel/utils/sanitize-html';\n\nexport default ApplicationSerializer.extend({\n  normalize(_, hash) {\n    if (hash && hash.attributes) {\n      const attrs = [\n        'examples',\n        'explanation',\n        'translation',\n        'word_class',\n        'word_construction'\n      ];\n\n      attrs.forEach((name) => {\n        if (hash.attributes[name]) {\n          hash.attributes[name] = sanitizeHTML(hash.attributes[name]);\n        }\n      });\n    }\n\n    return this._super(...arguments);\n  }\n});\n","import Service, { inject as service } from '@ember/service';\nimport $ from 'jquery';\nimport { Promise } from 'rsvp';\n\nexport default class AjaxService extends Service {\n  @service session;\n\n  /**\n   * Extend jQuery ajax functionality with auth and progress event listener\n   * @method request\n   * @param  {string} url - URL to where the request should be sent\n   * @param  {boolean} auth - Wheater the request should authorize to our API\n   * @param  {object} options - Standard jQuery ajax options\n   * @return {promise} Ajax promise\n   */\n  async request(url, auth, options) {\n    const ajax = $.ajax.bind($);\n    const self = this;\n\n    if (typeof url === 'object') {\n      options = url;\n      url = undefined;\n    }\n\n    options = options || {};\n\n    let xmlHttpReq;\n\n    if (!options.xhr) {\n      xmlHttpReq = $.ajaxSettings.xhr();\n    } else {\n      xmlHttpReq = options.xhr();\n    }\n\n    if (auth) {\n      await this.session.refreshAuthentication.perform();\n\n      options.beforeSend = (xhr) => {\n        const headers = self.session.headers;\n\n        if (headers) {\n          for (const [key, value] of Object.entries(headers)) {\n            xhr.setRequestHeader(key, value);\n          }\n        }\n      };\n    }\n\n    if (options.onProgress) {\n      xmlHttpReq.upload.onprogress = options.onProgress;\n      delete options.onProgress;\n    }\n\n    options.xhr = () => {\n      return xmlHttpReq;\n    };\n\n    // NOTE Make sure we return a 'real' promise.\n    return new Promise((resolve, reject) => {\n      ajax(url, options).then(resolve, reject);\n    });\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport shouldReloadOnUpdate from 'babel/utils/should-reload-on-update';\n\nconst CONFIG_REGEXP =\n  /<meta name=\"babel\\/config\\/environment\" content=\"(.+)\" \\/>/gm;\n\nexport default class AppUpdateService extends Service {\n  @service fetch;\n\n  @service router;\n\n  @tracked initialized = false;\n\n  @tracked hasUpdate = false;\n\n  async checkVersion() {\n    try {\n      // We check for updates by pinging the index file and comparing the app\n      // version found there with the current app version.\n\n      const text = await this.fetch.request('/index.html');\n      const matches = CONFIG_REGEXP.exec(text);\n      const meta = decodeURIComponent(matches[1]);\n      const json = JSON.parse(meta);\n      const indexVersion = json.APP.version;\n      const currentVersion = config.APP.version;\n\n      if (indexVersion && currentVersion && indexVersion !== currentVersion) {\n        this.hasUpdate = true;\n      }\n    } catch (err) {\n      // do nothing\n    }\n  }\n\n  initialize() {\n    if (!this.initialized) {\n      this.router.on('routeWillChange', (transition) => {\n        if (this.hasUpdate && shouldReloadOnUpdate(transition?.to?.name)) {\n          transition.finally(() => location.reload());\n        } else {\n          this.checkVersion();\n        }\n      });\n\n      this.initialized = true;\n    }\n  }\n}\n","import { addListener, removeListener, sendEvent } from '@ember/object/events';\nimport Service, { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { emptyAnswer, getCorrectAnswers } from 'babel/utils/assignments';\nimport { getOriginalAnswer } from 'babel/utils/get-answer';\nimport { chunk } from 'compton/utils/array';\nimport { task, timeout, waitForProperty } from 'ember-concurrency';\nimport { all, resolve } from 'rsvp';\n\nconst AUTOSAVE_TIME = 2000;\n\nexport default class AssignmentEventsService extends Service {\n  @service ajax;\n\n  @service router;\n\n  @service session;\n\n  @service store;\n\n  @service missionMode;\n\n  @tracked focusedExercise = null;\n\n  sent = {};\n\n  on(event, method) {\n    addListener(this, event, method);\n  }\n\n  off(event, method) {\n    removeListener(this, event, method);\n  }\n\n  trigger() {\n    const args = Array.prototype.slice.call(arguments);\n    const event = args.shift();\n\n    sendEvent(this, event, args);\n  }\n\n  @task({ enqueue: true })\n  *saveAnswer(context, answer, action) {\n    if (!context.isDestroyed) {\n      context.localStatus = 'saving';\n    }\n\n    if (this.submitAnswer.isRunning) {\n      this.autoSaveAnswer.cancelAll();\n    }\n\n    const resolvedAnswer = yield answer;\n\n    resolvedAnswer.updated = new Date();\n\n    yield resolvedAnswer.save({\n      adapterOptions: {\n        action,\n        ignoreResponsePayload: true,\n      },\n    });\n\n    if (!context.isDestroyed) {\n      context.localStatus = null;\n    }\n  }\n\n  @task({ restartable: true })\n  *autoSaveAnswer(context, answer) {\n    context.localStatus = 'editing';\n\n    yield timeout(AUTOSAVE_TIME);\n\n    yield this.saveAnswer.perform(context, answer);\n  }\n\n  @task\n  *submitAnswer(context, answer) {\n    yield waitForProperty(\n      context,\n      'localStatus',\n      (local) => local !== 'saving'\n    );\n\n    yield this.saveAnswer.perform(context, answer, 'submit');\n\n    const versionsRelation = answer.hasMany('versions');\n\n    yield versionsRelation.load();\n\n    const numVersions = yield answer.versions.length;\n\n    if (numVersions === 0) {\n      yield answer.reload();\n    }\n\n    yield versionsRelation.reload();\n  }\n\n  updateInteractiveForCollection(collection, interactive) {\n    const collectionId = collection.id;\n    const userId = this.session.user.id;\n    const interactiveKey = collectionId + userId;\n\n    this.sent[interactiveKey] = interactive;\n\n    this.trigger('interactive-updated', collectionId);\n  }\n\n  async getOrCreateInteractivesForCollections(collections, activeExercises) {\n    const interactives =\n      await this._fetchOrCreateInteractivesForCollections(collections);\n\n    return all(\n      collections.map(async (collection, index) => {\n        const collectionId = collection.id;\n        const userId = this.session.user.id;\n\n        const interactive = interactives[index];\n\n        if (!interactive) return {};\n\n        const entity = await interactive.entity;\n        let children = await entity.children;\n        children = await this.missionMode.allowedEntities(children);\n\n        let activeExercise = activeExercises?.[index];\n\n        if (!activeExercise && !collection.isDiagnosis) {\n          const currentExercise = await interactive.currentExercise;\n\n          if (currentExercise && children.includes(currentExercise)) {\n            activeExercise = currentExercise;\n          } else {\n            activeExercise = children.firstObject;\n          }\n        }\n\n        let activeAnswer;\n\n        if (activeExercise && !children.includes(activeExercise)) {\n          activeExercise = children.firstObject;\n        }\n\n        if (activeExercise) {\n          const answerKey = collectionId + userId + activeExercise.id;\n\n          if (!this.sent[answerKey]) {\n            this.sent[answerKey] = this.getOrCreateAnswerForExercise(\n              activeExercise,\n              interactive.answers\n            );\n          }\n\n          activeAnswer = await this.sent[answerKey];\n\n          if (!interactive.answers.includes(activeAnswer)) {\n            // The answer was created previously but not saved in the interactives answers\n            interactive.answers.addObject(activeAnswer);\n          }\n\n          if (interactive.currentExercise?.id !== activeExercise.id) {\n            interactive.currentExercise = activeExercise;\n          }\n\n          if (activeAnswer.isNew && !activeAnswer.isSaving) {\n            await activeAnswer.save();\n          }\n\n          if (!interactive.isSaving && !collection.isTeacherCollection) {\n            // Teacher collections do not have a persisted id,\n            // we therefore cannot save the interactive as the id\n            // will not be the same on the next page load.\n            interactive.save();\n          }\n        }\n\n        return { interactive, activeAnswer, activeExercise };\n      })\n    );\n  }\n\n  async getOrCreateInteractiveForCollection(collection, activeExercise) {\n    const items = await this.getOrCreateInteractivesForCollections(\n      [collection],\n      [activeExercise]\n    );\n\n    return items[0];\n  }\n\n  async createInteractive(collection, attempt, answers = []) {\n    const [ancestors, user] = await all([\n      collection.getParents(),\n      this.session.user,\n    ]);\n\n    const content =\n      ancestors.findBy('type', 'contents') ||\n      ancestors.findBy('type', 'interactives');\n    const area = ancestors.findBy('type', 'areas');\n    const book = ancestors.findBy('type', 'books');\n\n    const correctAnswers = getCorrectAnswers(answers);\n    const correctExercises = await all(\n      correctAnswers.map((answer) => answer.entity)\n    );\n\n    return this.store.createRecord('interactive', {\n      answers,\n      document_id: collection.document_id,\n      started: new Date(),\n      attempt,\n      type: 'practice',\n      entity: collection,\n      book,\n      area,\n      content,\n      user,\n      score: correctAnswers.length,\n      correctExercises,\n    });\n  }\n\n  _keyForCollection(collection) {\n    const collectionId = collection.id;\n    const userId = this.session.user.id;\n\n    return collectionId + userId;\n  }\n\n  async _fetchInteractivesForCollections(collections) {\n    let path;\n\n    if (collections.length === 1) {\n      // We use this endpoint when there is only one collection\n      // as this endpoint is cached. In many cases the code will\n      // call the methods once for each collection rather than\n      // calling for all collections at once. This provides better\n      // performance for those cases.\n      path = `/api/v1/meta/interactives/active/${collections[0].id}`;\n    } else {\n      const collectionIds = collections.map((collection) => collection.id);\n      const params = new URLSearchParams();\n\n      params.append('user_id[]', [this.session.user.id]);\n      collectionIds.map((id) => params.append('node_id[]', id));\n\n      path = `/api/v1/meta/interactives/active?${params.toString()}`;\n    }\n\n    let payload;\n\n    if (!this.session.inPreviewMode) {\n      try {\n        payload = await this.ajax.request(`${config.endpoint}${path}`, true);\n        this.store.pushPayload('interactive', payload);\n      } catch (err) {\n        // Continue with create\n      }\n    }\n\n    return all(\n      collections.map(async (collection) => {\n        let interactive, interactivePayload;\n\n        if (Array.isArray(payload?.data)) {\n          interactivePayload = payload?.data?.find(\n            (item) => item.relationships.entity.data.id === collection.id\n          );\n        } else {\n          interactivePayload = payload?.data;\n        }\n\n        if (interactivePayload?.id) {\n          interactive = this.store.peekRecord(\n            'interactive',\n            interactivePayload?.id\n          );\n        }\n\n        if (!interactive) {\n          if (!collection.isDiagnosis) {\n            const exercises = await resolve(collection.children);\n            const answers = await this.getAnswersForExercises(exercises);\n\n            interactive = await this.createInteractive(collection, 1, answers);\n          }\n        } else {\n          await all([\n            // interactive.answers some times contain references to missing answers.\n            // To avoid this causing the entire collection to not show, we fetch the\n            // answers here and then overwrite the relation with the answers that\n            // could actually be found. See DINO-4944 for more info.\n            all(\n              interactive\n                .hasMany('answers')\n                .ids()\n                .map((id) =>\n                  this.store.findRecord('answer', id).catch(() => null)\n                )\n            ).then((answers) => {\n              answers = answers.filter((x) => x);\n              interactive.answers = answers;\n            }),\n            interactive.entity,\n            interactive.currentExercise,\n            interactive.user,\n          ]);\n        }\n\n        return { collectionId: collection.id, interactive };\n      })\n    );\n  }\n\n  async _fetchOrCreateInteractivesForCollections(collections) {\n    // Find the collections that have not already been fetched.\n    const collectionsToFetch = collections.filter(\n      (collection) => !this.sent[this._keyForCollection(collection)]\n    );\n\n    if (collectionsToFetch.length > 0) {\n      // Chunk the collections into groups of 50 to avoide generating\n      // a too large URL.\n      const chunks = chunk(collectionsToFetch, 50);\n\n      await all(\n        chunks.map((chunk) => {\n          // Fetch the interactives for all collections in the chunk.\n          const promise = this._fetchInteractivesForCollections(chunk);\n\n          chunk.map((collection) => {\n            // Store the promise as result for each collection in this.sent\n            this.sent[this._keyForCollection(collection)] = promise.then(\n              (interactives) =>\n                interactives.find((item) => item.collectionId === collection.id)\n                  ?.interactive\n            );\n          });\n\n          return promise;\n        })\n      );\n    }\n\n    return all(\n      collections.map(\n        (collection) => this.sent[this._keyForCollection(collection)]\n      )\n    );\n  }\n\n  async getAnswersForExercises(exercises, useCache = true) {\n    const key = exercises.mapBy('id').join(',');\n\n    if (!key) return [];\n    if (useCache && this.sent[key]) return this.sent[key];\n\n    const query = { filter: {} };\n\n    exercises.forEach((exercise) => {\n      if (exercise.isTeacherAssignment) {\n        if (!query.filter.teacher_assignment_id) {\n          query.filter.teacher_assignment_id = [];\n        }\n\n        query.filter.teacher_assignment_id.push(exercise.teacherAssignment.id);\n      } else {\n        if (!query.filter.node_id) {\n          query.filter.node_id = [];\n        }\n\n        query.filter.node_id.push(exercise.id);\n      }\n    });\n\n    if (this.session.inPreviewMode) {\n      this.sent[key] = resolve([]);\n    } else {\n      this.sent[key] = this.store\n        .query('answer', query)\n        .then((answers) => answers.slice());\n    }\n\n    return this.sent[key];\n  }\n\n  async handleTeacherAssignmentsAddedToCollection(exercises) {\n    const answers = await this.getAnswersForExercises(exercises, true);\n\n    if (answers.length === 0) return;\n\n    const collection = await resolve(exercises[0].parent);\n    const { interactive } =\n      await this.getOrCreateInteractiveForCollection(collection);\n\n    answers.forEach((answer) => {\n      if (!interactive.answers.includes(answer)) {\n        interactive.answers.addObject(answer);\n      }\n    });\n  }\n\n  async getOrCreateAnswerForExercise(exercise, answers) {\n    let answer = getOriginalAnswer(exercise, answers);\n\n    if (!answer) {\n      let teacherAssignment, collection, content, area, book;\n\n      if (exercise.isTeacherAssignment) {\n        [teacherAssignment, collection] = await all([\n          exercise.teacherAssignment,\n          exercise.parent,\n        ]);\n        content = await resolve(collection.parent);\n        [area, book] = await all([content.parent, content.book]);\n      } else {\n        const ancestors = await resolve(exercise.getParents());\n\n        collection =\n          ancestors.findBy('type', 'collections') ||\n          ancestors.findBy('type', 'sections');\n\n        content =\n          ancestors.findBy('type', 'contents') ||\n          ancestors.findBy('type', 'interactives');\n        area = ancestors.findBy('type', 'areas');\n        book = ancestors.findBy('type', 'books');\n      }\n\n      let type;\n\n      if (collection.template === 'quiz') {\n        type = 'excercise_competition';\n      } else if (collection.isDiagnosis) {\n        type = 'diagnosis';\n      } else if (exercise.isTeacherAssignment) {\n        type = 'teacher_assignment';\n      } else {\n        type = 'standard';\n      }\n\n      answer = this.store.createRecord('answer', {\n        teacherAssignment,\n        collection,\n        content,\n        area,\n        book,\n        entity: exercise,\n        type,\n        user: this.session.user,\n        assignment_title: exercise.title,\n        document_id: exercise.document_id,\n        status: 'not-started',\n      });\n\n      answers.addObject(answer);\n    }\n\n    const exerciseAssignments = exercise.body?.exercise?.assignments;\n\n    if (exerciseAssignments) {\n      if (\n        !answer.assignments ||\n        answer.assignments.length !== exerciseAssignments.length\n      ) {\n        answer.assignments = exerciseAssignments.map((assignment) =>\n          emptyAnswer(assignment)\n        );\n      }\n    }\n\n    return answer;\n  }\n\n  async carouselAttemptExercises(interactive) {\n    const [collection, correctExercises] = await all([\n      interactive.entity,\n      interactive.correctExercises,\n    ]);\n    const exercises = await resolve(collection.children);\n\n    return exercises.filter((exercise) => !correctExercises.includes(exercise));\n  }\n\n  async carouselNextExercise(interactive) {\n    const attemptExercises = await this.carouselAttemptExercises(interactive);\n\n    let index;\n    let currentExercise = await resolve(interactive.currentExercise);\n\n    if (!currentExercise || !attemptExercises.includes(currentExercise)) {\n      index = 0;\n    } else {\n      index = attemptExercises.indexOf(currentExercise) + 1;\n    }\n\n    const remainingExercises = attemptExercises.slice(index);\n\n    if (remainingExercises.length > 0) {\n      return remainingExercises[0];\n    } else {\n      return null;\n    }\n  }\n\n  async carouselOpenNextExercise(interactive) {\n    const next = await this.carouselNextExercise(interactive);\n\n    if (next) {\n      interactive.currentExercise = next;\n      return this.refreshCarouselRoute(interactive);\n    }\n  }\n\n  async carouselDone(interactive) {\n    const answers = await resolve(interactive.answers);\n    const correctAnswers = getCorrectAnswers(answers);\n\n    interactive.ended = new Date();\n    interactive.score = correctAnswers.length;\n\n    await interactive.save();\n  }\n\n  async newCarouselAttempt(previousAttempt, resetAllAnswers = false) {\n    const collection = await resolve(previousAttempt.entity);\n    const exercises = await resolve(collection.children);\n    const exerciseIds = exercises.map((exercise) => exercise.id);\n    const attempt = previousAttempt.attempt + 1;\n\n    const answers = await resolve(previousAttempt.answers).then((arr) =>\n      arr\n        .slice()\n        .filter((answer) =>\n          exerciseIds.includes(answer.belongsTo('entity').id())\n        )\n    );\n    const correctAnswers = getCorrectAnswers(answers);\n    const previousAttemptAnswers = [];\n\n    await all(\n      answers.map(async (answer) => {\n        const [versions, exercise] = await all([\n          answer.versions,\n          answer.entity,\n        ]);\n\n        if (versions.length > 0) {\n          previousAttemptAnswers.push(versions.sortBy('created').pop());\n        } else {\n          previousAttemptAnswers.push(answer);\n        }\n\n        if (resetAllAnswers || !correctAnswers.includes(answer)) {\n          await this.resetAnswer(answer, exercise);\n        }\n      })\n    );\n\n    previousAttempt.answers = previousAttemptAnswers;\n\n    await previousAttempt.save();\n\n    const interactive = await this.createInteractive(\n      collection,\n      attempt,\n      answers\n    );\n\n    interactive.currentExercise = await this.carouselNextExercise(interactive);\n\n    await interactive.save();\n\n    this.updateInteractiveForCollection(collection, interactive);\n\n    try {\n      await this.refreshCarouselRoute(interactive);\n    } catch {\n      // Failed to refresh route, we ignore this\n    }\n  }\n\n  async resetAnswer(answer, exercise) {\n    answer.assignments = exercise?.body?.exercise?.assignments?.map(\n      (assignment) => emptyAnswer(assignment)\n    );\n\n    answer.status = 'not-started';\n\n    return this.saveAnswer.perform(this, answer);\n  }\n\n  async refreshCarouselRoute(interactive) {\n    const collection = await resolve(interactive.entity);\n    const parent = await resolve(collection.parent);\n\n    if (parent.type === 'contents' && collection.space === 'content') {\n      // When in content space of contents refreshing the route is not enough\n      // since most data is loaded in the controller or components. We\n      // therefore do a transition on the exercise query param to trigger\n      // tracking updates.\n      const currentExercise = await resolve(interactive.currentExercise);\n      const currentParam = this.router.currentRoute.queryParams.exercise;\n\n      let exercise = null;\n\n      if (!interactive.ended && currentExercise.id !== currentParam) {\n        exercise = currentExercise.id;\n      }\n\n      return this.router.transitionTo({ queryParams: { exercise } });\n    }\n\n    return this.router.refresh(this.router.currentRouteName);\n  }\n\n  focusExercise(exercise) {\n    this.focusedExercise = exercise;\n  }\n\n  resetExerciseFocus() {\n    this.focusedExercise = null;\n  }\n}\n","import { action, get } from '@ember/object';\nimport Service from '@ember/service';\nimport { storageFor } from 'ember-local-storage';\n\nexport default class ColorThemeService extends Service {\n  @storageFor('read-setting') settings;\n\n  get currentTheme() {\n    return this.settings.get('theme');\n  }\n\n  @action changeTheme(theme) {\n    this.removeTheme();\n\n    get(this, 'settings').set('theme', theme);\n\n    if (theme) {\n      const themeClass = ['theme', theme].join('-');\n      document.body.classList.add(themeClass);\n    }\n  }\n\n  @action removeTheme() {\n    const body = document.body;\n    const currentThemes = [...body.classList].filter((item) =>\n      /^theme-\\w+$/.test(item)\n    );\n\n    currentThemes.forEach((theme) => {\n      body.classList.remove(theme);\n    });\n  }\n}\n","import { cancel, once } from '@ember/runloop';\nimport Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nconst CLOSE_URL_BLOCKLIST = ['createMission=true'];\n\nexport default class ContextHelperService extends Service {\n  // Diagnosis\n\n  @tracked activeDiagnosisAttempt = null;\n\n  // Mission\n\n  @tracked activeMission = null;\n\n  @tracked activeCustomContent = null;\n\n  // Course\n\n  @tracked activeCourse = null;\n\n  // Product\n\n  @tracked activeProduct = null;\n\n  // Entity\n\n  @tracked activeBook = null;\n\n  @tracked activeArea = null;\n\n  @tracked activeContent = null;\n\n  @tracked activeSection = null;\n\n  @tracked activeExercise = null;\n\n  @tracked activeWorkspaceSection = null;\n\n  @tracked activeWorkspaceExercise = null;\n\n  // Navigation\n\n  @tracked closeUrl = null;\n\n  @tracked returnUrl = null;\n\n  // Page title\n\n  @tracked pageTitle = null;\n\n  // Timers\n\n  timers = {};\n\n  // Context states\n\n  get inActiveDiagnosis() {\n    return this.activeDiagnosisAttempt ? true : false;\n  }\n\n  get inMission() {\n    return this.activeMission ? true : false;\n  }\n\n  get inCustomContent() {\n    return this.activeCustomContent ? true : false;\n  }\n\n  get inCourse() {\n    return this.activeCourse ? true : false;\n  }\n\n  get inProduct() {\n    return this.activeProduct ? true : false;\n  }\n\n  get inBook() {\n    return this.activeBook ? true : false;\n  }\n\n  get inArea() {\n    return this.activeArea ? true : false;\n  }\n\n  get inContent() {\n    return this.activeContent ? true : false;\n  }\n\n  get inSection() {\n    return this.activeSection ? true : false;\n  }\n\n  get inExercise() {\n    return this.activeExercise ? true : false;\n  }\n\n  get activeEntity() {\n    if (this.inContent) return this.activeContent;\n    if (this.inArea) return this.activeArea;\n    if (this.inBook) return this.activeBook;\n    return null;\n  }\n\n  get inWorkspaceSection() {\n    return this.activeWorkspaceSection ? true : false;\n  }\n\n  get inWorkspaceExercise() {\n    return this.activeWorkspaceExercise ? true : false;\n  }\n\n  get hasCloseUrl() {\n    return this.closeUrl ? true : false;\n  }\n\n  get hasReturnUrl() {\n    return this.returnUrl ? true : false;\n  }\n\n  get hasPageTitle() {\n    return this.pageTitle ? true : false;\n  }\n\n  get activeGroupName() {\n    if (this.activeCourse) {\n      const courseName = this.activeCourse.name;\n      const group = this.activeCourse.groups?.[0]?.name ?? null;\n\n      if (group) {\n        if (group !== courseName) {\n          return `${group} (${courseName})`;\n        }\n\n        return group;\n      }\n\n      return courseName;\n    }\n\n    return null;\n  }\n\n  // METHODS\n\n  setActive(type, obj) {\n    if (this.timers[type]) {\n      cancel(this.timers[type]);\n    }\n\n    const val = obj ?? null;\n\n    this.timers[type] = once(this, this[`${type}Update`], val);\n  }\n\n  activeDiagnosisAttemptUpdate(val) {\n    this.activeDiagnosisAttempt = val;\n  }\n\n  activeMissionUpdate(val) {\n    this.activeMission = val;\n  }\n\n  activeCustomContentUpdate(val) {\n    this.activeCustomContent = val;\n  }\n\n  activeCourseUpdate(val) {\n    this.activeCourse = val;\n  }\n\n  activeProductUpdate(val) {\n    this.activeProduct = val;\n  }\n\n  activeBookUpdate(val) {\n    this.activeBook = val;\n  }\n\n  activeAreaUpdate(val) {\n    this.activeArea = val;\n  }\n\n  activeContentUpdate(val) {\n    this.activeContent = val;\n  }\n\n  activeSectionUpdate(val) {\n    this.activeSection = val;\n  }\n\n  activeExerciseUpdate(val) {\n    this.activeExercise = val;\n  }\n\n  activeWorkspaceSectionUpdate(val) {\n    this.activeWorkspaceSection = val;\n  }\n\n  activeWorkspaceExerciseUpdate(val) {\n    this.activeWorkspaceExercise = val;\n  }\n\n  closeUrlUpdate(val) {\n    this.closeUrl = val;\n  }\n\n  returnUrlUpdate(val) {\n    this.returnUrl = val;\n  }\n\n  pageTitleUpdate(val) {\n    this.pageTitle = val;\n  }\n\n  setCloseUrl(url) {\n    if (CLOSE_URL_BLOCKLIST.some((pattern) => url?.includes(pattern))) {\n      return;\n    }\n    this.setActive('closeUrl', this.#validateUrl(url));\n  }\n\n  setReturnUrl(url) {\n    this.setActive('returnUrl', this.#validateUrl(url));\n  }\n\n  #validateUrl(url) {\n    // just to make sure we never link to an external site\n    if (!url) return url;\n    if (!url.startsWith('/')) return null;\n    return url;\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { writeCookie } from 'babel/utils/handle-cookies';\n\nconst COOKIES_ACCEPTED_KEY = 'has_accepted_cookies';\nconst COOKIES_ALLOWED_COOKIE = 'cookies_allowed';\n\nexport default class CookieConsentService extends Service {\n  @service cookies;\n\n  @service readNotices;\n\n  constructor() {\n    super(...arguments);\n    this.readNotices.load();\n  }\n\n  get accepted() {\n    return (\n      this.cookies.read(COOKIES_ALLOWED_COOKIE) === 'yes' ||\n      this.readNotices.has(COOKIES_ACCEPTED_KEY)\n    );\n  }\n\n  get loaded() {\n    return (\n      this.cookies.read(COOKIES_ALLOWED_COOKIE) === 'yes' ||\n      this.readNotices.loaded\n    );\n  }\n\n  accept() {\n    writeCookie(this.cookies, COOKIES_ALLOWED_COOKIE, 'yes');\n    return this.readNotices.markAsRead(COOKIES_ACCEPTED_KEY);\n  }\n}\n","import { A } from '@ember/array';\nimport Service from '@ember/service';\nimport { inject as service } from '@ember/service';\nimport {\n  getObject,\n  removeObject,\n  storeInObject,\n} from 'babel/utils/session-storage';\nimport { storageFor } from 'ember-local-storage';\nimport { all, resolve } from 'rsvp';\n\nconst SESSION_STORAGE_KEY = 'course_context_dir';\n\nexport default class CourseContextService extends Service {\n  @service contextHelper;\n  @service helpList;\n  @service store;\n  @service session;\n\n  @storageFor('content-visited') visits;\n\n  async setCurrentCourse(course) {\n    course = await resolve(course);\n\n    if (course) {\n      // Resolve all relations needed for course.books.\n      // Weird internal Ember stuff causes course.books\n      // to be an empty array unless we do this,\n      // that in turn causes bugs like DINO-4357.\n      await resolve(course.setting)\n        .then((setting) =>\n          all([\n            setting?.books,\n            setting?.hiddenBooks,\n            setting?.helpList,\n            course.products,\n          ])\n        )\n        .then((result) => {\n          const helpList = result[2];\n\n          if (helpList) {\n            this.helpList.setActiveHelpList(helpList);\n          } else {\n            this.helpList.resetActiveHelpList();\n          }\n\n          return resolve(course.allBooks);\n        });\n\n      const books = await resolve(course.books);\n\n      if (books) {\n        books.forEach((book) => {\n          this._storeActiveCourseForBook(book.id, course.id);\n        });\n      }\n    }\n\n    this.contextHelper.setActive('activeCourse', course);\n  }\n\n  removeAllContext() {\n    this.contextHelper.setActive('activeCourse', null);\n    removeObject(SESSION_STORAGE_KEY);\n  }\n\n  async fetchCoursesForProduct(product) {\n    let currentCourses = A();\n    const courses = await this.session.get('user.courses');\n    courses?.forEach((course) => {\n      course.products.forEach((courseProduct) => {\n        if (product.id === courseProduct.id) {\n          currentCourses.pushObject(course);\n        }\n      });\n    });\n    currentCourses = currentCourses.uniq();\n    return currentCourses;\n  }\n\n  async fetchCoursesForBook(bookEntity) {\n    let currentCourses = A();\n    const courseId = this._getActiveCourseForBook(bookEntity.get('id'));\n\n    if (courseId) {\n      const courses = await this.session.get('user.courses');\n      const current = courses.findBy('id', courseId);\n\n      if (current) {\n        this.currentCourse = current;\n        currentCourses.pushObject(current);\n      }\n    }\n\n    if (!currentCourses.length) {\n      const products = await bookEntity.get('products');\n      const courses = await this.session.get('user.courses');\n\n      products?.forEach((product) => {\n        courses.forEach((course) => {\n          course?.get('products').forEach((courseProduct) => {\n            if (courseProduct.get('id') == product.get('id')) {\n              currentCourses.pushObject(course);\n            }\n          });\n        });\n      });\n\n      currentCourses = currentCourses.uniq();\n    }\n    return currentCourses;\n  }\n\n  storeVisitedContent(entityId) {\n    if (this.contextHelper.inCourse) {\n      let visits = this.visits.get('content_visited');\n      if (!Array.isArray(visits[this.contextHelper.activeCourse.id])) {\n        visits[this.contextHelper.activeCourse.id] = [];\n      }\n      visits[this.contextHelper.activeCourse.id] = visits[\n        this.contextHelper.activeCourse.id\n      ].filter((e) => e !== entityId);\n      visits[this.contextHelper.activeCourse.id].unshift(entityId);\n      this.visits.set('content_visited', visits);\n    }\n  }\n\n  getVisitedContentIds(courseId) {\n    return this.visits.get('content_visited')[courseId];\n  }\n\n  // PRIVATE\n\n  _getActiveCourseForBook(bookId) {\n    const emberCourseId = getObject(SESSION_STORAGE_KEY)?.[bookId];\n    const vueCourseId = getObject(\n      `${this.session.user.id}_context`\n    )?.selectedCourseId;\n\n    return emberCourseId || vueCourseId;\n  }\n\n  _storeActiveCourseForBook(bookId, courseId) {\n    storeInObject(SESSION_STORAGE_KEY, bookId, courseId);\n  }\n}\n","import { later } from '@ember/runloop';\nimport Service, { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class CustomContentDispatcherService extends Service {\n  @service intl;\n  @service snackbar;\n\n  @tracked highlightedCustomContent = null;\n\n  async save(customContent, showSuccessMessage = true, adapterOptions = null) {\n    try {\n      const promise = await customContent.save(adapterOptions);\n      if (showSuccessMessage) {\n        this.#success('save');\n      }\n      this.#highlight(customContent);\n      return promise;\n    } catch (error) {\n      this.#error('save');\n      throw error;\n    }\n  }\n\n  #success(method) {\n    this.snackbar.enqueue(\n      this.intl.t(\n        `services.customContentDispatcher.${method}.snackbar.success`\n      ),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  }\n\n  #error(method) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.customContentDispatcher.${method}.snackbar.error`),\n      {\n        variant: 'error',\n      }\n    );\n  }\n\n  #highlight(customContent) {\n    this.highlightedCustomContent = customContent;\n    later(() => {\n      this.highlightedCustomContent = null;\n    }, 1000);\n  }\n}\n","import { action } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport { htmlSafe } from '@ember/template';\nimport { tracked } from '@glimmer/tracking';\nimport { resolve } from 'rsvp';\n\nexport default class DiagnosisService extends Service {\n  @service intl;\n\n  @service contextHelper;\n\n  @service confirmManager;\n\n  @service router;\n\n  @tracked turningIn = false;\n\n  @action done() {\n    return this.confirmManager\n      .confirm({\n        title: this.intl.t('services.diagnosis.confirmTurnInTitle'),\n        message: htmlSafe(\n          this.intl.t('services.diagnosis.confirmTurnInMessage')\n        ),\n      })\n      .then(() => this._turnIn())\n      .catch((err) => console.log(err));\n  }\n\n  @action timesUp() {\n    return this._turnIn().catch((err) => console.log(err));\n  }\n\n  startDiagnosis(attempt) {\n    this.contextHelper.setActive('activeDiagnosisAttempt', attempt);\n  }\n\n  endDiagnosis() {\n    this.contextHelper.setActive('activeDiagnosisAttempt', null);\n  }\n\n  _turnIn() {\n    if (!this.contextHelper.activeDiagnosisAttempt) return resolve();\n\n    this.turningIn = true;\n\n    return this.contextHelper.activeDiagnosisAttempt\n      .turnIn()\n      .then(() => this.contextHelper.activeDiagnosisAttempt.entity)\n      .then((collection) =>\n        this.router.transitionTo(\n          'master.interactives.diagnoses.done',\n          this.contextHelper.activeContent.id,\n          collection.id,\n          this.contextHelper.activeDiagnosisAttempt.id\n        )\n      )\n      .then(() => {\n        this.turningIn = false;\n      });\n  }\n}\n","import Service, { service } from '@ember/service';\nimport { resolve } from 'rsvp';\n\nexport default class EntityContextService extends Service {\n  @service contextHelper;\n\n  @service productContext;\n\n  async setEntityContext(entity) {\n    await this.setEntityContextRecursively(entity);\n  }\n\n  async changeExercise(entity) {\n    this.contextHelper.setActive('activeExercise', entity);\n  }\n\n  async changeWorkspaceExercise(entity) {\n    const parent = await this.getParent(entity);\n\n    this.contextHelper.setActive('activeWorkspaceExercise', entity);\n    this.contextHelper.setActive('activeWorkspaceSection', parent);\n  }\n\n  resetEntityContext() {\n    this.contextHelper.setActive('activeBook', null);\n    this.contextHelper.setActive('activeArea', null);\n    this.contextHelper.setActive('activeContent', null);\n    this.contextHelper.setActive('activeSection', null);\n    this.contextHelper.setActive('activeExercise', null);\n    this.contextHelper.setActive('activeWorkspaceSection', null);\n    this.contextHelper.setActive('activeWorkspaceExercise', null);\n    this.contextHelper.setCloseUrl(null);\n    this.contextHelper.setReturnUrl(null);\n  }\n\n  async getParent(entity) {\n    let parent;\n\n    try {\n      parent = await entity.parent;\n    } catch (err) {\n      // do nothing\n    }\n\n    return parent;\n  }\n\n  async setEntityContextRecursively(entity) {\n    const parent = await this.getParent(entity);\n\n    switch (entity.type) {\n      case 'books':\n        this.contextHelper.setActive('activeBook', entity);\n\n        if (!this.contextHelper.inCourse && !this.contextHelper.inProduct) {\n          const products = await resolve(entity.products);\n\n          if (products?.length === 1) {\n            // In the case where the user visits the book without ever\n            // visiting the product route and there is only one product\n            // for the book, we set the active product to that product.\n            // When there are multiple products, the user will be shown\n            // a product selection modal. This solves DINO-4904.\n            await this.productContext.setActiveProduct(products[0]);\n          }\n        }\n        return;\n      case 'areas':\n      case 'archives':\n        this.contextHelper.setActive('activeArea', entity);\n        break;\n      case 'contents':\n      case 'interactives':\n      case 'materials':\n        this.contextHelper.setActive('activeContent', entity);\n        break;\n      case 'collections':\n      case 'sections':\n        if (entity.space === 'workspace') {\n          this.contextHelper.setActive('activeWorkspaceSection', entity);\n        } else {\n          this.contextHelper.setActive('activeSection', entity);\n        }\n        break;\n      case 'studies':\n      case 'exercises':\n      case 'assignments':\n        if (parent?.space === 'workspace') {\n          this.contextHelper.setActive('activeWorkspaceExercise', entity);\n        } else {\n          this.contextHelper.setActive('activeExercise', entity);\n        }\n        break;\n      default:\n        return;\n    }\n\n    if (parent) {\n      return this.setEntityContextRecursively(parent);\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class EntityInspectorService extends Service {\n  // PROPERTIES\n\n  @tracked inspectedEntity = null;\n  @tracked modalSection = null;\n  @tracked modalIsOpen = false;\n\n  // METHODS\n\n  @action openModal(inspectedEntity, modalSection = 'about') {\n    document.body.classList.add('entity-inspector--open');\n\n    this.inspectedEntity = inspectedEntity;\n    this.modalSection = modalSection;\n    this.modalIsOpen = true;\n  }\n\n  @action closeModal() {\n    document.body.classList.remove('entity-inspector--open');\n\n    this.inspectedEntity = null;\n    this.modalSection = null;\n    this.modalIsOpen = false;\n  }\n}\n","import EmberObject from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class EntitySearchService extends Service {\n  // SERVICE\n  @service store;\n\n  // PROPERTIES\n  @tracked searchResults = [];\n  @tracked searchStatus = null;\n  @tracked searchVal;\n  @tracked isLoading = false;\n  @tracked pageNumber = 1;\n  @tracked numPages = 0;\n  @tracked entities;\n  @tracked entity;\n  @tracked totalHits = 0;\n  @tracked showingResultLow = 1;\n  @tracked showingResultHight = 24;\n  perPage = 24;\n\n  resetSearch(newSearch = false) {\n    this.searchResults = [];\n    this.searchStatus = null;\n    this.pageNumber = 1;\n    this.numPages = 0;\n    this.showingResultLow = 1;\n    this.showingResultHight = 24;\n    if (!newSearch) {\n      this.searchVal = null;\n    }\n  }\n\n  setResultNumbers() {\n    if (this.numPages > 1) {\n      if (this.pageNumber === this.numPages) {\n        const allButLastPageResults = (this.numPages - 1) * 24;\n        const lastResultPageResults = this.totalHits - allButLastPageResults;\n        this.showingResultHight = this.totalHits;\n        this.showingResultLow = this.totalHits - lastResultPageResults;\n        return;\n      } else if (this.pageNumber > 1) {\n        this.showingResultLow = this.pageNumber * 24 - 23;\n        this.showingResultHight = this.pageNumber * 24 + 1;\n        return;\n      } else {\n        this.showingResultLow = 1;\n        this.showingResultHight = 24;\n      }\n    } else {\n      this.showingResultLow = this.totalHits;\n      this.showingResultHight = this.totalHits;\n    }\n  }\n\n  search(entity, entities, newSearch) {\n    if (newSearch) {\n      this.resetSearch(newSearch);\n    }\n    this.entities = entities;\n    this.entity = entity;\n    this.isLoading = true;\n    return this.store\n      .query('entity', {\n        page: {\n          size: this.perPage,\n          number: this.pageNumber,\n        },\n        filter: {\n          book_id: entities ? entities.mapBy('id') : entity.book_id,\n        },\n        search: this.searchVal,\n      })\n      .then((hits) => {\n        let entities = hits.sortBy('rank');\n        entities = entities.map((entity) => {\n          return EmberObject.create({\n            entity,\n          });\n        });\n        if (entities.length === 0) {\n          this.searchStatus = 'noHits';\n        } else {\n          this.searchStatus = 'validSearch';\n        }\n        this.isLoading = false;\n        this.searchResults = entities;\n        this.totalHits = hits?.meta?.total;\n        this.numPages = hits?.meta?.totalPages;\n        this.pageNumber = Number(this.pageNumber);\n        this.setResultNumbers();\n\n        // Matomo tracking specific for searching\n        if (window._paq) {\n          window._paq.push([\n            'trackSiteSearch',\n            this.searchVal,\n            this.entities?.firstObject?.title ?? false,\n            this.totalHits,\n          ]);\n        }\n      });\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { isPlainObject } from 'ember-fetch/types';\nimport { serializeQueryParams } from 'ember-fetch/utils/serialize-query-params';\nimport fetch from 'fetch';\nimport { reject } from 'rsvp';\n\nexport default class FetchService extends Service {\n  @service session;\n\n  async request(url = null, auth = false, options = {}) {\n    if (!url) return;\n\n    if (auth) {\n      // When authentication is needed we get the necessary headers from the session service.\n      await this.session.refreshAuthentication.perform();\n\n      if (!options.headers) options.headers = {};\n\n      for (const [key, value] of Object.entries(this.session.headers)) {\n        options.headers[key] = value;\n      }\n    }\n\n    if (options.type) {\n      // Type === method for backwards compatibility with the ajax service\n      options.method = options.type;\n      delete options.type;\n    }\n\n    if (options.data) {\n      // GET and HEAD requests should pass data in query string. Other requests should\n      // send it in the request body.\n      if (options.method === 'GET' || options.method === 'HEAD') {\n        if (Object.keys(options.data).length) {\n          const queryParamDelimiter = url.indexOf('?') > -1 ? '&' : '?';\n          url += `${queryParamDelimiter}${serializeQueryParams(options.data)}`;\n        }\n      } else {\n        if (isPlainObject(options.data)) {\n          if (!options.headers) options.headers = {};\n          options.headers['Content-Type'] =\n            'application/x-www-form-urlencoded; charset=UTF-8';\n          options.body = serializeQueryParams(options.data);\n        } else {\n          options.body = options.data;\n        }\n      }\n\n      delete options.data;\n    }\n\n    let response, data;\n\n    try {\n      response = await fetch(url, options);\n\n      if (response.headers.map['content-type'].startsWith('application/json')) {\n        data = await response.json();\n      } else {\n        data = await response.text();\n      }\n    } catch (err) {\n      return reject(err);\n    }\n\n    if (!response.ok) {\n      return reject(data?.errors?.[0]);\n    }\n\n    return data;\n  }\n}\n","import Service, { service } from '@ember/service';\n\nexport default class FileDispatcherService extends Service {\n  @service store;\n  @service intl;\n  @service snackbar;\n  @service confirmManager;\n\n  create(attributes = {}) {\n    return this.store.createRecord('file', attributes);\n  }\n\n  performUpload(file, fileData) {\n    const onResolve = () => {\n      this.#success('upload');\n    };\n\n    const onReject = (xhr) => {\n      // NOTE The request has been aborted.\n      if (xhr.status === 0) {\n        return;\n      }\n\n      this.#error('upload');\n    };\n\n    // NOTE Make sure that we return the orginal promise.\n    const promise = file.performUpload(fileData);\n    promise.then(onResolve, onReject);\n    return promise;\n  }\n\n  abortUpload(file) {\n    file.abortUpload();\n  }\n\n  save(file) {\n    const onResolve = () => {\n      this.#success('save');\n    };\n\n    const onReject = () => {\n      this.#error('save');\n    };\n\n    // NOTE Make sure that we return the orginal promise.\n    const promise = file.save();\n    promise.then(onResolve, onReject);\n    return promise;\n  }\n\n  delete(file, skipConfirm = false) {\n    if (skipConfirm) {\n      this.#deleteFile(file);\n    } else {\n      return this.#confirm('delete', { danger: true }).then(() => {\n        this.#deleteFile(file);\n      });\n    }\n  }\n\n  deleteMany(files) {\n    return this.#confirm(\n      'deleteMany',\n      {\n        danger: true,\n      },\n      files.length\n    ).then(async () => {\n      try {\n        const result = await Promise.all(\n          files.map((file) => file.destroyRecord())\n        );\n        this.#success('deleteMany', { count: files.length });\n        return result;\n      } catch (error) {\n        this.#error('delete');\n        throw error;\n      }\n    });\n  }\n\n  #deleteFile(file) {\n    const onResolve = () => {\n      this.#success('delete');\n    };\n\n    const onReject = () => {\n      this.#error('delete');\n    };\n\n    // NOTE Make sure that we return the orginal promise.\n    const promise = file.destroyRecord();\n    promise.then(onResolve, onReject);\n    return promise;\n  }\n\n  #confirm(method, options, count = 1) {\n    return this.confirmManager.perform(\n      this.intl.t(`services.fileDispatcher.${method}.confirm`, {\n        count,\n      }),\n      options\n    );\n  }\n\n  #success(method, { count = 1 } = {}) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.fileDispatcher.${method}.snackbar.success`, {\n        count,\n      }),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  }\n\n  #error(method, count = 1) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.fileDispatcher.${method}.snackbar.error`, {\n        count,\n      }),\n      {\n        variant: 'error',\n      }\n    );\n  }\n}\n","import { later } from '@ember/runloop';\nimport Service from '@ember/service';\nimport { inject as service } from '@ember/service';\nimport { trackPresentationEvent } from 'babel/utils/matomo-events';\n\nexport default Service.extend({\n  active: false,\n\n  router: service(),\n\n  contextHelper: service(),\n\n  init() {\n    this._super(...arguments);\n\n    this.get('router').on('routeDidChange', (transition) => {\n      let active = this.get('active');\n      if (transition.to.name != transition.from.name && active) {\n        this.turnOff();\n      }\n    });\n  },\n\n  turnOn() {\n    trackPresentationEvent('Ändra fokus - På');\n    document.body.classList.add('entering-focus');\n    later(() => {\n      this.resetTools();\n      document.body.classList.add('is-focusing');\n    }, 600);\n  },\n\n  turnOff() {\n    trackPresentationEvent('Ändra fokus - Av');\n    document.body.classList.remove('is-focusing', 'entering-focus');\n    this.set('active', false);\n  },\n\n  resetTools() {\n    const isWorkspaceOpen =\n      this.get('router.currentRouteName').split('.').includes('workspace') ||\n      (this.contextHelper.inWorkspaceExercise &&\n        !this.get('router.currentRouteName').includes('master.interactives'));\n\n    if (isWorkspaceOpen) {\n      this.get('router')\n        .replaceWith('master.contents')\n        .finally(() => {\n          this.set('active', true);\n        });\n    } else {\n      this.set('active', true);\n    }\n  },\n});\n","import Service from '@ember/service';\n\nexport default class FootnotesService extends Service {\n  indexes = {};\n\n  footnotes = [];\n\n  createIndexContext(sections) {\n    const footnotes = (sections || [])\n      .filterBy('footnotes')\n      .mapBy('footnotes')\n      .flat();\n\n    footnotes.forEach((footnote, index) => {\n      this.indexes[footnote.id] = index;\n      this.footnotes.push(footnote);\n    });\n\n    return footnotes;\n  }\n\n  getIndex(id) {\n    return this.indexes[id] + 1;\n  }\n\n  getFootnote(id) {\n    return this.footnotes.findBy('id', id);\n  }\n}\n","import Service, { inject as service } from '@ember/service';\n\nconst INFORMATION_KEY = 'has_seen_groups_information';\nconst TOOLTIP_KEY = 'has_seen_groups_tooltip';\n\nexport default class GroupsOnboardingService extends Service {\n  @service readNotices;\n\n  constructor() {\n    super(...arguments);\n    this.readNotices.load();\n  }\n\n  get informationSeen() {\n    return this.readNotices.has(INFORMATION_KEY);\n  }\n\n  get tooltipSeen() {\n    return this.readNotices.has(TOOLTIP_KEY);\n  }\n\n  get loaded() {\n    return this.readNotices.loaded;\n  }\n\n  dismissInformation() {\n    return this.readNotices.markAsRead(INFORMATION_KEY);\n  }\n\n  dismissTooltip() {\n    return this.readNotices.markAsRead(TOOLTIP_KEY);\n  }\n}\n","import { action } from '@ember/object';\nimport Service from '@ember/service';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport { trackHelplistEvent } from 'babel/utils/matomo-events';\nimport { resolve } from 'rsvp';\n\nexport default class HelpListService extends Service {\n  @service router;\n  @service store;\n  @service contextHelper;\n  @service ajax;\n\n  @tracked isOpen =\n    this.router.currentRoute?.queryParams?.help_list === 'true' ?? false;\n  @tracked activeHelpList = null;\n\n  @action\n  openModal() {\n    this.isOpen = true;\n    if (this.router.currentRoute?.queryParams?.help_list === 'false') {\n      this.router.replaceWith({ queryParams: { help_list: true } });\n    }\n  }\n\n  @action\n  closeModal() {\n    this.isOpen = false;\n    if (this.router.currentRoute?.queryParams?.help_list === 'true') {\n      this.router.replaceWith({ queryParams: { help_list: false } });\n    }\n  }\n\n  @action\n  async setActiveHelpList(helpList = null) {\n    if (!helpList) return;\n\n    this.activeHelpList = helpList;\n  }\n\n  @action\n  resetActiveHelpList() {\n    if (!this.activeHelpList) return;\n\n    this.activeHelpList = null;\n  }\n\n  @action\n  async activateHelpList() {\n    const course = await resolve(this.contextHelper.activeCourse);\n    const setting = await resolve(course.setting);\n\n    if (!setting) return;\n\n    const helpList = this.store.createRecord('help-list', { setting });\n\n    this.setActiveHelpList(helpList);\n\n    trackHelplistEvent('Aktivera');\n    return helpList.save({ adapterOptions: { ignoreResponsePayload: true } });\n  }\n\n  @action\n  deactivateHelpList(helpList) {\n    trackHelplistEvent('Deaktivera');\n\n    this.resetActiveHelpList();\n\n    return helpList.destroyRecord();\n  }\n\n  @action\n  async raiseHand() {\n    try {\n      trackHelplistEvent('Räcker upp handen');\n      const payload = await this.ajax.request(\n        `${config.endpoint}/api/v1/meta/help-lists/${this.contextHelper.activeCourse.id}/raise-hand`,\n        true,\n        { type: 'POST', data: {} }\n      );\n\n      this.store.pushPayload(payload);\n      return payload;\n    } catch (err) {\n      //\n    }\n  }\n\n  @action\n  async lowerHand(data) {\n    let body = {};\n\n    if (data) {\n      body.user_id = data.id;\n    }\n\n    try {\n      trackHelplistEvent('Tar ned handen');\n      const payload = await this.ajax.request(\n        `${config.endpoint}/api/v1/meta/help-lists/${this.contextHelper.activeCourse.id}/lower-hand`,\n        true,\n        { type: 'POST', data: body }\n      );\n\n      this.store.pushPayload(payload);\n      return payload;\n    } catch (err) {\n      //\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nexport default class ImboxService extends Service {\n  @tracked isSupportDrawerOpen = false;\n\n  @tracked hasInitialized = false;\n\n  load(user, school) {\n    if (this.hasInitialized || config.environment === 'test') return;\n\n    const role = user.role;\n\n    if (!role || role === 'student') return;\n\n    window._sid = '2417';\n    window._imbox = window._imbox || [];\n\n    function handleToggle(data) {\n      this.isSupportDrawerOpen = data.isOpen;\n\n      this._toggleImboxContainer(data.isOpen);\n\n      if (data.isOpen) {\n        document.documentElement.dataset['supportContainerMoved'] = 'true';\n      } else {\n        delete document.documentElement.dataset['supportContainerMoved'];\n      }\n    }\n\n    const userInfo = {\n      id: user.id,\n      name: `${user.firstname}${user.lastname ? ' ' + user.lastname : ''}`,\n      role: user.role,\n      username: user.username,\n      email: user.email,\n      school: school?.name,\n      schoolId: school?.id,\n    };\n\n    let translatedRole = userInfo.role;\n\n    // Hardcoded to swedish, but it´s just for Imbox\n    switch (userInfo.role.toLowerCase()) {\n      case 'private':\n        translatedRole = 'Privat';\n        break;\n      case 'student':\n        translatedRole = 'Elev';\n        break;\n      case 'teacher':\n        translatedRole = 'Lärare';\n        break;\n    }\n\n    let card = `${userInfo.name}<br />\n      <a href=\"${config.adminUrl}/users/${userInfo.id}\">${userInfo.username}</a><br />\n      ${translatedRole}\n      <a href=\"${config.adminUrl}/users/is-teacher?email=${userInfo.username}\">Är användaren lärare?</a><br />`;\n\n    if (userInfo.school) {\n      card += `<br /><a href=\"${config.adminUrl}/schools/${userInfo.schoolId}\">${userInfo.school}</a>`;\n    }\n\n    card += '<br/> Via: digiNOK';\n\n    // Settings, https://imbox.se/docs/online/dokumentation-v2/\n    window._imbox.push(['hideLauncher']);\n    window._imbox.push(['hideWidget']);\n\n    // User info\n    window._imbox.push([\n      'changeName',\n      `${translatedRole}: ${userInfo.name} - ${userInfo.username}`,\n    ]);\n\n    window._imbox.push(['insertCard', userInfo.id, card]);\n\n    const formValues = [\n      {\n        id: 'a5c0acf7-1623-4529-98e2-e0def15e718d',\n        value: userInfo.name,\n        formId: 5726,\n      },\n      {\n        id: 'bc4b69a5-5233-483c-85fe-de22687cd2a0',\n        value:\n          userInfo.role.toLowerCase() === 'private'\n            ? 'Privat'\n            : 'Skola & Organisation',\n        formId: 5726,\n      },\n    ];\n\n    // Only populate usernames that can be email addresses and ignore Hermods users since their ones are made up\n    if (/@{1}/i.test(user.username) && user.provider !== 'hermods') {\n      formValues.push({\n        id: '40c5d8ca-c41f-4a01-aa0a-372b537a6ad2',\n        value: userInfo.username,\n        formId: 5726,\n      });\n    }\n\n    if (userInfo.school) {\n      formValues.push({\n        id: '15588583-fdf9-4265-be7e-350d10374db2',\n        value: userInfo.school,\n        formId: 5726,\n      });\n    }\n\n    // User info\n    window._imbox.push(['setFormValue', formValues]);\n\n    // Events\n    window._imbox.push(['onToggle', handleToggle.bind(this)]);\n\n    const se = document.createElement('script');\n\n    se.type = 'text/javascript';\n    se.async = true;\n    se.src = 'https://files.imbox.io/app/dist/initWidget.js';\n\n    se.onload = () => {\n      const observer = new MutationObserver((records, observer) => {\n        let element = null;\n\n        for (let record of records) {\n          const addedNodes = record.addedNodes;\n\n          if (addedNodes) {\n            for (let node of addedNodes) {\n              if (node.id === 'imbox-container') {\n                element = node;\n                break;\n              }\n            }\n          }\n        }\n\n        if (element) {\n          this._toggleImboxContainer(false);\n          observer.disconnect();\n        }\n      });\n\n      observer.observe(document.body, {\n        childList: true,\n      });\n    };\n\n    document.head.appendChild(se);\n\n    this.hasInitialized = true;\n  }\n\n  _toggleImboxContainer(visible) {\n    const container = document.getElementById('imbox-container');\n\n    if (container) {\n      container.style.display = visible ? null : 'none';\n\n      if (visible) {\n        window._imbox.push(['hideLauncher']);\n      }\n    }\n  }\n\n  @action\n  onClick() {\n    if (window._imbox && typeof window._imbox.push === 'function') {\n      window._imbox.push(['toggle']);\n    }\n  }\n}\n","/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nexport { default } from 'ember-intl/services/intl';\n","import Service from '@ember/service';\n\nexport default Service.extend({\n  contentLanguage: 'sv_SE',\n  exerciseLanguage: null,\n  uiLanguage: 'sv'\n});\n","import Media from 'ember-responsive/services/media';\nexport default Media;\n","import { later } from '@ember/runloop';\nimport Service, { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport routeArgsForEntity from 'babel/utils/route-args-for-entity';\n\nexport default class MissionDispatcherService extends Service {\n  @service contextHelper;\n  @service router;\n  @service ajax;\n  @service store;\n  @service intl;\n  @service session;\n  @service snackbar;\n  @service missionMode;\n  @service confirmManager;\n\n  @tracked highlightedMissions = [];\n\n  async save(mission, { fromOverview = false } = {}) {\n    try {\n      await this.#save(mission);\n      this.#hightlight(mission);\n\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.save.snackbar.success', {\n          fromOverview,\n          state: mission.state,\n        }),\n        {\n          variant: 'success',\n          autoDismiss: fromOverview ? mission.isVisible : true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.save.snackbar.error'),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async schedule(mission, fields, { fromOverview = false } = {}) {\n    try {\n      await this.#schedule(mission, fields);\n\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.schedule.snackbar.success', {\n          fromOverview,\n          isOngoing: mission.isOngoing,\n        }),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.schedule.snackbar.error'),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async cancelSchedule(mission, { fromOverview = false } = {}) {\n    const wasOngoing = mission.isOngoing;\n\n    try {\n      await this.#cancelSchedule(mission);\n\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.cancelSchedule.snackbar.success',\n          {\n            fromOverview,\n            wasOngoing,\n          }\n        ),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.cancelSchedule.snackbar.error'),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async toggleActivation(mission, { fromOverview = false } = {}) {\n    try {\n      await this.#toggleActivation(mission);\n\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.toggleActivation.snackbar.success',\n          {\n            fromOverview,\n            visible: mission.active,\n          }\n        ),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.toggleActivation.snackbar.error',\n          {\n            fromOverview,\n          }\n        ),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async hide(mission, { fromOverview = false } = {}) {\n    const wasOngoing = mission.isOngoing;\n\n    try {\n      await this.#hide(mission);\n\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.hide.snackbar.success', {\n          fromOverview,\n          wasOngoing,\n        }),\n        {\n          variant: 'success',\n          autoDismiss: true,\n          autoDismissDelay: 6000,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.hide.snackbar.error', {\n          fromOverview,\n          wasOngoing,\n        }),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async copyToManyCourses(mission, courses) {\n    try {\n      await this.#request('copy', {\n        ids: [mission.id],\n        course_ids: courses.mapBy('id'),\n        active: mission.active,\n        keep_receivers: true,\n      });\n\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.copyToManyCourses.snackbar.success'\n        ),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.copyToManyCourses.snackbar.error'\n        ),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async copyManyToCourse(missions, course, { fromOverview = false } = {}) {\n    const count = missions.length;\n\n    try {\n      const newMissions = await this.#request('copy', {\n        ids: missions.mapBy('id'),\n        course_id: course.id,\n        active: fromOverview,\n      });\n\n      this.#highlightMany(newMissions);\n\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.copyManyToCourse.snackbar.success',\n          {\n            count,\n            fromOverview,\n          }\n        ),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.copyManyToCourse.snackbar.error',\n          {\n            count,\n            fromOverview,\n          }\n        ),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  async activateMany(missions, { fromOverview = false } = {}) {\n    const count = missions.length;\n\n    try {\n      const newMissions = await this.#request('activate', {\n        ids: missions.mapBy('id'),\n      });\n\n      this.#highlightMany(newMissions);\n      this.snackbar.enqueue(\n        this.intl.t(\n          'services.missionDispatcher.activateMany.snackbar.success',\n          {\n            count,\n            fromOverview,\n          }\n        ),\n        {\n          variant: 'success',\n          autoDismiss: true,\n        }\n      );\n    } catch (error) {\n      this.snackbar.enqueue(\n        this.intl.t('services.missionDispatcher.activateMany.snackbar.error', {\n          count,\n          fromOverview,\n        }),\n        {\n          variant: 'error',\n        }\n      );\n      throw error;\n    }\n  }\n\n  delete(mission, { fromOverview = false } = {}) {\n    return this.confirmManager\n      .perform(this.intl.t('services.missionDispatcher.delete.confirm'), {\n        danger: true,\n      })\n      .then(\n        async () => {\n          try {\n            await this.#delete(mission);\n\n            this.snackbar.enqueue(\n              this.intl.t(\n                'services.missionDispatcher.delete.snackbar.success',\n                {\n                  fromOverview,\n                }\n              ),\n              {\n                variant: 'success',\n                autoDismiss: true,\n              }\n            );\n          } catch (error) {\n            this.snackbar.enqueue(\n              this.intl.t('services.missionDispatcher.delete.snackbar.error', {\n                fromOverview,\n              }),\n              {\n                variant: 'error',\n              }\n            );\n            throw error;\n          }\n        },\n        () => {} // Needed to prevent unhandled rejection.\n      );\n  }\n\n  async getRoute(mission, customContent, closeUrl) {\n    if (!closeUrl) {\n      if (!this.contextHelper.inMission) {\n        closeUrl = this.router.currentURL;\n      } else if (this.contextHelper.closeUrl) {\n        closeUrl = this.contextHelper.closeUrl;\n      }\n    }\n\n    const entity = await customContent.entity;\n\n    const routeArgs = await routeArgsForEntity(\n      entity,\n      {\n        close_url: closeUrl,\n        mission: mission.id,\n        custom_content: customContent.id,\n      },\n      this.missionMode\n    );\n\n    return routeArgs;\n  }\n\n  async open(mission, customContent, closeUrl) {\n    const routeArgs = await this.getRoute(mission, customContent, closeUrl);\n\n    return this.router.transitionTo(...routeArgs);\n  }\n\n  #hightlight(mission) {\n    this.highlightedMissions.addObject(mission);\n    later(() => {\n      this.highlightedMissions.removeObject(mission);\n    }, 1000);\n  }\n\n  #highlightMany(missions) {\n    this.highlightedMissions.addObjects(missions);\n    later(() => {\n      this.highlightedMissions.removeObjects(missions);\n    }, 1000);\n  }\n\n  async #save(mission) {\n    if (!mission.startDate && mission.endDate) {\n      mission.startDate = new Date();\n    }\n\n    await mission.save();\n    const customContents = await mission.customContents;\n\n    const validCustomContents = customContents.rejectBy('missingEntity');\n\n    validCustomContents.forEach((customContent) => {\n      customContent.missions.addObject(mission);\n    });\n\n    await Promise.all(\n      validCustomContents.map((customContent) => {\n        return Promise.all([\n          customContent.includedEntities,\n          customContent.includedTeacherAssignments,\n          customContent.includedWordlists,\n        ]);\n      })\n    );\n\n    return Promise.all(validCustomContents.map((x) => x.save()));\n  }\n\n  async #delete(mission) {\n    const customContents = await mission.customContents;\n\n    await Promise.all(\n      customContents.map(async (customContent) => {\n        // DINO-4861 Need to wait for entity otherwise we might try\n        // to update custom contents without entity id which will\n        // cause a 400 from the API\n        await customContent.entity;\n\n        customContent?.missions.removeObject(mission);\n      })\n    );\n\n    return Promise.all([customContents.save(), mission.destroyRecord()]);\n  }\n\n  async #schedule(mission, { startDate, endDate = null } = {}) {\n    if (!startDate && endDate) {\n      startDate = new Date();\n    }\n\n    mission.startDate = startDate;\n    mission.endDate = endDate;\n    mission.active = false;\n    return mission.save();\n  }\n\n  async #cancelSchedule(mission) {\n    return this.#schedule(mission, {\n      startDate: null,\n      endDate: null,\n    });\n  }\n\n  async #toggleActivation(mission, { force = null } = {}) {\n    mission.active = force ? force : !mission.active;\n    return mission.save();\n  }\n\n  async #hide(mission) {\n    if (mission.active) {\n      return this.#toggleActivation(mission, { force: false });\n    }\n\n    return this.#cancelSchedule(mission);\n  }\n\n  async #request(name, data) {\n    const doc = await this.ajax.request(\n      `${config.endpoint}/api/v1/meta/missions/${name}`,\n      true,\n      {\n        type: 'POST',\n        data: JSON.stringify(data),\n        headers: { 'Content-Type': 'application/vnd.api+json' },\n      }\n    );\n\n    this.store.pushPayload(doc);\n\n    return doc.data\n      .map(({ id }) => this.store.peekRecord('mission', id))\n      .compact();\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { cached } from '@glimmer/tracking';\nimport { entityIsAllowedInCustomContent } from 'babel/utils/entity-is-allowed-in-custom-content';\nimport { load } from 'ember-async-data';\nimport { all, resolve } from 'rsvp';\n\nexport default class MissionModeService extends Service {\n  // SERVICES\n\n  @service session;\n\n  @service contextHelper;\n\n  @service courseContext;\n\n  // PROPERTIES\n\n  @cached\n  get customContentEntityProxy() {\n    let promise = resolve();\n\n    if (this.contextHelper.activeCustomContent) {\n      promise = resolve(this.contextHelper.activeCustomContent.entity);\n    }\n\n    return load(promise, this);\n  }\n\n  get customContentEntity() {\n    return this.customContentEntityProxy.isResolved\n      ? this.customContentEntityProxy.value\n      : null;\n  }\n\n  @cached\n  get includedEntitiesProxy() {\n    let promise = resolve([]);\n\n    if (\n      this.customContentEntity &&\n      this.contextHelper.activeContent &&\n      this.customContentEntity === this.contextHelper.activeContent\n    ) {\n      promise = resolve(\n        this.contextHelper.activeCustomContent.includedEntities\n      ).then((includedEntities) => includedEntities.toArray());\n    }\n\n    return load(promise, this);\n  }\n\n  get includedEntities() {\n    return this.includedEntitiesProxy.isResolved\n      ? this.includedEntitiesProxy.value\n      : [];\n  }\n\n  @cached\n  get includedTeacherAssignmentsProxy() {\n    let promise = resolve([]);\n\n    if (\n      this.customContentEntity &&\n      this.contextHelper.activeContent &&\n      this.customContentEntity === this.contextHelper.activeContent\n    ) {\n      promise = resolve(\n        this.contextHelper.activeCustomContent.includedTeacherAssignments\n      ).then((includedTeacherAssignments) =>\n        includedTeacherAssignments.toArray()\n      );\n    }\n\n    return load(promise, this);\n  }\n\n  get includedTeacherAssignments() {\n    return this.includedTeacherAssignmentsProxy.isResolved\n      ? this.includedTeacherAssignmentsProxy.value\n      : [];\n  }\n\n  @cached\n  get includedWordlistsProxy() {\n    let promise = resolve([]);\n\n    if (\n      this.customContentEntity &&\n      this.contextHelper.activeContent &&\n      this.customContentEntity === this.contextHelper.activeContent\n    ) {\n      promise = resolve(\n        this.contextHelper.activeCustomContent.includedWordlists\n      ).then((includedWordlists) => includedWordlists.toArray());\n    }\n\n    return load(promise, this);\n  }\n\n  get includedWordlists() {\n    return this.includedWordlistsProxy.isResolved\n      ? this.includedWordlistsProxy.value\n      : [];\n  }\n\n  // METHODS\n\n  activate({ mission = null, customContent = null, closeUrl = null }) {\n    this.contextHelper.setActive('activeMission', mission);\n    this.contextHelper.setActive('activeCustomContent', customContent);\n    this.contextHelper.setCloseUrl(closeUrl);\n\n    if (mission?.course) {\n      this.courseContext.setCurrentCourse(mission.course);\n    }\n  }\n\n  deactivate() {\n    this.contextHelper.setActive('activeMission', null);\n    this.contextHelper.setActive('activeCustomContent', null);\n    this.contextHelper.setCloseUrl(null);\n  }\n\n  addIncludedTeacherAssignmentIfNeeded(teacherAssignment) {\n    const user = this.session.user;\n\n    if (\n      this.contextHelper.inMission &&\n      this.contextHelper.activeCustomContent?.isUser(user) &&\n      this.contextHelper.activeCustomContent?.populated &&\n      teacherAssignment.isPublished\n    ) {\n      this.contextHelper.activeCustomContent.includedTeacherAssignments.addObject(\n        teacherAssignment\n      );\n\n      return this.contextHelper.activeCustomContent.save();\n    }\n\n    return resolve();\n  }\n\n  addIncludedWordlistIfNeeded(wordlist) {\n    const user = this.session.user;\n\n    if (\n      this.contextHelper.inMission &&\n      this.contextHelper.activeCustomContent?.isUser(user) &&\n      this.contextHelper.activeCustomContent?.populated &&\n      wordlist.isPublished\n    ) {\n      this.contextHelper.activeCustomContent.includedWordlists.addObject(\n        wordlist\n      );\n\n      return this.contextHelper.activeCustomContent.save();\n    }\n\n    return resolve();\n  }\n\n  teacherAssignmentIsAllowed(teacherAssignment) {\n    if (this.contextHelper.inMission) {\n      return (\n        (this.contextHelper.activeCustomContent?.populated &&\n          this.includedTeacherAssignments.length === 0) ||\n        this.includedTeacherAssignments.includes(teacherAssignment)\n      );\n    }\n\n    return true;\n  }\n\n  async allowedEntities(entities) {\n    if (!Array.isArray(entities)) return entities;\n\n    await resolve(this.contextHelper.activeCustomContent?.includedEntities);\n\n    const allowed = await all(\n      entities.map(async (entity) => {\n        const parent = await resolve(entity.parent);\n\n        if (\n          parent?.isDiagnosis ||\n          parent?.isCarousel ||\n          this.entityIsAllowed(entity)\n        ) {\n          return entity;\n        }\n\n        return null;\n      })\n    );\n\n    return allowed.filter((entity) => entity);\n  }\n\n  entityIsAllowed(entity) {\n    const user = this.session.user;\n\n    if (entity.isTeacherAssignment) {\n      const teacherAssignment = entity.teacherAssignment;\n\n      // NOTE The teacher owner should always have access to own unpublished teacher assignments.\n      if (\n        user.isTeacher &&\n        teacherAssignment.isUser(user) &&\n        !teacherAssignment.isPublished\n      ) {\n        return true;\n      }\n    }\n\n    return entityIsAllowedInCustomContent(\n      entity,\n      this.contextHelper.activeCustomContent,\n      this.contextHelper.inMission\n    );\n  }\n\n  wordlistIsAllowed(wordlist) {\n    if (wordlist.isTransformed) {\n      return this.entityIsAllowed(wordlist);\n    }\n\n    const user = this.session.user;\n\n    // NOTE A student should always have access to own wordlists.\n    if (user.isStudent && wordlist.isUser(user)) {\n      return true;\n    }\n\n    // NOTE The teacher owner should always have access to own unpublished wordlists.\n    if (user.isTeacher && wordlist.isUser(user) && !wordlist.isPublished) {\n      return true;\n    }\n\n    const entries = this.includedWordlists;\n\n    if (!this.contextHelper.inMission || !entries) {\n      return true;\n    }\n\n    if (\n      !this.contextHelper.activeCustomContent?.populated &&\n      entries.length === 0\n    ) {\n      return true;\n    }\n\n    return entries.mapBy('id').includes(wordlist.id);\n  }\n}\n","import { get as proxyGet } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Service, { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\n/* eslint-disable ember/no-get */\nexport default class NoteDispatcherService extends Service {\n  @service session;\n  @service store;\n  @service intl;\n  @service snackbar;\n  @service confirmManager;\n\n  @tracked highlightedNotes = [];\n\n  async save(note) {\n    try {\n      const result = await note.save();\n      this.#success('save');\n      return result;\n    } catch (error) {\n      this.#error('save');\n      throw error;\n    }\n  }\n\n  delete(note) {\n    return this.#confirm('delete', { danger: true }).then(async () => {\n      try {\n        const result = await note.destroyRecord();\n        this.#success('delete');\n        return result;\n      } catch (error) {\n        this.#error('delete');\n        throw error;\n      }\n    });\n  }\n\n  deleteMany(notes) {\n    return this.#confirm('deleteMany', { danger: true }, notes.length).then(\n      async () => {\n        try {\n          const result = await Promise.all(\n            notes.map((note) => note.destroyRecord())\n          );\n          this.#success('deleteMany', { count: notes.length });\n          return result;\n        } catch (error) {\n          this.#error('delete');\n          throw error;\n        }\n      }\n    );\n  }\n\n  async link(note, content) {\n    try {\n      const result = await this.#link(note, content);\n      this.#success('link');\n      return result;\n    } catch (error) {\n      this.#error('link');\n      throw error;\n    }\n  }\n\n  async linkMany(notes, content) {\n    try {\n      const result = await Promise.all(\n        notes.map((note) => this.#link(note, content))\n      );\n      this.#success('linkMany', { count: notes.length });\n      return result;\n    } catch (error) {\n      this.#error('linkMany');\n      throw error;\n    }\n  }\n\n  unlink(note, content) {\n    this.#confirm('unlink', { danger: true }).then(async () => {\n      try {\n        note.rollback();\n        proxyGet(note, 'contents').removeObject(content);\n        const result = await note.save();\n        this.#success('unlink');\n        return result;\n      } catch (error) {\n        this.#error('unlink');\n        throw error;\n      }\n    });\n  }\n\n  highlight(note) {\n    this.highlightMany([note]);\n  }\n\n  highlightMany(notes) {\n    this.highlightedNotes.addObjects(notes);\n\n    later(() => {\n      this.highlightedNotes.removeObjects(notes);\n    }, 3000);\n  }\n\n  #confirm(method, options, count = 1) {\n    return this.confirmManager.perform(\n      this.intl.t(`services.noteDispatcher.${method}.confirm`, {\n        count,\n      }),\n      options\n    );\n  }\n\n  #success(method, { count = 1 } = {}) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.noteDispatcher.${method}.snackbar.success`, {\n        count,\n      }),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  }\n\n  #error(method, count = 1) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.noteDispatcher.${method}.snackbar.error`),\n      {\n        variant: 'error',\n      },\n      { count }\n    );\n  }\n\n  async #link(note, content) {\n    const book = await proxyGet(content, 'book');\n\n    note.rollback();\n    proxyGet(note, 'books').addObject(book);\n    proxyGet(note, 'contents').addObject(content);\n\n    return note.save();\n  }\n}\n","import { observer } from '@ember/object';\nimport Service from '@ember/service';\nimport { inject as service } from '@ember/service';\nimport config from 'babel/config/environment';\nimport { clearCookie } from 'babel/utils/handle-cookies';\nimport { resolve } from 'rsvp';\n\nexport default Service.extend({\n  maintenanceMessage: null,\n\n  topMessage: null,\n\n  shownSnacks: null,\n\n  snacks: null,\n\n  ajax: service(),\n\n  cookies: service(),\n\n  pusher: service(),\n\n  store: service(),\n\n  session: service(),\n\n  userChanged: observer('session.user', function () {\n    this.getMessages();\n  }),\n\n  addListener() {\n    this.get('pusher').on('didReceiveNotice', () => {\n      this.getMessages();\n    });\n  },\n\n  async markAsRead(noticeId) {\n    const user = this.get('session.user');\n    if (!user?.id) return;\n\n    try {\n      await this.ajax.request(\n        `${config.userApiEndpoint}/api/users/${user.id}/read-notices`,\n        true,\n        {\n          type: 'POST',\n          contentType: 'application/vnd.api+json',\n          data: JSON.stringify({\n            data: { attributes: { notice_key: noticeId } },\n          }),\n        }\n      );\n    } catch (error) {\n      // Cookie-based dismissal is the source of truth; API call is best-effort\n    }\n  },\n\n  async fetchReadNoticeKeys(userId) {\n    try {\n      const response = await this.ajax.request(\n        `${config.userApiEndpoint}/api/users/${userId}/read-notices`,\n        true,\n        { type: 'GET' }\n      );\n\n      return new Set(\n        (response?.data ?? [])\n          .map((record) => record?.attributes?.notice_key)\n          .filter(Boolean)\n      );\n    } catch (error) {\n      return new Set();\n    }\n  },\n\n  async getMessages() {\n    if (!this.get('isRunning')) {\n      this.set('isRunning', true);\n\n      try {\n        const user = this.get('session.user');\n\n        let messages;\n        let readNoticeKeys = new Set();\n\n        if (user) {\n          const [licenses, fetchedKeys] = await Promise.all([\n            user.get('licenses'),\n            this.fetchReadNoticeKeys(user.id),\n          ]);\n\n          readNoticeKeys = fetchedKeys;\n\n          const isbns = licenses.map((license) => license.get('isbn'));\n\n          const nestedNotices = await this.getNoticesBatchedByIsbn(\n            isbns,\n            (isbnBatch) =>\n              this.get('store').query('notice', {\n                platform: 'diginok',\n                role: user.get('role'),\n                isbns: isbnBatch?.join(','),\n              })\n          );\n\n          messages = this.removeDuplicateNotices(nestedNotices);\n        } else {\n          messages = await this.get('store').query('notice', {\n            platform: 'diginok',\n          });\n        }\n\n        const openMessages = this.filterMessages(messages, readNoticeKeys);\n\n        this.showMessages(openMessages);\n\n        this.set('isRunning', false);\n      } catch (error) {\n        this.set('isRunning', false);\n      }\n    }\n  },\n\n  showMessages(messages) {\n    if (messages) {\n      if (messages.length === 0) {\n        this.set('maintenanceMessage', null);\n        this.set('topMessage', null);\n        this.set('snacks', null);\n        return resolve();\n      }\n\n      const maintenanceMessages = messages.filter(\n        (x) => x.get('type') === 'maintenance'\n      );\n\n      const topMessages = messages.filter((x) => x.get('type') === 'top');\n\n      const snacks = messages.filter((x) => x.get('type') === 'snack');\n\n      if (maintenanceMessages.length > 0) {\n        this.set('maintenanceMessage', maintenanceMessages[0]);\n      } else {\n        this.set('maintenanceMessage', null);\n      }\n\n      if (topMessages.length > 0) {\n        this.set('topMessage', topMessages[0]);\n      } else {\n        this.set('topMessage', null);\n      }\n\n      if (snacks.length > 0) {\n        this.set('snacks', snacks);\n      } else {\n        this.set('snacks', null);\n      }\n    }\n  },\n\n  filterMessages(messages, readNoticeKeys = new Set()) {\n    const cookies = this.cookies.read();\n\n    if (cookies) {\n      // Remove cookies set for messages that are no longer active\n      for (const name in cookies) {\n        if (name.startsWith('digi-closedNotice_')) {\n          const id = name.replace('digi-closedNotice_', '');\n\n          if (!messages.find((message) => message.id === id)) {\n            clearCookie(this.cookies, name);\n          }\n        }\n      }\n    }\n\n    return messages.filter((message) => {\n      if (this.cookies.read(`digi-closedNotice_${message.id}`)) {\n        return false;\n      }\n\n      if (readNoticeKeys.has(message.id)) {\n        return false;\n      }\n\n      if (message.get('isDeleted')) {\n        return false;\n      }\n\n      return true;\n    });\n  },\n\n  async getNoticesBatchedByIsbn(isbns, callback) {\n    const batchSize = 200;\n\n    const batchedIsbns =\n      isbns.length === 0\n        ? [null]\n        : Array.from({ length: Math.ceil(isbns.length / batchSize) }).map(\n            (_, index) =>\n              isbns.slice(index * batchSize, (index + 1) * batchSize)\n          );\n\n    return await Promise.all(batchedIsbns.map(callback));\n  },\n\n  removeDuplicateNotices(nestedNotices) {\n    const uniqueNoticeIds = new Set();\n\n    return nestedNotices.flatMap((nestedArray) =>\n      nestedArray.filter((message) => {\n        if (uniqueNoticeIds.has(message.get('id'))) return false;\n\n        uniqueNoticeIds.add(message.get('id'));\n        return true;\n      })\n    );\n  },\n});\n","import Service from '@ember/service';\nimport { inject as service } from '@ember/service';\n\nimport config from '../config/environment';\n\nexport default Service.extend({\n  ajax: service(),\n\n  session: service(),\n\n  logPageView(model, book, parent, metadata) {\n    const data = {};\n\n    data.user_id = this.get('session.user.id');\n\n    if (model && model.get('id')) {\n      data.entity_id = model.get('id');\n      data.title = model.get('title');\n      data.type = model.get('type');\n    }\n\n    if (book && book.get('id')) {\n      data.book_id = book.get('id');\n      data.book_title = book.get('title');\n    }\n\n    if (parent && parent.get('id')) {\n      data.parent_id = parent.get('id');\n      data.parent_title = parent.get('title');\n    }\n\n    if (metadata) {\n      data.metadata = metadata;\n    }\n\n    this.get('ajax').request(\n      config.endpoint + '/api/v1/meta/page-views/',\n      true,\n      {\n        type: 'POST',\n        data: data\n      }\n    );\n  }\n});\n","import Service from '@ember/service';\nimport { inject as service } from '@ember/service';\nimport {\n  getObject,\n  removeObject,\n  storeInObject,\n} from 'babel/utils/session-storage';\nimport { resolve } from 'rsvp';\n\nconst SESSION_STORAGE_KEY = 'product_context_dir';\n\nexport default class ProductContextService extends Service {\n  @service session;\n  @service contextHelper;\n\n  getAvailableProducts(book) {\n    return this._products(book);\n  }\n\n  async setActiveProduct(product) {\n    product = await resolve(product);\n\n    if (product) {\n      const books = await resolve(product.userBooks);\n\n      if (books) {\n        books.forEach((book) => {\n          this._storeActiveProductForBook(book.id, product.id);\n        });\n      }\n    }\n\n    this.contextHelper.setActive('activeProduct', product);\n  }\n\n  removeAllContext() {\n    this.contextHelper.setActive('activeProduct', null);\n    removeObject(SESSION_STORAGE_KEY);\n  }\n\n  // Private\n\n  _getStoredProductForBook(book) {\n    const userProductIds = (this.session.get('user.licenses') || []).mapBy(\n      'product.id'\n    );\n\n    const bookId = book?.get('id');\n    const activeProductId = this._getActiveProductForBook(bookId);\n    const vueActiveProductId = getObject(\n      `${this.session.user.id}_context`\n    )?.selectedProductId;\n\n    if (activeProductId && userProductIds?.includes(activeProductId)) {\n      return book.get('products').findBy('id', activeProductId);\n    }\n\n    if (vueActiveProductId && userProductIds?.includes(vueActiveProductId)) {\n      return book.get('products').findBy('id', vueActiveProductId);\n    }\n  }\n\n  _products(book) {\n    if (!book) {\n      return [];\n    }\n\n    const userProductIds = this.session\n      .get('user.licenses')\n      .map((license) => license.belongsTo('product').id());\n\n    const storedProduct = this._getStoredProductForBook(book);\n\n    if (storedProduct) {\n      return [storedProduct];\n    }\n\n    const entityProductIds = (book.get('products') || []).mapBy('id');\n\n    const validProductIds = entityProductIds.filter(\n      (id) => userProductIds.indexOf(id) !== -1\n    );\n\n    if (validProductIds.length === 1) {\n      const index = entityProductIds.indexOf(validProductIds[0]);\n      return [book.get('products').objectAt(index)];\n    } else {\n      return book.get('products').filter((product) => {\n        return validProductIds.includes(product.get('id'));\n      });\n    }\n  }\n\n  _getActiveProductForBook(bookId) {\n    return getObject(SESSION_STORAGE_KEY)?.[bookId];\n  }\n\n  _storeActiveProductForBook(bookId, productId) {\n    storeInObject(SESSION_STORAGE_KEY, bookId, productId);\n  }\n}\n","import { addListener, removeListener, sendEvent } from '@ember/object/events';\nimport { run } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { classify } from '@ember/string';\nimport { tracked } from '@glimmer/tracking';\nimport { task } from 'ember-concurrency';\nimport PusherBatchAuthorizer from 'pusher-js-auth';\nimport { all, resolve } from 'rsvp';\n\nimport config from '../config/environment';\nimport Pusher from '../utils/pusher';\n\nconst EVENTS = {\n  create: 'Create',\n  update: 'Update',\n  destroy: 'Destroy',\n  logout: 'Logout',\n};\n\nexport default class PusherService extends Service {\n  @service fetch;\n\n  @service session;\n\n  @service store;\n\n  @service helpList;\n\n  @tracked pusher;\n\n  initPusher(callback) {\n    if (this.pusher) {\n      if (this.pusher.connection.state === 'connected') {\n        // Pusher is already initialized and connected.\n        // We should continue and update the channels.\n        return callback();\n      } else {\n        // Pusher is initialized but not connected.\n        // This means another instance is waiting for\n        // the \"connected\" event. We can abort here as\n        // the other instance will update the channels\n        // when connection succeeds.\n        return;\n      }\n    }\n\n    this.pusher = new Pusher(config.pusherKey, {\n      cluster: config.pusherCluster,\n      forceTLS: true,\n      authorizer: (channel, options) => {\n        return {\n          authorize: async (socketId, callback) => {\n            await this.session.refreshAuthentication.perform();\n            options.auth.headers = this.session.headers;\n            const authorizer = new PusherBatchAuthorizer(channel, options);\n            return authorizer.authorize(socketId, callback);\n          },\n        };\n      },\n      authEndpoint: `${config.userApiEndpoint}/api/pusher/auth`,\n      auth: { headers: this.session.headers },\n    });\n\n    // Wait for \"connected\" event before updating channels.\n    // We can ignore other events as pusher retries automatically.\n    this.pusher.connection.bind('connected', callback);\n  }\n\n  on(event, callback) {\n    addListener(this, event, callback);\n  }\n\n  off(event, callback) {\n    removeListener(this, event, callback);\n  }\n\n  trigger() {\n    const args = Array.prototype.slice.call(arguments);\n    const event = args.shift();\n\n    sendEvent(this, event, args);\n  }\n\n  subscribe() {\n    this.initPusher(() => this.updateSubscriptions.perform());\n  }\n\n  async getChannels() {\n    const user = this.session?.user;\n    const channels = ['global'];\n\n    if (user) {\n      channels.push(['private', 'user', user.id].join('-'));\n\n      let courses, schools;\n\n      try {\n        [courses, schools] = await all([user.courses, user.schools]);\n      } catch (err) {\n        //console.log(err)\n      }\n\n      if (courses) {\n        const { isTeacher, isStudent } = user;\n\n        try {\n          await all(\n            courses.map(async (course) => {\n              channels.push(['private', 'course', course.id].join('-'));\n\n              if (isTeacher || isStudent) {\n                let teachers, users;\n\n                try {\n                  [teachers, users] = await all([\n                    course.teachers,\n                    course.users,\n                  ]);\n                } catch (err) {\n                  //console.log(err)\n                }\n\n                const teacherIds = (teachers || []).map((x) => x.id);\n\n                if (isTeacher) {\n                  const studentIds = (users || [])\n                    .map((x) => x.id)\n                    .filter((x) => !teacherIds.includes(x.id));\n\n                  studentIds.forEach((studentId) => {\n                    channels.push(['private', 'student', studentId].join('-'));\n                  });\n                }\n\n                teacherIds.forEach((teacherId) => {\n                  channels.push(['private', 'teacher', teacherId].join('-'));\n                });\n              }\n            })\n          );\n        } catch (err) {\n          //console.log(err)\n        }\n      }\n\n      if (schools) {\n        schools.forEach((school) => {\n          channels.push(['private', 'school', school.id].join('-'));\n        });\n      }\n    }\n\n    return channels.filter((x, idx, self) => self.indexOf(x) === idx);\n  }\n\n  @task({ enqueue: true })\n  *updateSubscriptions() {\n    const channels = yield this.getChannels();\n    const pusherChannels = Object.keys(this.pusher.channels.channels);\n\n    const channelsToAdd = (channels || []).filter(\n      (channel) => !(pusherChannels || []).includes(channel)\n    );\n\n    yield all(\n      channelsToAdd.map((channelName) =>\n        this.subscribeToChannel(channelName).catch(() => {\n          //console.log(err, channelName)\n        })\n      )\n    );\n\n    const channelsToRemove = (pusherChannels || []).filter(\n      (channel) => !(channels || []).includes(channel)\n    );\n\n    channelsToRemove.map((channelName) =>\n      this.unsubscribeFromChannel(channelName)\n    );\n  }\n\n  subscribeToChannel(channelName) {\n    return new Promise((resolve, reject) => {\n      const channel = this.pusher.subscribe(channelName);\n\n      channel.bind('pusher:subscription_succeeded', resolve);\n      channel.bind('pusher:subscription_error', reject);\n\n      channel.bind_global((event, data) =>\n        this._handleEvent(event, data, channel)\n      );\n    });\n  }\n\n  unsubscribeFromChannel(channelName) {\n    const channel = this.pusher.channel(channelName);\n\n    channel.unbind_global();\n\n    this.pusher.unsubscribe(channelName);\n  }\n\n  _handleEvent(event, data, channel) {\n    run(async () => {\n      if (data && data.type) {\n        this.trigger('didReceive' + classify(data.type), data);\n      }\n\n      if (data && data.type === 'notice') {\n        // user-api has no single-notice endpoint, so notices must not reach\n        // the generic findRecord/reload handling below; the notice service\n        // re-fetches the full list on didReceiveNotice instead.\n        return;\n      }\n\n      if (data && ['course', 'setting'].includes(data.type)) {\n        const user = this.session.user;\n\n        return resolve(user.courses)\n          .then((courses) => courses.reload())\n          .then(() => this.subscribe())\n          .then(async () => {\n            const course = user.courses.find((course) => course.id === data.id);\n\n            const setting = await resolve(course.setting);\n            await setting.reload();\n\n            this.trigger(data.type, setting);\n\n            return all([\n              setting.shortcutFiles,\n              setting.shortcuts,\n              setting.helpList,\n            ]);\n          })\n          .then(([shortcutFiles, shortcuts, helpList]) => {\n            if (helpList) {\n              this.helpList.setActiveHelpList(helpList);\n            } else {\n              this.helpList.resetActiveHelpList();\n            }\n\n            return all([\n              shortcutFiles.reload(),\n              shortcuts.reload(),\n              helpList?.reload(),\n            ]);\n          });\n      }\n\n      if (data && data.type === 'answer') {\n        const answer = this.store.peekRecord('answer', data.id);\n\n        if (answer) {\n          const url = `${config.endpoint}/api/v1/meta/answers/${data.id}`;\n\n          return this.fetch.request(url, true).then((response) => {\n            if (\n              !['started', 'not-started'].includes(answer.status) &&\n              response?.data?.attributes?.status\n            ) {\n              answer.status = response.data.attributes.status;\n            }\n          });\n        }\n\n        return resolve();\n      }\n\n      if (data && data.type === 'maintenance-mode') {\n        return this.session.user.reload();\n      }\n\n      if (data && data.type === 'license') {\n        if (channel?.name?.startsWith('private-user-')) {\n          return this.session.refreshUserLicenses();\n        } else {\n          if (data.user === this.session.user.id) {\n            return resolve();\n          }\n\n          const pushedLicense = data.data;\n\n          this.store.peekAll('course').forEach((course) => {\n            if (!course.active) return;\n\n            if (\n              !course.hasMany('products').ids().includes(pushedLicense.isbn)\n            ) {\n              return;\n            }\n\n            if (course.hasMany('missingLicenseProducts').value() === null) {\n              return;\n            }\n\n            course.licensesHaveChanged = true;\n          });\n        }\n      }\n\n      if (data && data.type === 'school') {\n        if (channel?.name?.startsWith('private-school-')) {\n          return resolve(this.session.user.school).then((school) => {\n            return school.users.reload();\n          });\n        }\n      }\n\n      if (\n        ['custom-content', 'setting'].includes(data?.type) &&\n        data?.user === this.session.user?.id\n      ) {\n        // Prevent reloading of data for the same user that modified it\n        return;\n      }\n\n      if (event === EVENTS.create) {\n        const record = this.store.peekRecord(data.type, data.id);\n\n        if (!record) {\n          try {\n            const newRecord = await this.store.findRecord(data.type, data.id);\n\n            this.trigger(data.type, newRecord, 'create');\n          } catch (error) {\n            // console.log(error);\n          }\n        }\n      } else if (event === EVENTS.update) {\n        let record = this.store.peekRecord(data.type, data.id);\n\n        if (record && !record.isSaving) {\n          try {\n            await record.reload();\n            this.trigger(data.type, record, 'update');\n          } catch (error) {\n            // NOTE If we cannot reload the record, we can assume it's no longer\n            // available and should thus be unloaded from the store.\n            this.trigger(data.type, record, 'willDelete');\n            record.unloadRecord();\n          }\n        } else {\n          try {\n            record = await this.store.findRecord(data.type, data.id);\n            this.trigger(data.type, record, 'create');\n          } catch (error) {\n            // console.log(error);\n          }\n        }\n      } else if (event === EVENTS.destroy) {\n        const record = this.store.peekRecord(data.type, data.id);\n\n        if (record && !record.isDeleted) {\n          this.trigger(data.type, record, 'willDelete');\n          record.deleteRecord();\n          this.trigger(data.type, record, 'didDelete');\n        }\n      } else if (event === EVENTS.logout) {\n        this.trigger('logout', data);\n      }\n    });\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\n\nexport default class ReadNoticesService extends Service {\n  @service ajax;\n\n  @service session;\n\n  @tracked _keys = new Set();\n\n  @tracked loaded = false;\n\n  _loadPromise = null;\n\n  load() {\n    if (this._loadPromise) return this._loadPromise;\n\n    const user = this.session?.user;\n    if (!user?.id) return Promise.resolve();\n\n    this._loadPromise = (async () => {\n      try {\n        const response = await this.ajax.request(\n          `${config.userApiEndpoint}/api/users/${user.id}/read-notices`,\n          true,\n          { type: 'GET' }\n        );\n\n        this._keys = new Set(\n          (response?.data ?? [])\n            .map((record) => record?.attributes?.notice_key)\n            .filter(Boolean)\n        );\n      } catch (error) {\n        // Keep defaults on failure\n      } finally {\n        this.loaded = true;\n      }\n    })();\n\n    return this._loadPromise;\n  }\n\n  has(key) {\n    return this._keys.has(key);\n  }\n\n  async markAsRead(key) {\n    if (this._keys.has(key)) return;\n\n    const user = this.session?.user;\n    if (!user?.id) return;\n\n    const next = new Set(this._keys);\n    next.add(key);\n    this._keys = next;\n\n    try {\n      await this.ajax.request(\n        `${config.userApiEndpoint}/api/users/${user.id}/read-notices`,\n        true,\n        {\n          type: 'POST',\n          contentType: 'application/vnd.api+json',\n          data: JSON.stringify({\n            data: { attributes: { notice_key: key } },\n          }),\n        }\n      );\n    } catch (error) {\n      const rollback = new Set(this._keys);\n      rollback.delete(key);\n      this._keys = rollback;\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport { cancel, later, next } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport MicRecorder from 'mic-recorder-to-mp3';\n\nexport default class RecordAudioService extends Service {\n  @tracked recorder;\n  @tracked audio = null;\n  @tracked uuid = null;\n  @tracked recordingsArray = [];\n\n  @action async startRecording() {\n    this.recorder = await this.handleStartRecord();\n    this.recorder.start();\n  }\n\n  @action async stopRecording() {\n    this.audio = await this.recorder.stop();\n    const index = this.recordingsArray.findIndex((object) => {\n      return object.uuid === this.uuid;\n    });\n\n    if (index != -1) {\n      this.recordingsArray[index].audio = this.audio;\n    } else {\n      this.recordingsArray.push({ audio: this.audio, uuid: this.uuid });\n    }\n    return;\n  }\n\n  returnRecording(searchId) {\n    const result = this.recordingsArray.find(({ uuid }) => uuid === searchId);\n    return this.recordingsArray.length > 1 ? result.audio : this.audio;\n  }\n\n  handleStartRecord() {\n    return new Promise((resolve) => {\n      const recorder = new MicRecorder({\n        bitRate: 128,\n      });\n\n      const start = () => {\n        recorder.start().catch((e) => {\n          console.error(e);\n        });\n      };\n\n      const stop = () => {\n        return new Promise((resolve) => {\n          recorder\n            .stop()\n            .getMp3()\n            .then(([buffer, audioBlob]) => {\n              const file = new File(buffer, 'music.mp3', {\n                type: audioBlob.type,\n                lastModified: Date.now(),\n              });\n              const audioUrl = new Audio(URL.createObjectURL(file));\n\n              resolve({ audioBlob, audioUrl });\n            })\n            .catch((e) => {\n              console.error(e);\n            });\n        });\n      };\n\n      resolve({ start, stop });\n    });\n  }\n}\n","import { getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport config from 'babel/config/environment';\nimport jwtDecode from 'ember-cli-jwt-decode';\nimport { storageFor } from 'ember-local-storage';\nimport { getConfig } from 'ember-simple-auth-oidc/config';\nimport ESASession from 'ember-simple-auth-oidc/services/session';\nimport getAbsoluteUrl from 'ember-simple-auth-oidc/utils/absolute-url';\nimport { generatePkceChallenge } from 'ember-simple-auth-oidc/utils/pkce';\nimport { resolve } from 'rsvp';\nimport { v4 } from 'uuid';\n\nexport default class SessionService extends ESASession {\n  @service imbox;\n\n  @service store;\n\n  @service router;\n\n  @service pusher;\n\n  @service ajax;\n\n  @service fetch;\n\n  @service ilt;\n\n  @tracked accesses;\n\n  @storageFor('session-states') states;\n\n  @tracked lastLoggedProduct = null;\n\n  get inPreviewMode() {\n    // The stored flag lives in localStorage and survives logout/login, so it\n    // must be combined with the current user's allow_preview claim.\n    return Boolean(this.states.get('inPreviewMode') && this.allowPreview);\n  }\n\n  set inPreviewMode(val) {\n    this.states.set('inPreviewMode', val);\n  }\n\n  get inUndercover() {\n    return this.states?.inUndercover;\n  }\n\n  get accessToken() {\n    return this.session?.content?.authenticated?.access_token;\n  }\n\n  get clientUserRole() {\n    if (!this.accessToken) {\n      return undefined;\n    }\n    return jwtDecode(this.accessToken)?.role;\n  }\n\n  get isUser() {\n    return this.clientUserRole === 'user';\n  }\n\n  get isAdmin() {\n    return this.clientUserRole === 'admin';\n  }\n\n  get isSuperAdmin() {\n    return this.clientUserRole === 'superadmin';\n  }\n\n  get allowPreview() {\n    if (!this.accessToken) {\n      return false;\n    }\n    return jwtDecode(this.accessToken)?.allow_preview;\n  }\n\n  get hasCMSAccess() {\n    const accessToken = this.session?.content?.authenticated?.access_token;\n\n    if (!accessToken) {\n      return false;\n    }\n\n    const idpRoles = jwtDecode(accessToken)?.idp_roles ?? [];\n\n    return idpRoles.some((role) => ['cms_admin', 'cms_editor'].includes(role));\n  }\n\n  constructor() {\n    super(...arguments);\n\n    this.pusher.on('logout', (logoutEvent) => {\n      const idToken = this.data.authenticated.id_token;\n\n      if (idToken) {\n        // if the session sent by logoutEvent is the same as idToken session\n        // we should logout this session\n        if (jwtDecode(idToken).sid === logoutEvent.id) {\n          // Invalidate the ember-simple-auth session\n          this.invalidate();\n\n          const authenticator = this.session._lookupAuthenticator(\n            this.session.authenticator\n          );\n\n          // Trigger a single logout on the authorization server\n          return authenticator.singleLogout(idToken);\n        }\n      } else {\n        this.router.transitionTo('/login');\n      }\n    });\n  }\n\n  refreshUserSession() {\n    return this.ajax.request(\n      `${config.userApiEndpoint}/api/users/refresh-userdata`,\n      true,\n      {\n        type: 'GET',\n      }\n    );\n  }\n\n  refreshUserLicenses() {\n    return this.ajax\n      .request(`${config.userApiEndpoint}/api/users/refresh-licenses`, true, {})\n      .then((data) =>\n        resolve(this.user.licenses)\n          .then((licenses) =>\n            licenses\n              .reload()\n              .then(() => licenses.invoke('notifyPropertyChange', 'userIds'))\n          )\n          .then(() => data)\n      );\n  }\n\n  load(stayOnPage = false) {\n    return this.store\n      .queryRecord('user', { me: true })\n      .then((user) => {\n        // Attempt to fetch an ILT token\n        this.ilt.getToken().catch(() => {});\n\n        if (!this.user) {\n          this.user = user;\n        }\n\n        return user;\n      })\n      .then((user) => {\n        user.get('school').then((school) => {\n          this.imbox.load(user, school);\n        });\n\n        return user;\n      })\n      .then((user) =>\n        this.fetch\n          .request(\n            `${config.endpoint}/api/v1/meta/accesses?user_id=${user.id}`,\n            true,\n            { type: 'GET' }\n          )\n          .then((response) => {\n            this.accesses = (response?.data || [])\n              .map((access) => access?.relationships?.node?.data?.id)\n              .filter((id) => id);\n          })\n          .catch(() => {})\n          .finally(() => user)\n      )\n      .catch(() => {\n        this.invalidate();\n\n        if (!stayOnPage) this.triggerPromptNone();\n      });\n  }\n\n  triggerPromptNone() {\n    const state = v4();\n\n    // Store state to session data\n    // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n    this.set('data.state', state);\n\n    /**\n     * Store the `nextURL` in the localstorage so when the user returns after\n     * the login he can be sent back to error destination.\n     */\n    // eslint-disable-next-line ember/classic-decorator-no-classic-methods\n    this.set('data.nextURL', window.location.pathname);\n\n    const esaConfig = getConfig(getOwner(this));\n\n    const { protocol, host } = location;\n\n    let search = [\n      `client_id=${esaConfig.clientId}`,\n      `redirect_uri=${protocol}//${host}/login`, // cant use this.redirectUri because it will point to whatever route path we are on\n      `response_type=code`,\n      `state=${state}`,\n      `scope=${esaConfig.scope}`,\n      `prompt=none`,\n    ];\n\n    if (esaConfig.enablePkce) {\n      const pkceChallenge = generatePkceChallenge(this.data.pkceCodeVerifier);\n      search.push(`code_challenge=${pkceChallenge}`);\n      search.push('code_challenge_method=S256');\n    }\n\n    search = search.filter(Boolean).join('&');\n\n    location.replace(\n      `${getAbsoluteUrl(esaConfig.host)}${esaConfig.authEndpoint}?${search}`\n    );\n  }\n\n  singleLogout() {\n    const idToken = this.data.authenticated.id_token;\n\n    // Invalidate the ember-simple-auth session\n    this.invalidate();\n\n    if (idToken) {\n      // Trigger a single logout on the authorization server\n      const authenticator = this.session._lookupAuthenticator(\n        this.session.authenticator\n      );\n\n      return authenticator.singleLogout(idToken);\n    } else {\n      // No id_token found which means we can not use post_logout_redirect_uri\n      return location.replace(\n        `${config['ember-simple-auth-oidc'].host}/session/end`\n      );\n    }\n  }\n\n  invalidateSession() {\n    return this.invalidate();\n  }\n\n  restore() {\n    return this.session.restore();\n  }\n}\n","import { later } from '@ember/runloop';\nimport Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport combineStyle from 'compton/utils/combine-style';\n\n// The entire path must exist for each file\nconst FILES = [\n  { name: 'error', path: '/assets/audios/error.mp3' },\n  { name: 'success', path: '/assets/audios/success.mp3' },\n  { name: 'swoosch', path: '/assets/audios/turned_in.mp3' },\n  { name: 'correct', path: '/assets/images/response/correct.svg' },\n  { name: 'turned-in', path: '/assets/images/response/turned-in.svg' },\n  { name: 'done', path: '/assets/images/response/done.svg' },\n];\n\nexport default class ShowResponseService extends Service {\n  @tracked mode;\n\n  @tracked audioSrc;\n\n  @tracked imgSrc;\n\n  @tracked imgStyle;\n\n  handleResponse(id, mode) {\n    switch (mode) {\n      case 'wrong':\n        this.mode = 'error';\n        this.playSound(id, 'error');\n        break;\n      case 'correct':\n        this.mode = 'success';\n        this.playSound(id, 'success');\n        this.showImage(id, 'correct');\n        break;\n      case 'done':\n        this.mode = 'done';\n        this.playSound(id, 'success');\n        this.showImage(id, 'done');\n        break;\n      default:\n        this.mode = 'turned-in';\n        this.playSound(id, 'swoosch');\n        this.showImage(id, 'turned-in');\n    }\n\n    later(() => {\n      this.reset();\n    }, 2100);\n  }\n\n  playSound(id, name) {\n    const pathObj = FILES.findBy('name', name);\n\n    this.audioSrc = pathObj?.path;\n\n    const elem = document.querySelector(`#${id}`);\n    const audio = elem.querySelector('.show-response-audio');\n\n    if (audio) {\n      audio.onload = () => {\n        audio.play();\n      };\n    }\n  }\n\n  showImage(id, name) {\n    const elem = document.querySelector(`#${id}`);\n    const parent = elem?.parentElement;\n    const rect = parent?.getBoundingClientRect();\n    const left = Math.floor(rect?.left + rect?.width / 2 - 144 / 2);\n    const height = 144;\n    const width = 144;\n    const pathObj = FILES.findBy('name', name);\n\n    this.imgSrc = pathObj?.path;\n    this.imgStyle = combineStyle({ left, height, width });\n  }\n\n  reset() {\n    this.audioSrc = null;\n    this.imgSrc = null;\n  }\n}\n","import { alias } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\nimport { storageFor } from 'ember-local-storage';\nimport { resolve } from 'rsvp';\n\nexport default Service.extend({\n  // SETUP\n\n  ilt: service(),\n\n  session: service(),\n\n  speakerSession: storageFor('speaker-session'),\n\n  // PROPERTIES\n\n  iltJwt: alias('speakerSession.iltJwt'),\n\n  iltEnabled: alias('speakerSession.iltEnabled'),\n\n  // METHODS\n\n  reset() {\n    this.set('iltJwt', null);\n    this.set('iltEnabled', null);\n  },\n\n  iltError() {\n    this.set('iltJwt', null);\n    this.set('iltEnabled', false);\n  },\n\n  // Fetch token through Digilär's backend and return a Promise that resolves with the new token as a string\n  // Should resolve with null payload instead of rejecting if a token could not be fetched.\n  async getJwt() {\n    // Check if ILT is enabled before doing anything else\n    // Note! The initial state of iltEnabled is null, which means that we don't know yet if ILT should be enabled or disabled.\n    // In this case we consider iltEnabled==null to mean \"enabled\", to allow the initial ILT authentication attempt.\n    if (this.get('iltEnabled') === false) {\n      return resolve();\n    }\n\n    await this.ilt.getToken().catch(() => {});\n\n    if (this.ilt.hasNarratedStudyMaterial) {\n      this.set('iltJwt', this.ilt.token);\n      this.set('iltEnabled', true);\n\n      return this.ilt.token;\n    } else {\n      this.set('iltJwt', null);\n      this.set('iltEnabled', false);\n    }\n  },\n});\n","import Service from '@ember/service';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport DigilarSpeakerConfig from 'babel/utils/speaker/DigilarSpeakerConfig';\n\nexport default class SpeakerService extends Service {\n  @service audioManager;\n  // INTERNAL PROPERTIES ///////////////////////////////////////////////////////\n\n  // By default, speaker is never activated.\n  @tracked active = false;\n\n  @tracked activeSpeakerAdapter = null;\n\n  @tracked encourageListeningEnabled = false;\n\n  @tracked digilarRecordedSpeechEnabled = false;\n\n  // true will automatically start playing speaker when content is loaded and speaker is active.\n  @tracked _autoplay = false;\n\n  // Keep an array of speaker contexts. Each context will register/unregister itself.\n  _activeSpeakerContexts = null;\n\n  constructor() {\n    super(...arguments);\n    this._activeSpeakerContexts = [];\n    this.digilarSpeakerConfig = new DigilarSpeakerConfig({\n      getContextData: () => {\n        // No context data required here\n        return {};\n      },\n    });\n  }\n\n  // PUBLIC/COMPUTED PROPERTIES ////////////////////////////////////////////////\n\n  // A property that can be set to true to temporarily disable speaker completely,\n  // for example for specific contents that we don't want speaker functionality for\n  // Use with care!\n  disabled = false;\n\n  // When a recorded speech plugin is initialized/activated with at least one audio source,\n  // this property will be set to that provider's id, one of: ['digilar', 'ilt']\n  activeRecordedSpeechProvider = null;\n\n  get autoplay() {\n    return this._autoplay;\n  }\n\n  // Contains the uuid of the SpeakerContext that should be considered as currently active.\n  // Makes it possible to for example restrict keyboard controls to a single SpeakerContext\n  activeSpeakerContextUuid = null;\n\n  // Contains the uuid of the SpeakerContext that last started playing an audio source.\n  // Makes it possible to pause all other speaker contexts when a new context has started playing.\n  lastPlayingSpeakerContextUuid = null;\n\n  // To avoid pitch changes when playback rate changes, the user's speech speed setting does not always have an effect.\n  // This property will change whenever a new speaker context becomes active\n  // The \"Adapt\" menu can then check this flag to determine how to handle it.\n  speechSpeedSettingHasEffectForActiveSpeaker = true;\n\n  // The speaker needs to know if a story is displayed in cinema mode (image only) or not (image+text)\n  // Will change by action toggling cinema mode on/off\n  storyCinemaMode = false;\n\n  // PUBLIC FUNCTIONS /////////////////////////////////////////////////////////\n\n  // Set speaker active state\n  setSpeakerActive(isActive) {\n    this.active = !!isActive;\n  }\n\n  // Toggle speaker active state\n  toggleSpeakerActive() {\n    this.active = !this.active;\n  }\n\n  // Reset active state, for example when route is changed\n  resetSpeakerActive() {\n    this._autoplay = false;\n  }\n\n  // Set autoplay on/off\n  setAutoplay(autoplay) {\n    this._autoplay = !!autoplay;\n  }\n\n  registerSpeakerContext(context) {\n    const uuids = this._activeSpeakerContexts?.map((cx) => {\n      return cx.getUuid();\n    });\n\n    if (!uuids.includes(context.getUuid())) {\n      this._activeSpeakerContexts.push(context);\n      // console.debug(`- Registered context ${contextUuid} with speaker service. Registered contexts =`, this.get('_activeSpeakerContextUuids'));\n    }\n  }\n\n  unregisterSpeakerContext(context) {\n    this._activeSpeakerContexts = this._activeSpeakerContexts.filter((obj) => {\n      return obj.getUuid() !== context.getUuid();\n    });\n  }\n\n  countRegisteredSpeakerContexts() {\n    return this._activeSpeakerContexts.length;\n  }\n\n  getRegisteredSpeakerContexts() {\n    return this._activeSpeakerContexts;\n  }\n\n  pauseOther(...others) {\n    // For all speaker contexts, pause any playing audio\n    this.getRegisteredSpeakerContexts()?.forEach((speakerContext) => {\n      speakerContext?.forEachSpeaker((sandbox) => {\n        const adapter = sandbox?.speakerAdapter;\n\n        if (adapter) {\n          if (adapter.isPlaying) adapter.pause();\n\n          // Add a listener to the adapter, if it is started, pause any playing audio\n          adapter.one('play', () => {\n            others.filter(Boolean).forEach((pause) => pause());\n\n            if (this.audioManager.currentAudio) {\n              this.audioManager.currentAudio.pause();\n            }\n          });\n        }\n      });\n    });\n  }\n}\n","// eslint-disable-next-line ember/use-ember-data-rfc-395-imports\nimport Store from 'ember-data/store';\n\nexport default class CustomStore extends Store {\n  createRecord() {\n    const model = super.createRecord(...arguments);\n    const attrs = model?.constructor?.attributes;\n\n    if (attrs) {\n      attrs.forEach((attr) => {\n        const key = attr?.name;\n\n        if (key && model[key]) {\n          // self assign model key to trigger som internal ember-data stuff\n          // that solves the defaultValue bugs in DINO-2210\n          // eslint-disable-next-line no-self-assign\n          model[key] = model[key];\n        }\n      });\n    }\n\n    return model;\n  }\n}\n","import { action } from '@ember/object';\nimport Service from '@ember/service';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class StudentListService extends Service {\n  @service router;\n  @service store;\n  @service contextHelper;\n  @service ajax;\n\n  @tracked isOpen = false;\n\n  @action\n  openModal() {\n    this.isOpen = true;\n  }\n\n  @action\n  closeDrawer() {\n    this.isOpen = false;\n  }\n}\n","import { get as proxyGet } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Service, { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport sanitizeHtml from 'ember-cli-sanitize-html';\n\n/* eslint-disable ember/no-get */\nexport default class TeacherAssignmentDispatcherService extends Service {\n  @service session;\n  @service store;\n  @service intl;\n  @service snackbar;\n  @service confirmManager;\n\n  @tracked highlightedTeacherAssignments = [];\n\n  async save(teacherAssignment, publish = false) {\n    try {\n      teacherAssignment?.exercise?.assignments?.forEach((assignment) => {\n        const pattern = assignment.content?.pattern ?? '';\n        const textContent = sanitizeHtml(pattern, { allowedTags: [] });\n\n        if (textContent.replace(/\\s/g, '').length > 0) {\n          assignment.settings?.set('pattern', true);\n        } else {\n          assignment.settings?.set('pattern', false);\n        }\n      });\n\n      teacherAssignment.public = publish;\n      const result = await teacherAssignment.save();\n      this.#success('save');\n      return result;\n    } catch (error) {\n      this.#error('save');\n      throw error;\n    }\n  }\n\n  delete(teacherAssignment) {\n    return this.#confirm('delete', { danger: true }).then(async () => {\n      try {\n        const result = await teacherAssignment.destroyRecord();\n        this.#success('delete');\n        return result;\n      } catch (error) {\n        this.#error('delete');\n        throw error;\n      }\n    });\n  }\n\n  async deleteMany(teacherAssignments) {\n    return this.#confirm(\n      'deleteMany',\n      {\n        danger: true,\n      },\n      teacherAssignments.length\n    ).then(async () => {\n      try {\n        const result = await Promise.all(\n          teacherAssignments.map((teacherAssignment) =>\n            teacherAssignment.destroyRecord()\n          )\n        );\n        this.#success('deleteMany', { count: teacherAssignments.length });\n        return result;\n      } catch (error) {\n        this.#error('delete');\n        throw error;\n      }\n    });\n  }\n\n  async link(teacherAssignment, content) {\n    try {\n      const result = await this.#link(teacherAssignment, content);\n      this.#success('link');\n      return result;\n    } catch (error) {\n      this.#error('link');\n      throw error;\n    }\n  }\n\n  async linkMany(teacherAssignments, content) {\n    try {\n      const result = await Promise.all(\n        teacherAssignments.map((teacherAssignment) =>\n          this.#link(teacherAssignment, content)\n        )\n      );\n      this.#success('linkMany', { count: teacherAssignments.length });\n      return result;\n    } catch (error) {\n      this.#error('linkMany');\n      throw error;\n    }\n  }\n\n  unlink(teacherAssignment, content) {\n    return this.#confirm('unlink', { danger: true }).then(async () => {\n      try {\n        teacherAssignment.rollback();\n        teacherAssignment.get('contents').removeObject(content);\n        const result = await teacherAssignment.save();\n        this.#success('unlink');\n        return result;\n      } catch (error) {\n        this.#error('unlink');\n        throw error;\n      }\n    });\n  }\n\n  highlight(teacherAssignment) {\n    this.highlightMany([teacherAssignment]);\n  }\n\n  highlightMany(teacherAssignments) {\n    this.highlightedTeacherAssignments.addObjects(teacherAssignments);\n\n    later(() => {\n      this.highlightedTeacherAssignments.removeObjects(teacherAssignments);\n    }, 3000);\n  }\n\n  #confirm(method, options, count = 1) {\n    return this.confirmManager.perform(\n      this.intl.t(`services.teacherAssignmentDispatcher.${method}.confirm`, {\n        count,\n      }),\n      options\n    );\n  }\n\n  #success(method, { count = 1 } = {}) {\n    this.snackbar.enqueue(\n      this.intl.t(\n        `services.teacherAssignmentDispatcher.${method}.snackbar.success`,\n        {\n          count,\n        }\n      ),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  }\n\n  #error(method, count = 1) {\n    this.snackbar.enqueue(\n      this.intl.t(\n        `services.teacherAssignmentDispatcher.${method}.snackbar.error`\n      ),\n      {\n        variant: 'error',\n      },\n      { count }\n    );\n  }\n\n  async #link(teacherAssignment, content) {\n    const book = await proxyGet(content, 'book');\n\n    teacherAssignment.rollback();\n    proxyGet(teacherAssignment, 'books').addObject(book);\n    proxyGet(teacherAssignment, 'contents').addObject(content);\n\n    return teacherAssignment.save();\n  }\n}\n","import Service, { inject as service  } from '@ember/service';\n\nexport default Service.extend({\n  speakerService: service('speaker'),\n  \n\n\n  pauseOtherVideos(excludedVideoId) {\n\n    if(this.speakerService && this.speakerService.active) {\n      this.speakerService.pauseOther();\n    }\n\n    if(window !== undefined && window.document) {\n      const documentVideos = document.getElementsByTagName('video');\n      \n      this._pauseIltVideo(excludedVideoId);\n      // We only pause videos that are currently playing\n      Array.from(documentVideos)\n      .filter(video => {  return !video.paused && video.id !== excludedVideoId;})\n      .forEach(video => { video.pause(); });\n      \n    }\n  },\n\n  /**\n   * Since ILT-video component is external and we do not have direct access to it,\n   * we need to pause the video by finding the video element in the DOM and pausing it.\n   * This is a workaround for the fact that we cannot directly access the ILT-video component\n   * from the Ember component.\n   * @param {string} excludedVideoId \n   */\n  _pauseIltVideo (excludedVideoId) {\n    const iltElements = document.querySelectorAll('.ilt-video');\n\n    Array.from(iltElements)\n    .filter(element => {\n      const video = element.querySelector('video');\n      return video && !video.paused && video.id !== excludedVideoId;\n    })\n    .forEach(element => {\n        const playButton = element.querySelector('.video-controls__button--play');\n        if (playButton) {\n          playButton.click();\n        }\n    })\n  }\n\n})\n","import Service from '@ember/service';\nimport { inject as service } from '@ember/service';\n\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\n\nexport default Service.extend({\n  // SETUP\n\n  session: service(),\n\n  store: service(),\n\n  intl: service(),\n\n  snackbar: service(),\n\n  confirm: service('confirmManager'),\n\n  // METHODS\n\n  save(word) {\n    const onResolve = () => {\n      this._success('save');\n    };\n\n    const onReject = () => {\n      this._error('save');\n    };\n\n    // NOTE Make sure that we return the orginal promise.\n    const promise = word.save().then(() => {\n      return word.get('wordlist').then((wordlist) => {\n        wordlist.get('words').addObject(word);\n        trackWordlistEvent('Spara ord');\n        return wordlist.save();\n      });\n    });\n    promise.then(onResolve, onReject);\n    return promise;\n  },\n\n  delete(word) {\n    return this._confirm('delete', { danger: true }).then(() => {\n      const onResolve = () => {\n        this._success('delete');\n      };\n\n      const onReject = () => {\n        this._error('delete');\n      };\n\n      // NOTE Make sure that we return the orginal promise.\n      trackWordlistEvent('Ta bort ord');\n      const promise = word.destroyRecord();\n      promise.then(onResolve, onReject);\n      return promise;\n    });\n  },\n\n  // PRIVATE\n\n  _confirm(method, options) {\n    return this.get('confirm').perform(\n      this.get('intl').t(\n        ['services', 'wordDispatcher', method, 'confirm'].join('.')\n      ),\n      options\n    );\n  },\n\n  _success(method) {\n    this.get('snackbar').enqueue(\n      this.get('intl').t(\n        ['services', 'wordDispatcher', method, 'snackbar', 'success'].join('.')\n      ),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  },\n\n  _error(method) {\n    this.get('snackbar').enqueue(\n      this.get('intl').t(\n        ['services', 'wordDispatcher', method, 'snackbar', 'error'].join('.')\n      ),\n      {\n        variant: 'error',\n      }\n    );\n  },\n});\n","import { get as proxyGet } from '@ember/object';\nimport { later } from '@ember/runloop';\nimport Service, { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { trackWordlistEvent } from 'babel/utils/matomo-events';\n\n/* eslint-disable ember/no-get */\nexport default class WordlistDispatcher extends Service {\n  @service session;\n  @service store;\n  @service intl;\n  @service snackbar;\n  @service confirmManager;\n\n  @tracked highlightedWordlists = [];\n\n  async save(wordlist, publish = false) {\n    const wasNew = wordlist.isNew;\n    const wasPublished = Boolean(wordlist.public);\n\n    try {\n      wordlist.public = publish;\n      const result = await wordlist.save();\n      this.#success('save');\n\n      if (wasNew) {\n        trackWordlistEvent('Skapa');\n      }\n\n      if (publish && !wasPublished) {\n        trackWordlistEvent('Publicera');\n      } else if (!publish && wasPublished) {\n        trackWordlistEvent('Avpublicera');\n      } else if (!wasNew) {\n        trackWordlistEvent('Uppdatera');\n      }\n\n      return result;\n    } catch (error) {\n      this.#error('save');\n      throw error;\n    }\n  }\n\n  async delete(wordlist) {\n    return this.#confirm('delete', { danger: true }).then(async () => {\n      try {\n        const result = await wordlist.destroyRecord();\n        this.#success('delete');\n        trackWordlistEvent('Ta bort');\n        return result;\n      } catch (error) {\n        this.#error('delete');\n        throw error;\n      }\n    });\n  }\n\n  async deleteMany(wordlists) {\n    const wordlistCount = wordlists.length;\n\n    return this.#confirm('deleteMany', { danger: true }, wordlists.length).then(\n      async () => {\n        try {\n          const result = await Promise.all(\n            wordlists.map((wordlist) => wordlist.destroyRecord())\n          );\n          this.#success('deleteMany', { count: wordlists.length });\n          trackWordlistEvent('Ta bort flera', wordlistCount);\n          return result;\n        } catch (error) {\n          this.#error('delete');\n          throw error;\n        }\n      }\n    );\n  }\n\n  async link(wordlist, content) {\n    try {\n      const result = await this.#link(wordlist, content);\n      this.#success('link');\n      trackWordlistEvent('Länka');\n      return result;\n    } catch (error) {\n      this.#error('link');\n      throw error;\n    }\n  }\n\n  async linkMany(wordlists, content) {\n    const wordlistCount = wordlists.length;\n\n    try {\n      const result = await Promise.all(\n        wordlists.map((wordlist) => this.#link(wordlist, content))\n      );\n      this.#success('linkMany', { count: wordlists.length });\n      trackWordlistEvent('Länka flera', wordlistCount);\n      return result;\n    } catch (error) {\n      this.#error('linkMany');\n      throw error;\n    }\n  }\n\n  unlink(wordlist, content) {\n    return this.#confirm('unlink', { danger: true }).then(async () => {\n      try {\n        wordlist.rollback();\n        wordlist.get('contents').removeObject(content);\n        const result = await wordlist.save();\n        this.#success('unlink');\n        trackWordlistEvent('Koppla bort');\n        return result;\n      } catch (error) {\n        this.#error('unlink');\n        throw error;\n      }\n    });\n  }\n\n  async duplicate(wordlist, content) {\n    try {\n      const result = await wordlist.duplicate(content);\n      this.#success('duplicate');\n      trackWordlistEvent('Duplicera');\n      return result;\n    } catch (error) {\n      this.#error('duplicate');\n      throw error;\n    }\n  }\n\n  highlight(wordlist) {\n    this.highlightMany([wordlist]);\n  }\n\n  highlightMany(wordlists) {\n    this.highlightedWordlists.addObjects(wordlists);\n\n    later(() => {\n      this.highlightedWordlists.removeObjects(wordlists);\n    }, 3000);\n  }\n\n  #confirm(method, options, count = 1) {\n    return this.confirmManager.perform(\n      this.intl.t(`services.wordlistDispatcher.${method}.confirm`, {\n        count,\n      }),\n      options\n    );\n  }\n\n  #success(method, { count = 1 } = {}) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.wordlistDispatcher.${method}.snackbar.success`, {\n        count,\n      }),\n      {\n        variant: 'success',\n        autoDismiss: true,\n      }\n    );\n  }\n\n  #error(method, count = 1) {\n    this.snackbar.enqueue(\n      this.intl.t(`services.wordlistDispatcher.${method}.snackbar.error`),\n      {\n        variant: 'error',\n      },\n      { count }\n    );\n  }\n\n  async #link(wordlist, content) {\n    const book = await proxyGet(content, 'book');\n\n    wordlist.rollback();\n    proxyGet(wordlist, 'books').addObject(book);\n    proxyGet(wordlist, 'contents').addObject(content);\n\n    return wordlist.save();\n  }\n}\n","import Service from '@ember/service';\n\nexport default Service.extend({\n  transformMaterialWord(material, sort) {\n    return {\n      word: material.get('name'),\n      translation: material.get('metadata.translation'),\n      explanation: material.get('metadata.explanation'),\n      examples: material.get('metadata.examples'),\n      word_class: material.get('metadata.word_class'),\n      word_construction: material.get('metadata.word_construction'),\n      sort: sort\n    };\n  }\n});\n","import LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\n\nexport default LocalStorageStore.extend();\n","import StorageObject from 'ember-local-storage/session/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      showTip: true\n    };\n  }\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      content_visited: {}\n    };\n  }\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/session/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      showStepTip: true,\n      showZoomTip: true,\n      showMarkerTip: true,\n    };\n  },\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      // Integer in a range defined by template c-content-playsettings. At the moment [0, 2]. Will be mapped to actual playback speed by speaker-context.\n      speechSpeed: 1,\n      highlighting: {\n        words: true,\n        sentences: true,\n      },\n      followText: true,\n      // true will \"override\" pre-recorded speech as default audio source and always use a TTS provider such as Acapela\n      preferSpeechSynthesis: false,\n      // User's preferred TTS voices, will be indexed by language code\n      voices: {},\n    };\n  },\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      theme: 'light',\n      fontfamily: 'system-font',\n      marking: 'underlined',\n      mode: 'scroll',\n      onlytext: false,\n      onlyImage: false,\n      readRulerIsOpen: false,\n      readRulerSpace: 40,\n      readRulerOffset: 0,\n      textformats: 'on',\n      textsize: '2',\n      lineHeight: 'standard',\n    };\n  },\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      isMinimized: false,\n    };\n  },\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      inUndercover: false,\n      inPreviewMode: false,\n    };\n  },\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/session/object';\n\nconst Storage = StorageObject.extend();\n\n// Uncomment if you would like to set initialState\nStorage.reopenClass({\n  initialState() {\n    return {\n      // ILT (Inläsningstjänst) can be disabled for the session if user is not authorized,\n      // Note: Initial value is null until we have tried to authenticate user for ILT! After that it will be true/false.\n      iltEnabled: null,\n\n      // A JWT is required to fetch articles from ILT. The token will be fetched from Digilär's backend.\n      iltJwt: null\n    };\n  }\n});\n\nexport default Storage;\n","import StorageObject from 'ember-local-storage/local/object';\n\nconst Storage = StorageObject.extend();\n\nStorage.reopenClass({\n  initialState() {\n    return {\n      schoolMessageClosed: false,\n      schoolApplicationMessageClosed: null,\n    };\n  }\n});\n\nexport default Storage;\n","import StorageArray from 'ember-local-storage/local/array';\n\nconst Storage = StorageArray.extend();\n\nexport default Storage;\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.404.heading\\\")}}\\n\\n<Header />\\n\\n<XErrorPage\\n  @explanation={{t \\\"routes.404.explanation\\\"}}\\n  @greeting={{t \\\"routes.404.greeting\\\"}}\\n  @heading={{t \\\"routes.404.heading\\\"}}\\n  @statusCode={{404}}\\n/>\\n', { moduleName: 'babel/templates/404.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"app--loading\\\">\\n  <DcLoader />\\n</div>\\n', { moduleName: 'babel/templates/application-loading.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#unless\\n  (or\\n    (eq this.router.currentRouteName \\\"embed-audit-collection\\\")\\n    (eq this.router.currentRouteName \\\"embed-audit-collection-loading\\\")\\n  )\\n}}\\n  <NavigationNarrator\\n    @navigationText={{t \\\"controllers.application.navigationText\\\"}}\\n    @skipText={{t \\\"controllers.application.skipText\\\"}}\\n    @routeChangeValidator={{this.shouldScreenReaderRefocus}}\\n  />\\n{{/unless}}\\n\\n<XProgressBar @fixed={{true}} @active={{this.isLoading}} />\\n\\n<div\\n  class=\\\"master-page\\\"\\n  {{did-update this.languageChanged this.session.user.language}}\\n>\\n  {{outlet}}\\n</div>\\n\\n<XConfirmModal />\\n\\n<XSnackbar />\\n\\n{{#if this.session.allowPreview}}\\n  <PreviewActions />\\n{{/if}}\\n\\n{{#if\\n  (and\\n    this.helpList.isOpen\\n    this.contextHelper.activeCourse\\n    this.session.user.isTeacher\\n  )\\n}}\\n  <HelpList @course={{this.contextHelper.activeCourse}} />\\n{{/if}}\\n', { moduleName: 'babel/templates/application.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"app--loading\\\" style=\\\"background-color: white;\\\">\\n  <DcLoader />\\n</div>', { moduleName: 'babel/templates/embed-audit-collection-loading.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if (and this.model.collection this.model.exercise)}}\\n  <CourseAudit::Collection\\n    @collection={{this.model.collection}}\\n    @customContent={{this.model.customContent}}\\n    @exercise={{this.model.exercise}}\\n    @selectedStudent={{this.model.selectedStudent}}\\n    @selectedAnswerId={{this.model.selectedAnswerId}}\\n    @students={{this.model.resolvedStudents}}\\n    @answers={{this.model.answers}}\\n    @includedEntities={{this.model.includedEntities}}\\n    @allUsers={{this.model.allUsers}}\\n    @mode={{this.model.mode}}\\n    @openInNewTab={{true}}\\n  />\\n{{else}}\\n  <XAlert @variant=\\\"error\\\" class=\\\"m1\\\">\\n    {{t \\\"routes.embedAuditCollection.invalidParams\\\"}}\\n  </XAlert>\\n{{/if}}\\n', { moduleName: 'babel/templates/embed-audit-collection.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#if this.cookieConsent.accepted}}\\n  <NoticeManager />\\n{{else if this.cookieConsent.loaded}}\\n  <CookieMessage />\\n{{/if}}\\n\\n<Header />\\n\\n<main id=\\\"main\\\">\\n  {{outlet}}\\n</main>\\n\\n{{#if\\n  (and this.session.user.isTeacher (not this.groupsOnboarding.informationSeen))\\n}}\\n  <GroupFeatureWelcomeModal />\\n{{else if this.contextHelper.activeBook}}\\n  <ContextSelect @book={{this.contextHelper.activeBook}} />\\n{{/if}}\\n\\n{{#if this.entityInspector.modalIsOpen}}\\n  <UiPortal>\\n    <EntityInspector\\n      @title={{t (concat \\\"routes.master.\\\" this.entityInspector.modalSection)}}\\n      @onClose={{this.entityInspector.closeModal}}\\n      @selectedEntity={{this.entityInspector.inspectedEntity}}\\n      @section={{this.entityInspector.modalSection}}\\n    />\\n  </UiPortal>\\n{{/if}}\\n{{#if\\n  (and\\n    this.studentList.isOpen\\n    this.contextHelper.activeCourse\\n    this.session.user.isTeacher\\n  )\\n}}\\n  <CourseUserList @course={{this.contextHelper.activeCourse}} />\\n{{/if}}', { moduleName: 'babel/templates/master.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ArchiveView\\n  @archive={{this.model.archive}}\\n  @folder={{this.model.folder}}\\n  @materials={{this.model.materials}}\\n  @pageNumber={{this.pageNumber}}\\n  @onPageChange={{this.handlePageChange}}\\n/>\\n\\n{{outlet}}\\n', { moduleName: 'babel/templates/master/archives.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<MaterialViewer\\n  @material={{this.model}}\\n  @onClose={{this.handleMaterialViewerClose}}\\n/>', { moduleName: 'babel/templates/master/archives/folders/materials.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.model.parent.title}}\\n{{page-title this.model.title}}\\n\\n<div class=\\\"container mt6\\\">\\n\\n  <h1 class=\\\"content-title\\\">\\n\\n    {{this.model.title}}\\n\\n  </h1>\\n\\n  {{model-rejection model=this.model}}\\n  {{model-rejection model=this.model.children}}\\n\\n  {{area-view model=this.model}}\\n\\n</div>\\n\\n<div style=\\\"margin-bottom: 20vh;\\\"></div>', { moduleName: 'babel/templates/master/areas.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.model.title}}\\n\\n<BookHeader @model={{this.model}} />\\n\\n<div class=\\\"container\\\">\\n  {{book-announcement\\n    id=this.model.id\\n    announcement=this.model.body.announcement\\n    updated=this.model.body.announcement_updated\\n  }}\\n\\n  {{!-- {{model-rejection model=model.children}} --}}\\n  {{#if this.model.body.introduction}}\\n    {{content/c-preamble value=this.model.body.introduction}}\\n  {{/if}}\\n  {{book-view model=this.model}}\\n</div>\\n\\n<div style=\\\"margin-bottom: 20vh;\\\"></div>', { moduleName: 'babel/templates/master/books.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.content.parent.parent.title}}\\n{{page-title this.content.parent.title}}\\n{{page-title this.content.title}}\\n\\n{{#if this.isEverythingHidden }}\\n\\n  {{#x-alert class=\\\"m4\\\"}}\\n    {{#if this.activeCategory.name}}\\n      <span class=\\\"text-ui\\\">{{this.activeCategory.name}}</span>\\n      {{t \\\"routes.master.contents.categoryIsHidden\\\"}}\\n    {{else}}\\n      {{t \\\"routes.master.contents.everythingIsHidden\\\"}}\\n    {{/if}}\\n  {{/x-alert}}\\n{{else}}\\n  {{#if this.activeSection}}\\n\\n    {{page-title this.activeSection.title}}\\n\\n    {{focus-mode}}\\n\\n    <span {{did-update (action \\\"handleExerciseChange\\\") this.activeExercise}} />\\n\\n    {{content-topbar\\n      content=this.categorizedSections\\n      collections=this.categorizedCollections\\n      restrictedSections=this.restrictedSections\\n      restrictedCollections=this.restrictedCollections\\n      categories=this.categories\\n      activeCategory=this.activeCategory\\n      model=this.activeSection\\n      sections=this.categorizedSections\\n      wordlists=this.contentWordlists\\n      activeSection=this.activeSection\\n      template=this.template\\n      routeToSection=(action \\\"routeToSection\\\")\\n      onCategoryChange=(action \\\"handleCategoryChange\\\")\\n    }}\\n\\n    {{#content-sheet\\n      content=this.content\\n      sections=this.categorizedSections\\n      restrictedSections=this.restrictedSections\\n      restrictedCollections=this.restrictedCollections\\n      activeSection=this.activeSection\\n      answers=this.answers\\n      exercises=this.exercises\\n      activeExercise=this.activeExercise\\n      activeAnswer=this.activeAnswer\\n      wordlists=this.coverWordlists\\n      collections=this.coverCollections\\n      speakerContentInfo=this.speakerContentInfo\\n      exerciseId=this.activeExerciseId\\n      template=this.template\\n      settings=this.settings\\n      activeCategory=this.activeCategory\\n      cacheNextAndPreviousImage=(action \\\"cacheNextAndPreviousImage\\\")\\n      onNextSection=(action \\\"nextSection\\\")\\n      onPreviousSection=(action \\\"previousSection\\\")\\n      routeToSection=(action \\\"routeToSection\\\")\\n    }}\\n\\n      {{outlet}}\\n\\n    {{/content-sheet}}\\n\\n    {{read-ruler}}\\n  {{/if}}\\n{{/if}}', { moduleName: 'babel/templates/master/contents.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"assignments/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/assignments/edit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"assignments/error\\\" />\\n', { moduleName: 'babel/templates/master/contents/assignments/error.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"assignments/index\\\" />\\n', { moduleName: 'babel/templates/master/contents/assignments/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"assignments/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/assignments/new.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"assignments/show\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/assignments/show.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace\\n  @route=\\\"notes/edit\\\"\\n  @model={{this.model}}\\n/>\\n', { moduleName: 'babel/templates/master/contents/notes/edit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"notes/error\\\" />\\n', { moduleName: 'babel/templates/master/contents/notes/error.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"notes/index\\\" />\\n', { moduleName: 'babel/templates/master/contents/notes/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace\\n  @route=\\\"notes/edit\\\"\\n  @model={{this.model}}\\n/>\\n', { moduleName: 'babel/templates/master/contents/notes/new.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/wordlists/edit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/error\\\" />\\n', { moduleName: 'babel/templates/master/contents/wordlists/error.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/index\\\" />\\n', { moduleName: 'babel/templates/master/contents/wordlists/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/wordlists/new.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/show\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/wordlists/show/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/words/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/wordlists/show/words/edit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<Workspace @route=\\\"wordlists/words/edit\\\" @model={{this.model}} />\\n', { moduleName: 'babel/templates/master/contents/wordlists/show/words/new.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.model.name}}\\n\\n<CourseMain @course={{this.model}}>\\n  {{outlet}}\\n</CourseMain>\\n', { moduleName: 'babel/templates/master/courses/show.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.pageTitle\\\")}}\\n\\n{{outlet}}', { moduleName: 'babel/templates/master/courses/show/audit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.comments.pageTitle\\\")}}\\n\\n<CourseAudit\\n  @groups={{this.model.groups}}\\n  @students={{this.model.students}}\\n  @auditType=\\\"comments\\\"\\n  @studentSelectValue={{this.selectedStudent}}\\n  @isAuditing={{this.isAuditing}}\\n  as |audit|\\n>\\n  <CourseAudit::Comments\\n    @students={{audit.selectedStudents}}\\n    @books={{this.model.course.books}}\\n    @course={{this.model.course}}\\n    @onClick={{audit.onAnswerClick}}\\n  />\\n</CourseAudit>', { moduleName: 'babel/templates/master/courses/show/audit/comments.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.inbox.pageTitle\\\")}}\\n\\n<CourseAudit\\n  @groups={{this.model.groups}}\\n  @students={{this.model.students}}\\n  @auditType=\\\"inbox\\\"\\n  @studentSelectValue={{this.selectedStudent}}\\n  @isAuditing={{this.isAuditing}}\\n  as |audit|\\n>\\n  <XAwait @value={{this.model.course.books}} as |books|>\\n    <AnswerLog\\n      @books={{books}}\\n      @users={{if\\n        this.selectedStudent\\n        (array this.selectedStudent)\\n        this.model.students\\n      }}\\n      @inboxType={{this.inboxType}}\\n      @showDiagnosis={{false}}\\n      @inboxMode={{true}}\\n      @trackAuditEvents={{true}}\\n      @course={{this.model.course}}\\n      @onAnswerClick={{audit.onAnswerClick}}\\n    />\\n  </XAwait>\\n\\n  <div class=\\\"text-small my1\\\">\\n    {{t \\\"routes.master.courses.show.audit.inbox.inboxNote\\\"}}\\n  </div>\\n</CourseAudit>\\n', { moduleName: 'babel/templates/master/courses/show/audit/inbox.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<h1 class=\\\"text-primary mb1\\\">\\n  {{t \\\"routes.master.courses.show.audit.index.pageTitle\\\"}}\\n</h1>\\n\\n{{#if this.model.students}}\\n  <div class=\\\"grid-layout\\\">\\n    <CourseAuditIndexCard\\n      class=\\\"flex grid-cell-6 grid-cell-md-12\\\"\\n      @onClick={{fn this.trackDashboardCard \\\"Uppdrag\\\"}}\\n      @disabled={{not this.model.hasMissions}}\\n      @disabledText={{t\\n        \\\"routes.master.courses.show.audit.index.missions.disabledText\\\"\\n      }}\\n      @image=\\\"/assets/images/course/audit-missions.svg\\\"\\n      @title={{t \\\"routes.master.courses.show.audit.index.missions.title\\\"}}\\n      @description={{t\\n        \\\"routes.master.courses.show.audit.index.missions.description\\\"\\n      }}\\n      @target=\\\"master.courses.show.audit.missions.index\\\"\\n      @queryParams={{if this.model.hasMissions (hash page=1)}}\\n      @buttonText={{t\\n        \\\"routes.master.courses.show.audit.index.missions.buttonText\\\"\\n      }}\\n    />\\n\\n    <CourseAuditIndexCard\\n      class=\\\"flex grid-cell-6 grid-cell-md-12\\\"\\n      @onClick={{fn this.trackDashboardCard \\\"Inkorg\\\"}}\\n      @image=\\\"/assets/images/course/audit-new.svg\\\"\\n      @notification={{if\\n        this.numNew\\n        (t\\n          \\\"routes.master.courses.show.audit.index.notification\\\" num=this.numNew\\n        )\\n      }}\\n      @title={{t \\\"routes.master.courses.show.audit.index.inbox.title\\\"}}\\n      @description={{t\\n        \\\"routes.master.courses.show.audit.index.inbox.description\\\"\\n      }}\\n      @target=\\\"master.courses.show.audit.inbox\\\"\\n      @queryParams={{hash\\n        inboxType=\\\"standard\\\"\\n        selectedStudent=null\\n        isAuditing=false\\n      }}\\n      @buttonText={{t\\n        \\\"routes.master.courses.show.audit.index.inbox.buttonText\\\"\\n      }}\\n    />\\n\\n    <CourseAuditIndexCard\\n      class=\\\"flex grid-cell-6 grid-cell-md-12\\\"\\n      @onClick={{fn this.trackDashboardCard \\\"Alla uppgifter\\\"}}\\n      @image=\\\"/assets/images/course/audit-all.svg\\\"\\n      @title={{t \\\"routes.master.courses.show.audit.index.overview.title\\\"}}\\n      @description={{t\\n        \\\"routes.master.courses.show.audit.index.overview.description\\\"\\n      }}\\n      @target=\\\"master.courses.show.audit.overview\\\"\\n      @queryParams={{hash\\n        overviewType=\\\"standard\\\"\\n        selectedStudent=null\\n        isAuditing=false\\n      }}\\n      @buttonText={{t\\n        \\\"routes.master.courses.show.audit.index.overview.buttonText\\\"\\n      }}\\n    />\\n\\n    <CourseAuditIndexCard\\n      class=\\\"flex grid-cell-6 grid-cell-md-12\\\"\\n      @onClick={{fn this.trackDashboardCard \\\"Följ elev\\\"}}\\n      @image=\\\"/assets/images/course/audit-student.svg\\\"\\n      @title={{t \\\"routes.master.courses.show.audit.index.log.title\\\"}}\\n      @description={{t\\n        \\\"routes.master.courses.show.audit.index.log.description\\\"\\n      }}\\n      @target=\\\"master.courses.show.audit.log\\\"\\n      @queryParams={{hash\\n        logInboxType=\\\"standard\\\"\\n        selectedStudent=null\\n        isAuditing=false\\n      }}\\n      @buttonText={{t \\\"routes.master.courses.show.audit.index.log.buttonText\\\"}}\\n    />\\n\\n    <CourseAuditIndexCard\\n      class=\\\"flex grid-cell-6 grid-cell-md-12\\\"\\n      @onClick={{fn this.trackDashboardCard \\\"Kommentarer\\\"}}\\n      @image=\\\"/assets/images/course/audit-comments.svg\\\"\\n      @notification={{if\\n        this.numComments\\n        (t\\n          \\\"routes.master.courses.show.audit.index.notification\\\"\\n          num=this.numComments\\n        )\\n      }}\\n      @title={{t \\\"routes.master.courses.show.audit.index.comments.title\\\"}}\\n      @description={{t\\n        \\\"routes.master.courses.show.audit.index.comments.description\\\"\\n      }}\\n      @target=\\\"master.courses.show.audit.comments\\\"\\n      @queryParams={{hash selectedStudent=null isAuditing=false}}\\n      @buttonText={{t\\n        \\\"routes.master.courses.show.audit.index.comments.buttonText\\\"\\n      }}\\n    />\\n  </div>\\n{{else}}\\n  <XAlert>\\n    {{t \\\"routes.master.courses.show.audit.noStudents\\\"}}\\n  </XAlert>\\n{{/if}}', { moduleName: 'babel/templates/master/courses/show/audit/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.log.pageTitle\\\")}}\\n\\n<CourseAudit\\n  @groups={{this.model.groups}}\\n  @students={{this.model.students}}\\n  @auditType=\\\"log\\\"\\n  @studentSelectValue={{this.selectedStudent}}\\n  @isAuditing={{this.isAuditing}}\\n  as |audit|\\n>\\n  {{#if this.selectedStudent}}\\n    <AnswerLog\\n      @books={{this.model.course.books}}\\n      @users={{array this.selectedStudent}}\\n      @inboxType={{this.logInboxType}}\\n      @trackAuditEvents={{true}}\\n      @course={{this.model.course}}\\n      @onAnswerClick={{audit.onAnswerClick}}\\n    />\\n  {{else}}\\n    <XAlert>\\n      {{t \\\"routes.master.courses.show.audit.log.noStudentSelected\\\"}}\\n    </XAlert>\\n  {{/if}}\\n</CourseAudit>\\n', { moduleName: 'babel/templates/master/courses/show/audit/log.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title\\n  (t \\\"routes.master.courses.show.audit.missions.index.pageTitle.missions\\\")\\n}}\\n\\n<div class=\\\"text-primary mb1\\\">\\n  {{t \\\"routes.master.courses.show.audit.missions.index.audit\\\"}}\\n</div>\\n\\n<XBreadcrumb class=\\\"mb1\\\" as |crumb|>\\n  <crumb.item as |item|>\\n    <item.link @route=\\\"master.courses.show.audit\\\">\\n      {{t \\\"routes.master.courses.show.audit.missions.index.breadcrumb.index\\\"}}\\n    </item.link>\\n  </crumb.item>\\n\\n  <crumb.item @active={{true}}>\\n    {{t \\\"routes.master.courses.show.audit.missions.index.breadcrumb.missions\\\"}}\\n  </crumb.item>\\n</XBreadcrumb>\\n\\n{{#each this.model as |mission|}}\\n  <div {{on \\\"click\\\" this.trackMissionOpen}}>\\n    <UiLink\\n      @route=\\\"master.courses.show.audit.missions.show\\\"\\n      @model={{mission.id}}\\n      @query={{hash selectedStudent=null isAuditing=false}}\\n      class=\\\"block\\\"\\n    >\\n      <DcCard\\n        class=\\\"p1 mb1 flex justify-space-between flex-center\\\"\\n        @effects={{true}}\\n      >\\n        <h2 class=\\\"text-tertiary mb0\\\">\\n          {{mission.title}}\\n        </h2>\\n\\n        <div class=\\\"flex flex-center\\\">\\n          <div\\n            class=\\\"text-small text-{{if @mission.user.isRejected \\'italic\\' \\'ui\\'}}\\n              text-muted mr1\\\"\\n          >\\n            {{#if mission.user.isRejected}}\\n              {{t\\n                \\\"routes.master.courses.show.audit.missions.index.deletedUser\\\"\\n              }}\\n            {{else}}\\n              {{mission.user.showname}}\\n            {{/if}}\\n          </div>\\n\\n          <DcIcon @name=\\\"tail-right\\\" class=\\\"text-color-default\\\" />\\n        </div>\\n      </DcCard>\\n    </UiLink>\\n  </div>\\n{{/each}}\\n\\n{{#if (gt this.numPages 1)}}\\n  <div class=\\\"my2 flex-centering\\\">\\n    <XPagination\\n      @totalPages={{this.numPages}}\\n      @page={{this.page}}\\n      @onChange={{this.handlePaginationChange}}\\n    />\\n  </div>\\n{{/if}}', { moduleName: 'babel/templates/master/courses/show/audit/missions/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.missions.show.pageTitle\\\")}}\\n\\n<CourseAudit\\n  @mission={{this.model.mission}}\\n  @groups={{this.model.groups}}\\n  @students={{this.model.students}}\\n  @auditType=\\\"missions\\\"\\n  @studentSelectValue={{this.selectedStudent}}\\n  @isAuditing={{this.isAuditing}}\\n  as |audit|\\n>\\n  <div class=\\\"text-secondary mt1\\\">{{this.model.mission.title}}</div>\\n\\n  {{#each this.model.mission.sortedCustomContents as |part|}}\\n    {{#if part.entity}}\\n      <XAwait @value={{part.entity}} as |entity|>\\n        <XAwait @value={{part.includedEntities}} as |includedEntities|>\\n          <CourseAudit::Standard::Entity\\n            @customContent={{part}}\\n            @entity={{entity}}\\n            @rootEntity={{entity}}\\n            @startExpanded={{lte this.model.mission.customContents.length 2}}\\n            @answeredSiblings={{(array)}}\\n            @selectedStudents={{audit.selectedStudents}}\\n            @includedEntities={{includedEntities}}\\n            @groups={{this.model.groups}}\\n            @openAuditMode={{audit.openAuditMode}}\\n          />\\n        </XAwait>\\n      </XAwait>\\n    {{else}}\\n      <XAlert @variant=\\\"error\\\" class=\\\"mt1\\\">\\n        {{#if (eq part.error \\\"invalid\\\")}}\\n          {{t\\n            \\\"routes.master.courses.show.audit.missions.show.invalidAlertMessage\\\"\\n          }}\\n        {{else}}\\n          {{t\\n            \\\"routes.master.courses.show.audit.missions.show.rejectedAlertMessage\\\"\\n          }}\\n        {{/if}}\\n      </XAlert>\\n    {{/if}}\\n  {{/each}}\\n</CourseAudit>', { moduleName: 'babel/templates/master/courses/show/audit/missions/show.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.audit.overview.pageTitle\\\")}}\\n\\n<CourseAudit\\n  @groups={{this.model.groups}}\\n  @students={{this.model.students}}\\n  @auditType=\\\"overview\\\"\\n  @studentSelectValue={{this.selectedStudent}}\\n  @isAuditing={{this.isAuditing}}\\n  as |audit|\\n>\\n  <XTab\\n    @appearance=\\\"pill\\\"\\n    @value={{this.overviewType}}\\n    @onChange={{action \\\"handleOverviewTypeChange\\\"}}\\n    as |typeTab|\\n  >\\n    <typeTab.pane\\n      @value=\\\"standard\\\"\\n      @label={{t \\\"routes.master.courses.show.audit.overview.types.standard\\\"}}\\n      @icon=\\\"assignments\\\"\\n    >\\n      {{#each this.model.course.books as |book|}}\\n        <XAwait @value={{book}} as |resolved|>\\n          <CourseAudit::Standard::Entity\\n            @entity={{resolved}}\\n            @rootEntity={{resolved}}\\n            @selectedStudents={{audit.selectedStudents}}\\n            @groups={{this.model.groups}}\\n            @openAuditMode={{audit.openAuditMode}}\\n          />\\n        </XAwait>\\n      {{/each}}\\n    </typeTab.pane>\\n\\n    <typeTab.pane\\n      @value=\\\"diagnosis\\\"\\n      @label={{t \\\"routes.master.courses.show.audit.overview.types.diagnosis\\\"}}\\n      @icon=\\\"diagnosis\\\"\\n    >\\n      {{#each this.model.course.books as |book|}}\\n        <CourseAudit::Diagnosis\\n          @selectedStudents={{audit.selectedStudents}}\\n          @book={{book}}\\n          @groups={{this.model.groups}}\\n          @openAuditMode={{audit.openAuditMode}}\\n        />\\n      {{/each}}\\n    </typeTab.pane>\\n\\n    <typeTab.pane\\n      @value=\\\"teacher_assignments\\\"\\n      @label={{t\\n        \\\"routes.master.courses.show.audit.overview.types.teacher_assignments\\\"\\n      }}\\n      @icon=\\\"teacher-assignments\\\"\\n    >\\n      {{#each this.model.course.books as |book|}}\\n        <CourseAudit::TeacherAssignments\\n          @selectedStudents={{audit.selectedStudents}}\\n          @book={{book}}\\n          @groups={{this.model.groups}}\\n          @course={{this.model.course}}\\n          @teacherAssignments={{this.model.teacherAssignments}}\\n          @openAuditMode={{audit.openAuditMode}}\\n        />\\n      {{/each}}\\n    </typeTab.pane>\\n  </XTab>\\n</CourseAudit>', { moduleName: 'babel/templates/master/courses/show/audit/overview.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.books.pageTitle\\\")}}\\n\\n<h2 class=\\\"text-primary mb0\\\">\\n  {{t \\\"routes.master.courses.show.books.booksPage.heading\\\"}}\\n</h2>\\n\\n{{#if this.books}}\\n  {{#if this.session.user.isTeacher}}\\n    {{#if (gt this.selectedBooks.length 13)}}\\n      <div class=\\\"text-color-error mb1 mt1\\\">\\n        {{t\\n          \\\"routes.master.courses.show.books.booksPage.booksWarning\\\"\\n          numBooks=this.selectedBooks.length\\n        }}\\n      </div>\\n    {{/if}}\\n  {{/if}}\\n\\n  <BookBrowser\\n    class=\\\"mt1\\\"\\n    @range=\\\"large\\\"\\n    @books={{this.books}}\\n    @selectable={{this.selectableBooks}}\\n    @selectedBooks={{this.selectedBooks}}\\n    @onSelect={{this.handleSelectBook}}\\n    @onDeselect={{this.handleDeselectBook}}\\n  />\\n{{else}}\\n  <XAlert class=\\\"mt1\\\">\\n    {{#if this.session.user.isStudent}}\\n      {{t \\\"routes.master.courses.show.books.noEntitiesStudent\\\"}}\\n    {{else}}\\n      {{t \\\"routes.master.courses.show.books.noEntities\\\"}}\\n    {{/if}}\\n  </XAlert>\\n{{/if}}', { moduleName: 'babel/templates/master/courses/show/books.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.index.pageTitle\\\")}}\\n\\n<div\\n  class=\\\"flex flex-column\\n    {{if\\n      (eq this.model.course.overviewDisplayFirst \\'missions\\')\\n      \\'flex-reverse\\'\\n    }}\\\"\\n>\\n  <div class=\\\"mb2\\\">\\n    <div class=\\\"course-shortcuts-title text-secondary nb1\\\">\\n      {{t \\\"routes.master.courses.show.index.shortcutsHeadingLabel\\\"}}\\n    </div>\\n\\n    <CourseShortcuts\\n      @course={{this.model.course}}\\n      @onFileUpload={{this.handleMissionDetailModalFileUpload}}\\n    />\\n  </div>\\n\\n  <div class=\\\"mb2\\\">\\n    {{#if this.isShowingIntro}}\\n      <XModal\\n        @title={{t\\n          \\\"routes.master.courses.show.index.welcomeHeading\\\"\\n          name=this.model.course.name\\n        }}\\n        @onClose={{this.closeIntroModal}}\\n        @size={{hash height=\\\"auto\\\" width=\\\"small\\\"}}\\n        @headerDivider={{false}}\\n        @closeButton={{false}}\\n        as |modal|\\n      >\\n        <modal.header class=\\\"px3 pt3\\\" />\\n\\n        <modal.content class=\\\"px3 pb3\\\">\\n          {{t \\\"routes.master.courses.show.index.welcomeContent\\\" htmlSafe=true}}\\n\\n          <a\\n            href=\\\"https://support.nok.se/article/4101\\\"\\n            target=\\\"_blank\\\"\\n            rel=\\\"noopener noreferrer\\\"\\n            class=\\\"block text-ui text-color-default mb1\\\"\\n          >\\n            {{t \\\"routes.master.courses.show.index.readMoreAboutCoursesButton\\\"}}\\n          </a>\\n\\n          <div class=\\\"flex mt1\\\">\\n            <UiButton @autofocus={{true}} @onClick={{this.closeIntroModal}}>\\n              {{t \\\"routes.master.courses.show.index.welcomeContinueButton\\\"}}\\n            </UiButton>\\n          </div>\\n        </modal.content>\\n      </XModal>\\n    {{/if}}\\n\\n    <h2 class=\\\"text-secondary nb1\\\">\\n      {{t \\\"routes.master.courses.show.index.missionsHeadingLabel\\\"}}\\n    </h2>\\n\\n    {{#if this.session.user.isTeacher}}\\n      <div class=\\\"flex mb1\\\">\\n        {{#let (generate-id) as |id|}}\\n          <UiButton\\n            id={{id}}\\n            @appearance=\\\"link\\\"\\n            @active={{this.isAddNewActionMenuOpen}}\\n            @onClick={{this.handleAddNewActionMenuOpen}}\\n          >\\n            <DcIcon class=\\\"nr1\\\" @name=\\\"simple-add\\\" />\\n            {{t \\\"routes.master.courses.show.index.addNewMissionButtonLabel\\\"}}\\n          </UiButton>\\n\\n          {{#if this.isAddNewActionMenuOpen}}\\n            <MissionAddActionMenu\\n              @for={{id}}\\n              @includeActivate={{true}}\\n              @onSelect={{this.handleMissionActionMenuSelect}}\\n              @onClose={{set this \\\"isAddNewActionMenuOpen\\\" false}}\\n            />\\n          {{/if}}\\n        {{/let}}\\n\\n        {{#if (gt this.missions.length 1)}}\\n          <UiButton\\n            class=\\\"ml1 {{unless this.isSortingDisabled \\'slow-shake\\'}}\\\"\\n            @appearance=\\\"link\\\"\\n            @onClick={{this.toggleSort}}\\n          >\\n            {{#if this.isSortingDisabled}}\\n              {{t \\\"routes.master.courses.show.index.sort\\\"}}\\n            {{else}}\\n              {{t \\\"routes.master.courses.show.index.saveSortOrder\\\"}}\\n              <DcIcon class=\\\"nl1\\\" @name=\\\"check\\\" @size=\\\"xs\\\" />\\n            {{/if}}\\n          </UiButton>\\n        {{/if}}\\n      </div>\\n    {{/if}}\\n\\n    {{#if this.missions}}\\n      <MissionBrowser\\n        @missions={{this.missions}}\\n        @students={{this.model.course.students}}\\n        @sortable={{and\\n          this.session.user.isTeacher\\n          (gt this.missions.length 1)\\n          (not this.isSortingDisabled)\\n        }}\\n        @onEdit={{this.handleMissionBrowserEdit}}\\n        @onCopy={{this.handleMissionBrowserCopy}}\\n        @onShare={{this.handleMissionBrowserShare}}\\n        @onToggleActivation={{this.handleMissionBrowserToggleActivation}}\\n        @onHide={{this.handleMissionBrowserHide}}\\n        @onEditCustomContent={{this.handleMissionBrowserEditCustomContent}}\\n        @onSort={{this.handleMissionBrowserSort}}\\n        @onSchedule={{this.handleMissionBrowserSchedule}}\\n      />\\n    {{else}}\\n      <MissionIntroCard\\n        class=\\\"mt1\\\"\\n        @onAddNew={{this.handleAddNewMissionButtonClick}}\\n      >\\n        <:heading>\\n          {{t\\n            \\\"routes.master.courses.show.index.missionIntroCardHeadingLabel\\\"\\n            isTeacher=this.session.user.isTeacher\\n          }}\\n        </:heading>\\n\\n        <:content>\\n          <p>\\n            {{t\\n              \\\"routes.master.courses.show.index.missionIntroCardParagraphMessage\\\"\\n              isTeacher=this.session.user.isTeacher\\n            }}\\n          </p>\\n\\n          {{#if this.session.user.isTeacher}}\\n            <UiButton @onClick={{this.handleAddNewMissionButtonClick}}>\\n              <DcIcon class=\\\"nr1\\\" @name=\\\"simple-add\\\" />\\n              {{t \\\"routes.master.courses.show.index.createMissionButtonLabel\\\"}}\\n            </UiButton>\\n          {{/if}}\\n        </:content>\\n      </MissionIntroCard>\\n    {{/if}}\\n  </div>\\n</div>\\n\\n{{#if this.isMissionDetailModalOpen}}\\n  <MissionDetailModal\\n    @mission={{this.mission}}\\n    @onClose={{this.handleMissionDetailModalClose}}\\n    @onSave={{this.handleMissionDetailModalSave}}\\n    @onDelete={{this.handleMissionDetailModalDelete}}\\n    @onFileUpload={{this.handleMissionDetailModalFileUpload}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCourseMissionActivateModalOpen}}\\n  <CourseMissionActivateModal\\n    @course={{this.model.course}}\\n    @onActivate={{this.handleMissionActivateModalActivate}}\\n    @onClose={{set this \\\"isCourseMissionActivateModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCourseMissionCopyFromModalOpen}}\\n  <CourseMissionCopyFromModal\\n    @course={{this.model.course}}\\n    @onCopy={{this.handleMissionCopyFromModalCopy}}\\n    @onClose={{set this \\\"isCourseMissionCopyFromModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCourseMissionCopyToModalOpen}}\\n  <CourseMissionCopyToModal\\n    @course={{this.model.course}}\\n    @mission={{this.courseMissionCopyToModalMeta.mission}}\\n    @onCopy={{this.handleMissionCopyToModalCopy}}\\n    @onClose={{this.handleMissionCopyToModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.isMissionShareModalOpen}}\\n  <MissionShareModal\\n    @mission={{this.missionShareModalMeta.mission}}\\n    @onClose={{this.handleMissionShareModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCustomContentDetailModalOpen}}\\n  <CustomContentDetailModal\\n    @customContent={{this.customContent}}\\n    @teacherAssignments={{this.model.teacherAssignments}}\\n    @wordlists={{this.model.wordlists}}\\n    @onSave={{this.handleCustomContentDetailModalSave}}\\n    @onClose={{this.handleCustomContentDetailModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.pendingFile.upload}}\\n  <XUploadProgressModal\\n    @upload={{this.pendingFile.upload}}\\n    @onAbort={{this.handleFileUploadAbort}}\\n  />\\n{{/if}}', { moduleName: 'babel/templates/master/courses/show/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.missions.pageTitle\\\")}}\\n\\n<div>\\n  <div class=\\\"text-primary mb1\\\">\\n    {{t \\\"routes.master.courses.show.missions.headingLabel\\\"}}\\n  </div>\\n\\n  <div class=\\\"flex flex-center justify-space-between mb1\\\">\\n    {{#let (generate-id) as |id|}}\\n      <UiButton\\n        id={{id}}\\n        @appearance=\\\"link\\\"\\n        @active={{this.isMissionAddActionMenuOpen}}\\n        @onClick={{this.handleMissionAddActionMenuOpen}}\\n      >\\n        <DcIcon class=\\\"nr1\\\" @name=\\\"simple-add\\\" />\\n        {{t \\\"routes.master.courses.show.index.addNewMissionButtonLabel\\\"}}\\n      </UiButton>\\n\\n      {{#if this.isMissionAddActionMenuOpen}}\\n        <MissionAddActionMenu\\n          @for={{id}}\\n          @onSelect={{this.handleMissionActionMenuSelect}}\\n          @onClose={{this.handleMissionAddActionMenuClose}}\\n        />\\n      {{/if}}\\n    {{/let}}\\n\\n    <div class=\\\"flex flex-center\\\">\\n      <div class=\\\"flex mr1\\\">\\n        <span class=\\\"text-bold text-small\\\">\\n          {{t \\\"routes.master.courses.show.missions.sortLabel\\\"}}\\n        </span>\\n\\n        <XMenuButton\\n          @class=\\\"text-small nl1\\\"\\n          @appearance=\\\"link\\\"\\n          @items={{this.sortMenuButtonItems}}\\n          @onChange={{this.handleSortMenuButtonChange}}\\n        >\\n          {{this.sortMenuButtonLabel}}\\n        </XMenuButton>\\n      </div>\\n\\n      <div class=\\\"flex\\\">\\n        <span class=\\\"text-bold text-small\\\">\\n          {{t \\\"routes.master.courses.show.missions.scopeLabel\\\"}}\\n        </span>\\n\\n        <XMenuButton\\n          @class=\\\"text-small nl1\\\"\\n          @appearance=\\\"link\\\"\\n          @items={{this.scopeMenuButtonItems}}\\n          @onChange={{this.handleScopeMenuButtonChange}}\\n        >\\n          {{this.scopeMenuButtonLabel}}\\n        </XMenuButton>\\n      </div>\\n    </div>\\n  </div>\\n\\n  {{#if this.model.missions}}\\n    <MissionBrowser\\n      @missions={{this.model.missions}}\\n      @students={{this.model.course.students}}\\n      @displayDetails={{true}}\\n      @onEdit={{this.handleMissionBrowserEdit}}\\n      @onCopy={{this.handleMissionBrowserCopy}}\\n      @onShare={{this.handleMissionBrowserShare}}\\n      @onToggleActivation={{this.handleMissionBrowserToggleActivation}}\\n      @onSchedule={{this.handleMissionBrowserSchedule}}\\n      @onCancelSchedule={{this.handleMissionBrowserCancelSchedule}}\\n      @onEditCustomContent={{this.handleMissionBrowserEditCustomContent}}\\n    />\\n\\n    {{#if (gt this.model.missions.meta.totalPages 1)}}\\n      <div class=\\\"mb2 flex justify-center\\\">\\n        <XPagination\\n          class=\\\"mt1\\\"\\n          @totalPages={{this.model.missions.meta.totalPages}}\\n          @page={{this.model.missions.meta.page}}\\n          @showFirstLast={{false}}\\n          @routed={{true}}\\n          @onChange={{set this \\\"page\\\"}}\\n        />\\n      </div>\\n    {{/if}}\\n  {{else}}\\n    <XAlert>\\n      {{t\\n        \\\"routes.master.courses.show.missions.noResultMessage\\\"\\n        scope=this.model.query.scope\\n      }}\\n    </XAlert>\\n  {{/if}}\\n</div>\\n\\n{{#if this.isMissionDetailModalOpen}}\\n  <MissionDetailModal\\n    @mission={{this.mission}}\\n    @onClose={{this.handleMissionDetailModalClose}}\\n    @onSave={{this.handleMissionDetailModalSave}}\\n    @onDelete={{this.handleMissionDetailModalDelete}}\\n    @onFileUpload={{this.handleMissionDetailModalFileUpload}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCourseMissionCopyFromModalOpen}}\\n  <CourseMissionCopyFromModal\\n    @course={{this.model.course}}\\n    @onCopy={{this.handleMissionCopyFromModalCopy}}\\n    @onClose={{set this \\\"isCourseMissionCopyFromModalOpen\\\" false}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCourseMissionCopyToModalOpen}}\\n  <CourseMissionCopyToModal\\n    @course={{this.model.course}}\\n    @mission={{this.courseMissionCopyToModalMeta.mission}}\\n    @onCopy={{this.handleMissionCopyToModalCopy}}\\n    @onClose={{this.handleMissionCopyToModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.isMissionShareModalOpen}}\\n  <MissionShareModal\\n    @mission={{this.missionShareModalMeta.mission}}\\n    @onClose={{this.handleMissionShareModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.isCustomContentDetailModalOpen}}\\n  <CustomContentDetailModal\\n    @customContent={{this.customContent}}\\n    @teacherAssignments={{this.model.teacherAssignments}}\\n    @wordlists={{this.model.wordlists}}\\n    @onSave={{this.handleCustomContentDetailModalSave}}\\n    @onClose={{this.handleCustomContentDetailModalClose}}\\n  />\\n{{/if}}\\n\\n{{#if this.pendingFile.upload}}\\n  <XUploadProgressModal\\n    @upload={{this.pendingFile.upload}}\\n    @onAbort={{this.handleFileUploadAbort}}\\n  />\\n{{/if}}', { moduleName: 'babel/templates/master/courses/show/missions.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.myResults.title\\\")}}\\n\\n<div class=\\\"text-primary mb1\\\">\\n  {{t \\\"routes.master.courses.show.myResults.title\\\"}}\\n</div>\\n\\n<XAwait @value={{this.model.books}} as |books|>\\n  <AnswerLog @course={{this.model}} @books={{books}} />\\n</XAwait>', { moduleName: 'babel/templates/master/courses/show/my-results.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.courses.show.settings.title\\\")}}\\n\\n<h2 class=\\\"text-primary mb0\\\">\\n  {{t \\\"routes.master.courses.show.settings.title\\\"}}\\n</h2>\\n\\n<CourseAdaptSettings @course={{this.model.course}} />\\n', { moduleName: 'babel/templates/master/courses/show/settings.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.error.heading\\\")}}\\n\\n<div class=\\\"container\\\">\\n  <ErrorPage @error={{this.error}} class=\\\"mt2\\\" />\\n</div>\\n', { moduleName: 'babel/templates/master/error.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.forbidden.heading\\\")}}\\n\\n<XErrorPage\\n  @explanation={{t \\\"routes.master.forbidden.explanation\\\"}}\\n  @heading={{t \\\"routes.master.forbidden.heading\\\"}}\\n  @statusCode={{403}}\\n/>\\n', { moduleName: 'babel/templates/master/forbidden.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{!-- template-lint-disable no-bare-strings --}}\\n<div class=\\\"container my3\\\">\\n  <div class=\\\"text-secondary mb1\\\">Grupper</div>\\n\\n  <div class=\\\"grid mb2\\\">\\n    {{#each this.model.courses as |course|}}\\n      <div class=\\\"col-sm-6 col-3 flex\\\">\\n        <UiLink\\n          class=\\\"flex-auto text-color\\\"\\n          @route=\\\"master.courses.show\\\"\\n          @model={{course.id}}\\n          data-test-homescreen-course-link\\n        >\\n          <ImageCard\\n            @image={{if course.coverImage course.coverImage \\\"/assets/images/defaults/course.svg\\\"}}\\n            @title={{course.name}}\\n          />\\n        </UiLink>\\n      </div>\\n    {{/each}}\\n  </div>\\n\\n  <div class=\\\"text-secondary mb1\\\">Produkter</div>\\n\\n  <div class=\\\"grid mb2\\\">\\n    {{#each this.model.products as |product|}}\\n      <div class=\\\"col-sm-6 col-3 flex\\\">\\n        <UiLink\\n          class=\\\"flex-auto text-color\\\"\\n          @route=\\\"master.products.index\\\"\\n          @model={{product.id}}\\n          data-test-homescreen-product-link\\n        >\\n          <ImageCard\\n            @image={{image-source product.cover.imageURL max=true w=640 h=480}}\\n            @title={{product.title}}\\n            @imageSize=\\\"contain\\\"\\n          />\\n        </UiLink>\\n      </div>\\n    {{/each}}\\n  </div>\\n</div>\\n', { moduleName: 'babel/templates/master/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.model.parent.parent.title}}\\n{{page-title this.model.parent.title}}\\n{{page-title this.model.title}}\\n\\n{{outlet}}\\n\\n<ReadRuler />\\n', { moduleName: 'babel/templates/master/interactives.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{outlet}}\\n', { moduleName: 'babel/templates/master/interactives/diagnoses/done.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DiagnosisShow\\n  @model={{this.model}}\\n  @queryExercise={{this.exercise}}\\n  @disabled={{true}}\\n  as |DiagnosisShowYield|\\n>\\n  <DiagnosisShowYield.Controls>\\n    <div class=\\\"ml1 mr1 text-color-success text-ui flex flex-center\\\">\\n      <DcIcon @name=\\\"check-circle\\\" class=\\\"nr1\\\" />\\n      {{t \\\"routes.master.interactives.diagnosis.done.audit.attemptCompleted\\\"}}\\n    </div>\\n\\n    <UiLink\\n      @route=\\\"master.interactives.diagnoses.done.index\\\"\\n      @appearance=\\\"button\\\"\\n      @variant=\\\"success\\\"\\n      @shape=\\\"rounded\\\"\\n      @size={{if (media \\\"mediumOrLess\\\") \\\"small\\\" \\\"medium\\\"}}\\n    >\\n      {{t \\\"routes.master.interactives.diagnosis.done.audit.goBack\\\"}}\\n    </UiLink>\\n  </DiagnosisShowYield.Controls>\\n</DiagnosisShow>', { moduleName: 'babel/templates/master/interactives/diagnoses/done/audit.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DiagnosisDone\\n  @interactive={{this.model.interactive}}\\n  @collection={{this.model.collection}}\\n  @exercises={{this.model.exercises}}\\n  @answers={{this.model.answers}}\\n  @result={{this.model.attempt}}\\n/>\\n', { moduleName: 'babel/templates/master/interactives/diagnoses/done/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DiagnosisIntro\\n  @interactive={{this.model.interactive}}\\n  @collection={{this.model.collection}}\\n  @results={{this.model.results}}\\n  @isTeacher={{this.session.user.isTeacher}}\\n  @scoreMax={{this.model.exercises.length}}\\n  @onStartButtonClick={{this.handleStart}}\\n  @onCancel={{this.handleCancel}}\\n/>\\n', { moduleName: 'babel/templates/master/interactives/diagnoses/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<DiagnosisShow\\n  @model={{this.model}}\\n  @queryExercise={{this.exercise}}\\n  @turningIn={{this.diagnosis.turningIn}}\\n  as |DiagnosisShowYield|\\n>\\n  <DiagnosisShowYield.Controls>\\n    <CountdownTimer\\n      @from={{this.model.attempt.started}}\\n      @minutes={{this.model.attempt.entity.timeAllowed}}\\n      @onFinish={{this.diagnosis.timesUp}}\\n      class=\\\"ml1 mr1\\\"\\n    />\\n\\n    <UiButton\\n      @variant=\\\"error\\\"\\n      @onClick={{this.diagnosis.done}}\\n      @size={{if (media \\\"mediumOrLess\\\") \\\"small\\\" \\\"medium\\\"}}\\n      @shape=\\\"rounded\\\"\\n    >\\n      {{t \\\"routes.master.interactives.diagnosis.show.end\\\"}}\\n    </UiButton>\\n  </DiagnosisShowYield.Controls>\\n</DiagnosisShow>', { moduleName: 'babel/templates/master/interactives/diagnoses/show.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<div class=\\\"container mb4 {{unless this.showCoverImage \\\"mt6\\\"}}\\\">\\n  {{#if this.showCoverImage }}\\n    <Interactives::CoverImage\\n      @image={{this.interactive.image}}\\n    />\\n  {{/if}}\\n\\n  <div class=\\\"container-lg\\\">\\n    <div class=\\\"flex flex-center mb1\\\">\\n      <ContentMeta\\n        @template={{this.interactive.template}}\\n        @model={{this.interactive}}\\n      />\\n    </div>\\n\\n    <h1 class=\\\"content-title\\\">\\n      {{this.interactive.title}}\\n    </h1>\\n\\n    {{#if this.interactive.body.preamble}}\\n      <Content::CPreamble class=\\\"mb2\\\" @value={{this.interactive.body.preamble}} />\\n    {{/if}}\\n\\n    <div class=\\\"mt1\\\">\\n      <EntityCategorizer\\n        @entity={{this.interactive}}\\n        @validEntities={{this.restrictedCollections}}\\n        as |categoryGroup|\\n      >\\n        {{#if categoryGroup.category.name}}\\n          <h2 class=\\\"text-primary mt2 mb1\\\">{{categoryGroup.category.name}}</h2>\\n        {{/if}}\\n\\n        {{component\\n          this.componentName\\n          categoryGroup=categoryGroup\\n          interactive=this.interactive\\n        }}\\n\\n      </EntityCategorizer>\\n    </div>\\n\\n  </div>\\n\\n</div>', { moduleName: 'babel/templates/master/interactives/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<ContentTopbar\\n  @activeSection={{this.model.collection}}\\n  @template={{this.model.interactive.template}}\\n  @model={{this.model.collection}}\\n  @hideWorkflow={{true}}\\n  @categories={{(array)}}\\n  @sections={{this.model.collections}}\\n  @restrictedSections={{this.model.collections}}\\n  @hidePlaySettings={{false}}\\n  @title={{this.model.collection.title}}\\n  @routeToSection={{this.openCollection}}\\n  @isInteractive={{true}}\\n  @hideNavigation={{true}}\\n  @toggleTools=\\\"toggleTools\\\"\\n  class=\\\"flex-shrink\\\"\\n/>\\n\\n<FocusMode />\\n\\n<CollectionView\\n  @withinContent={{true}}\\n  @collection={{this.model.collection}}\\n  @exercises={{this.model.exercises}}\\n  @activeExercise={{this.model.activeExercise}}\\n  @answers={{this.model.answers}}\\n  @activeAnswer={{this.model.activeAnswer}}\\n  @shortCode={{this.model.book.body.shortcode}}\\n  @digilarRecordedSpeechEnabled={{this.model.interactive.body.recorded_speech_activated}}\\n  @editor={{this.model.editor}}\\n  @openExercise={{this.openExercise}}\\n  @onCollectionClose={{this.handleCollectionClose}}\\n/>', { moduleName: 'babel/templates/master/interactives/practices/show.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<MaterialViewer\\n  @material={{this.model.selectedMaterial}}\\n  @onClose={{this.handleClose}}\\n/>\\n', { moduleName: 'babel/templates/master/materials.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('<MissionStartPage @mission={{this.model.mission}} @items={{this.model.items}} />', { moduleName: 'babel/templates/master/missions.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title this.model.title}}\\n\\n<ContextSelect\\n  @product={{this.model}}\\n  @onSelectCourse={{this.routeToCourse}}/>\\n\\n<Products::ProductMain @product={{this.model}} class=\\\"product-main-component\\\">\\n  {{outlet}}\\n</Products::ProductMain>\\n', { moduleName: 'babel/templates/master/products.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.products.index.pageTitle\\\")}}\\n\\n<div class=\\\"grid-layout grid-gap-3-sm\\\">\\n\\n  <div class=\\\"grid-cell-12 grid-cell-sm-12\\\">\\n\\n    {{products/product-index\\n      product=this.model.product\\n      continueVisited=this.model.continueVisited\\n      lastVisited=this.model.lastVisited\\n    }}\\n\\n  </div>\\n\\n</div>', { moduleName: 'babel/templates/master/products/index.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{page-title (t \\\"routes.master.products.myResults.title\\\")}}\\n\\n<div class=\\\"text-primary mb1\\\">\\n  {{t \\\"routes.master.products.myResults.title\\\"}}\\n</div>\\n\\n<AnswerLog @books={{this.model.books}} @showTeacherAssignments={{false}} />', { moduleName: 'babel/templates/master/products/my-results.hbs' });\n","import { hbs } from 'ember-cli-htmlbars';\nexport default hbs('{{#entity-preview-page\\n  model=this.model\\n  image=this.model.image\\n}}{{/entity-preview-page}}', { moduleName: 'babel/templates/nodes.hbs' });\n","import { A, isArray } from '@ember/array';\nimport { camelizeKeys, underscoreKeys } from 'compton/utils/object';\nimport DS from 'ember-data';\n\nimport emberObjectToNativeObject from '../utils/ember-object-to-native-object';\nimport nativeObjectToEmberObject from '../utils/native-object-to-ember-object';\n\nconst { Transform } = DS;\n\nexport default Transform.extend({\n  deserialize(serialized) {\n    if (isArray(serialized)) {\n      return serialized.map((x) => nativeObjectToEmberObject(camelizeKeys(x)));\n    } else {\n      return A();\n    }\n  },\n\n  serialize(deserialized) {\n    if (isArray(deserialized)) {\n      return deserialized.map((x) =>\n        underscoreKeys(emberObjectToNativeObject(x))\n      );\n    } else {\n      return A();\n    }\n  }\n});\n","import EmberObject from '@ember/object';\nimport { typeOf } from '@ember/utils';\nimport { camelizeKeys, underscoreKeys } from 'compton/utils/object';\nimport DS from 'ember-data';\n\nimport emberObjectToNativeObject from '../utils/ember-object-to-native-object';\nimport nativeObjectToEmberObject from '../utils/native-object-to-ember-object';\n\nconst { Transform } = DS;\n\nexport default Transform.extend({\n  deserialize(serialized, { camelizeDeserializedKeys = false }) {\n    if (typeOf(serialized) === 'object') {\n      if (camelizeDeserializedKeys) {\n        serialized = camelizeKeys(serialized);\n      }\n      return nativeObjectToEmberObject(serialized);\n    } else {\n      return EmberObject.create();\n    }\n  },\n\n  serialize(deserialized) {\n    if (typeOf(deserialized) === 'instance') {\n      return underscoreKeys(emberObjectToNativeObject(deserialized));\n    } else {\n      return {};\n    }\n  }\n});\n","// Note: Code taken from https://stackoverflow.com/questions/28310414/what-is-the-ember-implementation-of-setinterval-and-clearinterval\nimport EmberObject from '@ember/object';\nimport { cancel, later } from '@ember/runloop';\n\nvar Poller = EmberObject.extend({\n  _interval: 1000,\n  _currentlyExecutedFunction: null,\n\n  start: function(context, pollingFunction) {\n    this.set(\n      '_currentlyExecutedFunction',\n      this._schedule(context, pollingFunction, [].slice.call(arguments, 2))\n    );\n  },\n\n  stop: function() {\n    cancel(this.get('_currentlyExecutedFunction'));\n  },\n\n  _schedule: function(context, func, args) {\n    return later(\n      this,\n      function() {\n        this.set(\n          '_currentlyExecutedFunction',\n          this._schedule(context, func, args)\n        );\n        func.apply(context, args);\n      },\n      this.get('_interval')\n    );\n  },\n\n  setInterval: function(interval) {\n    this.set('_interval', interval);\n  }\n});\n\nexport default Poller;\n","function addSettingRelationship(item) {\n  if (item.relationships?.setting) return;\n\n  item.relationships.setting = {\n    links: {\n      related: `/api/v1/meta/settings/${item.id}`,\n    },\n  };\n}\n\nexport function addCourseSettingRelationship(payload) {\n  if (payload?.data?.type === 'courses') {\n    addSettingRelationship(payload.data);\n  } else if (\n    Array.isArray(payload?.data) &&\n    payload.data.find((item) => item.type === 'courses')\n  ) {\n    payload.data.map((item) => {\n      if (item.type === 'courses') {\n        addSettingRelationship(item);\n      }\n    });\n  }\n}\n","export default function appendQueryParams(url, params) {\n  if (params && typeof params === 'object' && !Array.isArray(params)) {\n    const querystring =\n      url.indexOf('?') > -1\n        ? new URLSearchParams(new URL(url).search)\n        : new URLSearchParams();\n\n    for (const [key, value] of Object.entries(params)) {\n      querystring.append(key, value);\n    }\n    url = `${url.substr(\n      0,\n      url.indexOf('?') > -1 ? url.indexOf('?') : url.length\n    )}?${querystring.toString()}`;\n  }\n  return url;\n}\n","import EmberObject from '@ember/object';\nimport clone from 'babel/utils/clone';\nimport isEqual from 'babel/utils/isEqual';\nimport shuffle from 'compton/utils/array-shuffle';\n\nfunction emptyAnswer(assignment) {\n  if (!assignment) return;\n\n  let alternatives, input, indexArr;\n\n  switch (assignment.template) {\n    case 'arrange':\n      alternatives = assignment.content.alternatives;\n\n      do {\n        input = shuffle(alternatives.map((alt) => alt));\n      } while (\n        input.mapBy('uuid').toString() === alternatives.mapBy('uuid').toString()\n      );\n\n      break;\n    case 'choice':\n      input = [];\n      break;\n    case 'editor':\n      if (assignment.settings?.pattern && assignment.content?.pattern?.length) {\n        input = assignment.content.pattern;\n      } else {\n        input = '';\n      }\n      break;\n    case 'match':\n      alternatives = assignment.content.alternatives.map((alternative) => {\n        return EmberObject.create({\n          assigned: false,\n          uuid: alternative.uuid,\n        });\n      });\n\n      input = clone(shuffle(alternatives));\n      break;\n    case 'number-line':\n      input = [];\n      break;\n    case 'reply':\n      input = '';\n      break;\n    case 'place-choices':\n      input = [];\n      break;\n    case 'place-words':\n      alternatives = assignment.content.alternatives.concat(\n        assignment.content.extra\n      );\n\n      // Filter out null or undefined values\n      alternatives = alternatives.filter(\n        (item) => item !== null && item?.value !== null\n      );\n\n      input = alternatives.map((item) => {\n        return EmberObject.create({\n          value: item?.value || item,\n          assignedTo: null,\n          extra: item?.value ? false : true,\n        });\n      });\n\n      input = clone(shuffle(input));\n      break;\n    case 'place-images':\n      alternatives = assignment.content.alternatives;\n\n      input = alternatives.map((item) => {\n        return EmberObject.create({\n          uuid: item.uuid,\n          assignedTo: null,\n          image: item.image,\n          extra: item.extra,\n        });\n      });\n\n      input = clone(shuffle(input));\n      break;\n    case 'place-text-gaps':\n      input = assignment.content.markers.map((marker) => {\n        return EmberObject.create({\n          uuid: marker.uuid,\n          value: '',\n        });\n      });\n      break;\n    case 'sort':\n      indexArr = shuffle([...Array(assignment.content.items.length).keys()]);\n\n      if (assignment.settings.behaviour === 'images') {\n        alternatives = assignment.content.items.filterBy('isImage');\n      } else {\n        alternatives = assignment.content.items.rejectBy('isImage');\n      }\n\n      input = alternatives.map((item, index) => {\n        return EmberObject.create({\n          uuid: item.uuid,\n          assignedTo: null,\n          index: indexArr[index],\n        });\n      });\n\n      input = clone(input);\n      break;\n    case 'matrix':\n    case 'text-gap':\n    case 'text-gap-multiple':\n      input = assignment.content.objects.map((gap) => {\n        return EmberObject.create({\n          uuid: gap.uuid,\n          value: '',\n        });\n      });\n      break;\n    case 'check':\n      input = false;\n  }\n\n  return EmberObject.create({\n    uuid: assignment.uuid,\n    correct: false,\n    input: input,\n    score: 0,\n    scoreMax: 1,\n  });\n}\n\nfunction dragGapIsCorrect(assignment, gap, input) {\n  if (!gap.alternatives) return false;\n\n  let keys = gap.alternatives.filterBy('correct').map((alternative) => {\n    if (alternative && alternative.value) {\n      return alternative.value.trim();\n    } else {\n      return null;\n    }\n  });\n\n  let value = input.findBy('uuid', gap.uuid).value;\n\n  if (!value) return false;\n\n  value = value.trim();\n\n  return keys.includes(value);\n}\n\nfunction selectGapIsCorrect(assignment, gap, input) {\n  if (!gap.alternatives) return false;\n\n  let keys = gap.alternatives.filterBy('correct').map((alternative) => {\n    if (alternative && alternative.value) {\n      return alternative.value.trim();\n    } else {\n      return null;\n    }\n  });\n\n  const item = input.findBy('uuid', gap.uuid);\n  let value = item && item.value;\n\n  if (!value) return false;\n\n  value = value.trim();\n\n  return keys.includes(value);\n}\n\nfunction writeGapIsCorrect(assignment, gap, input) {\n  if (!gap.alternatives) return false;\n\n  let keys = gap.alternatives.filterBy('correct').map((alternative) => {\n    if (alternative && alternative.value) {\n      return alternative.value.trim();\n    } else {\n      return null;\n    }\n  });\n\n  let value = input.findBy('uuid', gap.uuid).value;\n\n  if (!value) return false;\n\n  value = value.trim();\n\n  const settings = assignment.settings.correctionwrite;\n\n  if (!settings.includes('case')) {\n    keys = keys.map((key) => key.toLowerCase());\n    value = value.toLowerCase();\n  }\n\n  if (!settings.includes('whitespace')) {\n    keys = keys.map((key) => key.replace(/\\s/g, ''));\n    value = value.replace(/\\s/g, '');\n  }\n\n  return keys.includes(value);\n}\n\nfunction gapIsCorrect(assignment, gap, input) {\n  if (!assignment || !assignment.settings) return;\n\n  switch (assignment.settings.behaviour) {\n    case 'drag':\n      return dragGapIsCorrect(assignment, gap, input);\n    case 'select':\n      return selectGapIsCorrect(assignment, gap, input);\n    case 'write':\n      return writeGapIsCorrect(assignment, gap, input);\n  }\n}\n\nfunction normalizeLatexInput(input) {\n  /**\n   * This function handles whitespace and decimal separator in the\n   * latex code so that any amount of whitespace or using period or\n   * comma as the decimal separator is all valid.\n   *\n   * Since Mathlive is configured to use comma as the default\n   * decimal separator, the latex decimal separator period {.}\n   * is never generated and therefore doesn't need to be handled.\n   *\n   * \\; is regular whitespace in latex\n   * {,} is the way a comma separator is represented in latex\n   *\n   * So basically the code does the following to the input string:\n   * 1. Removes latex whitespace\n   * 2. Removes regular whitespace\n   * 3. Replaces latex decimal separator comma with regular comma\n   * 4. Replaces comma with period\n   */\n\n  const values = [/\\\\;/g, /\\\\ /g, /\\{,\\}/g, /,/g];\n  const replacements = ['', '', ',', '.'];\n\n  let replacement;\n\n  values.forEach((value, idx) => {\n    replacement = replacements[idx];\n    input = input.replace(value, replacement);\n  });\n\n  // A special replacement is needed for fractions where the new\n  // syntax writes them as frac12 whereas the old would write\n  // frac{1}{2}.\n  const fracRegexp = /\\\\frac([0-9])([0-9])/g;\n  input = input.replace(fracRegexp, `\\\\frac{$1}{$2}`);\n\n  return input;\n}\n\nconst WHITESPACE_RX = /\\s/g;\n\nexport function isPlaceTextGapWordCorrect(x, y, corrections = []) {\n  if (typeof x !== 'string' || typeof y !== 'string') {\n    return false;\n  }\n\n  if (!corrections.includes('case')) {\n    x = x.toLowerCase();\n    y = y.toLowerCase();\n  }\n\n  if (!corrections.includes('whitespace')) {\n    x = x.replace(WHITESPACE_RX, '');\n    y = y.replace(WHITESPACE_RX, '');\n  }\n\n  return x === y;\n}\n\nfunction validatePlaceTextGaps(assignment, input) {\n  const markers = assignment.content.markers;\n  const corrections = assignment.settings.correctionwrite;\n  return markers.every((answer) =>\n    isPlaceTextGapWordCorrect(\n      answer.word,\n      input.findBy('uuid', answer.uuid).value,\n      corrections\n    )\n  );\n}\n\nfunction isCorrect(assignment, answer) {\n  if (!assignment) return;\n\n  let alternatives,\n    markers,\n    input,\n    items,\n    isFormula,\n    doLowerCase,\n    keepWhitespace,\n    keys,\n    objects;\n\n  switch (assignment.template) {\n    case 'arrange':\n      alternatives = assignment.content.alternatives;\n      input = answer.input;\n\n      if (!alternatives || !input || input.length === 0) {\n        return false;\n      }\n\n      return isEqual(input.mapBy('uuid'), alternatives.mapBy('uuid'));\n    case 'choice':\n      alternatives = assignment.content.alternatives;\n      input = clone(answer.input);\n\n      if (!alternatives || !input || input.length === 0) {\n        return false;\n      }\n\n      return alternatives.every((alternative) => {\n        return input.includes(alternative.uuid) === alternative.correct;\n      });\n    case 'match':\n      alternatives = assignment.content.alternatives;\n      input = clone(answer.input);\n\n      if (!alternatives || !input || !input.every((a) => a.assigned)) {\n        return false;\n      }\n\n      return alternatives.every((alternative, index) => {\n        return input.objectAt(index).uuid === alternative.uuid;\n      });\n    case 'number-line':\n      alternatives = assignment.content.alternatives;\n      input = clone(answer.input);\n\n      if (!alternatives || !input || input.length === 0) {\n        return false;\n      }\n\n      if (alternatives.length != input.length) return false;\n\n      return alternatives.every((alternative) =>\n        input.includes(alternative.start_index)\n      );\n\n    case 'place-choices':\n      markers = assignment.content.markers.filterBy('correct');\n      input = clone(answer.input);\n\n      if (\n        !markers ||\n        !input ||\n        input.length === 0 ||\n        markers.length !== input.length\n      ) {\n        return false;\n      }\n\n      return markers.mapBy('uuid').every((uuid) => input.includes(uuid));\n\n    case 'place-words':\n      alternatives = assignment.content.alternatives;\n      input = clone(answer.input);\n\n      alternatives = alternatives.filter(\n        (item) => item !== null && item?.value !== null\n      );\n\n      if (\n        input.filter(\n          (answer) => answer.extra === true && answer.assignedTo != null\n        ).length\n      ) {\n        return false;\n      }\n\n      if (\n        !alternatives.every(\n          (answer) =>\n            input.findBy('assignedTo', answer.assigned_to)?.value ===\n            answer.value\n        )\n      ) {\n        return false;\n      }\n      return true;\n    case 'place-images':\n      alternatives = assignment.content.alternatives;\n      input = clone(answer.input);\n\n      items = alternatives.map((alternative) => {\n        const answer = input.findBy('uuid', alternative.uuid);\n\n        // This fix has been added to handle cases where the same image should be accepted at multiple points.\n        const answers = input.filter((item) => item.image === answer.image);\n\n        return {\n          correct: answers.some(\n            (answer) => answer.assignedTo === alternative.assignedTo\n          ),\n        };\n      });\n      return items.every((answer) => answer.correct);\n    case 'place-text-gaps':\n      input = clone(answer.input);\n\n      return validatePlaceTextGaps(assignment, input);\n\n    case 'reply':\n      input = clone(answer.input);\n\n      if (!input || typeof input !== 'string' || input === '') {\n        return false;\n      }\n\n      isFormula = assignment.settings.behaviour === 'formula';\n\n      if (!assignment.settings.correctiontext) {\n        assignment.settings.correctiontext = [];\n      }\n\n      doLowerCase = !assignment.settings.correctiontext.includes('case');\n      keepWhitespace =\n        assignment.settings.correctiontext.includes('whitespace');\n\n      keys = assignment.content.keys;\n\n      if (isFormula) {\n        input = normalizeLatexInput(input);\n        keys = keys.map((key) => normalizeLatexInput(key));\n      } else {\n        input = input.trim();\n\n        if (!keepWhitespace) {\n          input = input.replace(/\\s/g, '');\n          keys = keys.map((key) => key.replace(/\\s/g, ''));\n        }\n\n        if (doLowerCase) {\n          input = input.toLowerCase();\n          keys = keys.map((key) => key.toLowerCase());\n        }\n      }\n\n      if (keys.includes(input)) return true;\n\n      if (isFormula && parseFloat(input) == input) {\n        return keys\n          .filter((key) => parseFloat(key) == key && parseFloat(key))\n          .includes(parseFloat(input));\n      }\n\n      return false;\n    case 'sort':\n      if (assignment.settings.behaviour === 'images') {\n        items = assignment.content.items.filterBy('isImage');\n      } else {\n        items = assignment.content.items.rejectBy('isImage');\n      }\n\n      input = answer.input;\n\n      // check that items or input is valid and all input are\n      // assigned to a dropzone\n      if (!items || !input || !input.any((a) => a.assignedTo)) {\n        return false;\n      }\n\n      // check that num assigned items for each group matches\n      if (\n        !assignment.content.groups.every(\n          (group) =>\n            items.filterBy('assigned_to', group.uuid).length ===\n            input.filterBy('assignedTo', group.uuid).length\n        )\n      ) {\n        return false;\n      }\n\n      // check that all item values are present among the correct\n      // values for the dropzone it is attached to\n      if (\n        !input.every(\n          (a) =>\n            items\n              .filterBy('assigned_to', a.assignedTo)\n              .mapBy('value')\n              .indexOf(items.findBy('uuid', a.uuid).value) !== -1\n        )\n      ) {\n        return false;\n      }\n\n      return true;\n    case 'matrix':\n    case 'text-gap':\n    case 'text-gap-multiple':\n      objects = assignment.content.objects;\n      input = clone(answer.input);\n\n      if (!objects || !input || !input.every((a) => a.value)) {\n        return false;\n      }\n\n      return objects.every((gap) => gapIsCorrect(assignment, gap, input));\n    case 'check':\n      return answer.input === true;\n  }\n}\n\nfunction correctExercise(exercise, answer) {\n  const assignments = exercise.get('body.exercise.assignments');\n\n  const assignmentResults = assignments.map((assignment) => {\n    let assignmentAnswer = answer\n      .get('assignments')\n      .findBy('uuid', assignment.uuid);\n\n    if (!assignmentAnswer) {\n      assignmentAnswer = emptyAnswer(assignment);\n      answer.get('assignments').addObject(assignmentAnswer);\n    }\n\n    const correct = isCorrect(assignment, assignmentAnswer);\n\n    assignmentAnswer.set('correct', correct);\n    assignmentAnswer.set('score', correct ? 1 : 0);\n\n    return correct;\n  });\n\n  const correct = assignmentResults.every(Boolean);\n\n  answer.set('status', correct ? 'correct' : 'wrong');\n}\n\nconst NOT_STARTED_ANSWER_STATUSES = ['not-started'];\n\nconst NOT_SUBMITTED_ANSWER_STATUSES = NOT_STARTED_ANSWER_STATUSES.concat([\n  'started',\n  'incomplete',\n]);\n\nconst NOT_CORRECT_ANSWER_STATUSES = NOT_SUBMITTED_ANSWER_STATUSES.concat([\n  'wrong',\n  'teacher-wrong',\n]);\n\nconst CORRECT_ANSWER_STATUSES = ['correct'];\n\nfunction getCorrectAnswers(answers) {\n  return answers.filter((answer) =>\n    CORRECT_ANSWER_STATUSES.includes(answer.status)\n  );\n}\n\nfunction getNumCorrectAnswers(answers) {\n  return answers.filter(\n    (answer) => !NOT_CORRECT_ANSWER_STATUSES.includes(answer.status)\n  ).length;\n}\n\nfunction getNumStartedAnswers(answers) {\n  return answers.filter(\n    (answer) => !NOT_STARTED_ANSWER_STATUSES.includes(answer.status)\n  ).length;\n}\n\nfunction getNumSubmittedAnswers(answers) {\n  return answers.filter(\n    (answer) => !NOT_SUBMITTED_ANSWER_STATUSES.includes(answer.status)\n  ).length;\n}\n\nexport {\n  correctExercise,\n  emptyAnswer,\n  getCorrectAnswers,\n  getNumCorrectAnswers,\n  getNumStartedAnswers,\n  getNumSubmittedAnswers,\n};\n","import { Promise } from 'rsvp';\n\nfunction scrollToPromise({ top, behavior }) {\n  window.scrollTo({\n    top,\n    behavior,\n  });\n  return waitForScrollEnd();\n}\n\nfunction waitForScrollEnd() {\n  let lastChangedFrame = 0;\n  let lastX = window.scrollX;\n  let lastY = window.scrollY;\n\n  return new Promise((resolve) => {\n    function tick(frames) {\n      if (frames >= 500 || frames - lastChangedFrame > 20) {\n        return resolve();\n      }\n      if (window.scrollX != lastX || window.scrollY != lastY) {\n        lastChangedFrame = frames;\n        lastX = window.scrollX;\n        lastY = window.scrollY;\n      }\n      window.requestAnimationFrame(tick.bind(null, frames + 1));\n    }\n    tick(0);\n  });\n}\n\nfunction viewportTop() {\n  const margin = parseInt(\n    getComputedStyle(document.body).getPropertyValue('--global-margin')\n  );\n  const header = parseInt(\n    getComputedStyle(document.body).getPropertyValue('--header-height')\n  );\n\n  let topbar = parseInt(\n    document.getElementsByClassName('content-topbar')[0]?.offsetHeight\n  );\n\n  if (isNaN(topbar)) {\n    topbar = parseInt(\n      getComputedStyle(document.body).getPropertyValue('--topbar-height')\n    );\n  }\n\n  return margin + header + topbar;\n}\n\nfunction viewportBottom() {\n  let index = parseInt(\n    document.getElementsByClassName('contents-float-nav')[0]?.offsetHeight\n  );\n\n  if (isNaN(index)) {\n    index = 0;\n  }\n\n  return index;\n}\n\nfunction scrollTo(elem, behavior = 'smooth') {\n  const target = {\n    top: 0,\n    behavior,\n  };\n\n  if (\n    !elem.classList.contains('chapter-part') ||\n    elem.previousElementSibling !== null\n  ) {\n    target.top = elemOffset(elem) - viewportTop();\n  }\n\n  return scrollToPromise(target);\n}\n\nfunction elemOffset(elem) {\n  let offset = elem.offsetTop;\n  let par = elem.offsetParent;\n\n  while (par) {\n    offset += par.offsetTop;\n    par = par.offsetParent;\n  }\n\n  return offset;\n}\n\nexport { elemOffset, scrollTo, viewportBottom, viewportTop, waitForScrollEnd };\n","import { isArray } from '@ember/array';\nimport EmberObject from '@ember/object';\n\nconst clone = function(val) {\n  if (!val || typeof val !== 'object') {\n    return val;\n  }\n\n  if (isArray(val)) {\n    return val.map((item) => clone(item));\n  }\n\n  return EmberObject.create(Object.assign({}, val));\n};\n\nexport default clone;\n","export default async function collectionClose(model, contextHelper, router) {\n  const { interactive } = model;\n\n  if (contextHelper.inMission && interactive?.children?.length <= 1) {\n    return router.transitionTo(\n      'master.missions',\n      contextHelper.activeMission.id\n    );\n  }\n\n  if (interactive?.children.length > 1) {\n    return router.transitionTo('master.interactives');\n  }\n\n  if (contextHelper.hasCloseUrl) {\n    return router.transitionTo(contextHelper.closeUrl);\n  }\n\n  let parent;\n\n  try {\n    parent = await interactive.parent;\n  } catch (err) {\n    // do nothing\n  }\n\n  if (parent) {\n    return router.transitionTo('nodes', parent.id);\n  }\n\n  return router.transitionTo('master.index');\n}\n","const copyToClipboard = function(str) {\n  if (navigator.clipboard) return navigator.clipboard.writeText(str);\n\n  const element = document.createElement('textarea');\n  element.value = str;\n  element.contentEditable = true;\n  element.readOnly = true;\n\n  document.body.appendChild(element);\n\n  const range = document.createRange();\n  range.selectNodeContents(element);\n\n  const selection = window.getSelection();\n  selection.removeAllRanges();\n  selection.addRange(range);\n\n  element.setSelectionRange(0, 999999);\n\n  document.execCommand('copy');\n\n  document.body.removeChild(element);\n\n  return Promise.resolve();\n};\n\nexport default copyToClipboard;\n","import { getProperties } from '@ember/object';\nimport { typeOf } from '@ember/utils';\n\nconst BLACKLISTED_KEYS = [\n  'isInstance',\n  'isDestroyed',\n  'isDestroying',\n  'concatenatedProperties',\n  'mergedProperties'\n];\n\nfunction emberObjectToNativeObject(target) {\n  let result;\n\n  switch (typeOf(target)) {\n    case 'instance':\n      result = {};\n\n      for (const k in getProperties(target, Object.keys(target))) {\n        if (target.hasOwnProperty(k) && !BLACKLISTED_KEYS.includes(k)) {\n          result[k] = emberObjectToNativeObject(target[k]);\n        }\n      }\n\n      break;\n\n    case 'object':\n      result = {};\n\n      for (const k in target) {\n        if (target.hasOwnProperty(k)) {\n          result[k] = emberObjectToNativeObject(target[k]);\n        }\n      }\n\n      break;\n\n    case 'array':\n      result = target.map((x) => emberObjectToNativeObject(x));\n      break;\n\n    default:\n      result = target;\n  }\n\n  return result;\n}\n\nexport default emberObjectToNativeObject;\n","function isIncluded(entries, entry, customContent, isActive) {\n  if (!isActive || !entries) {\n    return true;\n  }\n\n  if (!customContent.get('populated') && entries.get('length') === 0) {\n    return true;\n  }\n\n  return entries.mapBy('id').includes(entry.get('id'));\n}\n\nfunction teacherAssignmentIsAllowed(\n  teacherAssignmentEntity,\n  customContent,\n  isActive\n) {\n  return isIncluded(\n    customContent.get('includedTeacherAssignments')?.toArray() || [],\n    teacherAssignmentEntity.get('teacherAssignment'),\n    customContent,\n    isActive\n  );\n}\n\nfunction teacherCollectionIsAllowed(teacherCollection, customContent) {\n  const includedTeacherAssignments =\n    customContent.get('includedTeacherAssignments')?.toArray() || [];\n\n  if (\n    !includedTeacherAssignments ||\n    (!customContent.get('populated') &&\n      includedTeacherAssignments.get('length') === 0)\n  ) {\n    return true;\n  }\n\n  return includedTeacherAssignments\n    .mapBy('id')\n    .any((id) => teacherCollection.get('children').mapBy('id').includes(id));\n}\n\nexport function entityIsAllowedInCustomContent(\n  entity,\n  customContent,\n  isActive = true\n) {\n  if (!entity) return false;\n  if (!customContent) return true;\n\n  if (entity.get('isTeacherAssignment')) {\n    return teacherAssignmentIsAllowed(entity, customContent, isActive);\n  }\n\n  if (entity.get('isTeacherCollection')) {\n    return teacherCollectionIsAllowed(entity, customContent);\n  }\n\n  let includedEntities;\n\n  try {\n    includedEntities = customContent.get('includedEntities').toArray();\n  } catch (err) {\n    // do nothing\n  }\n\n  if (!includedEntities) includedEntities = [];\n\n  return isIncluded(includedEntities, entity, customContent, isActive);\n}\n","class MissingContentError extends Error {\n  /**\n   * The constructor takes the same arguments as the standard JavaScript\n   * Error but with an extra \"redirectTarget\" argument last.\n   */\n\n  constructor() {\n    const args = Array.from(arguments);\n    const redirectTarget = args.pop();\n\n    super(...args);\n\n    this.redirectTarget = redirectTarget;\n  }\n\n  redirectTarget;\n}\n\nexport { MissingContentError };\n","import { isPresent, typeOf } from '@ember/utils';\n\nimport himalaya from './himalaya';\n\nfunction nodeIsFootnote(node) {\n  if (node.tagName === 'span') {\n    return node.attributes.any(\n      (attribute) =>\n        attribute.key === 'data-type' && attribute.value === 'footnote'\n    );\n  }\n  return false;\n}\n\nfunction extractFootnotesFromNodes(nodes) {\n  const footnotes = [];\n\n  nodes.forEach((node) => {\n    if (nodeIsFootnote(node)) {\n      const value = node.attributes.findBy('key', 'data-value')?.value;\n      const id = node.attributes.findBy('key', 'data-id')?.value;\n\n      if (value && id) {\n        footnotes.addObject({\n          id,\n          value,\n        });\n      }\n    }\n    if (node.children) {\n      footnotes.addObjects(extractFootnotesFromNodes(node.children));\n    }\n  });\n\n  return footnotes;\n}\n\nexport default function extractFootnotesFromEditorValue(value) {\n  if (isPresent(value)) {\n    if (typeOf(value) === 'string') {\n      value = himalaya.parse(value);\n    }\n\n    return extractFootnotesFromNodes(value);\n  }\n  return [];\n}\n","import { all, reject } from 'rsvp';\n\nasync function courseRequest(store, user, selectedSchoolId, page, now) {\n  return store\n    .query('course', {\n      filter: {\n        school_id: selectedSchoolId,\n        active: true,\n        teachers: { arrayContains: user.id },\n      },\n      page: {\n        number: page,\n        size: 300,\n      },\n    })\n    .then((response) => ({\n      numPages: response.meta.total_pages,\n      courses: response.filter(\n        (course) => course.keep_alive || course.end_date > now\n      ),\n    }));\n}\n\nexport default async function fetchSchoolsAndCourses(\n  store,\n  user,\n  selectedSchoolId\n) {\n  let [schools, selectedSchool] = await all([user.schools, user.school]);\n\n  const schoolOptions = schools.sortBy('name').map((school) => {\n    return {\n      value: school.id,\n      label: school.name,\n    };\n  });\n\n  if (!selectedSchoolId) {\n    selectedSchoolId = selectedSchool.id;\n  }\n\n  selectedSchool = schools.findBy('id', selectedSchoolId);\n\n  if (!selectedSchool) return reject();\n\n  let page = 1;\n  const now = new Date();\n  const { numPages, courses: userCourses } = await courseRequest(\n    store,\n    user,\n    selectedSchoolId,\n    page,\n    now\n  );\n  const promises = [];\n\n  for (page = 2; page <= numPages; page++) {\n    promises.push(\n      courseRequest(store, user, selectedSchoolId, page, now).then(\n        ({ courses }) => userCourses.push(...courses)\n      )\n    );\n  }\n\n  await all(promises);\n\n  const courses = userCourses.sortBy('name');\n\n  return { schoolOptions, selectedSchoolId, courses };\n}\n","import entityFallbackTitles from 'babel/rules/entity-fallback-titles';\n\nexport default function (type, intl) {\n  const typeFallback = entityFallbackTitles[type];\n\n  if (typeFallback) {\n    return intl.t(`utils.generateFallbackTitle.${type}`);\n  }\n\n  return intl.t(`utils.generateFallbackTitle.missingType`);\n}\n","function getAnswersForExercise(exercise, answers) {\n  if (!exercise || !answers) return null;\n\n  const exerciseKey = exercise.get('isTeacherAssignment')\n    ? 'teacherAssignment.id'\n    : 'id';\n\n  const id = exercise.get(exerciseKey);\n\n  if (!id) return null;\n\n  const answerKey = exercise.get('isTeacherAssignment')\n    ? 'teacherAssignment.id'\n    : 'node_id';\n\n  const answersForExercise = answers.filter((answer) => answer.get(answerKey) === id);\n\n  if (answersForExercise.length === 0) return null;\n\n  return answersForExercise;\n}\n\nfunction getOriginalAnswer(exercise, answers) {\n  const answersForExercise = getAnswersForExercise(exercise, answers);\n\n  if (!answersForExercise) return null;\n\n  const originalAnswers = answersForExercise.filter(\n    (answer) => !answer.belongsTo('originalAnswer').id()\n  );\n\n  if (originalAnswers.length === 0) return null;\n\n  return originalAnswers.shift();\n}\n\nfunction getLatestVersion(exercise, answers) {\n  const answersForExercise = getAnswersForExercise(exercise, answers);\n\n  if (!answersForExercise) return null;\n\n  const versions = answersForExercise.filter((answer) =>\n    answer.belongsTo('originalAnswer').id()\n  );\n\n  if (versions.length > 0) {\n    return versions\n      .sortBy('version')\n      .reverse()\n      .shift();\n  }\n\n  return getOriginalAnswer(exercise, answers);\n}\n\nexport { getAnswersForExercise, getOriginalAnswer, getLatestVersion };\n","import sortBy from 'babel/utils/sort-by';\nimport { all } from 'rsvp';\n\nexport default function getCollectionData(store, collection) {\n  const promises = [\n    collection.parent,\n    collection.children,\n    collection.book,\n    collection.contenteditor,\n    collection.audio,\n  ];\n\n  return all(promises).then(([parent, exercises, book, editor]) => {\n    if (collection.isTeacherCollection) {\n      exercises = sortBy(exercises, 'title_asc');\n    }\n\n    return {\n      parent,\n      exercises,\n      book,\n      editor,\n    };\n  });\n}\n","/**\n * Utility for get element(s)\n *\n * @method getElement\n * @param {HTMLElement|String} element Element or selector for element(s)\n * @param {HTMLElement|String} [parentElement=document] If element is a String, search for element(s) in parentElement. parentElement can be a selector.\n * @param {Boolean} [multipleElements=false] Only available if element is a String. If true, return all matching elements. If false, only return first found element.\n * @returns {(HTMLElement|NodeList)} Element or, if multipleElements is true, NodeList with all matching elements.\n * @namespace utils\n *\n * @example\n * import getElement from 'babel/utils/get-element';\n *\n * getElement(this.element);\n * getElement('.find-me', this.element, true);\n */\n\nconst isBoolean = (value) => {\n  return typeof value === 'boolean';\n};\n\nconst isElement = (value) => {\n  return typeof value === 'object' && value instanceof HTMLElement;\n};\n\nconst isString = (value) => {\n  return typeof value === 'string' && value !== '';\n};\n\nexport default function(...params) {\n  let element,\n    elements,\n    parentElement = document,\n    multipleElements = false;\n\n  // set values from params\n  for (let index = params.length - 1; index >= 0; index--) {\n    const value = params[index];\n\n    if (index === 0 && isElement(value)) {\n      element = value;\n    } else if (index === 0 && isString(value) && multipleElements) {\n      elements = parentElement.querySelectorAll(value);\n    } else if (index === 0 && isString(value) && !multipleElements) {\n      element = parentElement.querySelector(value);\n    } else if (isElement(value)) {\n      parentElement = value;\n    } else if (isString(value)) {\n      parentElement = document.querySelector(value);\n    } else if (isBoolean(value)) {\n      multipleElements = value;\n    }\n  }\n\n  return element || elements || null;\n}\n","import { dasherize } from '@ember/string';\nimport { typeOf } from '@ember/utils';\n\nexport default function getSettingClassesForPart(className, part) {\n  const settingClasses = [];\n  const settings = part?.settings;\n\n  if (settings) {\n    for (const k in settings) {\n      const v = settings[k];\n\n      if (v) {\n        const type = typeOf(v);\n        if (type === 'boolean') {\n          settingClasses.addObject(dasherize(k));\n        } else if (type === 'string') {\n          settingClasses.addObject(dasherize(v));\n        }\n      }\n    }\n  }\n\n  return settingClasses\n    .map((settingClass) => [className, settingClass].join('--'))\n    .concat([className]);\n}\n","export default function() {\n  return new Date(new Date().toISOString().split('T')[0]);\n}\n","import { A } from '@ember/array';\nimport { get, set } from '@ember/object';\nimport { all, reject } from 'rsvp';\n\nexport default function (\n  entityId,\n  session,\n  ajax,\n  endpoint,\n  userApiEndpoint,\n  transition\n) {\n  transition.abort();\n\n  return all([\n    ajax.request(\n      `${endpoint}/api/v1/content/entities/${entityId}/products`,\n      true,\n      { type: 'GET' }\n    ),\n    session.get('user.licenses'),\n  ]).then(([entityProducts, userLicenses]) => {\n    // First check if the user's licenses should cover the entity\n\n    const entityISBNs =\n      entityProducts &&\n      entityProducts.data &&\n      entityProducts.data.map((x) => x.id);\n    const licensedISBNs =\n      userLicenses &&\n      userLicenses\n        .filter((x) => x.get('isActive') && !x.get('isExpired'))\n        .map((x) => x.get('isbn'));\n\n    let licenseExists = false;\n\n    if (entityISBNs && licensedISBNs) {\n      entityISBNs.forEach((isbn) => {\n        if (licensedISBNs.indexOf(isbn) !== -1) {\n          licenseExists = true;\n        }\n      });\n    }\n\n    const resolve = () => {\n      // save the entityId in the session to prevent eternal loops\n      // in weird edge cases, see NODI-1309\n\n      const failedEntities = get(session, 'failedFindLicenseEntities') || A();\n\n      if (failedEntities.includes(entityId)) {\n        return reject();\n      }\n\n      failedEntities.push(entityId);\n\n      set(session, 'failedFindLicenseEntities', failedEntities);\n\n      return session.refreshUserLicenses().then(() => {\n        const location = get(transition, 'intent.url');\n\n        if (!location) {\n          return transition.retry();\n        }\n\n        return (window.location = location);\n      });\n    };\n\n    if (licenseExists) {\n      // The user should already have access, refresh book access and retry\n      return resolve();\n    }\n\n    // Attempt to find a license to connect the user to automatically\n    const userId = session.get('user.id');\n\n    return ajax\n      .request(`${userApiEndpoint}/api/users/${userId}/find-license`, true, {\n        type: 'GET',\n        data: { entityId },\n      })\n      .then((payload) => {\n        if (payload && payload.data && payload.data.id) {\n          return resolve();\n        }\n\n        return reject();\n      });\n  });\n}\n","function getOptions() {\n  const maxAge = 60 * 60 * 24 * 365; // one year in seconds\n  const fullDomain = location.hostname;\n  const domainParts = fullDomain.split('.');\n  const numDomainParts = domainParts.length;\n  const domain =\n    numDomainParts > 2\n      ? '.' +\n        domainParts[numDomainParts - 2] +\n        '.' +\n        domainParts[numDomainParts - 1]\n      : fullDomain;\n  const path = '/';\n\n  return { domain, path, maxAge };\n}\n\nfunction clearCookie(cookieService, name) {\n  const { domain, path } = getOptions();\n  cookieService.clear(name, { domain, path });\n}\n\nfunction writeCookie(cookieService, name, value) {\n  cookieService.write(name, value, getOptions());\n}\n\nexport { clearCookie, writeCookie };\n","import { all, Promise, resolve } from 'rsvp';\n\nfunction handleDirtyHasManyRelationshipData(store, url, type) {\n  return new Promise((resolve, reject) => {\n    if (!type) reject();\n\n    const relationUrl = new URL(url);\n    const params = new URLSearchParams(relationUrl.search);\n    const ids = params.getAll('id')?.filter((x) => x?.length > 0) || [];\n\n    let notFound = 0;\n\n    all(\n      ids.map((id) =>\n        store\n          .findRecord(type, id)\n          .then((item) => {\n            const serialized = item.serialize();\n            const data = serialized.data;\n            data.id = id;\n            return data;\n          })\n          .catch(() => {\n            notFound++;\n          })\n      )\n    )\n      .then((records) =>\n        resolve({\n          data: records.filter((x) => x),\n          meta: { num_not_found: notFound },\n        })\n      )\n      .catch(reject);\n  });\n}\n\nfunction handleDirtyBelongsToRelationshipData(store, url, type) {\n  return new Promise((resolve, reject) => {\n    const id = url.split('/').pop();\n\n    if (!type || !id) reject();\n\n    store\n      .findRecord(type, id)\n      .then((item) => {\n        const serialized = item.serialize();\n        const data = serialized.data;\n        data.id = id;\n        return data;\n      })\n      .then((record) => resolve({ data: record }))\n      .catch(() => resolve({ data: null }));\n  });\n}\n\nfunction handleReceiversRelationship(store, snapshot, url, type) {\n  return all([\n    resolve(snapshot?.record?.course).then((course) =>\n      resolve(course?.users?.mapBy('id'))\n    ),\n    handleDirtyHasManyRelationshipData(store, url, type),\n  ]).then(([courseUsers, receivers]) => {\n    const validReceivers = {\n      data: [],\n      meta: { num_not_found: receivers?.meta?.num_not_found || 0 },\n    };\n\n    receivers?.data?.forEach((user) => {\n      if (courseUsers?.includes(user?.id)) {\n        validReceivers.data.push(user);\n      } else {\n        validReceivers.meta.num_not_found++;\n      }\n    });\n\n    return validReceivers;\n  });\n}\n\nexport {\n  handleDirtyBelongsToRelationshipData,\n  handleDirtyHasManyRelationshipData,\n  handleReceiversRelationship,\n};\n","// TEMP FIXME\nexport default window.himalaya;\n","const DEFAULT_MAX_IMAGE_SIZE = 1200;\n\nfunction toPositiveDimension(value) {\n  const dimension = Number(value);\n\n  return dimension > 0 ? dimension : null;\n}\n\nexport default function getResizedImageDimensions({\n  width,\n  height,\n  maxSize = DEFAULT_MAX_IMAGE_SIZE,\n} = {}) {\n  const parsedWidth = toPositiveDimension(width);\n  const parsedHeight = toPositiveDimension(height);\n  const resolvedMaxSize = maxSize > 0 ? maxSize : DEFAULT_MAX_IMAGE_SIZE;\n\n  if (!parsedWidth || !parsedHeight) {\n    return {\n      width: resolvedMaxSize,\n      height: resolvedMaxSize,\n    };\n  }\n\n  const longestSide = Math.max(parsedWidth, parsedHeight);\n\n  if (longestSide <= resolvedMaxSize) {\n    return {\n      width: parsedWidth,\n      height: parsedHeight,\n    };\n  }\n\n  const scale = resolvedMaxSize / longestSide;\n\n  return {\n    width: Math.round(parsedWidth * scale),\n    height: Math.round(parsedHeight * scale),\n  };\n}\n","function isWorkspaceCollectionActive(router, collection) {\n  return collection?.children?.find((exercise) =>\n    router.isActive('master.contents.assignments.show', exercise)\n  );\n}\n\nexport { isWorkspaceCollectionActive };\n","import { isArray } from '@ember/array';\n\nexport default function(val1, val2) {\n  if (typeof val1 === 'string') {\n    return val1 === val2;\n  }\n\n  if (isArray(val1)) {\n    return (\n      isArray(val2) &&\n      val1.length === val2.length &&\n      val1.every((item, index) => item === val2[index])\n    );\n  }\n\n  return false;\n};\n","import moment from 'moment';\n\nexport default function licenseInfo(license, intl, showErrors = false) {\n  const result = { text: '', class: false, extended: false };\n\n  let isError = false;\n\n  if (license.get('isbn') && license.get('isbn').startsWith('EX')) {\n    if (!license.license_id || license.is_expired) {\n      result.text = intl.t('utils.licenseInfo.missingLicense');\n      isError = true;\n    } else if (!license.active_until) {\n      result.class = 'text-color-success';\n      result.text = intl.t('utils.licenseInfo.ready');\n    } else {\n      result.class = 'text-color-success';\n      result.text = intl.t('utils.licenseInfo.started');\n    }\n  } else if (!license.license_id) {\n    result.text = intl.t('utils.licenseInfo.missingLicense');\n    isError = true;\n  } else if (license.is_external) {\n    if (license.is_expired) {\n      result.class = 'text-color-error';\n      result.text = intl.t('utils.licenseInfo.externalExpired', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    } else {\n      result.class = moment(license.active_until).isBefore(\n        moment().add(30, 'days')\n      )\n        ? 'text-color-error'\n        : 'text-color-success';\n      result.text = intl.t('utils.licenseInfo.externalExpires', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    }\n  } else if (license.is_demo) {\n    if (license.is_expired) {\n      if (\n        moment(license.active_until).isBefore(moment().subtract(365, 'days'))\n      ) {\n        result.text = intl.t('utils.licenseInfo.missingLicense');\n      } else {\n        result.text = intl.t('utils.licenseInfo.freeUsed');\n      }\n\n      result.class = 'text-color-error';\n    } else {\n      result.class = license.extended\n        ? 'text-color-success'\n        : 'text-color-error';\n      result.text = intl.t('utils.licenseInfo.freeExpires', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n      result.extended = license.extended;\n    }\n  } else if (!license.active_until) {\n    result.text = intl.t('utils.licenseInfo.ready');\n  } else if (license.is_expired) {\n    result.class = 'text-color-error';\n\n    if (license.is_private) {\n      result.text = intl.t('utils.licenseInfo.personalExpired', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    } else {\n      result.class = 'text-color-error';\n      result.text = intl.t('utils.licenseInfo.expired', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    }\n  } else if (moment(license.active_until).isBefore(moment().add(30, 'days'))) {\n    result.class = license.extended ? 'text-color-success' : 'text-color-error';\n\n    if (license.is_private) {\n      result.text = intl.t('utils.licenseInfo.personalExpires', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    } else {\n      result.text = intl.t('utils.licenseInfo.expires', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    }\n\n    if (license.extended) result.extended = true;\n  } else {\n    result.class = 'text-color-success';\n\n    if (license.is_private) {\n      result.text = intl.t('utils.licenseInfo.personalValidThru', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    } else {\n      result.text = intl.t('utils.licenseInfo.validThru', {\n        date: moment(license.active_until).format('YYYY-MM-DD'),\n      });\n    }\n\n    if (license.extended) result.extended = true;\n  }\n\n  if (showErrors && isError) {\n    result.class = 'text-color-error';\n  }\n\n  return result;\n}\n","import { isArray } from '@ember/array';\nimport { all, reject } from 'rsvp';\n\nexport default function loadDataFromStore(type, id, store) {\n  if (!id) return reject();\n\n  if (isArray(id)) {\n    const promises = id.map((x) => {\n      if (!x) return reject();\n      return store.findRecord(type, x);\n    });\n\n    return all(promises);\n  }\n\n  return store.findRecord(type, id);\n}\n","import config from 'babel/config/environment';\n\n/* Key and format are shared with the vue app (logOpenedProduct.ts) so a\n   product opened in one half is not logged again by the other. */\nfunction storageKey(userId) {\n  return `${userId}_logged_products`;\n}\n\nfunction loggedProducts(userId) {\n  try {\n    const stored = JSON.parse(\n      window.sessionStorage.getItem(storageKey(userId)) ?? '[]'\n    );\n    return Array.isArray(stored) ? stored : [];\n  } catch (err) {\n    return [];\n  }\n}\n\nasync function logOpenedProduct(model, ajax, session) {\n  try {\n    const product = await model.product;\n    const userId = session.get('user.id');\n\n    if (!product || !userId) return;\n\n    const logged = loggedProducts(userId);\n\n    if (logged.includes(product.id)) return;\n\n    await ajax.request(`${config.userApiEndpoint}/api/statistics`, true, {\n      type: 'POST',\n      data: { isbn: product.id },\n    });\n\n    window.sessionStorage.setItem(\n      storageKey(userId),\n      JSON.stringify([...logged, product.id])\n    );\n  } catch (err) {\n    // console.log('Could not log opened product', err);\n  }\n}\n\nexport { logOpenedProduct };\n","import config from 'babel/config/environment';\n\nexport function getDownloadUrl(material, forceDownload = true) {\n  const { metadata, id } = material;\n\n  const name = (metadata?.download_name ?? metadata?.filename ?? '').replaceAll(\n    '?',\n    ''\n  );\n  const forceDownloadParam = forceDownload ? '?force_download=true' : '';\n\n  return `${config.endpoint}/api/v1/content/materials/${id}/download/${name}${forceDownloadParam}`;\n}\n\nexport async function openMaterialDownload(\n  material,\n  ajax,\n  forceDownload = true\n) {\n  const url = getDownloadUrl(material, forceDownload);\n\n  const data = await ajax.request(url, true, {\n    type: 'GET',\n  });\n\n  if (data?.signed_url) {\n    window.open(data.signed_url);\n    return true;\n  }\n\n  return false;\n}\n","const MATOMO_CATEGORIES = {\n  presentation: 'Presentation',\n  play: 'Uppläsning',\n  readingBuddy: 'Läskompis',\n  helplist: 'Hjälplista',\n  mission: 'Uppdrag',\n  pageHeader: 'Sidhuvud',\n  wordlists: 'Ordlistor',\n  product: 'Produkt',\n  content: 'Innehåll',\n  shortcut: 'Genväg',\n  audit: 'Uppföljning',\n};\n/**\n * Track an event in Matomo\n * @param {Event} event\n * @example\n * **När användaren slutför en inbjudan via a-post där hen har valt klass och skickar med 30 elever**\n * ```javascript\n * trackEvent('Användare', 'Bjud in elev - Via e-post - Slutför', 'Med klass', 30);\n * ```\n */\nexport function trackEvent({ category, action, name, value }) {\n  if (!category || !action) {\n    console.error('Missing category or action for tracking event', {\n      category,\n      action,\n    });\n\n    return;\n  }\n\n  // Make sure window._paq exists\n  window._paq ??= [];\n\n  window._paq.push(['trackEvent', category, action, name, value?.toString()]);\n}\n\n/**\n * Track a presentation event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackPresentationEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.presentation,\n    action,\n    name,\n  });\n}\n\n/**\n * Track a play setting event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n * @param {number} [value] The new settings value\n */\nexport function trackPlaySettingEvent(action, name, value) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.play,\n    action,\n    name,\n    value,\n  });\n}\n\n/**\n * Track a reading buddy event in Matomo.\n *\n * @param {string} action The action performed\n */\nexport function trackReadingBuddyEvent(action) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.readingBuddy,\n    action,\n  });\n}\n\n/**\n * Track a helplist event in Matomo.\n *\n * @param {string} action The action performed\n */\nexport function trackHelplistEvent(action) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.helplist,\n    action,\n  });\n}\n\n/**\n * Track a mission event in Matomo.\n *\n * @param {string} action The action performed\n */\nexport function trackMissionEvent(action) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.mission,\n    action,\n  });\n}\n\n/**\n * Track a page header event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackPageHeaderEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.pageHeader,\n    action,\n    name,\n  });\n}\n\n/**\n * Track open elevwebb event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [isbn] Product ISBN\n */\nexport function trackOpenElevwebbEvent(action, isbn) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.product,\n    action,\n    name: isbn,\n  });\n}\n\n/**\n * Track a content event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackContentEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.content,\n    action,\n    name,\n  });\n}\n\n/**\n * Track a wordlist event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackWordlistEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.wordlists,\n    action,\n    name,\n  });\n}\n\n/**\n * Track a shortcut event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackShortcutEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.shortcut,\n    action,\n    name,\n  });\n}\n\n/**\n * Track an audit event in Matomo.\n *\n * @param {string} action The action performed\n * @param {string} [name] Additional details\n */\nexport function trackAuditEvent(action, name) {\n  trackEvent({\n    category: MATOMO_CATEGORIES.audit,\n    action,\n    name,\n  });\n}\n\n/**\n * Track a book page where the user has no license for the product.\n *\n * @param {string} id The book id\n * @param {string} title The book title\n * @param {string} referer The referrer, i.e where the user came from, might be empty\n */\nexport function trackBookPageWithoutLicense(id, title, referrer = '') {\n  trackEvent({\n    category: MATOMO_CATEGORIES.product,\n    action: 'Boksida utan licens',\n    name: `${id} - ${title}`,\n    value: referrer,\n  });\n}\n","import EmberObject, { set } from '@ember/object';\nimport { typeOf } from '@ember/utils';\n\nfunction objectToEmberObject(target) {\n  let result;\n\n  switch (typeOf(target)) {\n    case 'object':\n      result = EmberObject.create();\n\n      for (const k in target) {\n        if (target.hasOwnProperty(k)) {\n          const v = target[k];\n          set(result, k, objectToEmberObject(v));\n        }\n      }\n\n      break;\n\n    case 'array':\n      result = target.map((x) => objectToEmberObject(x));\n      break;\n\n    default:\n      result = target;\n  }\n\n  return result;\n}\n\nexport default objectToEmberObject;\n","// https://stackoverflow.com/a/62198235\nexport function numberToBase26(number, tail = '') {\n  if (number <= 26) {\n    return `${String.fromCharCode(number + 64)}${tail}`.toLowerCase();\n  }\n\n  const remainder = number % 26 || 26;\n  const division = Math.trunc(number / 26) - (remainder === 26 ? 1 : 0);\n\n  return numberToBase26(\n    division,\n    `${String.fromCharCode(remainder + 64)}${tail}`\n  );\n}\n","import { assert } from '@ember/debug';\n\nexport default function pagedArray({ content, page = 1, perPage = 1 }) {\n  assert('content must be an array', Array.isArray(content));\n\n  page = parseInt(page);\n  perPage = parseInt(perPage);\n\n  assert('Page must be an integer', !isNaN(page));\n  assert('Per page must be an integer', !isNaN(perPage));\n\n  const start = (page - 1) * perPage;\n  const end = start + perPage;\n  const items = content.slice(start, end);\n\n  items.page = page;\n  items.perPage = perPage;\n  items.totalPages = Math.ceil(content.length / perPage);\n\n  return items;\n}\n","import { tracked } from '@glimmer/tracking';\n\nexport default class Part {\n  constructor(component) {\n    if (component) {\n      for (const [key, value] of Object.entries(component)) {\n        this[key] = value;\n      }\n    }\n  }\n\n  @tracked mediaForced = false;\n}\n","export default window.Pusher;\n","import config from 'babel/config/environment';\n\nconst TRANSITION_TO_PATH = {\n  'master.index': () => `${config.nokPortalURL}/login`,\n  'master.admin.books': () => `${config.skolAdminUrl}/products`,\n  'master.admin.teachers.list': () =>\n    `${config.skolAdminUrl}/users?role=teacher`,\n  'master.admin.students.list': () =>\n    `${config.skolAdminUrl}/users?role=student`,\n  'master.admin.courses': () => `${config.skolAdminUrl}/courses`,\n  'master.profile.settings': () => `${config.nokPortalURL}/profile/settings`,\n  'master.courses.new': () => `${config.skolAdminUrl}/courses`,\n  'master.course-settings': (to) =>\n    `${config.skolAdminUrl}/courses/${to.params.course_id}`,\n  activate: (to) => `${config.nokPortalURL}/activate/${to.params.link_hash}`,\n};\n\nexport function redirectToNokportal(transition) {\n  if (\n    config.nokPortalURL &&\n    config.nokPortalURL !== 'null' &&\n    config.skolAdminUrl &&\n    config.skolAdminUrl !== 'null'\n  ) {\n    window.location = `${getUrl(transition.targetName, transition.to)}`;\n  }\n}\n\nexport function getUrl(targetName, to) {\n  return TRANSITION_TO_PATH[targetName]\n    ? TRANSITION_TO_PATH[targetName](to)\n    : '';\n}\n","import { notifyPropertyChange } from '@ember/object';\n\nexport default async function refreshRouteAndNotifyExerciseChange(\n  router,\n  contextHelper,\n  route\n) {\n  await router.refresh(route);\n\n  const children = await contextHelper.activeContent.children;\n  const collections = children.filter((child) => child.type === 'collections');\n\n  collections.forEach((collection) =>\n    notifyPropertyChange(collection, 'children')\n  );\n}\n","import { all, resolve } from 'rsvp';\n\nexport function resolvePathForTeacherAssignmentAnswer(answer, books) {\n  return all([books, answer.teacherAssignment, answer.book, answer.content])\n    .then(async ([books, teacherAssignment, book, content]) => {\n      if (!books?.includes(book)) {\n        const contents = await resolve(teacherAssignment.contents);\n        const bookIds = books.map((book) => book.id);\n\n        content = contents.find((content) =>\n          bookIds.includes(content.belongsTo('book').id())\n        );\n      }\n\n      return all([\n        teacherAssignment.createAsEntity(content),\n        content,\n        content.parent,\n      ]);\n    })\n    .then(([entity, content, area]) => ({\n      entity,\n      content,\n      area,\n    }));\n}\n","import { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { waitFor } from '@ember/test-waiters';\nimport { tracked } from '@glimmer/tracking';\n\nconst STATE = {\n  pending: 'pending',\n  resolved: 'resolved',\n  rejected: 'rejected',\n};\n\nexport default class Resource {\n  @tracked state = STATE.pending;\n  @tracked value = null;\n  @tracked error = null;\n\n  get isPending() {\n    return this.state === STATE.pending;\n  }\n\n  get isResolved() {\n    return this.state === STATE.resolved;\n  }\n\n  get isRejected() {\n    return this.state === STATE.rejected;\n  }\n\n  get isFulfilled() {\n    return this.isResolved || this.isRejected;\n  }\n\n  constructor(callback, initialParams = {}) {\n    assert(\n      `The first argument passed to Resource must be a function. Got ${typeof callback}`,\n      typeof callback === 'function'\n    );\n\n    this.callback = callback;\n    this.load(initialParams);\n  }\n\n  @action\n  @waitFor\n  async load(params = {}) {\n    try {\n      this.value = await this.callback(params);\n      this.error = null;\n      this.state = STATE.resolved;\n    } catch (error) {\n      this.error = error;\n      this.value = null;\n      this.state = STATE.rejected;\n    }\n  }\n}\n","const ARCHIVES = 'archives';\nconst AREAS = 'areas';\nconst ASSIGNMENTS = 'assignments';\nconst BOOKS = 'books';\nconst COLLECTIONS = 'collections';\nconst CONTENTS = 'contents';\nconst EXERCISES = 'exercises';\nconst FOLDERS = 'folders';\nconst GLOSSARIES = 'glossaries';\nconst INTERACTIVES = 'interactives';\nconst SECTIONS = 'sections';\nconst STUDIES = 'studies';\nconst MATERIALS = 'materials';\n\nconst SPACES = {\n  content: 'content',\n  workspace: 'workspace',\n};\n\nconst NAME_PARTS = {\n  archives: 'archives',\n  assignments: 'assignments',\n  contents: 'contents',\n  diagnoses: 'diagnoses',\n  folders: 'folders',\n  index: 'index',\n  interactives: 'interactives',\n  master: 'master',\n  practices: 'practices',\n  show: 'show',\n  wordlists: 'wordlists',\n  materials: 'materials',\n  products: 'products',\n};\n\nasync function getChildRouteName(entity) {\n  const parent = await entity.parent;\n\n  if (parent.type === CONTENTS) {\n    if (entity.space === 'workspace') {\n      return NAME_PARTS.assignments;\n    } else {\n      return NAME_PARTS.contents;\n    }\n  } else if (entity.isDiagnosis) {\n    return NAME_PARTS.diagnoses;\n  } else {\n    return NAME_PARTS.practices;\n  }\n}\n\nasync function getFirstContentOrInteractiveAncestor(entity) {\n  let parent = await entity.parent;\n\n  while (![CONTENTS, INTERACTIVES].includes(parent.type)) {\n    parent = await parent.parent;\n  }\n\n  return parent;\n}\n\nfunction isWithinWorkspace(nameParts) {\n  return nameParts.any((namePart) =>\n    [NAME_PARTS.assignments, NAME_PARTS.wordlists].includes(namePart)\n  );\n}\n\nfunction resolveStandardRoute(entity, nameParts, models, queryParams) {\n  nameParts.addObject(entity.type, NAME_PARTS.index);\n  models.addObject(entity.id);\n\n  if (entity.type === CONTENTS) {\n    queryParams.section = undefined;\n    queryParams.exercise = undefined;\n  }\n}\n\nasync function resolveSectionRoute(entity, nameParts, models, queryParams) {\n  const parent = await entity.parent;\n\n  nameParts.addObject(NAME_PARTS.contents);\n  models.addObject(parent.id);\n  queryParams.section = entity.id;\n}\n\nasync function resolveGlossariesRoute(entity, nameParts, models) {\n  const parent = await entity.parent;\n\n  nameParts.addObjects([\n    NAME_PARTS.contents,\n    NAME_PARTS.wordlists,\n    NAME_PARTS.show,\n  ]);\n\n  models.addObjects([parent.id, entity.id]);\n}\n\nasync function resolveContentCollectionRoute(\n  entity,\n  nameParts,\n  models,\n  queryParams\n) {\n  const [contentOrInteractiveAncestor, parent, children] = await Promise.all([\n    getFirstContentOrInteractiveAncestor(entity),\n    entity.parent,\n    entity.children,\n  ]);\n\n  const ancestorType = contentOrInteractiveAncestor.type;\n\n  if (ancestorType === INTERACTIVES) {\n    const childRouteName = await getChildRouteName(entity);\n\n    nameParts.addObjects([ancestorType, childRouteName]);\n    models.addObjects([contentOrInteractiveAncestor.id, entity.id]);\n  } else {\n    nameParts.addObject(NAME_PARTS.contents);\n    models.addObject(parent.id);\n    queryParams.section = entity.id;\n\n    const exercise =\n      (queryParams.section && children.findBy('id', queryParams.exercise)) ||\n      children.firstObject;\n\n    if (exercise) {\n      queryParams.exercise = exercise.id;\n    }\n  }\n}\n\nasync function resolveWordspaceCollectionRoute(\n  entity,\n  nameParts,\n  models,\n  missionMode\n) {\n  const [contentOrInteractiveAncestor, children, childRouteName] =\n    await Promise.all([\n      getFirstContentOrInteractiveAncestor(entity),\n      entity.children,\n      getChildRouteName(entity),\n    ]);\n\n  let exercises = children;\n\n  if (missionMode) {\n    exercises = await missionMode.allowedEntities(children);\n  }\n\n  const firstChild = exercises?.[0];\n\n  const ancestorType = contentOrInteractiveAncestor.type;\n\n  nameParts.addObject(ancestorType);\n  models.addObject(contentOrInteractiveAncestor.id);\n\n  if (ancestorType === INTERACTIVES) {\n    models.addObject(entity.id);\n  }\n\n  nameParts.addObject(childRouteName);\n\n  if (firstChild) {\n    nameParts.addObject(NAME_PARTS.show);\n    models.addObject(firstChild.id);\n  } else {\n    nameParts.addObject(NAME_PARTS.index);\n  }\n}\n\nasync function resolveCollectionRoute(\n  entity,\n  nameParts,\n  models,\n  queryParams,\n  missionMode\n) {\n  if (entity.space === SPACES.content) {\n    await resolveContentCollectionRoute(entity, nameParts, models, queryParams);\n  } else if (entity.space === SPACES.workspace) {\n    await resolveWordspaceCollectionRoute(\n      entity,\n      nameParts,\n      models,\n      missionMode\n    );\n  }\n}\n\nasync function resolveInteractivesDiagnosisExerciseRoute(\n  contentOrInteractiveAncestor,\n  parent,\n  nameParts,\n  models\n) {\n  nameParts.addObjects([\n    NAME_PARTS.interactives,\n    NAME_PARTS.diagnoses,\n    NAME_PARTS.index,\n  ]);\n\n  models.addObjects([contentOrInteractiveAncestor.id, parent.id]);\n}\n\nasync function resolveInteractivesPracticeExerciseRoute(\n  contentOrInteractiveAncestor,\n  parent,\n  entity,\n  nameParts,\n  models\n) {\n  let templateType = NAME_PARTS.practices;\n\n  nameParts.addObjects([\n    NAME_PARTS.interactives,\n    templateType,\n    NAME_PARTS.show,\n  ]);\n\n  models.addObjects([contentOrInteractiveAncestor.id, parent.id, entity.id]);\n}\n\nasync function resolveInteractivesExerciseRoute(\n  contentOrInteractiveAncestor,\n  parent,\n  entity,\n  nameParts,\n  models\n) {\n  if (parent.isDiagnosis) {\n    await resolveInteractivesDiagnosisExerciseRoute(\n      contentOrInteractiveAncestor,\n      parent,\n      nameParts,\n      models\n    );\n  } else {\n    await resolveInteractivesPracticeExerciseRoute(\n      contentOrInteractiveAncestor,\n      parent,\n      entity,\n      nameParts,\n      models\n    );\n  }\n}\n\nasync function resolveContentExerciseRoute(\n  contentOrInteractiveAncestor,\n  parent,\n  entity,\n  nameParts,\n  models,\n  queryParams\n) {\n  nameParts.addObject(NAME_PARTS.contents);\n\n  if (parent.space === SPACES.workspace) {\n    nameParts.addObjects([NAME_PARTS.assignments, NAME_PARTS.show]);\n    models.addObjects([contentOrInteractiveAncestor.id, entity.id]);\n  } else if (parent.space === SPACES.content) {\n    const parentParent = await parent.parent;\n\n    models.addObject(parentParent.id);\n    queryParams.section = parent.id;\n    queryParams.exercise = entity.id;\n  }\n}\n\nasync function resolveExerciseRoute(entity, nameParts, models, queryParams) {\n  const [parent, contentOrInteractiveAncestor] = await Promise.all([\n    entity.parent,\n    getFirstContentOrInteractiveAncestor(entity),\n  ]);\n\n  if (contentOrInteractiveAncestor.type === INTERACTIVES) {\n    await resolveInteractivesExerciseRoute(\n      contentOrInteractiveAncestor,\n      parent,\n      entity,\n      nameParts,\n      models\n    );\n  } else {\n    await resolveContentExerciseRoute(\n      contentOrInteractiveAncestor,\n      parent,\n      entity,\n      nameParts,\n      models,\n      queryParams\n    );\n  }\n}\n\nasync function resolveFolderRoute(entity, nameParts, models) {\n  const parent = await entity.parent;\n\n  nameParts.addObjects([NAME_PARTS.archives, NAME_PARTS.folders]);\n  models.addObjects([parent.id, entity.id]);\n}\n\nasync function resolveProductRoute(product, nameParts, models) {\n  nameParts.addObject(NAME_PARTS.products);\n  models.addObject(product.id);\n}\n\nexport default async function (entity, initialQueryParams = {}, missionMode) {\n  entity = await entity;\n\n  const nameParts = [NAME_PARTS.master];\n  const models = [];\n  const queryParams = { ...initialQueryParams };\n\n  switch (entity?.type) {\n    case BOOKS:\n    case AREAS:\n    case ARCHIVES:\n    case CONTENTS:\n    case INTERACTIVES:\n    case MATERIALS:\n      resolveStandardRoute(entity, nameParts, models, queryParams);\n      break;\n    case SECTIONS:\n      await resolveSectionRoute(entity, nameParts, models, queryParams);\n      break;\n    case GLOSSARIES:\n      await resolveGlossariesRoute(entity, nameParts, models);\n      break;\n    case COLLECTIONS:\n      await resolveCollectionRoute(\n        entity,\n        nameParts,\n        models,\n        queryParams,\n        missionMode\n      );\n      break;\n    case ASSIGNMENTS:\n    case EXERCISES:\n    case STUDIES:\n      await resolveExerciseRoute(entity, nameParts, models, queryParams);\n      break;\n    case FOLDERS:\n      await resolveFolderRoute(entity, nameParts, models);\n      break;\n    default:\n      if (entity?.constructor?.modelName === 'product') {\n        await resolveProductRoute(entity, nameParts, models);\n      }\n      break;\n  }\n\n  if (isWithinWorkspace(nameParts)) {\n    const contentAncestor = await getFirstContentOrInteractiveAncestor(entity);\n    let children = await contentAncestor.children;\n\n    let section =\n      queryParams.section && children.findBy('id', queryParams.section);\n\n    if (!section) {\n      const parent = await entity.parent;\n\n      if (parent.type === COLLECTIONS && !parent.isTeacherCollection) {\n        children = children.filterBy('cat.id', parent.cat?.id);\n      }\n\n      section = children.findBy('type', SECTIONS);\n    }\n\n    if (section) {\n      queryParams.section = section.id;\n    } else {\n      // NOTE Redirect to the cover page if there's no sections. In the future\n      // we may want to remove this code as it's now technically possible to\n      // display the nested workspace routes directly on the cover page.\n      return [\n        [NAME_PARTS.master, NAME_PARTS.contents, NAME_PARTS.index].join('.'),\n        contentAncestor.id,\n      ];\n    }\n  }\n\n  return [nameParts.join('.'), ...models, { queryParams }];\n}\n","/**\n * Retrieves all parameters for a `RouteInfo` object and its parents in\n * correct oder, so that you can pass them to e.g.\n * `transitionTo(routeName, ...params)`.\n *\n * @param routeInfo\n */\nfunction getParameters(routeInfo) {\n  let allParameters = [];\n  let current = routeInfo;\n  do {\n    const { params, paramNames } = current;\n    const currentParameters = paramNames.map((n) => params[n]);\n    allParameters = [...currentParameters, ...allParameters];\n  } while ((current = current.parent));\n  return allParameters;\n}\n\n/**\n * Builds the URL for a `RouteInfo` object and its parents.\n *\n * @param routeInfo\n *\n * {@link https://github.com/emberjs/rfcs/issues/658}\n */\nfunction getURLFromRouteInfo(routeInfo, router) {\n  const { name, queryParams } = routeInfo;\n  const orderedParameters = getParameters(routeInfo);\n  const url = router.urlFor(name, ...orderedParameters, { queryParams });\n  return url;\n}\n\nexport { getParameters, getURLFromRouteInfo };\n","import sanitizeHtml from 'ember-cli-sanitize-html';\n\n// We basically allow all tags and attributes that are\n// safe from an XSS point of view.\n\nconst allowedTags = [\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'div',\n  'figcaption',\n  'figure',\n  'hr',\n  'li',\n  'ol',\n  'p',\n  'ul',\n  'b',\n  'br',\n  'em',\n  'i',\n  'q',\n  's',\n  'small',\n  'span',\n  'strong',\n  'sub',\n  'sup',\n  'u',\n  'wbr',\n  'del',\n  'ins',\n  'caption',\n  'col',\n  'colgroup',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'tr',\n  'strike',\n  'a',\n];\n\nconst allowedAttributes = {\n  '*': [\n    'aria-*',\n    'class',\n    'data-*',\n    'dir',\n    'id',\n    'lang',\n    'spellcheck',\n    'tabindex',\n    'title',\n    'translate',\n  ],\n  li: ['value', 'type'],\n  ol: ['reversed', 'start', 'type'],\n  ul: ['type'],\n  col: ['span'],\n  colgroup: ['span'],\n  td: ['colspan', 'rowspan'],\n  th: ['abbr', 'colspan', 'rowspan', 'scope'],\n  a: ['href', 'target'],\n};\n\nexport default function (markup) {\n  return sanitizeHtml(markup, { allowedTags, allowedAttributes });\n}\n","import { later } from '@ember/runloop';\nimport { getURLFromRouteInfo } from 'babel/utils/routing';\n\nexport default function scrollToTopIfNeeded(router) {\n  let scrollPrevented = false;\n\n  function handleRouteWillChange(transition) {\n    router.off('routeWillChange', handleRouteWillChange);\n\n    if (getURLFromRouteInfo(transition.to, router) !== router.currentURL) {\n      scrollPrevented = true;\n    }\n  }\n\n  function scrollToTopUnlessPrevented() {\n    if (scrollPrevented === false) {\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    }\n  }\n\n  router.on('routeWillChange', handleRouteWillChange);\n\n  later(scrollToTopUnlessPrevented);\n}\n","function storeInObject(sessionKey, key, value) {\n  let dir = window.sessionStorage.getItem(sessionKey);\n  dir = JSON.parse(dir);\n  if (!dir || typeof dir !== 'object') {\n    dir = {};\n  }\n  dir[key] = value;\n  window.sessionStorage.setItem(sessionKey, JSON.stringify(dir));\n}\n\nfunction getObject(sessionKey) {\n  try {\n    const entry = window.sessionStorage.getItem(sessionKey);\n\n    if (!entry) return null;\n\n    return JSON.parse(entry);\n  } catch (e) {\n    return null;\n  }\n}\n\nfunction removeObject(sessionKey) {\n  window.sessionStorage.removeItem(sessionKey);\n}\n\nexport { getObject, removeObject, storeInObject };\n","/**\n * Utility for shake element(s)\n *\n * @method shakeElement\n * @param {HTMLElement|String} element Element or selector for element(s) to shake\n * @param {HTMLElement|String} [parentElement=document] If element is a String, search for element(s) in parentElement. parentElement can be a selector.\n * @param {Boolean} [multipleElements=false] Only available if element is a String. If true, shake all matching elements. If false, only shake first found element.\n * @namespace utils\n *\n * @example\n * import shakeElement from 'babel/utils/shake-element';\n *\n * shakeElement(this.element);\n * shakeElement('.shake-me', this.element, true);\n */\n\nimport { later } from '@ember/runloop';\nimport getElement from 'babel/utils/get-element';\n\nconst shake = (element) => {\n  later(\n    (shakeElement) => {\n      shakeElement && shakeElement.classList.add('shake');\n    },\n    element,\n    1\n  );\n\n  later(\n    (shakeElement) => {\n      shakeElement && shakeElement.classList.remove('shake');\n    },\n    element,\n    1000\n  );\n};\n\nexport default function(...params) {\n  const element = getElement(...params);\n\n  if (element instanceof HTMLElement) {\n    shake(element);\n  } else if (element instanceof NodeList) {\n    [].slice.call(element).forEach((elem) => shake(elem));\n  }\n}\n","const WHITELISTED_ROUTE_NAMES = [\n  'master.index',\n  'master.courses.new',\n  'master.courses.show.index',\n  'master.courses.show.books',\n  'master.courses.show.missions',\n  'master.courses.show.my-results',\n  'master.courses.show.audit.index',\n  'master.courses.show.audit.overview',\n  'master.courses.show.audit.inbox',\n  'master.courses.show.audit.log',\n  'master.courses.show.audit.comments',\n  'master.courses.show.audit.missions.index',\n  'master.courses.show.audit.missions.show',\n  'master.course-settings',\n  'master.missions',\n  'master.products.index',\n  'master.products.my-results',\n  'master.profile.settings',\n  'master.admin.books',\n  'master.admin.teachers.list',\n  'master.admin.students.list',\n  'master.admin.courses',\n  'master.books',\n  'master.areas',\n  'master.archives.index',\n  'master.archives.folders.index',\n  'master.archives.folders.materials',\n  'master.contents.index',\n  'master.interactives.index',\n  'master.materials',\n];\n\nexport default function shouldReloadOnUpdate(routeName) {\n  if (WHITELISTED_ROUTE_NAMES.includes(routeName)) return true;\n  return false;\n}\n","import shuffle from 'compton/utils/array-shuffle';\n\nexport default function(array, sortOption) {\n  switch (sortOption) {\n    case 'inverse':\n      return array.sortBy('sort').reverse();\n    case 'random':\n      return shuffle(array.toArray());\n    case 'name_desc':\n      return array.sortBy('name').reverse();\n    case 'name_asc':\n      return array.sortBy('name');\n    case 'title_desc':\n      return array.sortBy('title').reverse();\n    case 'title_asc':\n      return array.sortBy('title');\n    case 'date_desc':\n      return array.sortBy('created').reverse();\n    case 'date_asc':\n      return array.sortBy('created');\n    default:\n      return array;\n  }\n}\n","import { SpeakerAdapterAudioSource } from 'speaker';\n\n/**\n *\n */\nclass DigilarAudioSourceHandler {\n  constructor(params) {\n    // Destruct params to class variables\n    ({\n      prioritizeSingleRecordedSpeechAudioSource:\n        this._prioritizeSingleRecordedSpeechAudioSource,\n      recordedSpeechProviderPriority: this._recordedSpeechProviderPriority,\n    } = params);\n  }\n\n  /**\n   * Private helper method to compare recorded speech provider priority\n   * @param {*} providerIdToCheck\n   * @param {*} providerIdToCompareTo\n   */\n  _hasHigherPriorityThan(providerIdToCheck, providerIdToCompareTo) {\n    if (!this._recordedSpeechProviderPriority) {\n      // Should not happen\n      return false;\n    }\n\n    // Find out which of the specified providers has the highest prio (i.e which comes first in the prio array)\n    const highestPrioProviderId = this._recordedSpeechProviderPriority.find(\n      (providerId) =>\n        [providerIdToCheck, providerIdToCompareTo].includes(providerId)\n    );\n\n    if (!highestPrioProviderId) {\n      // None of the providers were found\n      return false;\n    }\n\n    return highestPrioProviderId === providerIdToCheck;\n  }\n\n  /**\n   * Customize the audio source configs if necessary to be able to handle special cases\n   * @param {*} audioSourceConfigs\n   * @param {*} preferRecordedSpeech\n   * @param {*} recordedSpeechProviderPlugins An object indexed by provider ID, containing the currently initialized instances of each recorded speech provider plugin\n   * @return The customized audio sources (object with keys 'all', 'tts', 'recordedSpeech', each containing an array of SpeakerAdapterAudioSource objects), or just audioSourceConfigs if no customization is needed.\n   */\n  customizeAudioSources(\n    audioSourceConfigs,\n    preferRecordedSpeech,\n    recordedSpeechProviderPlugins = {}\n  ) {\n    // console.debug('customizeAudioSources:', audioSourceConfigs);\n\n    let { all, recordedSpeech, tts } = audioSourceConfigs;\n    let customizedAudioSourceConfigs = { ...audioSourceConfigs };\n\n    // Handle the special case where we have a single audio file that contains all recorded speech.\n    // Only relevant when using Digilär's recorded speech plugin\n    const digilarRecordedSpeechPlugin =\n      recordedSpeechProviderPlugins['digilar'];\n\n    if (digilarRecordedSpeechPlugin) {\n      // The single recorded speech audio file should be used instead of normal recorded speech (per component) or TTS if:...\n      let useSingleRecordedSpeechAudioSource =\n        // ...The single recorded speech file exists\n        digilarRecordedSpeechPlugin.hasValidSingleRecordedSpeechFile() &&\n        // ... AND it is prioritized over component-level recorded speech OR if there is at least one component-level audio source that's missing recorded speech...\n        (this._prioritizeSingleRecordedSpeechAudioSource ||\n          recordedSpeech.some((audioSource) => audioSource === null)) &&\n        // ...AND if recorded speech is preferred or if there are no valid TTS sources.\n        (preferRecordedSpeech ||\n          tts.every((audioSource) => audioSource === null)) &&\n        // ...AND finally if there are no recorded speech sources already configured by a provider of HIGHER priority\n        recordedSpeech.every((audioSource) => {\n          return (\n            audioSource === null ||\n            audioSource.recordedSpeechConfig().recordedSpeechProviderId ===\n              'digilar' ||\n            this._hasHigherPriorityThan(\n              'digilar',\n              audioSource.recordedSpeechConfig().recordedSpeechProviderId\n            )\n          );\n        });\n\n      if (useSingleRecordedSpeechAudioSource) {\n        // Attach some additional data to the audio source that we want received with the speaker events (in event.data)\n        let extraEventData = {\n          singleRecordedSpeechFile: true,\n        };\n        let singleRecordedSpeechAudioSource = new SpeakerAdapterAudioSource(\n          digilarRecordedSpeechPlugin.getSingleRecordedSpeechConfig(),\n          null,\n          null,\n          extraEventData\n        );\n\n        // This will initialize a single audio source for recorded speech\n        // Note that we also return a single TTS audio source as null, to have the same number of audio sources for TTS and recorded speech.\n        customizedAudioSourceConfigs = {\n          all: [singleRecordedSpeechAudioSource],\n          recordedSpeech: [singleRecordedSpeechAudioSource],\n          tts: [null],\n        };\n      } else {\n        if (preferRecordedSpeech) {\n          // If recorded speech is preferred, we exclude TTS audio sources that are not allowed to be used as fallback.\n          // The disableFallback property is set in: DigilarDomHelper.getTextBlockTtsData()\n          for (\n            let i = 0;\n            i < customizedAudioSourceConfigs.recordedSpeech.length;\n            i++\n          ) {\n            const rsConfig = customizedAudioSourceConfigs.recordedSpeech[i]\n              ? customizedAudioSourceConfigs.recordedSpeech[\n                  i\n                ].recordedSpeechConfig()\n              : null;\n\n            // First make sure that there is an audio source for recorded speech configured\n            // Disabling fallback to TTS is right now limited to Digilar's own recorded speech\n            if (rsConfig && rsConfig.recordedSpeechProviderId === 'digilar') {\n              const ttsConfig = customizedAudioSourceConfigs.tts[i]\n                ? customizedAudioSourceConfigs.tts[i].textToSpeechConfig()\n                : null;\n              if (\n                ttsConfig &&\n                ttsConfig.textToSpeechData &&\n                ttsConfig.textToSpeechData.disableFallback\n              ) {\n                // Exclude TTS source is excluded if not allowed as fallback\n                customizedAudioSourceConfigs.tts[i] = null;\n                // console.debug(`Removing TTS source for index ${i} because recorded speech exists and is preferred, and disableFallback=true`);\n              }\n            }\n          }\n          // console.debug(`Customized audio source configs = `,customizedAudioSourceConfigs);\n        }\n      }\n    }\n\n    return customizedAudioSourceConfigs;\n  }\n}\n\nexport default DigilarAudioSourceHandler;\n","const DigilarDomElements = {\n  CONTENT_TITLE: {\n    elementName: 'h1',\n    className: 'content-title',\n  },\n  IMAGE_GALLERY: {\n    elementName: 'div',\n    className: 'tb-render-gallery',\n  },\n  IMAGES: {\n    elementName: 'figure',\n    className: 'tb-render-image',\n  },\n  IMAGE_INNER: {\n    elementName: 'img',\n    className: 'tb-render-image',\n  },\n  IMAGE_CAPTIONS: {\n    elementName: 'div',\n    className: 'tb-render-image-caption',\n  },\n  INTERACTIVE_IMAGE_CAPTIONS: {\n    elementName: 'div',\n    className: 'tb-render-interactive-image-caption',\n  },\n  AUDIO_CAPTIONS: {\n    elementName: 'div',\n    className: 'tb-render-audio-caption',\n  },\n  COLLECTION_EXERCISE_INDEX: {\n    elementName: 'div',\n    className: 'collection-exercise-index',\n  },\n  VIDEO_CAPTIONS: {\n    elementName: 'div',\n    className: 'tb-render-video-caption',\n  },\n  IMAGE_SOURCES: {\n    elementName: 'div',\n    className: 'tb-render-image-source',\n  },\n  TIPS: {\n    elementName: 'div',\n    className: 'tb-render-group--recommendation',\n  },\n  SECTION_HEADERS: {\n    elementName: 'div',\n    className: 'section-number',\n  },\n  HEADERS_LEVEL_2: {\n    elementName: 'h2',\n    className: 'tb-render-heading',\n  },\n  HEADERS_LEVEL_3: {\n    elementName: 'h3',\n    className: 'tb-render-heading',\n  },\n  LIST: {\n    elementName: 'ol',\n    className: 'tb-render-list',\n  },\n  LIST_ITEMS: {\n    elementName: 'li',\n    className: 'tb-render-list-item',\n  },\n  POPOVER_DIALOGS: {\n    elementName: 'div',\n    className: 'x-popover-dialog',\n  },\n  SECTION_HEADING: {\n    elementName: 'h1',\n    className: '',\n  },\n  MODAL_DIALOG_TITLE: {\n    elementName: 'div',\n    className: 'x-dialog-header',\n  },\n  STORY_SECTION_TITLE: {\n    elementName: 'h2',\n    classNames: 'story-section-title',\n  },\n  STORY_SECTION_CONTENT: {\n    elementName: 'div',\n    className: 'story-section-content-text-block',\n  },\n  STORY_IMAGE_CONTAINER: {\n    elementName: 'figure',\n    className: 'story-section-image-container',\n  },\n  STORY_IMAGE: {\n    elementName: 'div',\n    className: 'story-section-image',\n  },\n  VIDEO: {\n    elementName: 'div',\n    className: 'tb-render-video',\n  },\n  AUDIO: {\n    elementName: 'div',\n    className: 'tb-render-audio',\n  },\n  MATHLIVE: {\n    elementName: 'span',\n    className: 'mathlive',\n  },\n  WORKSPACE: {\n    elementName: 'div',\n    className: 'toolbar-sticky',\n  },\n  EXERCISE_VIEW: {\n    elementName: 'div',\n    className: 'collection-view-body',\n  },\n  DATA_TABLE: {\n    elementName: 'div',\n    className: 'tb-render-table',\n  },\n  DATA_TABLE_CELLS: {\n    elementName: 'td',\n    className: 'tb-render-table-column',\n  },\n  DATA_TABLE_HEADER_CELLS: {\n    elementName: 'th',\n    className: 'tb-render-table-column',\n  },\n  INTERACTIVE_IMAGES: {\n    elementName: 'figure',\n    className: 'tb-render-interactive-image',\n  },\n  CANVAS: {\n    elementName: 'div',\n    className: 'tb-render-canvas',\n  },\n  CANVAS_CAPTION: {\n    elementName: 'div',\n    className: 'tb-render-canvas-caption',\n  },\n  WORKFLOW_INDEX: {\n    elementName: 'div',\n    className: 'workflow-index',\n  },\n  TOOLBAR_WIDGETS: {\n    elementName: 'div',\n    className: 'toolbar-widgets',\n  },\n  EXERCISE_MAIN_ASSIGNMENT: {\n    elementName: 'div',\n    className: 'exercise-main-assignment',\n  },\n  ENTITY_THUMBNAILS: {\n    elementName: 'div',\n    className: 'entity-thumbnail',\n  },\n  CODE_BLOCK: {\n    elementName: 'div',\n    className: 'tb-render-code',\n  },\n  CODE_BLOCK_CAPTION: {\n    elementName: 'div',\n    className: 'tb-render-code-caption',\n  },\n  ASSIGNMENT_LINK: {\n    elementName: 'div',\n    className: 'tb-render-assignment-link',\n  },\n};\n\nexport default DigilarDomElements;\n","/* eslint-disable ember/no-jquery */\nimport { storageFor } from 'ember-local-storage';\nimport $ from 'jquery';\nimport { WebPageTranslationDetector } from 'speaker';\n\nimport DigilarDomElementsConfig from './DigilarDomElementsConfig';\nimport DigilarLanguageUtil from './DigilarLanguageUtil';\n//import DigilarSpeakerType from './DigilarSpeakerType';\n\nconst DigilarSpeakerDOMElements = {\n  STORY_IMAGE_SPEAKER_CONTROLS: {\n    elementName: 'div',\n    className: 'speaker-story-image-controls',\n  },\n  AUDIO_PROVIDER_INFO: {\n    elementName: 'div',\n    className: 'speaker-audio-provider-info',\n  },\n};\n\nconst toJQuerySelector = (domElementConfig) => {\n  let selector = '';\n  if (domElementConfig.elementName) {\n    selector = domElementConfig.elementName;\n  }\n  if (domElementConfig.className) {\n    selector += `.${domElementConfig.className}`;\n  }\n  return selector;\n};\n\n/**\n * Digilär custom DOM functionality for the speaker. Primarily used by the generic class SpeakerDomHandler from the speaker repo.\n */\nclass DigilarDomHelper {\n  @storageFor('play-settings') speakerSettings;\n\n  constructor(params) {\n    this._domElementsConfig = null;\n\n    // Destruct params to class variables\n    ({\n      getContextData: this._getContextData,\n      getSingleRecordedSpeechAudioSourceConfig:\n        this._getSingleRecordedSpeechAudioSourceConfig,\n      speakerConfig: this._speakerConfig,\n    } = params);\n  }\n\n  _textBlockSelectors() {\n    let generalSelector = '[data-speaker-block], [data-id]';\n    let additionalSelectors = [];\n\n    // Excluding the images from the \"speaker text blocks\" requires some special attention.\n    // This is necessary to be able to add play/pause controls only to the captions and not to the images\n    if (this._speakerConfig.UI.Images.excludeImageFromSpeakerControls()) {\n      if (!this._speakerConfig.UI.Images.excludeCaptionsFromSpeakerControls()) {\n        // Add caption selector if captions are not excluded\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.IMAGE_CAPTIONS)\n        );\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.VIDEO_CAPTIONS)\n        );\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.INTERACTIVE_IMAGE_CAPTIONS)\n        );\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.AUDIO_CAPTIONS)\n        );\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.CODE_BLOCK_CAPTION)\n        );\n        additionalSelectors.push(\n          toJQuerySelector(DigilarDomElementsConfig.CANVAS_CAPTION)\n        );\n      }\n\n      const isRecordedSpeech =\n        this._speakerConfig.getContextData().digilarRecordedSpeechEnabled ||\n        this._speakerConfig.getContextData().iltRecordedSpeechEnabled;\n\n      // Modify the general selector to exclude the image elements, since we are now only interested in the captions,\n      // and we don't want to create duplicate audio sources\n      let imagesSelector = toJQuerySelector(DigilarDomElementsConfig.IMAGES);\n      let interActiveImagesSelector = toJQuerySelector(\n        DigilarDomElementsConfig.INTERACTIVE_IMAGES\n      );\n      let videoSelector = toJQuerySelector(DigilarDomElementsConfig.VIDEO);\n      let audioSelector = toJQuerySelector(DigilarDomElementsConfig.AUDIO);\n      let codeSelector = toJQuerySelector(DigilarDomElementsConfig.CODE_BLOCK);\n      let listSelector = toJQuerySelector(DigilarDomElementsConfig.LIST);\n      let canvasSelector = toJQuerySelector(DigilarDomElementsConfig.CANVAS);\n      let assignmentSelector = isRecordedSpeech\n        ? toJQuerySelector(DigilarDomElementsConfig.ASSIGNMENT_LINK)\n        : null;\n      generalSelector = `${generalSelector}:not(${imagesSelector}):not(${interActiveImagesSelector}):not(${videoSelector}):not(${audioSelector}):not(${codeSelector}):not(${canvasSelector}):not(${assignmentSelector}):not(${listSelector} ${listSelector})`;\n    }\n\n    if (!this._speakerConfig.TextProcessing.shouldExcludeModalDialogTitle()) {\n      additionalSelectors.push(\n        toJQuerySelector(DigilarDomElementsConfig.MODAL_DIALOG_TITLE)\n      );\n    }\n\n    // In exercises, exclude tables from being read\n    if (this._getContextData().contentType === 'practice') {\n      // Modify the general selector to exclude any table components within the answer part of the exercise.\n      generalSelector = `${generalSelector}:not(${toJQuerySelector(\n        DigilarDomElementsConfig.EXERCISE_MAIN_ASSIGNMENT\n      )} ${toJQuerySelector(DigilarDomElementsConfig.DATA_TABLE)})`;\n    }\n\n    additionalSelectors.push('[data-speaker-pause-for]');\n\n    // Merge the general selector with the additional selectors\n    return [generalSelector, ...additionalSelectors];\n  }\n\n  /////////////////////////////////////////////////////////////////////\n  //\n  // BEGIN: \"Interface methods\" that will be called by SpeakerDomHandler\n  //\n\n  getTextBlockRecordedSpeechData($textBlock) {\n    let dataId = $textBlock.attr('data-id');\n\n    let isPausing = false;\n    // If we're not pausing check ancestors if configured to do so.\n    if (!$textBlock[0]?.dataset?.speakerPauseFor) {\n      // If the text block itself does not have a data-id attribute, then check if any ancestor has it instead if configured to do so.\n      if (\n        !dataId &&\n        this._speakerConfig.RecordedSpeech.searchAncestorsForDataId()\n      ) {\n        // console.debug(`text block does not have data-id attribute. Checking ancestors...`, $textBlock.text());\n        const $ancestorWithDataId = $textBlock.closest('[data-id]').first();\n        if ($ancestorWithDataId.length > 0) {\n          dataId = $ancestorWithDataId.attr('data-id');\n          // console.debug(`Using ancestor data-id ${dataId}.`);\n        }\n      }\n    } else {\n      isPausing = true;\n    }\n\n    let recordedReadingUrl = $textBlock.attr('data-reading');\n\n    if (recordedReadingUrl === 'none') {\n      recordedReadingUrl = null;\n    }\n\n    return {\n      recordedSpeechId: dataId || null,\n      recordedReadingUrl: recordedReadingUrl,\n      isPausing,\n    };\n  }\n\n  // Extract all data from a text block DOM element necessary to configure TTS providers for that element.\n  // Can return anything. The returned data will be injected to other customized functions.\n  getTextBlockTtsData($textBlock) {\n    const getFallbackExcludedElementConfigs = () => {\n      let excludedElements = [];\n\n      // Some speaker specific elements must be excluded from TTS fallback for Digilär's recorded speech\n      excludedElements.push(DigilarDomElementsConfig.IMAGE_CAPTIONS);\n      excludedElements.push(DigilarDomElementsConfig.VIDEO_CAPTIONS);\n      excludedElements.push(DigilarDomElementsConfig.AUDIO_CAPTIONS);\n      excludedElements.push(\n        DigilarDomElementsConfig.INTERACTIVE_IMAGE_CAPTIONS\n      );\n      excludedElements.push(DigilarDomElementsConfig.CONTENT_TITLE);\n\n      return excludedElements;\n    };\n\n    // Check if the $textBlock is a child of, or ancestor of, any of the elements that should be excluded\n    const disableFallback = getFallbackExcludedElementConfigs().some(\n      (elementConfig) => {\n        const excludedElementSelector = `${elementConfig.elementName}.${elementConfig.className}`;\n\n        // Exclude if the text block is an excluded element\n        return $textBlock.is(excludedElementSelector);\n      }\n    );\n\n    return {\n      // The ttsTextId will be sent to the Polly backend to be used when naming the audio files.\n      ttsTextId: $textBlock.attr('data-id') || null,\n\n      // The disableFallback property will be checked by DigilarAudioSourceHandler to exclude TTS audio sources.\n      disableFallback,\n    };\n  }\n\n  hasUnresolvedTextBlocks(dom) {\n    return dom?.querySelectorAll('[data-reading-loading]')?.length > 0;\n  }\n\n  getTextBlockLanguage($textBlock) {\n    // Get language from text block if specified\n    let lang = $textBlock.attr('data-language') || null;\n\n    if (lang) {\n      lang = DigilarLanguageUtil.parseLanguage(lang);\n    }\n\n    return lang;\n  }\n\n  findRenderedTextBlockElements(dom) {\n    this._addPauseElements();\n    let { contentType, exerciseType } = this._getContextData();\n\n    let additionalTextBlockSelectors = [];\n\n    // Note: This is example code for how we can create speech for specific parts of exercises.\n    // Either extend with more functionality, or add data-id attribute to the elements that should be turned in to speech.\n    if (contentType === 'practice') {\n      switch (exerciseType) {\n        case 'sort-match':\n          additionalTextBlockSelectors = ['div.alternative'];\n          break;\n        default:\n          break;\n      }\n    }\n\n    let allTextBlockSelectors = this._textBlockSelectors().concat(\n      additionalTextBlockSelectors\n    );\n\n    let $textBlocks = $(dom).find(allTextBlockSelectors.join(','));\n\n    return $textBlocks;\n  }\n\n  _addPauseElements() {\n    const pauseElements = Array.from(\n      document.querySelectorAll('[data-speaker-pause]')\n    );\n\n    const createPauseElement = (pauseFor) => {\n      const pauseSpan = document.createElement('span');\n      pauseSpan.setAttribute('hidden', true);\n      pauseSpan.dataset.speakerPauseFor = pauseFor;\n      return pauseSpan;\n    };\n\n    pauseElements.forEach((element) => {\n      // Only add pause span to elements that have none.\n      if (!element.querySelector('[data-speaker-pause-for]')) {\n        // We need to create a wrapping span otherwise 'replaceHtmlElementByAttribute' in\n        // digilar-general.js won't find our pause element.\n        const pauseWrapper = createPauseElement(element.dataset.speakerPause);\n        const pause = createPauseElement(element.dataset.speakerPause);\n        // Need to populate the span with something the speaker doesn't read, Acapela reads html entities such as &nbsp;\n        pause.textContent = '{{}}';\n        pause.dataset.reading = 'none';\n        pauseWrapper.appendChild(pause);\n        element.appendChild(pauseWrapper);\n      }\n    });\n  }\n\n  filterRenderedTextBlockElements(dom, $textBlocks) {\n    // No need to do any custom filtering\n    return $textBlocks;\n  }\n\n  shouldExcludeTextBlock(/*$textBlock*/) {\n    //let { contentType, exerciseType } = this._getContextData();\n\n    // Note! This is just an example of how text blocks can be excluded based on context data\n    /*\n    if (contentType === 'practice') {\n      if ($textBlock.text().trim().length < 5) {\n        return true;\n      }\n    }\n    */\n\n    return false;\n  }\n\n  isTextBlockRendered($textBlock) {\n    let isRendered = true;\n\n    // Special handling for content titles\n    if ($textBlock.hasClass(DigilarDomElementsConfig.CONTENT_TITLE.className)) {\n      if ($textBlock.text().trim().length === 0) {\n        return false;\n      }\n    }\n\n    // Check that images have received their src attribute\n    if ($textBlock.hasClass(DigilarDomElementsConfig.IMAGES.className)) {\n      $textBlock\n        .find(toJQuerySelector(DigilarDomElementsConfig.IMAGE_INNER))\n        .each(function () {\n          let hasSrc = $(this)[0].hasAttribute('src');\n          if (!hasSrc) {\n            return (isRendered = false);\n          }\n        });\n\n      return isRendered;\n    }\n\n    return isRendered;\n  }\n\n  getExcludedDomElements() {\n    let excludedElements = [];\n\n    if (this._speakerConfig.TextProcessing.shouldExcludeImages()) {\n      excludedElements.push(DigilarDomElementsConfig.IMAGES);\n    } else if (this._speakerConfig.TextProcessing.shouldExcludeImageSources()) {\n      excludedElements.push(DigilarDomElementsConfig.IMAGE_SOURCES);\n    }\n\n    if (this._speakerConfig.TextProcessing.shouldExcludeTips()) {\n      excludedElements.push(DigilarDomElementsConfig.TIPS);\n    }\n\n    if (this._speakerConfig.TextProcessing.shouldExcludeImageGalleries()) {\n      excludedElements.push(DigilarDomElementsConfig.IMAGE_GALLERY);\n    }\n\n    if (this._getContextData().contentType !== 'practice') {\n      // This makes sure that the main speaker from chapter/story/workflow does not try to create speech for the exercises or workspace\n      // which will have their own speaker instances.\n\n      excludedElements.push(DigilarDomElementsConfig.WORKSPACE);\n    }\n\n    // Always exclude the following elements\n    excludedElements.push(DigilarDomElementsConfig.POPOVER_DIALOGS);\n    //excludedElements.push(DigilarDomElementsConfig.AUDIO);\n    //excludedElements.push(DigilarDomElementsConfig.VIDEO);\n    excludedElements.push(DigilarSpeakerDOMElements.AUDIO_PROVIDER_INFO);\n\n    excludedElements.push(DigilarDomElementsConfig.COLLECTION_EXERCISE_INDEX);\n\n    return excludedElements;\n  }\n\n  cleanUpDom(domHandler, contextDomElement) {\n    // Clean up the section elem (when in story mode and recorded speech for entire section)\n    domHandler._cleanUpSpeakerElems(this.findSectionElem(contextDomElement));\n\n    // Delete any custom elements that have been added in applyCustomSpeakerMarkup\n    $(contextDomElement).find(`[data-speaker-audio-provider-info]`).remove();\n  }\n\n  beforeApplyTextMetaData(domHandler, $textBlock) {\n    // Remove any popovers that may have been opened, or else they will mess up the html when meta data is applied\n    // because the popover wasn't part of the original text/html that was used to generate the meta data.\n    let $popovers = $textBlock.find(\n      `.${DigilarDomElementsConfig.POPOVER_DIALOGS.className}`\n    );\n    $popovers.remove();\n  }\n\n  getAudioSourceIndex(initializedAudioSources) {\n    const contextData = this._getContextData();\n    let { section, contentType } = contextData;\n    let index = initializedAudioSources.findIndex((source) => {\n      return (\n        source.textToSpeechConfig?.textToSpeechData?.ttsTextId ===\n        section.document_id\n      );\n    });\n    if (contentType === 'chapter' && index < 2) {\n      index = 0;\n    }\n    return index;\n  }\n\n  getFirstVisibleAudioSourceIndex(initializedAudioSources) {\n    const index = initializedAudioSources.findIndex((source) => {\n      const element = document.querySelector(\n        `[data-speaker-text-id='${source.id}']`\n      );\n      return (\n        element &&\n        element.getAttribute('hidden') !== 'true' &&\n        this._isElementInViewport(element)\n      );\n    });\n    return index;\n  }\n\n  _isElementInViewport(el) {\n    const { viewportTop } = this._getContextData().viewportUtils;\n    const { top } = el.getBoundingClientRect();\n\n    const viewTop = this._insideOfPopupOrExercise(el) ? 0 : viewportTop();\n    return top >= viewTop;\n  }\n\n  shouldAutoSelectFirstTextBlock() {\n    const contextData = this._getContextData();\n    let { contentType, mode } = contextData;\n\n    if (contentType === 'chapter' && mode === 'scroll') {\n      return true;\n    }\n    return false;\n  }\n\n  isPageRendered(speakerType, dom) {\n    const contextData = this._getContextData();\n\n    let { contentType, onlyImages } = contextData;\n\n    // When viewing only images in a story, make sure that the image has been rendered\n    if (contentType === 'story' && onlyImages) {\n      let $storyImage = this.findStoryImageElem(dom);\n      if ($storyImage.length === 0) {\n        return {\n          ready: false,\n          message: `Story image not found`,\n        };\n      }\n    }\n\n    return {\n      ready: true,\n    };\n  }\n\n  _applyProviderInfoForAudioSource($elemsToApplyTo, audioSource) {\n    if ($elemsToApplyTo && $elemsToApplyTo.length > 0) {\n      $elemsToApplyTo.each(function () {\n        let $elemToApplyTo = $(this);\n\n        const hasProviderInfoBeenApplied =\n          $elemToApplyTo.children(`[data-speaker-audio-provider-info]`).length >\n          0;\n\n        if (!hasProviderInfoBeenApplied) {\n          // Pick relevant information from the audio source that we need to expose in the DOM\n          const isRecordedSpeech = audioSource.isRecordedSpeech;\n          const isLegacyRecordedSpeech = !!(\n            isRecordedSpeech &&\n            audioSource.recordedSpeechConfig.eventData.singleRecordedSpeechFile\n          );\n          const provider = isRecordedSpeech\n            ? audioSource.recordedSpeechConfig.recordedSpeechProviderId\n            : audioSource.textToSpeechConfig.textToSpeechProviderId;\n\n          const providerInfoHtml = () => {\n            const providerNames = {\n              ilt: 'Inläsningstjänst',\n              digilar: 'Digilär',\n              polly: 'AWS Polly',\n            };\n\n            // Change the content of the returned div as needed.\n            // Adding attributes and classes is also ok to do.\n            return `\n              <div class=\"speaker-audio-provider-info\" data-speaker-audio-provider-info data-speaker-provider-id=\"${provider}\" data-speaker-recorded-speech=\"${isRecordedSpeech}\" data-speaker-legacy-recorded-speech=\"${isLegacyRecordedSpeech}\" >\n                <span>${providerNames[provider] || ''}</span>\n              </div>\n            `.trim();\n          };\n\n          const $providerInfoElem = $(providerInfoHtml());\n\n          $elemToApplyTo.prepend($providerInfoElem);\n        }\n      });\n    }\n  }\n\n  applyCustomSpeakerMarkup(\n    speakerSandbox,\n    initializedAudioSources,\n    speakerControls\n  ) {\n    let { domHandler } = speakerSandbox;\n    let { contentType, onlyImages } = this._getContextData();\n\n    let allowDefaultMarkupToBeApplied = true;\n\n    // In story mode, always add provider info to the story image element\n    if (contentType === 'story') {\n      const $storyImageElem = this.findStoryImageElem(\n        domHandler.getSpeakerContextDomElement()\n      );\n\n      // Use only the first audio source to add provider info (it should be the same for all audio sources)\n      if (initializedAudioSources.length > 0) {\n        this._applyProviderInfoForAudioSource(\n          $storyImageElem,\n          initializedAudioSources[0]\n        );\n      }\n    }\n\n    // If in story content with texts hidden, also add speaker controls to the image\n    let textsHidden = contentType === 'story' && onlyImages;\n    if (textsHidden) {\n      this.applySpeakerMarkUpToStoryImage(domHandler, {\n        numberOfAudioSources: initializedAudioSources.length,\n        highlightAsSelected: false,\n        highlightAsPlaying: false,\n      });\n      this.addSpeakerControlsToStoryImage(speakerSandbox, speakerControls);\n    }\n\n    // Add speaker controls to the text block(s), even if not visible to be able to turn \"only images\" on/off without having to reset speaker to get controls and text meta data working again\n    // Handle special case here when there is only a single recorded speech audio source for a story/section but several text block components.\n    // In that case, only one set of controls should be created for the whole section\n    let singleRecordedSpeechConfig =\n      this._getSingleRecordedSpeechAudioSourceConfig();\n    let isSingleRecordedSpeechAudioSource =\n      singleRecordedSpeechConfig &&\n      initializedAudioSources.length === 1 &&\n      initializedAudioSources[0].id === singleRecordedSpeechConfig.id;\n\n    if (isSingleRecordedSpeechAudioSource) {\n      this.applySpeakerMarkUpToSection(domHandler);\n      this.addSpeakerControlsToSection(speakerSandbox, speakerControls);\n      const $sectionElem = this.findSectionElem(\n        domHandler.getSpeakerContextDomElement()\n      );\n\n      // Use only the first audio source to add provider info (it should be the same for all audio sources)\n      if (initializedAudioSources.length > 0) {\n        this._applyProviderInfoForAudioSource(\n          $sectionElem,\n          initializedAudioSources[0]\n        );\n      }\n\n      // Skip default text block markup in SpeakerContext\n      allowDefaultMarkupToBeApplied = false;\n    }\n\n    // In the normal case, add provider info to each text block (component) matching an audio source\n    const $domContextRoot = $(domHandler.getSpeakerContextDomElement());\n\n    initializedAudioSources.forEach((audioSource) => {\n      // Skip all but the first part for multi-part recorded speech (ILT)\n      // (Non-multipart audio will only have a single part with index 0.)\n      if (\n        audioSource.isRecordedSpeech &&\n        audioSource.recordedSpeechConfig.recordedSpeechPartIndex > 0\n      ) {\n        return;\n      }\n\n      const $textBlock = $domContextRoot\n        .find(`[data-speaker-text-id=\"${audioSource.id}\"]`)\n        .first();\n\n      this._applyProviderInfoForAudioSource($textBlock, audioSource);\n    });\n\n    return allowDefaultMarkupToBeApplied;\n  }\n\n  preventTextBlockClicksForJQuerySelectors() {\n    return ['button', 'a', 'input'];\n  }\n\n  /**\n   * Scrolls given text block DOM element into view\n   * @param {*} textBlockElem The text block DOM element to scroll to\n   */\n  scrollToTextBlock(textBlockElem) {\n    if (!textBlockElem) {\n      return;\n    }\n\n    if (textBlockElem.dataset.speakerScrollTo) {\n      textBlockElem = textBlockElem.parentElement;\n    }\n\n    if (textBlockElem.dataset.speakerPauseFor) {\n      this._handlePauseElementScroll(\n        textBlockElem,\n        parseInt(textBlockElem.dataset.speakerPauseFor)\n      );\n      return;\n    }\n\n    if (this._insideOfPopupOrExercise(textBlockElem)) {\n      const scrollToElement = textBlockElem.nextElementSibling || textBlockElem;\n\n      scrollToElement.scrollIntoView({\n        block: 'nearest',\n        inline: 'nearest',\n        behavior: 'smooth',\n      });\n    } else if (WebPageTranslationDetector.isTranslated()) {\n      textBlockElem.scrollIntoView({\n        block: 'center',\n        inline: 'nearest',\n        behavior: 'smooth',\n      });\n    } else {\n      let { viewportTop, viewportBottom, elemOffset, scrollTo } =\n        this._getContextData().viewportUtils;\n\n      const top = window.pageYOffset + viewportTop();\n      const bottom = window.pageYOffset + window.innerHeight - viewportBottom();\n      const offset = elemOffset(textBlockElem);\n      const height = textBlockElem.offsetHeight;\n\n      if (offset < top || offset + height > bottom) {\n        scrollTo(textBlockElem);\n      }\n    }\n  }\n\n  _handlePauseElementScroll(textBlockElem, pauseFor) {\n    const SPEAKER_TEXT_BLOCK_SELECTED = 'speaker-text-block-selected';\n    const parent = textBlockElem.parentElement;\n\n    // No need to \"select\" pause element if it is already selected.\n    if (parent.classList.contains(SPEAKER_TEXT_BLOCK_SELECTED)) {\n      return;\n    }\n\n    parent.classList.add(SPEAKER_TEXT_BLOCK_SELECTED);\n    setTimeout(\n      () => {\n        parent.classList.remove(SPEAKER_TEXT_BLOCK_SELECTED);\n      },\n      parseInt(pauseFor * 2)\n    ); // Wait a bit extra before highlighting is removed, especially Acapela seems to pause for longer than specified.\n    parent.scrollIntoView({ behavior: 'smooth', block: 'center' });\n  }\n\n  /**\n   * Checks whether textBlockElement is inside of a popup or exercise\n   * @param {*} textBlockElem The text block DOM element to scroll to\n   */\n  _insideOfPopupOrExercise(textBlockElem) {\n    return (\n      this.findPopupSpeakerDomContextElem() ||\n      textBlockElem.closest('.exercise-view-component') ||\n      textBlockElem.closest('.collection-view-editor')\n    );\n  }\n\n  /**\n   * Configuration of the inner html of some speaker control html elements\n   */\n  speakerControlsHtml() {\n    return {\n      playButtonInnerHtml: '<i class=\"nc-icon nc-button-play\"></i>',\n      pauseButtonInnerHtml: '<i class=\"nc-icon nc-button-pause\"></i>',\n    };\n  }\n\n  // END: \"Interface methods\" that will be called by SpeakerDomHandler\n  //\n  /////////////////////////////////////////////////////////////////////\n\n  /////////////////////////////////////////////////////////////////////\n  //\n  // BEGIN: Digilär specific methods that are NOT required by SpeakerDomHandler.\n  //\n\n  getHtmlElementsToPauseAfter() {\n    return [\n      DigilarDomElementsConfig.SECTION_HEADERS,\n      DigilarDomElementsConfig.HEADERS_LEVEL_2,\n      DigilarDomElementsConfig.HEADERS_LEVEL_3,\n      DigilarDomElementsConfig.LIST_ITEMS,\n      DigilarDomElementsConfig.IMAGE_CAPTIONS,\n      DigilarDomElementsConfig.VIDEO_CAPTIONS,\n      DigilarDomElementsConfig.AUDIO_CAPTIONS,\n      DigilarDomElementsConfig.INTERACTIVE_IMAGE_CAPTIONS,\n      DigilarDomElementsConfig.DATA_TABLE_CELLS,\n      DigilarDomElementsConfig.DATA_TABLE_HEADER_CELLS,\n    ];\n  }\n\n  getHtmlElementsToRemoveFromTextProcessing() {\n    const elementsToRemove = [\n      DigilarDomElementsConfig.POPOVER_DIALOGS,\n      DigilarDomElementsConfig.WORKSPACE,\n      DigilarSpeakerDOMElements.AUDIO_PROVIDER_INFO,\n      DigilarDomElementsConfig.ENTITY_THUMBNAILS,\n    ];\n\n    if (\n      this._speakerConfig.TextProcessing.shouldExcludeMathCode() &&\n      !this._speakerConfig.TextProcessing.shouldExcludeTextsContainingMathCode()\n    ) {\n      elementsToRemove.push(DigilarDomElementsConfig.MATHLIVE);\n    }\n\n    if (this._speakerConfig.TextProcessing.shouldExcludeImageSources()) {\n      elementsToRemove.push(DigilarDomElementsConfig.IMAGE_SOURCES);\n    }\n\n    return elementsToRemove;\n  }\n\n  isSpeakerContextWithinWorkflow(speakerContextDomElement) {\n    let retVal = false;\n\n    // First, check globally if a workflow exists (because the speaker-context elem will not actually be a descendant of the workflow)\n    const $workflow = $(\n      `.${DigilarDomElementsConfig.WORKFLOW_INDEX.className}`\n    ).first();\n\n    if ($workflow.length > 0) {\n      // Ok, a workflow exists. Now we must check that the speaker-context elem is not within the workspace (Arbetsbord) part of the content,\n      // in which case it should not be considered to be within the workflow (Arbetsflöde).\n      const $workspaceAncestor = $(speakerContextDomElement)\n        .parent()\n        .closest(toJQuerySelector(DigilarDomElementsConfig.TOOLBAR_WIDGETS))\n        .first();\n      const isWithinWorkspace = $workspaceAncestor.length > 0;\n\n      retVal = !isWithinWorkspace;\n    }\n\n    return retVal;\n  }\n\n  isValidTtsElem(htmlString) {\n    const $textBlockElem = $(`<span>${htmlString}</span>`);\n\n    // Check if text block contains math code and in that case invalidate it for TTS use.\n    if (\n      this._speakerConfig.TextProcessing.shouldExcludeTextsContainingMathCode()\n    ) {\n      const containsMathlive =\n        $textBlockElem.find(toJQuerySelector(DigilarDomElementsConfig.MATHLIVE))\n          .length > 0;\n      if (containsMathlive) {\n        // console.debug('Math code detected, invalidating text for TTS:', $textBlockElem.html());\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  findPopupSpeakerDomContextElem() {\n    // get all dialog contents except interactiveImage\n    const dialogElements = $(\n      'div.x-dialog-content:not(:has(.x-interactive-image))'\n    );\n\n    const elem =\n      dialogElements.get(dialogElements.length - 1) ||\n      $('div.x-attachment').get(0) ||\n      null;\n\n    if (elem) {\n      if (\n        $(elem).find('.collection-view').length > 0 ||\n        elem.classList.contains('dismissible-tooltip')\n      ) {\n        // use main speaker for collection-view-modal\n        // see digilar/digilar-v2#3041\n        return null;\n      }\n    }\n\n    const toolTip = document.getElementsByClassName('x-tooltip-container');\n    if (toolTip && toolTip.length > 0 && !dialogElements.length) {\n      return null;\n    }\n\n    return elem;\n  }\n\n  addSpeakerContextClickListener(speakerContext, contextDomRoot) {\n    const $contextDomRoot = $(contextDomRoot);\n\n    $contextDomRoot.click(function (event) {\n      // Find the closest speaker context ancestor of the clicked element\n      const $contextForClick = $(event.target)\n        .closest('[data-speaker-context-uuid]')\n        .first();\n\n      const isClickWithinThisContext =\n        $contextForClick.length > 0 &&\n        $contextForClick.attr('data-speaker-context-uuid') ===\n          speakerContext.getUuid();\n\n      // Clicks on some elements should never change focus\n      const excludeClicksOnElements = [DigilarDomElementsConfig.WORKFLOW_INDEX];\n      const excludeSelector = excludeClicksOnElements\n        .map((el) => `${el.elementName}.${el.className}`)\n        .join(' ');\n      const isWithinExcludedElement =\n        $(event.target).closest(excludeSelector).length > 0;\n\n      // Set context focus if click is within context DOM. Ignore other clicks.\n      if (isClickWithinThisContext && !isWithinExcludedElement) {\n        speakerContext.setContextFocus(true);\n      }\n    });\n  }\n\n  //\n  // END: Digilär specific methods that are NOT required by SpeakerDomHandler.\n  //\n  ////////////////////////////////////////////////////////////////////\n\n  ////////////////////////////////////////////////////////////////////\n  //\n  // BEGIN: Functionality to handle Digilär's story mode, including \"only images\"\n  // and \"legacy mode\" (legacy mode meaning that there is only one recorded speech file per section,\n  // instead of per component)\n  //\n\n  findStoryImageElem(/*dom*/) {\n    // Note: The story image element is not found within speaker-context (dom param) so we search entire document\n    return $(\n      `${toJQuerySelector(\n        DigilarDomElementsConfig.STORY_IMAGE_CONTAINER\n      )} ${toJQuerySelector(DigilarDomElementsConfig.STORY_IMAGE)}`\n    ).first();\n  }\n\n  findSectionElem(dom) {\n    let $section = $(dom)\n      .find(toJQuerySelector(DigilarDomElementsConfig.STORY_SECTION_CONTENT))\n      .children('div')\n      .first();\n    return $section;\n  }\n\n  addSpeakerControlsToStoryImage(speakerSandbox, speakerControls) {\n    let { speakerAdapter, domHandler } = speakerSandbox;\n\n    let $storyImage = this.findStoryImageElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n    if ($storyImage.length === 0) {\n      return false;\n    }\n\n    // For story cinema mode we need to find out which audio is currently selected (if any)\n    // This due to the fact that there may be one or many audio sources \"hidden\" behind a single clickable image\n    const getAudioSourceIndex = () =>\n      speakerAdapter.getCurrentAudioSource()\n        ? speakerAdapter.getCurrentAudioSource().audioSourceIndex\n        : 0;\n\n    const $speakerControls = domHandler._addSpeakerControlsToElement(\n      $storyImage,\n      getAudioSourceIndex,\n      speakerControls,\n      { selectBeforePlay: false }\n    );\n    $speakerControls.addClass(\n      DigilarSpeakerDOMElements.STORY_IMAGE_SPEAKER_CONTROLS.className\n    );\n\n    // Insert the control buttons as the first child of the story image\n    $storyImage.prepend($speakerControls);\n  }\n\n  _findSpeakerControlsForStoryImage() {\n    const $storyImageControls = $(\n      toJQuerySelector(DigilarSpeakerDOMElements.STORY_IMAGE_SPEAKER_CONTROLS)\n    );\n\n    return $storyImageControls.first();\n  }\n\n  cleanUpStoryImage(domHandler) {\n    let $storyImage = this.findStoryImageElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n\n    if ($storyImage.length > 0) {\n      domHandler._cleanUpSpeakerElems($storyImage);\n\n      // Note: The control buttons for story images are not found within the scope of the speaker-context element (domHandler.getSpeakerContextDomElement())\n      this._findSpeakerControlsForStoryImage().remove();\n\n      // Remove any animations while playing\n      this._clearStoryImagePlayingHighlighting(domHandler);\n    }\n  }\n\n  applySpeakerMarkUpToSection(domHandler) {\n    let $section = this.findSectionElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n\n    if (\n      $section.length > 0 &&\n      !domHandler._hasTextBlockSpeakerMarkUp($section)\n    ) {\n      // Always treat the section speech as recorded speech, since that will show animation/progress bar if enabled, even if it's synthetic speech being played.\n      let isRecordedSpeech = true;\n      let showProgressBar =\n        domHandler._shouldShowProgressBarWhenPlaying(isRecordedSpeech);\n\n      domHandler._applySpeakerMarkUpToElem($section, { showProgressBar });\n    }\n  }\n\n  addSpeakerControlsToSection(speakerSandbox, speakerControls) {\n    let { domHandler } = speakerSandbox;\n    let $section = this.findSectionElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n\n    // For the section element, there will only be a single audio source (index 0) that we want to control\n    domHandler._addSpeakerControlsToElement(\n      $section,\n      () => 0,\n      speakerControls,\n      { selectBeforePlay: false }\n    );\n  }\n\n  applySpeakerMarkUpToStoryImage(\n    domHandler,\n    {\n      numberOfAudioSources,\n      highlightAsSelected,\n      highlightAsPlaying,\n      highlightAsPaused,\n      progressBarValue = 0,\n    }\n  ) {\n    let $storyImage = this.findStoryImageElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n\n    // Showing a progress bar when there are more than 1 audio sources doesn't make sense in \"image only mode\", since texts are not visible\n    // and there will only be one image regardless of the number of audio sources\n    let showProgressBar = numberOfAudioSources === 1;\n\n    if (\n      $storyImage.length > 0 &&\n      !domHandler._hasTextBlockSpeakerMarkUp($storyImage)\n    ) {\n      domHandler._applySpeakerMarkUpToElem($storyImage, {\n        // The progress bar can be disabled completely for story image using the showProgressBar param. That's necessary to not show it when there are more than one text block being played.\n        showProgressBar:\n          showProgressBar && domHandler._shouldShowProgressBarWhenPlaying(true),\n      });\n\n      if (progressBarValue > 0) {\n        domHandler._setProgressBarValue($storyImage, progressBarValue);\n      }\n\n      if (highlightAsSelected) {\n        this._highlightSelectedStoryImage(domHandler);\n      }\n      if (highlightAsPlaying) {\n        this._highlightStoryImagePlaying(domHandler, $storyImage, {\n          isUserTriggered: false,\n        });\n      } else if (highlightAsPaused) {\n        this._highlightStoryImagePaused(domHandler, $storyImage);\n      }\n    }\n  }\n\n  _showStoryImageLoader(domHandler) {\n    let $storyPlayer = this._findSpeakerControlsForStoryImage();\n    if ($storyPlayer.length > 0) {\n      // Insert the loading indicator as a sibling after the speaker controls\n      $storyPlayer.after(domHandler._getLoadingIndicatorHtml());\n    }\n  }\n\n  _hideStoryImageLoader(domHandler) {\n    domHandler._hideTextBlockLoader(\n      this._findSpeakerControlsForStoryImage().parent()\n    );\n  }\n\n  _highlightSelectedStoryImage(domHandler) {\n    domHandler._highlightSelected(\n      this.findStoryImageElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _highlightSelectedSection(domHandler) {\n    domHandler._highlightSelected(\n      this.findSectionElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _highlightSectionPlaying(domHandler, { isUserTriggered = true } = {}) {\n    // Clear any paused/playing highlighting\n    this._clearSectionPlayingHighlighting(domHandler);\n    this._clearSectionPausedHighlighting(domHandler);\n\n    let $section = this.findSectionElem(\n      domHandler.getSpeakerContextDomElement()\n    );\n\n    domHandler._highlightTextBlockPlaying($section, {\n      // Always treat the legacy section speech as recorded speech, since that will show animation if enabled, even if it's synthetic speech being played.\n      highlightWithAnimation: domHandler._shouldShowAnimationWhenPlaying(true),\n      isUserTriggered,\n    });\n  }\n\n  _highlightStoryImagePlaying(\n    domHandler,\n    $storyImage,\n    { isUserTriggered = false } = {}\n  ) {\n    // Clear any playing/paused highlighting\n    this._clearStoryImagePausedHighlighting(domHandler);\n    this._clearStoryImagePlayingHighlighting(domHandler);\n\n    domHandler._highlightTextBlockPlaying($storyImage, {\n      // Always treat the story image speech as recorded speech, since that will show animation if enabled, even if it's synthetic speech being played.\n      highlightWithAnimation: domHandler._shouldShowAnimationWhenPlaying(true),\n      isUserTriggered,\n    });\n  }\n\n  _highlightSectionPaused(domHandler) {\n    domHandler._highlightTextBlockPaused(\n      this.findSectionElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _highlightStoryImagePaused(domHandler) {\n    domHandler._highlightTextBlockPaused(\n      this.findStoryImageElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearSelectedSectionHighlighting(domHandler) {\n    domHandler._clearSelectedHighlighting(\n      this.findSectionElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearSelectedStoryImageHighlighting(domHandler) {\n    domHandler._clearSelectedHighlighting(\n      this.findStoryImageElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearSectionPlayingHighlighting(domHandler) {\n    domHandler._clearPlayingHighlighting(\n      this.findSectionElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearStoryImagePlayingHighlighting(domHandler) {\n    domHandler._clearPlayingHighlighting(\n      this.findStoryImageElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearSectionPausedHighlighting(domHandler) {\n    domHandler._clearPausedHighlighting(\n      this.findSectionElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  _clearStoryImagePausedHighlighting(domHandler) {\n    domHandler._clearPausedHighlighting(\n      this.findStoryImageElem(domHandler.getSpeakerContextDomElement())\n    );\n  }\n\n  // END: Functionality to handle Digilär's story mode\n  //\n  ////////////////////////////////////////////////////////////////////\n}\n\nexport default DigilarDomHelper;\n","class DigilarLanguageUtil {\n  /**\n   * Parses the actual language from different language code formats.\n   * Examples:\n   * 'sv_SE' => 'sv'\n   * 'en-UD' => 'en'\n   * @param {*} languageCode\n   * @return The language part from the language/country code.\n   */\n  static parseLanguage(languageCode) {\n    // Replace '-' with '_' in case language codes are of format 'sv-SE' instead of 'sv_SE'\n    let language = languageCode.replace('-', '_');\n    const separatorIndex = language.indexOf('_');\n\n    if (separatorIndex >= 0) {\n      // Get first part of language code\n      language = language.substring(0, separatorIndex);\n    }\n\n    // console.debug(`langageCode \"${languageCode}\" was parsed into language \"${language}\"`);\n\n    return language;\n  }\n}\n\nexport default DigilarLanguageUtil;\n","import digilarPollyRuleSet from 'babel/utils/speaker/text-processing-rule-sets/polly/digilar-polly';\nimport {\n  PollyTextToSpeechProvider,\n  SpeakerTextProcessorRuleSet,\n} from 'speaker';\n\nimport DigilarPollyProxy from './DigilarPollyProxy';\n\nclass DigilarPollyProviderFactory {\n  static newPollyPlugin({\n    pollyProxyParams,\n    speechSpeed = 1.0,\n    generalDigilarTextProcessingRuleSets,\n  }) {\n    const { ajax, apiBaseUrl } = pollyProxyParams;\n\n    const pollyProvider = new PollyTextToSpeechProvider({\n      // A proxy object needs to be injected to handle all communication with AWS Polly.\n      // We use our own backend proxy instead of the \"default\" PollyFrontendProxy.\n      pollyProxy: new DigilarPollyProxy({ ajax, apiBaseUrl }),\n\n      cacheEnabled: false,\n      // Injecting a simple \"cache function\" that can be used either as a cache or for mocking during dev and test.\n      // The audioSourceKey received as param is the textToSpeechCacheKey for each audio source config.\n\n      fetchSpeechCache: (audioSourceKey, language, voice, speechSpeed) => {\n        return null;\n      },\n\n      // URL protocol can be forced by setting for example 'https' here. Not forcing will use protocol relative URLs.\n      forcedUrlProtocol: null,\n\n      // The speech speed here is not the playback speed. Instead it is the speed of the speech generated by Acapela. 1.0 = default. Lower value = slower, higher value = faster.\n      speechSpeed,\n\n      // Adjust volume to match other providers and/or recorded speech volume.\n      // Set to a falsy value to use default volume\n      // For all valid values, see https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html#prosody-tag\n      // Examples of valid values: '+6dB', '-6dB', 'soft', 'x-loud'\n      volume: 'x-loud',\n\n      customTextProcessingRuleSets: (language) => [\n        ...generalDigilarTextProcessingRuleSets(language),\n\n        // Digilär+Polly specific rules\n        new SpeakerTextProcessorRuleSet(digilarPollyRuleSet(language)),\n      ],\n    });\n\n    return pollyProvider;\n  }\n}\n\nexport default DigilarPollyProviderFactory;\n","class DigilarPollyProxy {\n  constructor({ ajax, apiBaseUrl }) {\n    this._ajax = ajax;\n    this._apiBaseUrl = apiBaseUrl;\n  }\n\n  synthesizeSpeech({\n    text,\n    language,\n    voice,\n    speechSpeed,\n    textToSpeechData,\n    generateSpeechMarks,\n  }) {\n    return new Promise((resolve, reject) => {\n      // Post request to our own backend Polly endpoint\n      const url = `${this._apiBaseUrl}/api/v1/content/polly/synthesize`;\n\n      const data = {\n        textId: textToSpeechData.ttsTextId,\n        text,\n        language,\n        voiceName: voice.id,\n        voiceEngineType: voice.engineType,\n        speechSpeed,\n      };\n\n      const useAuth = true;\n\n      this._ajax\n        .request(url, useAuth, {\n          type: 'POST',\n          data,\n        })\n        .then((response) => {\n          // console.debug(`Response from backend Polly API:`, response);\n          resolve(JSON.parse(response));\n        })\n        .catch(reject);\n    });\n  }\n}\n\nexport default DigilarPollyProxy;\n","import $ from 'jquery';\nimport { RecordedSpeechProvider } from 'speaker';\n\nclass DigilarRecordedSpeechProvider extends RecordedSpeechProvider {\n  constructor(params) {\n    super();\n\n    // Destruct params to class variables\n    ({\n      recordedSpeechBaseUrl: this._recordedSpeechBaseUrl,\n      singleRecordedSpeechConfig: this._singleRecordedSpeechConfig,\n      prioritizeSingleRecordedSpeechAudioSource:\n        this._prioritizeSingleRecordedSpeechAudioSource,\n    } = params);\n\n    this._hasValidSingleRecordedSpeechFile = false;\n  }\n\n  /**\n   * Performs any kind of custom init as a first step before initializing any audio sources.\n   * For example, fetch data from external APIs and/or apply custom logic to decide how to intialize the audio sources.\n   * Must return a Promise that resolves when done\n   */\n  customInit() {\n    // For a story, there is currently a single recorded speech file for the whole section rather than one for each text block component.\n    // What is done here is to check if such a recorded speech file exists.\n    // Note: In the future there will probably be stories with one recorded speech file per component, so we must be able to handle both cases which is done below.\n    if (this._singleRecordedSpeechConfig) {\n      const singleAudioSourcePromise = new Promise((resolve, reject) => {\n        $.get(this._singleRecordedSpeechConfig.recordedSpeechUrl)\n          .done((response) => {\n            // Save state to be checked later\n            this._hasValidSingleRecordedSpeechFile = true;\n            // console.debug(`* URL for single file recorded speech is valid *`);\n            resolve();\n          })\n          .fail((error) => {\n            // Reset the url to mark the config as invalid\n            this._singleRecordedSpeechConfig.recordedSpeechUrl = null;\n            // console.debug(`- URL for single file recorded speech is NOT valid -`);\n            resolve();\n          });\n      });\n\n      return singleAudioSourcePromise;\n    } else {\n      // If there's no single audio source, just resolve the promise immediately to allow execution to continue\n      // console.debug(`No single file recorded speech to check`);\n      return Promise.resolve();\n    }\n  }\n\n  /**\n   * Makes it possible to skip text block processing for recorded speech audio sources for this\n   * provider AND any providers of lower priority.\n   * If no special cases are implemented, this method should always return false.\n   */\n  preventRecordedSpeechForTextBlocks() {\n    // For Digilär's recorded speech, there is a special case when we have a single recorded speech audio file for the entire content/section.\n    // When that is the case, no individual text blocks needs to be checked for recorded speech.\n    return (\n      this._hasValidSingleRecordedSpeechFile &&\n      this._prioritizeSingleRecordedSpeechAudioSource\n    );\n  }\n\n  /**\n   * @param textBlockData The custom text block data returned by the DOM helper's getTextBlockRecordedSpeechData() function.\n   * @param textBlockHtml The html (string) of the text block. Needed for example to create meta data to enable word/sentence highlighting.\n   * @return An array of zero or more configuration objects for the audio sources to be created for the text block.\n   * Note: Returning more than one config object means that the recorded speech has been split up into several sound files for that the block.\n   * Zero configs (empty array) means that recorded speech will not be available for that the block.\n   */\n  getTextBlockAudioSourceData(textBlockData, textBlockHtml) {\n    // For Digilär's own recorded speech, there is always a 1-to-1 relationship between a component (text block) and its audio file,\n    const audioSources = [];\n\n    if (textBlockData.recordedReadingUrl) {\n      audioSources.push({\n        url: textBlockData.recordedReadingUrl,\n        // No meta data == Word/sentence highlighting not supported by Digilär\n        textMetaData: null,\n        // No custom data necessary\n        data: {},\n      });\n    } else if (textBlockData.recordedSpeechId) {\n      audioSources.push({\n        url: `${this._recordedSpeechBaseUrl}/${textBlockData.recordedSpeechId}`,\n        // No meta data == Word/sentence highlighting not supported by Digilär\n        textMetaData: null,\n        // No custom data necessary\n        data: {},\n      });\n    }\n\n    return audioSources;\n  }\n\n  /**\n   * Specifies if all recorded speech URLs should be verified by HTTP GET requests.\n   * Set to false for optimization if you're sure that all recorded speech URLs are already valid\n   */\n  shouldVerifyRecordedSpeechUrls() {\n    // Note: No recorded speech URLs are verified anymore. Instead, if a load error occurs the speaker will automatically continue to the next audio source.\n    return false;\n  }\n\n  /**\n   * Called when an audio source from the current provider is starting to play.\n   * Note, not called when play is resumed after pausing\n   */\n  playStarted(event) {}\n\n  /**\n   * Called when an audio source from the current provider has finished playing.\n   */\n  playEnded(event) {}\n\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n  // Below are custom functions used only by DigilarAudioSourceHandler\n\n  getSingleRecordedSpeechConfig() {\n    return this._singleRecordedSpeechConfig;\n  }\n\n  hasValidSingleRecordedSpeechFile() {\n    return this._hasValidSingleRecordedSpeechFile;\n  }\n}\n\nexport default DigilarRecordedSpeechProvider;\n","import config from 'babel/config/environment';\nimport { DefaultSpeakerConfig, WebPageTranslationDetector } from 'speaker';\n\nimport DigilarLanguageUtil from './DigilarLanguageUtil';\nimport allSpeakerVoices from './speaker-voices';\n\nclass DigilarSpeakerConfig extends DefaultSpeakerConfig {\n  constructor({ getContextData, getSpeakerSettings } = {}) {\n    super();\n    this.getContextData = getContextData;\n    this.getSpeakerSettings = getSpeakerSettings;\n\n    // Default case, we want to use all voices configured in speaker-voices.js\n    this._voices = allSpeakerVoices;\n\n    this.recordedSpeechProviderPriority =\n      this.recordedSpeechProviderPriority.bind(this);\n  }\n\n  onDemandLoadingNumberOfAudioSourcesToLoad() {\n    // If the page is translated don't load audio sources on demand, since that\n    // will cause the speaker to replace the translated text with the original text.\n    //\n    // The user will get more loading spinners but hopefully will only be shown translated text.\n    if (WebPageTranslationDetector.isTranslated()) {\n      return 0;\n    }\n\n    return super.onDemandLoadingNumberOfAudioSourcesToLoad();\n  }\n\n  //////////////////////////////////////////////////////////////////\n  //\n  // BEGIN: Overridden config\n  //\n  recordedSpeechBaseUrl() {\n    return config.recordedSpeechEndpoint;\n  }\n\n  preferredVoice(language, isTranslationLanguage = false) {\n    const defaultLanguage = isTranslationLanguage ? null : 'sv';\n    language = this._toTtsLanguageCode(\n      DigilarLanguageUtil.parseLanguage(language),\n      defaultLanguage\n    );\n\n    // This can only happen when isTranslationLanguage is true\n    // In that case, we don't want to default to Swedish voice, so we return null here\n    if (!language) {\n      return null;\n    }\n\n    let selectedVoice = this.getSpeakerSettings().get('voices')[language];\n\n    // If user has already selected a voice, make sure that it is still a valid voice\n    const hasValidSelectedVoice =\n      selectedVoice && this.isValidVoice(language, selectedVoice);\n\n    if (!hasValidSelectedVoice) {\n      // Get default voice in case of no valid voice selected\n      selectedVoice = this.supportedVoices(language)[0].id;\n    }\n\n    return selectedVoice;\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  isRecordedSpeechEnabled(speakerType) {\n    // Recorded speech can be completely disabled, to prevent looking up audio source URLs that we won't use or that we know don't exist anyway\n    return (\n      // Never use recorded speech for translated web pages\n      !WebPageTranslationDetector.isTranslated() &&\n      // No need to check recorded speech if user prefers synthetic speech\n      !this.getSpeakerSettings().get('preferSpeechSynthesis')\n    );\n  }\n\n  preferRecordedSpeech() {\n    return (\n      this.isRecordedSpeechEnabled() &&\n      !this.getSpeakerSettings().get('preferSpeechSynthesis')\n    );\n  }\n\n  recordedSpeechProviderPriority() {\n    const priority = [];\n\n    // console.log('getContextData()', this.getContextData());\n\n    if (this.getContextData().digilarRecordedSpeechEnabled) {\n      priority.push('digilar');\n    }\n    if (this.getContextData().iltRecordedSpeechEnabled) {\n      priority.push('ilt');\n    }\n\n    // console.debug('recordedSpeechProviderPriority =', priority);\n\n    return priority;\n  }\n\n  allowTtsWithRecordedSpeech() {\n    return true;\n  }\n\n  allowMixOfRecordedSpeechProviders() {\n    return false;\n  }\n\n  preventApplyingTextMetaData() {\n    return false;\n  }\n\n  //\n  // END: Overridden config\n  //\n  //////////////////////////////////////////////////////////////////\n  //\n  // BEGIN: Additional Digilär specific config\n  //\n\n  /**\n   * Helper function to handle content of unsupported languages\n   * @param {*} languageCode\n   */\n  _toTtsLanguageCode(languageCode, defaultLanguage = null) {\n    if (Object.keys(this.supportedVoices()).includes(languageCode)) {\n      return languageCode;\n    } else {\n      return defaultLanguage;\n    }\n  }\n\n  isValidVoice(language, voiceId) {\n    return this.supportedVoices(language).some((voice) => voice.id === voiceId);\n  }\n\n  supportedVoices(language) {\n    if (language) {\n      if (!this._voices[language] || this._voices[language].length === 0) {\n        throw `No TTS voices configured for language ${language}. Check file speaker-voices.js.`;\n      }\n      return this._voices[language];\n    } else {\n      // Return all voices if no language is specified as param\n      return this._voices;\n    }\n  }\n\n  /**\n   * @param providerId The ID of the provider to get speech speed values for. Must be one of the implemented providers: { 'digilar', 'ilt', 'polly' }\n   * @return An array of three speech speed values where 1.0 means 100%, each array index corresponding to selected option in UI component (Veryslow/Slow/Standard/Fast).\n   */\n  speechSpeedValues(providerId) {\n    const DEFAULT = [0.5, 0.7, 1.0, 1.2];\n\n    const speedByProvider = {\n      digilar: [0.5, 0.7, 1.0, 1.2],\n      ilt: [0.5, 0.7, 1.0, 1.2],\n      polly: [0.5, 0.7, 1.0, 1.2],\n    };\n\n    return speedByProvider[providerId] || DEFAULT;\n  }\n\n  // true will use the selected TTS provider's speech speed instead of using the playback speed functionality of the local sound lib (Howler)\n  // false will always request speech from TTS provider with a speed of 1.0 (100%) and the local sound lib will then be used to adjust playback speed.\n  useTtsSpeechSpeed() {\n    return true;\n  }\n\n  // Autoplay of first text block can be disabled for some content types.\n  // eslint-disable-next-line no-unused-vars\n  autoplayFirstTextBlockOnLoad(speakerType) {\n    return !['practice'].includes(this.getContextData().contentType);\n  }\n\n  // This is a setting to handle the legacy of stories (bildberättelser) where each story has a single recorded speech file.\n  // Setting this to true will always use that legacy file if found, while false will also check for recorded speech on component level.\n  alwaysUseSingleRecordedSpeechFileForStory() {\n    return true;\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  autoSelectFirstTextBlockOnInit(speakerType, initializedAudioSources) {\n    return ['chapter', 'story', 'workflow', 'practice'].includes(\n      this.getContextData().contentType\n    );\n  }\n\n  // Change to a larger value if DOM poller seems to consume too much CPU\n  domPollerIntervalMs() {\n    return 500;\n  }\n\n  // Below: Sub types of configuration are grouped in getters\n\n  get UI() {\n    return {\n      Images: {\n        // Configures if the images and captions should be part of the clickable speaker controls or not.\n        // Captions can only be excluded when images are.\n        // true --> The image/caption is not clickable to play/pause\n        // false --> Make image/caption clickable to play/pause\n        excludeImageFromSpeakerControls: () => true,\n        excludeCaptionsFromSpeakerControls: () => {\n          return (\n            this.getContextData().digilarRecordedSpeechEnabled &&\n            !this.getSpeakerSettings().get('preferSpeechSynthesis')\n          );\n        },\n      },\n    };\n  }\n\n  get Activation() {\n    return {\n      // true --> save state (permantently) in local storage, false --> save state (temporarily) in speaker service\n      alwaysRememberActiveState: () => false,\n\n      // true --> allow the active state stored in service to be overridden by \"active setting\" from local storage\n      // Only relevant if alwaysRememberActiveState === false.\n      overrideActiveStateWithSetting: () => true,\n    };\n  }\n\n  get RecordedSpeech() {\n    return {\n      // Change this to true to search ancestors in the DOM for data-id attribute when a text block element does not have the data-id itself.\n      // This should make it possible to have recorded speech for images (ILT) even if only the text caption is selected from the DOM.\n      // (The caption does not have a data-id attribute but the figure ancestor does)\n      searchAncestorsForDataId: () => true,\n    };\n  }\n\n  // The TextProcessing group contains function related to processing texts for TTS.\n  get TextProcessing() {\n    return {\n      shouldExcludeImageGalleries: () => true,\n      shouldExcludeImages: () => false, // Excludes images (and captions) completely from TTS text processing\n      shouldExcludeImageSources: () => true, // Only relevant if shouldExcludeImages()===false\n      shouldExcludeTips: () => false,\n      shouldExcludeModalDialogTitle: () => true,\n      shouldExcludeTextsContainingMathCode: () => false, // Don't exclude entire text blocks for TTS because they contain math\n      shouldExcludeMathCode: () => false, // Set to true to exclude just the math code. (Right now it's being replaced with alternative text instead)\n    };\n  }\n}\n\nexport default DigilarSpeakerConfig;\n","// Identifiers for the different types of speakers that are used within speaker contexts\n// MAIN: The main speaker that handles all normal text within the chapters/sections\n// POPUP: A temporary speaker that handles text within modal dialogs etcetera\nconst DigilarSpeakerType = {\n  MAIN: 'main',\n  POPUP: 'popup'\n};\n\nexport default DigilarSpeakerType;\n","/**\n * Test if app is run on an iOS device\n */\nexport const iOS = () => {\n  const iOS =\n    !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);\n  // console.debug(`Platform = ${navigator.platform}, isIOS = ${iOS}`);\n  return iOS;\n};\n","const handleSpeakerEvent = (\n  domHandler,\n  event,\n  params,\n  contextData,\n  domHelper\n) => {\n  let { contentType, onlyImages } = contextData;\n\n  // isStoryImageMode - Support for story content when no text is visible, only story image\n  // isLegacyStoryMode - Legacy support where we only have one recorded speech audio file per section instead of one file per text block for stories.\n  //\n  // Note that both isStoryImageMode and isLegacyStoryMode can be true at the same time.\n  //\n  let isStoryImageMode = !!(contentType === 'story' && onlyImages);\n  let isLegacyStoryMode = !!(\n    contentType === 'story' &&\n    event.isRecordedSpeech &&\n    event.data.singleRecordedSpeechFile\n  );\n\n  // If not handling our \"special content\", then skip our custom event handling\n  // and allow default event handling to take place instead\n  if (!isStoryImageMode && !isLegacyStoryMode) {\n    return true;\n  }\n\n  let dom = domHandler.getSpeakerContextDomElement();\n\n  const updateRelevantProgressBars = (normalizedProgressValue) => {\n    let $progressBarParents = null;\n\n    // Update both 'section' and 'image' progress bars since we can show/hide image/texts dynamically\n    $progressBarParents = domHelper\n      .findStoryImageElem(dom)\n      .add(domHelper.findSectionElem(dom));\n    domHandler._setProgressBarValue(\n      $progressBarParents,\n      normalizedProgressValue\n    );\n  };\n\n  // Helper function to show/hide the loading indicator for image or text.\n  const showLoadingIndicator = (visible) => {\n    if (isStoryImageMode) {\n      if (visible) {\n        domHelper._showStoryImageLoader(domHandler);\n      } else {\n        domHelper._hideStoryImageLoader(domHandler);\n      }\n    } else if (isLegacyStoryMode) {\n      let $section = domHelper.findSectionElem(dom);\n      if (visible) {\n        domHandler._showTextBlockLoader($section);\n      } else {\n        domHandler._hideTextBlockLoader($section);\n      }\n    }\n  };\n\n  // Switch to false if default event handling should be prevented for an event\n  let allowDefaultEventHandling = true;\n\n  switch (event.type) {\n    case 'progress':\n      updateRelevantProgressBars(event.position / event.duration);\n      allowDefaultEventHandling = false;\n      break;\n    case 'word':\n      // No custom handling\n      break;\n    case 'sentence':\n      // No custom handling\n      break;\n    case 'stop':\n      if (isStoryImageMode) {\n        domHelper._clearStoryImagePlayingHighlighting(domHandler);\n        domHelper._clearStoryImagePausedHighlighting(domHandler);\n        // Reset progress bar\n        updateRelevantProgressBars(0);\n      }\n\n      if (isLegacyStoryMode) {\n        domHelper._clearSectionPlayingHighlighting(domHandler);\n        domHelper._clearSectionPausedHighlighting(domHandler);\n        // Reset progress bar\n        updateRelevantProgressBars(0);\n\n        allowDefaultEventHandling = false;\n      }\n\n      break;\n    case 'play':\n      if (isLegacyStoryMode) {\n        domHelper._highlightSectionPlaying(domHandler, {\n          isUserTriggered: event.isUserTriggered,\n        });\n      }\n\n      if (isStoryImageMode) {\n        // When only viewing image in story mode, the same image is always highlighted\n        let $storyImage = domHelper.findStoryImageElem(dom);\n\n        domHelper._highlightStoryImagePlaying(domHandler, $storyImage, {\n          isUserTriggered: event.isUserTriggered,\n        });\n        // Must also highlight as selected, because a 'select' event is not received when switching to \"story image mode\" after playing has already started\n        domHelper._highlightSelectedStoryImage(domHandler);\n      }\n\n      // Prevent default event handling, otherwise highlighting for image/section will get cleared\n      allowDefaultEventHandling = false;\n\n      break;\n    case 'pause':\n      if (isStoryImageMode) {\n        domHelper._clearStoryImagePlayingHighlighting(domHandler);\n        domHelper._highlightStoryImagePaused(domHandler);\n      }\n      if (isLegacyStoryMode) {\n        domHelper._clearSectionPlayingHighlighting(domHandler);\n        domHelper._highlightSectionPaused(domHandler);\n        allowDefaultEventHandling = false;\n      }\n\n      break;\n    case 'select':\n      if (isStoryImageMode) {\n        domHelper._highlightSelectedStoryImage(domHandler);\n      }\n      if (isLegacyStoryMode) {\n        domHelper._highlightSelectedSection(domHandler);\n        allowDefaultEventHandling = false;\n      }\n\n      // Reset progress bars\n      let $progressBarParents = domHelper\n        .findStoryImageElem(dom)\n        .add(domHelper.findSectionElem(dom));\n      domHandler._setProgressBarValue($progressBarParents, 0);\n\n      break;\n    case 'autoPlayWhenLoaded':\n      showLoadingIndicator(true);\n      allowDefaultEventHandling = false;\n      break;\n    case 'autoPlayWhenLoadedCancelled':\n      showLoadingIndicator(false);\n      allowDefaultEventHandling = false;\n      break;\n    case 'load':\n      showLoadingIndicator(false);\n\n      // Add progress bar to both story section elem and to story image elem.\n      domHandler._addProgressBarToElem(domHelper.findSectionElem(dom));\n      domHandler._addProgressBarToElem(domHelper.findStoryImageElem(dom));\n\n      allowDefaultEventHandling = false;\n      break;\n    default:\n      break;\n  }\n\n  return allowDefaultEventHandling;\n};\n\nexport default handleSpeakerEvent;\n","import { defaultSpeakerControls } from 'speaker';\n\nconst digilarSpeakerControls = (\n  speakerContext,\n  speakerConfig,\n  speakerAdapter,\n  getOnClickPromise\n) => {\n  const defaultControls = defaultSpeakerControls(\n    speakerContext,\n    speakerConfig,\n    speakerAdapter\n  );\n\n  return {\n    ...defaultControls,\n\n    onTextBlockClick: (speakerAudioSourceIndex, options) => {\n      // Wait for injected promise to resolve before proceeding with click handling\n      getOnClickPromise()\n        .then(() => {\n          defaultControls.onTextBlockClick(speakerAudioSourceIndex, options);\n        })\n        .catch((error) => console.warn(`promiseOnClick rejected:`, error));\n    },\n\n    onPlayButtonClick: (speakerAudioSourceIndex, options) => {\n      // Wait for injected promise to resolve before proceeding with click handling\n      getOnClickPromise()\n        .then(() =>\n          defaultControls.onPlayButtonClick(speakerAudioSourceIndex, options)\n        )\n        .catch((error) => console.warn(`promiseOnClick rejected:`, error));\n    },\n  };\n};\n\nexport default digilarSpeakerControls;\n","import { defaultSpeakerOptions } from 'speaker';\n\nimport { iOS } from './deviceUtils';\n\nconst digilarSpeakerOptions = (\n  digilarSpeakerConfig,\n  { getSelectedSpeechSpeed }\n) => {\n  const disableProgressBar =\n    !digilarSpeakerConfig.showProgressBarWhenPlayingRecordedSpeech() &&\n    !digilarSpeakerConfig.showProgressBarWhenPlayingTts();\n\n  // On iOS, using HTML5 audio requires a user interaction for each individual audio source which makes \"autoplay next\" fail.\n  // Therefor we use Web Audio API for iOS, which only requires a single user interaction for the first autoplay.\n  // For other platforms HTML5 audio is used (only) to prevent pitch from changing along with playback speed for recorded speech.\n  const forceHtml5Audio = !iOS();\n\n  const playbackSpeedRecordedSpeech = () => {\n    if (forceHtml5Audio) {\n      // For HTML5 audio, just call injected function to get user's preferred playback speed. Pitch will be the same for all speeds.\n      return getSelectedSpeechSpeed();\n    } else {\n      // For Web Audio API, don't allow playback speed change for recorded speech because it will change the pitch of the voice.\n      return 1.0;\n    }\n  };\n\n  return {\n    ...defaultSpeakerOptions({ disableProgressBar }),\n\n    progressEventsIntervalMs: disableProgressBar ? 0 : 25,\n\n    playbackSpeedRecordedSpeech: playbackSpeedRecordedSpeech(),\n\n    // If the TTS provider's speech speed is used, then the playback speed for TTS will always be 1.0 (100%).\n    playbackSpeedTextToSpeech: digilarSpeakerConfig.useTtsSpeechSpeed()\n      ? 1.0\n      : getSelectedSpeechSpeed(),\n\n    forceHtml5Audio,\n\n    // Change this to a higher value if it is not enough to detect failed autoplay attempts\n    autoplayTimeoutMs: 500,\n\n    // Retry once on load error. Should be enough to handle most glitches against backend Acapela API.\n    maxLoadAttempts: 2,\n\n    audioFormats: ['mp3', 'webm'],\n\n    enablePlayNextOnLoadError: true,\n\n    // 1000 ms delay on load error before the load is rejected and loadError event is emitted.\n    loadErrorDelayMs: 1000\n  };\n};\n\nexport default digilarSpeakerOptions;\n","import $ from 'jquery';\n\n// Implementation of the communication with ILT's API (Inläsningstjänst).\nclass IltApi {\n  constructor({ apiBaseUrl, reportListeningsDisabled = false } = {}) {\n    this._apiBaseUrl = apiBaseUrl;\n\n    // Allow listenings (royalty) to be completely disabled\n    // Required when running dev/test env towards ILT's prod environment but we don't want to report any listenings.\n    this._reportListeningsDisabled = reportListeningsDisabled;\n  }\n\n  /**\n   * Fetch a single article\n   * @param {*} articleId\n   * @param {String} jwt A valid JWT\n   * @return {Promise} A promise that resolves when article has been fetched\n   */\n  fetchArticle({ articleId, jwt, useBrowserCache = false }) {\n    const urlWithParams = `${this._apiBaseUrl}/api/Student/articles/articleId?articleId=${articleId}`;\n\n    return new Promise((resolve, reject) => {\n      $.ajax({\n        url: urlWithParams,\n        // Disable browser caching to make sure that user always gets the latest article\n        cache: useBrowserCache,\n        type: 'GET',\n        // Setting a timeout to prevent entire speaker functionality to break down if ILT is not responding...\n        timeout: 30000,\n        beforeSend: function (xhr) {\n          xhr.setRequestHeader('Authorization', `Bearer ${jwt}`);\n        },\n      })\n        .done((article) => {\n          // console.debug(`ILT article ${articleId}:`, article);\n          resolve(article);\n        })\n        .fail((xhr) => {\n          // console.debug(`ILT fetch error:`, xhr.responseJSON);\n          reject(xhr.status);\n        });\n    });\n  }\n\n  /**\n   * Report a single listening to the \"royalty API\"\n   * @param {*} articleId\n   * @param {*} recordingId\n   * @param {*} jwt\n   */\n  reportListening(articleId, recordingId, jwt) {\n    if (this._reportListeningsDisabled) {\n      return false;\n    }\n\n    const url = `${this._apiBaseUrl}/api/Student/articles/${articleId}/recordings/${recordingId}/listenings`;\n\n    $.ajax({\n      url,\n      type: 'POST',\n      // Setting a timeout to prevent entire speaker functionality to break down if ILT is not responding...\n      timeout: 2000,\n      beforeSend: function (xhr) {\n        xhr.setRequestHeader('Authorization', `Bearer ${jwt}`);\n      },\n    })\n      .done(() => {\n        // console.debug(`Successfully reported listening to ILT for articleId ${articleId}, recordingId ${recordingId}`);\n      })\n      .fail((xhr) => {\n        console.warn(\n          `Error reporting listening to ILT for articleId ${articleId}, recordingId ${recordingId}. Error code ${xhr.status}`\n        );\n      });\n  }\n}\n\nexport default IltApi;\n","class IltDataParser {\n  _findSentenceGroup(article, sentenceGroupId) {\n    if (!article) {\n      return null;\n    }\n\n    let sentenceGroup = null;\n\n    // Find sentence group in article\n    if (article.SentenceGroups && article.SentenceGroups.length > 0) {\n      sentenceGroup = article.SentenceGroups.find(\n        (group) => group.Id === sentenceGroupId\n      );\n    }\n\n    return sentenceGroup;\n  }\n\n  _findArticle(articles, sentenceGroupId) {\n    if (!articles) {\n      return null;\n    }\n\n    let articleContainingSentenceGroup = null;\n\n    // Find article containing the sentence group\n    for (let article of articles) {\n      if (article.SentenceGroups && article.SentenceGroups.length > 0) {\n        if (\n          article.SentenceGroups.some((group) => group.Id === sentenceGroupId)\n        ) {\n          articleContainingSentenceGroup = article;\n          break;\n        }\n      }\n    }\n\n    return articleContainingSentenceGroup || null;\n  }\n\n  _createTextMetaData(sentence, sentenceIndex, textBlockHtml) {\n    // For ILT, there can be no support for word highlighting since we have no info about individual words\n    const words = [];\n\n    // Each audio source is always a single sentence\n    const sentences = [\n      {\n        // The following properties are required for 'sentence' events to be emitted at correct times from the Speaker class.\n        sentenceIndex,\n        startTimeMs: 0,\n        durationMs: 0, // 0 means that duration is unknown at the moment and equal to length of audio source\n\n        // Required for sentence highlighting to be possible. Note that sentenceIndex is also required.\n        sentenceText: sentence.Content,\n      },\n    ];\n\n    return { words, sentences };\n  }\n\n  //////////////////////////////////////////////////////////////////////////////\n  // PUBLIC METHODS\n\n  getAudioSources(articles, sentenceGroupId, textBlockHtml) {\n    const article = this._findArticle(articles, sentenceGroupId);\n    const sentenceGroup = this._findSentenceGroup(article, sentenceGroupId);\n\n    if (\n      !sentenceGroup ||\n      !sentenceGroup.Sentences ||\n      sentenceGroup.Sentences.length === 0\n    ) {\n      return [];\n    }\n\n    // Parse audio sources from sentence group within the article data\n    const audioSources = sentenceGroup.Sentences.map((sentence, index) => {\n      return {\n        // The url is required\n        url: sentence.RecordingUrl.Url,\n        // Text meta data is required to be able to support sentence highlighting\n        textMetaData: this._createTextMetaData(sentence, index, textBlockHtml),\n        // The data is optional and may contain whatever data necessary for custom UI solutions\n        // It will be included in events emitted by the speaker as property \"recordedSpeechProviderData\"\n        // For ILT we need recordingId+article.Id to be able to call the \"royalty API\" for reporting back listenings to ILT.\n        data: {\n          text: sentence.Content,\n          recordingId: sentence.RecordingId,\n          articleId: article.Id,\n        },\n      };\n    });\n\n    // console.debug(`audio sources returned from IltDataParser:`, audioSources);\n\n    return audioSources;\n  }\n\n  isArticleExpired(article) {\n    // To decide if an article has expired, we must check EVERY sentence, because Created+TTL is individual for each sentence...\n    // It's enough to find one sentence that has expired, because that means that the entire article must be fetched again.\n    const isExpired = article.SentenceGroups.some((sentenceGroup) => {\n      return sentenceGroup.Sentences.some((sentence) => {\n        const createdDate = new Date(sentence.RecordingUrl.Created);\n        const expirationTimeInSeconds = Math.floor(\n          createdDate.getTime() / 1000 + sentence.RecordingUrl.TimeLeftSeconds\n        );\n        const nowInSeconds = Math.floor(new Date().getTime() / 1000);\n\n        // Sentence will be considered expired if it expires within this margin (in minutes)\n        const expirationMarginMinutes = 10;\n\n        return (\n          nowInSeconds > expirationTimeInSeconds - expirationMarginMinutes * 60\n        );\n      });\n    });\n\n    // console.debug(`Is article ${article.Id} expired? ${isExpired}`);\n\n    return isExpired;\n  }\n}\n\nexport default IltDataParser;\n","const STATIC_AUDIO_SOURCES = [\n  {\n    text: 'Inläsningstjänst - första meningen.',\n    url: 'http://vaas.acapela-group.com/MESSAGES/007105103105108097114/Digilar_APP/sounds/651402408_ef712c40d1947.mp3',\n  },\n  {\n    text: 'Inläsningstjänst - andra meningen.',\n    url: 'http://vaas.acapela-group.com/MESSAGES/007105103105108097114/Digilar_APP/sounds/651402607_ef712d4602986.mp3',\n  },\n  {\n    text: 'Inläsningstjänst - tredje meningen.',\n    url: 'http://vaas.acapela-group.com/MESSAGES/007105103105108097114/Digilar_APP/sounds/651402715_ef712e29d8762.mp3',\n  },\n];\n\nclass IltMockApi {\n  constructor({ sentenceGroupId }) {\n    this._sentenceGroupId = sentenceGroupId;\n  }\n\n  _mockArticle(articleId) {\n    const newSentenceGroup = (sentenceGroupId) => {\n      return {\n        Id: sentenceGroupId,\n        Sentences: STATIC_AUDIO_SOURCES.map((audioSource, i) => {\n          return {\n            Order: i,\n            Content: audioSource.text,\n            RecordingUrl: {\n              Url: audioSource.url,\n              Ttl: null,\n              Created: '2019-07-03T13:11:38.390Z',\n              TimeLeft: null,\n              TimeLeftSeconds: 0,\n            },\n            RecordingId: `00000000-0000-0000-0000-00000000000${i + 1}`,\n          };\n        }),\n      };\n    };\n\n    // Generate a mock article using static audio source data, and a single sentence group using the group ID passed to the constructor\n    const article = {\n      Id: articleId,\n      PublisherDomContainer: 'N/A',\n      SentenceGroups: [newSentenceGroup(this._sentenceGroupId)],\n    };\n\n    return article;\n  }\n\n  fetchArticle({ articleId, jwt, useBrowserCache = false }) {\n    // Resolve with mock article\n    return Promise.resolve(this._mockArticle(articleId));\n  }\n\n  reportListening(recordingId) {\n    // Do nothing in mocked API. Real API will call /api/Student/articles/{articleId}/recordings/{recordingId}/listenings\n    console.debug(\n      `Mock API not reporting listening back to ILT for recordingId ${recordingId}`\n    );\n  }\n}\n\nexport default IltMockApi;\n","import IltDataParser from './IltDataParser';\n\nclass IltMockDataParser {\n  constructor({ sentenceGroupId }) {\n    this._sentenceGroupId = sentenceGroupId;\n\n    // Wrap the \"real\" data parser to use it's data parsing algorithm\n    this._dataParser = new IltDataParser();\n  }\n\n  getAudioSources(articles, sentenceGroupId, textBlockHtml) {\n    // Ignore the sentenceGroupId param since that will not exist in our mock article data.\n    // Instead use the group IDs injected to the constructor, and call the actual data parsing algorithm with that value\n    return this._dataParser.getAudioSources(\n      articles,\n      this._sentenceGroupId,\n      textBlockHtml\n    );\n  }\n\n  isArticleExpired(article) {\n    return false;\n  }\n}\n\nexport default IltMockDataParser;\n","import { RecordedSpeechProvider } from 'speaker';\n\nclass IltRecordedSpeechProvider extends RecordedSpeechProvider {\n  constructor(params) {\n    super();\n\n    // Destruct params to class variables\n    ({\n      articleIds: this._articleIds,\n      iltApi: this._iltApi,\n      iltDataParser: this._iltDataParser,\n\n      // Injected function to handle ILT:s JWT required to access the articles API.\n      getJwt: this._getJwt,\n\n      // Injected function that handles when an ILT error occurs.\n      iltError: this._iltError,\n\n      // This flag is necessary to configure some behavior for missing ILT audio\n      enablePlayNextOnLoadError: this._enablePlayNextOnLoadError,\n    } = params);\n\n    // Will be initialized by customInit()\n    this._articles = null;\n    this._jwt;\n  }\n\n  _fetchArticles(articleIds, jwt) {\n    const fetchPromises = articleIds.map((articleId) => {\n      return this._iltApi\n        .fetchArticle({ articleId, jwt, useBrowserCache: true })\n        .then((article) => {\n          if (!this._iltDataParser.isArticleExpired(article)) {\n            return article;\n          } else {\n            // console.debug(`Article has expired. Will attempt to fetch again, busting browser cache...`);\n            // For expired articles, try to fetch again and disable browser cache for this request\n            // If the article fetched is still expired, reject Promise to disable ILT speech for that article\n            return this._iltApi\n              .fetchArticle({ articleId, jwt, useBrowserCache: false })\n              .then((article) =>\n                this._iltDataParser.isArticleExpired(article) ? null : article\n              );\n          }\n        })\n        .catch(() => {\n          // console.debug('ILT Article not found', err);\n          return;\n        });\n    });\n\n    // Filter out any expired (null) articles when all fetch promises are done\n    return Promise.all(fetchPromises).then((articles) =>\n      articles.filter((article) => article)\n    );\n  }\n\n  /**\n   * Performs any kind of custom init as a first step before initializing any audio sources.\n   * For example, fetch data from external APIs and/or apply custom logic to decide how to intialize the audio sources.\n   * Must return a Promise that resolves when done. Should NEVER reject, instead handle all errors internally.\n   */\n  customInit() {\n    // Start by resetting articles\n    this._articles = null;\n\n    // Get token, and then fetch articles\n    return this._getJwt()\n      .then((jwt) => {\n        this._jwt = jwt;\n\n        if (jwt) {\n          // Fetch article data from ILT\n          return this._fetchArticles(this._articleIds, jwt)\n            .then((articles) => {\n              // Note: When successfully fetching articles, we must enable ILT in case it is still null,\n              // i.e the initial session value when we don't know yet if the user has ILT access.\n              this._articles = articles;\n              return articles;\n            })\n            .catch((errorCode) => {\n              console.warn(\n                `Could not fetch articles from ILT. Error code:`,\n                errorCode\n              );\n              if (+errorCode === 401) {\n                // Notify that an ILT error occured\n                this._iltError();\n              }\n            });\n        }\n      })\n      .catch((error) => {\n        // Unexpected error getting/fetching token. Catch the error, but don't disable ILT in this case, to allow us to try again later.\n        console.warn(`Unexpected error trying to get a JWT for ILT:`, error);\n      });\n  }\n\n  /**\n   * Makes it possible to skip text block processing for recorded speech audio sources for this\n   * provider AND any providers of lower priority.\n   * If no special cases are implemented, this method should always return false.\n   */\n  preventRecordedSpeechForTextBlocks() {\n    // ILT has no special cases that needs text blocks to be skipped completely\n    return false;\n  }\n\n  /**\n   * @param textBlockData The custom text block data returned by the DOM helper's getTextBlockRecordedSpeechData() function.\n   * @param textBlockHtml The html (string) of the text block. Needed for example to create meta data to enable word/sentence highlighting.\n   * @return An array of zero or more configuration objects for the audio sources to be created for the text block.\n   * Note: Returning more than one config object means that the recorded speech has been split up into several sound files for that the block.\n   * Zero configs (empty array) means that recorded speech will not be available for that the block.\n   */\n  getTextBlockAudioSourceData(textBlockData, textBlockHtml) {\n    // For ILT's recorded speech, we use the article data already fetched in customInit()\n    // to find the audio sources to create for each text block, one for each sentence\n\n    const iltSentenceGroupId = textBlockData.recordedSpeechId;\n\n    let audioSources = [];\n\n    // Exclude text blocks that don't have a recordedSpeechId and therefore will never have been sent to ILT (such as headings and image texts)\n    if (iltSentenceGroupId) {\n      audioSources = this._iltDataParser.getAudioSources(\n        this._articles,\n        iltSentenceGroupId,\n        textBlockHtml\n      );\n    }\n\n    if (audioSources.length === 0) {\n      // NOTE! This is a quick fix to allow text blocks without ILT audio to be clickable the same way Digilär audio works.\n      // By specifying an invalid audio URL, a load error will occur, and the speaker will then continue with the next audio source instead, or fallback to TTS.\n      if (this._enablePlayNextOnLoadError && !textBlockData.isPausing) {\n        audioSources = [\n          {\n            url: '/no-ilt-audio-found.mp3',\n\n            // Custom data to mark the audio source as invalid\n            data: {\n              invalid: true,\n            },\n          },\n        ];\n      }\n    }\n\n    return audioSources;\n  }\n\n  /**\n   * Specifies if all recorded speech URLs should be verified by HTTP GET requests.\n   * Set to false for optimization if you're sure that all recorded speech URLs are already valid\n   */\n  shouldVerifyRecordedSpeechUrls() {\n    // Note: We should never have to validate the ILT URLs since they should always exist.\n    return false;\n  }\n\n  /**\n   * Called when an audio source from the current provider is starting to play.\n   * Note, not called when play is resumed after pausing\n   */\n  playStarted(event) {\n    return this._playbackRoyaltyHandler(event);\n  }\n\n  /**\n   * Called when an audio source from the current provider has finished playing.\n   */\n  playEnded(event) {}\n\n  /////////////////////////////////////////////////////////////////////////\n  // Private functions\n\n  _playbackRoyaltyHandler(speakerEvent) {\n    // Here we just read the locally stored token which have already been fetched and validated by the customInit() function.\n    const jwt = this._jwt;\n\n    // Use data from the play event to make a callback to ILT's playback royalty API\n    const { articleId, recordingId } = speakerEvent.recordedSpeechProviderData;\n\n    this._iltApi.reportListening(articleId, recordingId, jwt);\n  }\n}\n\nexport default IltRecordedSpeechProvider;\n","// NOTE! The first voice of each language will be the default voice for that language.\n// The order of remaining voices has no meaning.\n// (How the voices are displayed is decided by the playsettings component)\nconst voices = {\n  // Swedish\n  sv: [{ id: 'polly-elin-neural', label: 'Elin' }],\n\n  // English\n  en: [\n    { id: 'polly-brian-neural', label: 'Brian (GB)' },\n    { id: 'polly-amy-neural', label: 'Amy (GB)' },\n    { id: 'polly-kimberly-neural', label: 'Kimberly (US)' },\n    { id: 'polly-matthew-neural', label: 'Matthew (US)' },\n    { id: 'polly-olivia-neural', label: 'Olivia (AU)' },\n    { id: 'polly-aria-neural', label: 'Aria (NZ)' },\n    { id: 'polly-ayanda-neural', label: 'Ayanda (SA)' },\n    { id: 'polly-kajal-neural', label: 'Kajal (IN)' },\n    //  { id: 'polly-raveena-standard', label: 'Raveena (IN)' },\n  ],\n\n  // French\n  fr: [\n    { id: 'polly-gabrielle-neural', label: 'Gabrielle (CA)' },\n    { id: 'polly-liam-neural', label: 'Liam (CA)' },\n    { id: 'polly-lea-neural', label: 'Léa' },\n  ],\n\n  // German\n  de: [\n    { id: 'polly-vicki-neural', label: 'Vicki' },\n    { id: 'polly-daniel-neural', label: 'Daniel' },\n    { id: 'polly-hannah-neural', label: 'Hannah (AT)' },\n  ],\n\n  // Italian\n  it: [\n    { id: 'polly-bianca-neural', label: 'Bianca' },\n    { id: 'polly-adriano-neural', label: 'Adriano' },\n  ],\n\n  // Spanish\n  es: [\n    { id: 'polly-lupe-neural', label: 'Lupe (US)' },\n    { id: 'polly-pedro-neural', label: 'Pedro (US)' },\n    { id: 'polly-mia-neural', label: 'Mia (MX)' },\n    { id: 'polly-lucia-neural', label: 'Lucia' },\n  ],\n\n  // Danish\n  da: [\n    { id: 'polly-mads-standard', label: 'Mads' },\n    { id: 'polly-naja-standard', label: 'Naja' },\n  ],\n\n  // Norwegian\n  no: [\n    { id: 'polly-ida-neural', label: 'Ida' },\n    { id: 'polly-liv-standard', label: 'Liv' },\n  ],\n\n  // The following languages have been added to support web page translations in Chrome.\n  // Priority for voices: 1. AWS Polly neural, 2. AWS Polly standard\n  // To add more voices, see the following links for complete lists of available voices:\n  //\n  // Polly: https://docs.aws.amazon.com/polly/latest/dg/voicelist.html\n\n  // Arabic\n  ar: [{ id: 'polly-zeina-standard', label: 'Zeina' }],\n\n  // Catalan\n  ca: [{ id: 'polly-arlet-neural', label: 'Arlet' }],\n\n  // Chinese (Word highlighting working very poorly due to Chinese characters)\n  zh: [{ id: 'polly-hiujin-neural', label: 'Hiujin' }],\n\n  // Dutch\n  nl: [{ id: 'polly-laura-neural', label: 'Laura' }],\n\n  // Finnish\n  fi: [{ id: 'polly-suvi-neural', label: 'Suvi' }],\n\n  // Hindi\n  hi: [\n    { id: 'polly-kajal-neural', label: 'Kajal' },\n    //    { id: 'polly-aditi-standard', label: 'Aditi' }\n  ],\n\n  // Icelandic\n  is: [{ id: 'polly-dora-standard', label: 'Dora' }],\n\n  // Japanese (Word highlighting working very poorly due to Japanese characters)\n  ja: [{ id: 'polly-takumi-neural', label: 'Takumi' }],\n\n  // Korean\n  ko: [{ id: 'polly-seoyeon-neural', label: 'Seoyeon' }],\n\n  // Polish\n  pl: [{ id: 'polly-ola-neural', label: 'Ola' }],\n\n  // Portugese\n  pt: [{ id: 'polly-ines-neural', label: 'Ines' }],\n\n  // Romanian\n  ro: [{ id: 'polly-carmen-standard', label: 'Carmen' }],\n\n  // Russian\n  ru: [{ id: 'polly-tatyana-standard', label: 'Tatyana' }],\n\n  // Turkish\n  tr: [{ id: 'polly-burcu-standard', label: 'Burcu' }],\n\n  // Welsh\n  cy: [{ id: 'polly-gwyneth-standard', label: 'Gwyneth' }],\n\n  // Czech\n  cs: [{ id: 'polly-jitka-standard', label: 'Jitka' }],\n};\n\n// If the same voices should be supported for several language codes, add the keys for those languages here\n//\n// Norwegian language mappings\nvoices.nn = voices.no;\nvoices.nb = voices.no;\n\nexport default voices;\n","// This rule set is specific for Swedish language (sv) and has been added here as an example without any actual rules\n// It is used from component speaker-context in function _getDigilarTextProcessingRuleSets.\n// To add a rule set like this for another language, just copy this file, rename it, add the rules, and use it from speaker-context:_getDigilarTextProcessingRuleSets().\n//\n// NOTE! Language specific rule sets like this one are only intended for more complex rules that can differ between languages.\n// For simpler translations, use digilar-general.js instead and add translations to translation/languages/<language>.js\n// See digilar-general.js for example use of the translate() function.\n//\nconst ruleSet = () => {\n  return {\n    initialCleanUp: (textProcessor, syntax, { withPlaceholder }) => {},\n\n    beforeHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => {},\n\n    afterHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => {},\n\n    finalCleanUp: (textProcessor, syntax, { withPlaceholder }) => {},\n  };\n};\n\nexport default ruleSet;\n","import DigilarDomElementsConfig from 'babel/utils/speaker/DigilarDomElementsConfig';\nimport $ from 'jquery';\nimport { SpeakerStringUtil } from 'speaker';\n\nimport exponents from './helpers/exponents';\nimport translate from './translation/translate';\n\n/**\n * Appends sentence separators to some element types to automatically force the TTS provider to pause when reading\n */\nconst _addPauseAfterElements = (\n  textProcessor,\n  syntax,\n  htmlElementsToPauseAfter\n) => {\n  // Append a '.' to each element's html content, but only where the content doesn't already end with a sentence separator.\n  // The '.' is used to force the TTS provider to pause after reading, and also separates sentences for highlighting\n  htmlElementsToPauseAfter.forEach((elementConfig) => {\n    // console.log('** append sentence separator to element: ', elementConfig);\n\n    textProcessor.appendToHtmlElementContent(\n      elementConfig,\n      // Also add an extra space just in case, since Acapela can't handle words separated by '.' without any space very well.\n      '. ',\n      // Note! Using pause function instead of '.' would be possible and \"works\",\n      // but for example for tables all text will then be treated and highlighted as a single sentence which is probably not what we want.\n      // ` ${syntax.pause(500)} `,\n      (content) => !SpeakerStringUtil.endsWithSentenceSeparator(content)\n    );\n  });\n\n  textProcessor.replaceHtmlElementByAttribute(\n    { elementName: 'span', attributeName: 'data-speaker-pause-for' },\n    (elementMetaData) => {\n      const { completeElement } = elementMetaData;\n      const match = completeElement.match(/data-speaker-pause-for=\"(\\d+)\"/);\n      const pauseFor = (match && match[1]) || 500;\n      return `${syntax.pause(pauseFor)}`;\n    }\n  );\n};\n\n/* * Regex character class for thousands separators:\n * \\x20   = Standard space\n * \\xA0   = Non-breaking space (\\u00A0)\n * \\u2009 = Thin space\n * \\u202F = Narrow non-breaking space\n */\nconst THOUSANDS_NUMBER_REGEX =\n  /\\b[1-9]\\d{0,2}(?:[\\x20\\xA0\\u2009\\u202F]\\d{3})+\\b/;\nconst SEPARATOR_REGEX = /[\\x20\\xA0\\u2009\\u202F]+/g;\n\nconst _normalizeThousandsSeparatedNumbers = (textProcessor) => {\n  textProcessor.replaceRegex(THOUSANDS_NUMBER_REGEX, (match) =>\n    match[0].replace(SEPARATOR_REGEX, '')\n  );\n};\n\nconst ruleSet = (\n  language,\n  { htmlElementsToRemove = [], htmlElementsToPauseAfter = [] } = {}\n) => {\n  return {\n    initialCleanUp: (textProcessor, syntax, { withPlaceholder }) => {\n      // Remove all html elements that have been configured to not be part of text processing\n      htmlElementsToRemove.forEach((elementToRemove) => {\n        // console.log('* Removing html element: ', elementToRemove);\n        textProcessor.removeHtmlElementsByClass(elementToRemove);\n      });\n    },\n\n    beforeHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => {\n      _addPauseAfterElements(textProcessor, syntax, htmlElementsToPauseAfter);\n\n      // If we have a translation for mathematical text, use it to replace any math elements\n      // Otherwise, just remove the math elements\n      translate(\n        'math-text',\n        language,\n        // Callback function when translation exists\n        (translation) => {\n          const replacement = `${syntax.pause(250)}${translation}${syntax.pause(\n            250\n          )}`;\n\n          textProcessor.replaceHtmlElementByClass(\n            DigilarDomElementsConfig.MATHLIVE,\n            (elementMetaData) => replacement\n          );\n        },\n        // Callback function when translation does not exist\n        () => {\n          textProcessor.removeHtmlElementsByClass(\n            DigilarDomElementsConfig.MATHLIVE\n          );\n        }\n      );\n\n      // Find alternative texts and replace them, i.e html tags for which the content should be read as something else.\n      // The html for this is a wrapping <span> for the text to replace, with an additional appended <span> containing the alternative text.\n      // Example:\n      // <span data-speaker-alt-text>\n      //   <p>This is the original <b>text/html</b> that will be replaced</p>\n      //   <span class=\"speaker-alt-text\">This is the alternative text that will be read by TTS</span>\n      // </span>\n      //\n      // Note: The alternative text may contain other \"special html elements\" that can then be handled by subsequent rules\n      // for example to enable fonetic support (not impemented yet) in alternative texts.\n      textProcessor.replaceHtmlElementByAttribute(\n        { elementName: 'span', attributeName: 'data-speaker-alt-text' },\n        (elementMetaData) => {\n          // Get matched element as string\n          const { completeElement } = elementMetaData;\n\n          // Using jQuery to extract replacement text from matched element\n          const $element = $(completeElement);\n          const $altTextElem = $element.find('.speaker-alt-text').first();\n\n          if ($altTextElem.length === 0) {\n            // Don't replace anything if alternative text is not found\n            return completeElement;\n          }\n\n          const EXCLUDE_VOICES = [\n            'acapela_cloud-Mia22k_HQ',\n            'acapela_cloud-Samuel22k_NT',\n          ];\n\n          const playSettings = JSON.parse(\n            localStorage.getItem('storage:play-settings') ?? {}\n          );\n\n          if (\n            EXCLUDE_VOICES.includes(playSettings?.voices[language]) &&\n            $altTextElem.text().includes('[') &&\n            $altTextElem.text().includes(']')\n          ) {\n            $element.find('.speaker-alt-text').remove();\n            return $element.html();\n          }\n\n          // Get the textContent instead of innerHTML to make x-sampa and ipa work\n          const altHtml = $altTextElem.get(0).textContent;\n\n          return altHtml;\n        }\n      );\n\n      textProcessor.replaceHtmlElementByAttribute(\n        { elementName: 'button', attributeName: 'data-footnote' },\n        () => {\n          return '';\n        }\n      );\n\n      // Find exponents in html and replace them with placeholders\n      exponents.replaceHtmlWithPlaceholders(textProcessor);\n    },\n\n    afterHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => {\n      // Replace the exponent placeholders with plain text now that all html is gone\n      exponents.replacePlaceholdersWithText(textProcessor, syntax);\n\n      // Keep grouped thousands as one number so TTS reads \"2000\" instead of \"2 0 0 0\".\n      _normalizeThousandsSeparatedNumbers(textProcessor);\n\n      // Translate some characters/expressions\n      translate('unicode-arrow', language, (translation) => {\n        textProcessor.replaceText('⟶', () => translation);\n      });\n\n      // Remove all emojis\n      exponents.removeEmojis(textProcessor);\n    },\n\n    finalCleanUp: (textProcessor, syntax, { withPlaceholder }) => { },\n  };\n};\n\nexport default ruleSet;\n","const exponents = {\n  /**\n   * Get rid of all html elements representing exponents and replace with specific placeholders\n   */\n  replaceHtmlWithPlaceholders: (textProcessor) => {\n    // Note! Important here to replace entire html element instead of just using replaceHtmlElementContent.\n    // Otherwise we can't later add a word meta data element around both the base unit and the exponent since the html will be \"broken\" after being replaced/removed in several steps.\n    // By replacing the entire html element in one step we avoid that problem.\n    textProcessor.replaceHtmlElementByClass(\n      {\n        elementName: 'sup',\n        className: 'tb-render-inline-element-superscript',\n      },\n      (elementMetaData) => {\n        const { content } = elementMetaData;\n        const replacement = `___sup_${content}___`;\n        return replacement;\n      }\n    );\n\n    textProcessor.replaceHtmlElementByClass(\n      {\n        elementName: 'sub',\n        className: 'tb-render-inline-element-subscript',\n      },\n      (elementMetaData) => {\n        const { content } = elementMetaData;\n        const replacement = `___sub_${content}___`;\n        return replacement;\n      }\n    );\n  },\n\n  /**\n   * Replace the placeholders created by replaceHtmlWithPlaceholders() with plain text that depends on textual context\n   */\n  replacePlaceholdersWithText: (textProcessor, syntax) => {\n    // Replace superscript placeholders\n    textProcessor.replaceRegex(/(\\w*?)___sup_(.*?)___/, (match) => {\n      // console.log('** Matched pow() =', match);\n      const base = match[1];\n      const sup = match[2];\n\n      let plainText = `${base} ${syntax.pause(200)} upphöjt till ${sup}`;\n\n      return ` ${plainText}`;\n    });\n\n    // Replace subscript placeholders\n    textProcessor.replaceRegex(/(\\w*?)___sub_(.*?)___/, (match) => {\n      const base = match[1];\n      const sub = match[2];\n\n      let plainText = `${base} ${syntax.pause(200)} nedsänkt till ${sub}`;\n\n      return ` ${plainText}`;\n    });\n  },\n\n  /**\n   * Replace emoji symbols with empty string\n   * Note: The regex may not 100% cover all current and future emojis\n   *       but seems to cover all listed emojis on https://getemoji.com/\n   */\n  removeEmojis: (textProcessor) => {\n    textProcessor.replaceRegex(\n      /(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|\\ud83c[\\ude32-\\ude3a]|\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/,\n      () => ''\n    );\n  },\n};\n\nexport default exponents;\n","/////////////////////////////////////////////////////////////////////////////////////\n// Note: This Polly specific rule set is empty right now... add functionality when needed\n\nconst ruleSet = (language) => {\n  return {\n    initialCleanUp: (textProcessor, syntax, { withPlaceholder }) => { },\n\n    beforeHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => { },\n\n    afterHtmlRemoved: (textProcessor, syntax, { withPlaceholder }) => { },\n\n    finalCleanUp: (textProcessor, syntax, { withPlaceholder }) => {\n      if (textProcessor?._rawText?.includes('data-speaker-alt-text')) {\n        const XSAMPA_MATCHER = /(\\[(.*?)\\])/;\n\n        textProcessor.replaceRegex(XSAMPA_MATCHER, (match) => {\n          return `<phoneme alphabet='x-sampa' ph='${match[2]}'></phoneme>`;\n        });\n      }\n    },\n  };\n};\n\nexport default ruleSet;\n","export default {\n  'unicode-arrow': 'pfeil',\n  'math-text': 'mathematischer Ausdruck'\n};\n","export default {\n  'unicode-arrow': 'arrow',\n  'math-text': 'mathematical expression'\n};\n","export default {\n  'unicode-arrow': 'flecha',\n  'math-text': 'expresión matemática'\n};\n","export default {\n  'unicode-arrow': 'flèche',\n  'math-text': 'expression mathématique'\n};\n","export default {\n  'unicode-arrow': 'freccia',\n  'math-text': 'espressione matematica'\n};\n","export default {\n  'unicode-arrow': 'pil',\n  'math-text': 'matematisk text'\n};\n","import de from './languages/de';\nimport en from './languages/en';\nimport es from './languages/es';\nimport fr from './languages/fr';\nimport it from './languages/it';\nimport sv from './languages/sv';\n\nconst TRANSLATION_TABLES = { sv, en, es, fr, it, de };\n\n/**\n *\n * @param {*} key The key to look up in the translation table for given language\n * @param {*} language The language to translate to\n * @param {*} onTranslation Callback function that will get called only if a translation was found. The translation is passed as the only parameter to the function.\n * @param {*} onMissingTranslation Optional callback function that will get called only if a translation was NOT found.\n */\nconst translate = (key, language, onTranslation, onMissingTranslation) => {\n  const translation =\n    TRANSLATION_TABLES[language] && TRANSLATION_TABLES[language][key]\n      ? TRANSLATION_TABLES[language][key]\n      : null;\n\n  if (translation) {\n    onTranslation(translation);\n  } else {\n    if (onMissingTranslation) {\n      onMissingTranslation();\n    }\n  }\n};\n\nexport default translate;\n","export default {\n  // Return current origin url e.g. https://example.com\n  getCurrentOrigin: function() {\n    let origin = window.location.origin;\n\n    if (!origin) {\n      origin =\n        window.location.protocol +\n        '//' +\n        window.location.hostname +\n        (window.location.port ? ':' + window.location.port : '');\n    }\n\n    return origin;\n  },\n\n  // Check if url match current domain\n  urlIsSameOrigin: function(url) {\n    if (url.startsWith(this.getCurrentOrigin())) {\n      return true;\n    } else {\n      return false;\n    }\n  },\n\n  isValidURL: function (url) {\n    const expression = /[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?/gi;\n    const urlRegex = new RegExp(expression);\n    return typeof url === 'string' && url?.match(urlRegex);\n  },\n\n  addHttp: function (url) {\n    return !/^https?:\\/\\//i.test(url) ? `http://${url}` : url;\n  },\n};\n","define('babel/config/environment', [], function() {\n  var prefix = 'babel';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"babel/app\")[\"default\"].create({\"name\":\"babel\",\"version\":\"5.15.2+e7f3c806\"});\n          }\n        \n"],"mappings":"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"}