diff --git a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html index f97b267b1..615d39f7f 100644 --- a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html +++ b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html @@ -6,9 +6,11 @@
+ button> + + {{ item.iconTitle }}

diff --git a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts index 41c0c501c..af2ca87d5 100644 --- a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts +++ b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts @@ -56,6 +56,7 @@ export class AddonBlockRecentlyAccessedItemsProvider { const modicon = item.icon && CoreDomUtils.getHTMLElementAttribute(item.icon, 'src'); item.iconUrl = CoreCourse.getModuleIconSrc(item.modname, modicon || undefined); + item.iconTitle = item.icon && CoreDomUtils.getHTMLElementAttribute(item.icon, 'title'); return item; }); @@ -99,4 +100,5 @@ export type AddonBlockRecentlyAccessedItemsItem = { */ export type AddonBlockRecentlyAccessedItemsItemCalculatedData = { iconUrl: string; // Icon URL. Calculated by the app. + iconTitle?: string | null; // Icon title. }; diff --git a/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html b/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html index 35033669b..676ad9624 100644 --- a/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html +++ b/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html @@ -58,7 +58,7 @@ {{ 'addon.mod_lesson.enterpassword' | translate }} + [autofocus]="true" #passwordinput [clearOnEdit]="false"> diff --git a/src/addons/mod/lesson/components/index/index.ts b/src/addons/mod/lesson/components/index/index.ts index 743c4c959..e616492f8 100644 --- a/src/addons/mod/lesson/components/index/index.ts +++ b/src/addons/mod/lesson/components/index/index.ts @@ -424,7 +424,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo pageId = continueLast ? this.accessInfo.lastpageseen : this.accessInfo.firstpageid; } - await CoreNavigator.navigate(`../player/${this.courseId}/${this.lesson.id}`, { + await CoreNavigator.navigate('player', { params: { pageId: pageId, password: this.password, @@ -472,7 +472,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo return; } - CoreNavigator.navigate(`../player/${this.courseId}/${this.lesson.id}`, { + CoreNavigator.navigate('player', { params: { pageId: this.retakeToReview.pageid, password: this.password, @@ -695,7 +695,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo * @return Promise resolved when done. */ async openRetake(userId: number): Promise { - await CoreNavigator.navigate(`../user-retake/${this.courseId}/${this.lesson!.id}`, { + await CoreNavigator.navigate('user-retake', { params: { userId, }, diff --git a/src/addons/mod/lesson/components/password-modal/password-modal.html b/src/addons/mod/lesson/components/password-modal/password-modal.html index c09d93d0f..37ddd3fad 100644 --- a/src/addons/mod/lesson/components/password-modal/password-modal.html +++ b/src/addons/mod/lesson/components/password-modal/password-modal.html @@ -15,7 +15,8 @@ {{ 'addon.mod_lesson.enterpassword' | translate }} + [autofocus]="true" #passwordinput [clearOnEdit]="false"> + diff --git a/src/addons/mod/lesson/lesson-lazy.module.ts b/src/addons/mod/lesson/lesson-lazy.module.ts index 87d4eb6cb..1881e3f13 100644 --- a/src/addons/mod/lesson/lesson-lazy.module.ts +++ b/src/addons/mod/lesson/lesson-lazy.module.ts @@ -26,11 +26,11 @@ const routes: Routes = [ component: AddonModLessonIndexPage, }, { - path: 'player/:courseId/:lessonId', + path: ':courseId/:cmId/player', loadChildren: () => import('./pages/player/player.module').then( m => m.AddonModLessonPlayerPageModule), }, { - path: 'user-retake/:courseId/:lessonId', + path: ':courseId/:cmId/user-retake', loadChildren: () => import('./pages/user-retake/user-retake.module').then( m => m.AddonModLessonUserRetakePageModule), }, ]; diff --git a/src/addons/mod/lesson/pages/player/player.page.ts b/src/addons/mod/lesson/pages/player/player.page.ts index 592b2dc54..470bd1c0c 100644 --- a/src/addons/mod/lesson/pages/player/player.page.ts +++ b/src/addons/mod/lesson/pages/player/player.page.ts @@ -98,7 +98,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { mediaFile?: CoreWSExternalFile; // Media file of the lesson. activityLink?: AddonModLessonActivityLink; // Next activity link data. - protected lessonId!: number; // Lesson ID. + protected cmId!: number; // Course module ID. protected password?: string; // Lesson password (if any). protected forceLeave = false; // If true, don't perform any check when leaving the view. protected offline?: boolean; // Whether we are in offline mode. @@ -118,22 +118,19 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { * Component being initialized. */ async ngOnInit(): Promise { - this.lessonId = CoreNavigator.getRouteNumberParam('lessonId')!; + this.cmId = CoreNavigator.getRouteNumberParam('cmId')!; this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; this.password = CoreNavigator.getRouteParam('password'); this.review = !!CoreNavigator.getRouteBooleanParam('review'); this.currentPage = CoreNavigator.getRouteNumberParam('pageId'); this.retakeToReview = CoreNavigator.getRouteNumberParam('retake'); - // Block the lesson so it cannot be synced. - CoreSync.blockOperation(this.component, this.lessonId); - try { // Fetch the Lesson data. const success = await this.fetchLessonData(); if (success) { // Review data loaded or new retake started, remove any retake being finished in sync. - AddonModLessonSync.deleteRetakeFinishedInSync(this.lessonId); + AddonModLessonSync.deleteRetakeFinishedInSync(this.lesson!.id); } } finally { this.loaded = true; @@ -144,8 +141,10 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { * Component being destroyed. */ ngOnDestroy(): void { - // Unblock the lesson so it can be synced. - CoreSync.unblockOperation(this.component, this.lessonId); + if (this.lesson) { + // Unblock the lesson so it can be synced. + CoreSync.unblockOperation(this.component, this.lesson.id); + } } /** @@ -214,7 +213,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { // Get the possible jumps now. this.jumps = await AddonModLesson.getPagesPossibleJumps(this.lesson!.id, { - cmId: this.lesson!.coursemodule, + cmId: this.cmId, readingStrategy: CoreSitesReadingStrategy.PreferCache, }); @@ -259,14 +258,18 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { */ protected async fetchLessonData(): Promise { try { - // Wait for any ongoing sync to finish. We won't sync a lesson while it's being played. - await AddonModLessonSync.waitForSync(this.lessonId); + this.lesson = await AddonModLesson.getLesson(this.courseId, this.cmId); - this.lesson = await AddonModLesson.getLessonById(this.courseId, this.lessonId); this.title = this.lesson.name; // Temporary title. + // Block the lesson so it cannot be synced. + CoreSync.blockOperation(this.component, this.lesson.id); + + // Wait for any ongoing sync to finish. We won't sync a lesson while it's being played. + await AddonModLessonSync.waitForSync(this.lesson.id); + // If lesson has offline data already, use offline mode. - this.offline = await AddonModLessonOffline.hasOfflineData(this.lessonId); + this.offline = await AddonModLessonOffline.hasOfflineData(this.lesson.id); if (!this.offline && !CoreApp.isOnline() && AddonModLesson.isLessonOffline(this.lesson) && !this.review) { @@ -275,7 +278,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { } const options = { - cmId: this.lesson.coursemodule, + cmId: this.cmId, readingStrategy: this.offline ? CoreSitesReadingStrategy.PreferCache : CoreSitesReadingStrategy.OnlyNetwork, }; this.accessInfo = await this.callFunction( @@ -306,7 +309,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { // Lesson uses password, get the whole lesson object. const options = { password: this.password, - cmId: this.lesson.coursemodule, + cmId: this.cmId, readingStrategy: this.offline ? CoreSitesReadingStrategy.PreferCache : CoreSitesReadingStrategy.OnlyNetwork, }; promises.push(this.callFunction( @@ -322,7 +325,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { if (this.offline) { // Offline mode, get the list of possible jumps to allow navigation. promises.push(AddonModLesson.getPagesPossibleJumps(this.lesson.id, { - cmId: this.lesson.coursemodule, + cmId: this.cmId, readingStrategy: CoreSitesReadingStrategy.PreferCache, }).then((jumpList) => { this.jumps = jumpList; @@ -344,7 +347,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { if (this.review && this.retakeToReview && CoreUtils.isWebServiceError(error)) { // The user cannot review the retake. Unmark the retake as being finished in sync. - await AddonModLessonSync.deleteRetakeFinishedInSync(this.lessonId); + await AddonModLessonSync.deleteRetakeFinishedInSync(this.lesson!.id); } CoreDomUtils.showErrorModalDefault(error, 'core.course.errorgetmodule', true); @@ -373,7 +376,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { if (result?.warnings?.length) { // Some data was deleted. Check if the retake has changed. const info = await AddonModLesson.getAccessInformation(this.lesson!.id, { - cmId: this.lesson!.coursemodule, + cmId: this.cmId, }); if (info.attemptscount != this.accessInfo!.attemptscount) { @@ -485,7 +488,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { if (this.lesson!.timelimit && !this.accessInfo!.canmanage) { // Get the last lesson timer. const timers = await AddonModLesson.getTimers(this.lesson!.id, { - cmId: this.lesson!.coursemodule, + cmId: this.cmId, readingStrategy: CoreSitesReadingStrategy.OnlyNetwork, }); @@ -510,12 +513,12 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { this.loadingMenu = true; const options = { password: this.password, - cmId: this.lesson!.coursemodule, + cmId: this.cmId, readingStrategy: this.offline ? CoreSitesReadingStrategy.PreferCache : CoreSitesReadingStrategy.OnlyNetwork, }; const pages = await this.callFunction( - AddonModLesson.getPages.bind(AddonModLesson.instance, this.lessonId, options), + AddonModLesson.getPages.bind(AddonModLesson.instance, this.lesson!.id, options), options, ); @@ -543,7 +546,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { password: this.password, review: this.review, includeContents: true, - cmId: this.lesson!.coursemodule, + cmId: this.cmId, readingStrategy: this.offline ? CoreSitesReadingStrategy.PreferCache : CoreSitesReadingStrategy.OnlyNetwork, accessInfo: this.accessInfo, jumps: this.jumps, @@ -638,15 +641,15 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { // Lesson allows offline and the user changed some data in server. Update cached data. const retake = this.accessInfo!.attemptscount; const options = { - cmId: this.lesson!.coursemodule, + cmId: this.cmId, readingStrategy: CoreSitesReadingStrategy.OnlyNetwork, }; // Update in background the list of content pages viewed or question attempts. if (AddonModLesson.isQuestionPage(this.pageData?.page?.type || -1)) { - AddonModLesson.getQuestionsAttemptsOnline(this.lessonId, retake, options); + AddonModLesson.getQuestionsAttemptsOnline(this.lesson!.id, retake, options); } else { - AddonModLesson.getContentPagesViewedOnline(this.lessonId, retake, options); + AddonModLesson.getContentPagesViewedOnline(this.lesson!.id, retake, options); } } diff --git a/src/addons/mod/lesson/pages/user-retake/user-retake.page.ts b/src/addons/mod/lesson/pages/user-retake/user-retake.page.ts index 771a8e4c9..b7473c4b1 100644 --- a/src/addons/mod/lesson/pages/user-retake/user-retake.page.ts +++ b/src/addons/mod/lesson/pages/user-retake/user-retake.page.ts @@ -55,7 +55,7 @@ export class AddonModLessonUserRetakePage implements OnInit { loaded?: boolean; // Whether the data has been loaded. timeTakenReadable?: string; // Time taken in a readable format. - protected lessonId!: number; // The lesson ID the retake belongs to. + protected cmId!: number; // The lesson ID the retake belongs to. protected userId?: number; // User ID to see the retakes. protected retakeNumber?: number; // Number of the initial retake to see. protected previousSelectedRetake?: number; // To be able to detect the previous selected retake when it has changed. @@ -64,7 +64,7 @@ export class AddonModLessonUserRetakePage implements OnInit { * Component being initialized. */ ngOnInit(): void { - this.lessonId = CoreNavigator.getRouteNumberParam('lessonId')!; + this.cmId = CoreNavigator.getRouteNumberParam('cmId')!; this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; this.userId = CoreNavigator.getRouteNumberParam('userId') || CoreSites.getCurrentSiteUserId(); this.retakeNumber = CoreNavigator.getRouteNumberParam('retake'); @@ -111,11 +111,11 @@ export class AddonModLessonUserRetakePage implements OnInit { */ protected async fetchData(): Promise { try { - this.lesson = await AddonModLesson.getLessonById(this.courseId, this.lessonId); + this.lesson = await AddonModLesson.getLesson(this.courseId, this.cmId); // Get the retakes overview for all participants. const data = await AddonModLesson.getRetakesOverview(this.lesson.id, { - cmId: this.lesson.coursemodule, + cmId: this.cmId, }); // Search the student. @@ -185,8 +185,8 @@ export class AddonModLessonUserRetakePage implements OnInit { protected async setRetake(retakeNumber: number): Promise { this.selectedRetake = retakeNumber; - const retakeData = await AddonModLesson.getUserRetake(this.lessonId, retakeNumber, { - cmId: this.lesson!.coursemodule, + const retakeData = await AddonModLesson.getUserRetake(this.lesson!.id, retakeNumber, { + cmId: this.cmId, userId: this.userId, }); diff --git a/src/addons/mod/lesson/services/handlers/grade-link.ts b/src/addons/mod/lesson/services/handlers/grade-link.ts index 4478201e9..151db384c 100644 --- a/src/addons/mod/lesson/services/handlers/grade-link.ts +++ b/src/addons/mod/lesson/services/handlers/grade-link.ts @@ -65,7 +65,7 @@ export class AddonModLessonGradeLinkHandlerService extends CoreContentLinksModul if (accessInfo.canviewreports) { // User can view reports, go to view the report. CoreNavigator.navigateToSitePath( - AddonModLessonModuleHandlerService.PAGE_NAME + `/user-retake/${courseId}/${module.instance}`, + AddonModLessonModuleHandlerService.PAGE_NAME + `/${courseId}/${module.id}/user-retake`, { params: { userId: Number(params.userid) }, siteId, diff --git a/src/addons/mod/lesson/services/handlers/report-link.ts b/src/addons/mod/lesson/services/handlers/report-link.ts index 59d545ae3..5fc993a2d 100644 --- a/src/addons/mod/lesson/services/handlers/report-link.ts +++ b/src/addons/mod/lesson/services/handlers/report-link.ts @@ -122,11 +122,9 @@ export class AddonModLessonReportLinkHandlerService extends CoreContentLinksHand * * @param moduleId Module ID. * @param userId User ID. - * @param courseId Course ID. * @param retake Retake to open. - * @param groupId Group ID. * @param siteId Site ID. - * @param navCtrl The NavController to use to navigate. + * @param courseId Course ID. * @return Promise resolved when done. */ protected async openUserRetake( @@ -150,7 +148,7 @@ export class AddonModLessonReportLinkHandlerService extends CoreContentLinksHand }; CoreNavigator.navigateToSitePath( - AddonModLessonModuleHandlerService.PAGE_NAME + `/user-retake/${courseId}/${module.instance}`, + AddonModLessonModuleHandlerService.PAGE_NAME + `/${courseId}/${module.id}/user-retake`, { params, siteId }, ); } catch (error) { diff --git a/src/addons/mod/lesson/services/lesson.ts b/src/addons/mod/lesson/services/lesson.ts index 929a73fa8..255482aea 100644 --- a/src/addons/mod/lesson/services/lesson.ts +++ b/src/addons/mod/lesson/services/lesson.ts @@ -1486,7 +1486,7 @@ export class AddonModLessonProvider { const response = await site.read('mod_lesson_get_lesson', params, preSets); - if (typeof response.lesson.ongoing != 'undefined') { + if (typeof response.lesson.ongoing == 'undefined') { // Basic data not received, password is wrong. Remove stored password. this.removeStoredPassword(lessonId, site.id); diff --git a/src/core/components/local-file/core-local-file.html b/src/core/components/local-file/core-local-file.html index 43d2ba8e1..510727bba 100644 --- a/src/core/components/local-file/core-local-file.html +++ b/src/core/components/local-file/core-local-file.html @@ -14,7 +14,7 @@ + (click)="$event.stopPropagation()" [autofocus]="true" [(ngModel)]="newFileName" *ngIf="editMode">
diff --git a/src/core/components/send-message-form/core-send-message-form.html b/src/core/components/send-message-form/core-send-message-form.html index 118b9daa2..75d27f779 100644 --- a/src/core/components/send-message-form/core-send-message-form.html +++ b/src/core/components/send-message-form/core-send-message-form.html @@ -1,5 +1,5 @@
- @@ -10,4 +10,3 @@
- diff --git a/src/core/directives/auto-focus.ts b/src/core/directives/auto-focus.ts index 1beefc28d..97e715ce6 100644 --- a/src/core/directives/auto-focus.ts +++ b/src/core/directives/auto-focus.ts @@ -21,6 +21,8 @@ import { CoreUtils } from '@services/utils/utils'; * Directive to auto focus an element when a view is loaded. * * You can apply it conditionallity assigning it a boolean value: + * + * @deprecated since 3.9.5. ion-input now supports an [autofocus] attribute, please use that one instead. */ @Directive({ selector: '[core-auto-focus]', @@ -39,16 +41,7 @@ export class CoreAutoFocusDirective implements OnInit { * Component being initialized. */ ngOnInit(): void { - // @todo - // if (this.navCtrl.isTransitioning()) { - // // Navigating to a new page. Wait for the transition to be over. - // const subscription = this.navCtrl.viewDidEnter.subscribe(() => { - // this.autoFocus(); - // subscription.unsubscribe(); - // }); - // } else { this.autoFocus(); - // } } /** diff --git a/src/core/features/course/components/format/core-course-format.html b/src/core/features/course/components/format/core-course-format.html index 143673386..9e59df15f 100644 --- a/src/core/features/course/components/format/core-course-format.html +++ b/src/core/features/course/components/format/core-course-format.html @@ -21,8 +21,9 @@ [class.core-section-download]="downloadEnabled"> - + id="core-course-section-button" expand="block"> + + {{ 'core.course.sections' | translate }}: diff --git a/src/core/features/course/components/section-selector/section-selector.html b/src/core/features/course/components/section-selector/section-selector.html index 9eb4b28dd..43bff2a76 100644 --- a/src/core/features/course/components/section-selector/section-selector.html +++ b/src/core/features/course/components/section-selector/section-selector.html @@ -9,23 +9,25 @@ - + - +

- + {{ 'core.course.hiddenfromstudents' | translate }} - + {{ 'core.notavailable' | translate }} diff --git a/src/core/features/courses/components/course-progress/core-courses-course-progress.html b/src/core/features/courses/components/course-progress/core-courses-course-progress.html index db78a223d..c226b41e0 100644 --- a/src/core/features/courses/components/course-progress/core-courses-course-progress.html +++ b/src/core/features/courses/components/course-progress/core-courses-course-progress.html @@ -11,7 +11,7 @@ [class.core-course-with-buttons]="courseOptionMenuEnabled || (downloadCourseEnabled && showDownload)" [class.core-course-with-spinner]="(downloadCourseEnabled && prefetchCourseData.icon == 'spinner') || showSpinner">

+ class="core-course-additional-info" aria-hidden="true"> @@ -24,7 +24,10 @@

- + + + {{ 'core.courses.aria:favourite' | translate }} + {{ 'core.courses.aria:coursename' | translate }}

@@ -50,9 +53,10 @@
- - + + + + diff --git a/src/core/features/courses/components/self-enrol-password/self-enrol-password.html b/src/core/features/courses/components/self-enrol-password/self-enrol-password.html index d115445cd..71888137f 100644 --- a/src/core/features/courses/components/self-enrol-password/self-enrol-password.html +++ b/src/core/features/courses/components/self-enrol-password/self-enrol-password.html @@ -20,7 +20,7 @@ type="password" placeholder="{{ 'core.courses.password' | translate }}" [(ngModel)]="password" - [core-auto-focus] + [autofocus]="true" [clearOnEdit]="false"> diff --git a/src/core/features/courses/lang.json b/src/core/features/courses/lang.json index f9aa10d0c..f3e140b98 100644 --- a/src/core/features/courses/lang.json +++ b/src/core/features/courses/lang.json @@ -1,6 +1,9 @@ { "addtofavourites": "Star this course", "allowguests": "This course allows guest users to enter", + "aria:coursename": "Course name", + "aria:courseprogress": "Course progress:", + "aria:favourite": "Course is starred", "availablecourses": "Available courses", "cannotretrievemorecategories": "Categories deeper than level {{$a}} cannot be retrieved.", "categories": "Course categories", @@ -13,6 +16,7 @@ "errorloadplugins": "The plugins required by this course could not be loaded correctly. Please reload the app to try again.", "errorsearching": "An error occurred while searching.", "errorselfenrol": "An error occurred while self enrolling.", + "favourite": "Starred course", "filtermycourses": "Filter my courses", "frontpage": "Front page", "hidecourse": "Remove from view", @@ -36,4 +40,4 @@ "sendpaymentbutton": "Send payment via PayPal", "show": "Restore to view", "totalcoursesearchresults": "Total courses: {{$a}}" -} \ No newline at end of file +} diff --git a/src/core/features/login/pages/forgotten-password/forgotten-password.html b/src/core/features/login/pages/forgotten-password/forgotten-password.html index 56a3aef48..b95018ee7 100644 --- a/src/core/features/login/pages/forgotten-password/forgotten-password.html +++ b/src/core/features/login/pages/forgotten-password/forgotten-password.html @@ -31,7 +31,7 @@ + formControlName="value" autocapitalize="none" autocorrect="off" [autofocus]="autoFocus"> diff --git a/src/core/features/login/pages/site/site.html b/src/core/features/login/pages/site/site.html index 7113ef2f2..a857a6542 100644 --- a/src/core/features/login/pages/site/site.html +++ b/src/core/features/login/pages/site/site.html @@ -27,7 +27,7 @@

{{ 'core.login.siteaddress' | translate }}

+ formControlName="siteUrl" [autofocus]="showKeyboard && !showScanQR">
@@ -37,7 +37,7 @@

{{ 'core.login.siteaddress' | translate }}

+ [autofocus]="showKeyboard && !showScanQR" (ionChange)="searchSite($event, siteForm.value.siteUrl)"> @@ -49,7 +49,7 @@