Starts in:
2 DAYS
22 HRS
27 MIN
15 SEC
Starts in:
2 D
22 H
27 M
15 S
Open Closed

⚠️ Bugs & Issues v8.0.x ⚠️ #6260


User avatar
0
EngincanV created
Support Team .NET Developer

⚡ Update ABP CLI and ABP Suite

dotnet tool update -g Volo.Abp.Cli --prerelease
abp suite update --preview

📗 Blog post

  • https://blog.abp.io/abp/announcing-abp-8-0-release-candidate

📘 Commercial release logs

  • https://docs.abp.io/en/commercial/8.0/release-notes
  • https://commercial.abp.io/releases/

🔼 Migration guides

  • https://docs.abp.io/en/abp/8.0/Migration-Guides/Abp-8_0
  • https://docs.abp.io/en/commercial/8.0/migration-guides/v8_0

✏️ Feel free to report any bugs, issues, and problems.


97 Answer(s)
  • User Avatar
    0
    rafael.gonzales created

    Found another bug in ABP.Suite 8.0.0.rc-3

    When you try to generate an Entity with a one-to-many relationship. It tries to locate a test class in the wrong place.

    It tries to locate in Demo.TestBase folder instead of Demo.Domain.Tests folder

    Could not find a part of the path 'C:\Users\User\Documents\GitHub\demo\demo-web-mvc\modules\Demo\test\Demo.TestBase\Demo\DemoDataSeedContributor.cs'.
    System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\User\Documents\GitHub\demo\demo-web-mvc\modules\Demo\test\Demo.TestBase\Demo\DemoDataSeedContributor.cs'.
       at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
       at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
       at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
       at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
       at System.IO.StreamReader.ValidateArgsAndOpenPath(String path, Encoding encoding, Int32 bufferSize)
       at System.IO.File.OpenText(String path)
       at Volo.Abp.IO.FileHelper.ReadAllTextAsync(String path) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Core\Volo\Abp\IO\FileHelper.cs:line 59
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.kKU8AbY4LZ(String  )
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.ThA8R0QUdt(TestDataObject  , Int32  )
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.OYG8Wvo7Rq()
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.ExecuteAsync(CrudPageCommandOptions options)
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.CommandManager.ExecuteAllAsync(CrudPageCommandOptions options)
       at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.CrudPageGenerator.GenerateAsync(EntityModel entity, Solution solution, EntityModel masterEntity)
       at Volo.Abp.Suite.Controllers.CrudPageGeneratorController.SaveAndGenerateEntityAsync(Guid solutionId, EntityModel entity)
       at lambda_method1948(Closure, Object)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
    
  • User Avatar
    0
    vinhlam0112 created

    I follow : https://community.abp.io/posts/upgrade-your-existing-projects-to-.net-8-abp-8.0-x0n7hiqr To update from 7.4.1 to 8.0.0

    And I have two errors when I launch my Blazor application:

    Failed to start platform. Reason: TypeError: Cannot read properties of undefined (reading 'dotnet.wasm') at Vt (global.js?_v=638368097806085722:1:62226) TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at global.js?_v=638368097806085722:1:37659 at global.js?_v=638368097806085722:1:38464 at Object.start (global.js?_v=638368097806085722:1:46018) at Vt (global.js?_v=638368097806085722:1:62202)

    Afterwards, I run "abp bundle" in folder blazor.host

    And I received an error like this:

  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    I follow : https://community.abp.io/posts/upgrade-your-existing-projects-to-.net-8-abp-8.0-x0n7hiqr To update from 7.4.1 to 8.0.0

    And I have two errors when I launch my Blazor application:

    Failed to start platform. Reason: TypeError: Cannot read properties of undefined (reading 'dotnet.wasm') at Vt (global.js?_v=638368097806085722:1:62226) TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at global.js?_v=638368097806085722:1:37659 at global.js?_v=638368097806085722:1:38464 at Object.start (global.js?_v=638368097806085722:1:46018) at Vt (global.js?_v=638368097806085722:1:62202)

    Afterwards, I run "abp bundle" in folder blazor.host

    And I received an error like this:

    Did you follow the migration guides mentioned in the article? You should update the Blazorise package versions to 1.3.2 and then run abp bundle command.

    Also, you should update the LeptonX package version as follows:

    <PackageReference Include="Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme" Version="3.0.*-*" />
    
  • User Avatar
    0
    vinhlam0112 created

    I follow : https://community.abp.io/posts/upgrade-your-existing-projects-to-.net-8-abp-8.0-x0n7hiqr
    To update from 7.4.1 to 8.0.0

    And I have two errors when I launch my Blazor application:

    Failed to start platform. Reason: TypeError: Cannot read properties of undefined (reading 'dotnet.wasm') at Vt (global.js?_v=638368097806085722:1:62226)
    TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at global.js?_v=638368097806085722:1:37659 at global.js?_v=638368097806085722:1:38464 at Object.start (global.js?_v=638368097806085722:1:46018) at Vt (global.js?_v=638368097806085722:1:62202)

    Afterwards, I run "abp bundle" in folder blazor.host

    And I received an error like this:

    Did you follow the migration guides mentioned in the article? You should update the Blazorise package versions to 1.3.2 and then run abp bundle command.

    Also, you should update the LeptonX package version as follows:

    <PackageReference Include="Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme" Version="3.0.*-*" /> 
    

    I followed the documentation and updated Blazorise to version 1.3.2, and here are the packages I upgraded to version 8.0 in the .Blazor.Host module. But the error still remains.

  • User Avatar
    0
    rafael.gonzales created

    There is still a critical issue in ABP Suite that won't let you generate Entities with one-on-one relationships.

    If I create a RelatedEntities in ABP Suite with any property and generate it and then create a MasterEntity with a relationship of 1-1 with RelatedEntities and try to generate it using ABP Suite. I will get the following error.

  • User Avatar
    0
    JackQian created

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    @vinhlam0112

    Could you share the error logs? (HttpApi.Host & AuthServer)

  • User Avatar
    0
    rafael.gonzales created

    There is still a critical issue in ABP Suite that won't let you generate Entities with one-on-one relationships.

    If I create a RelatedEntities in ABP Suite with any property and generate it and then create a MasterEntity with a relationship of 1-1 with RelatedEntities and try to generate it using ABP Suite. I will get the following error.

    Related to this. If you create a Master-Detail Entity, the detail entity doesn't generate any test project or it's added to the master entity test project.

  • User Avatar
    0
    portx-dev created

    After updating version from 7.4.2 to 8.0.0, my angular app has the following error

    ERROR Error: NG0302: The pipe 'abpLocalization' could not be found in the 'HttpErrorComponent' component. Verify that it is included in the '@Component.imports' of this component. Find more at https://angular.io/errors/NG0302 at getPipeDef (core.mjs:27712:15) at Module.ɵɵpipe (core.mjs:27653:19) at HttpErrorComponent_ng_container_0_Template (volosoft-abp.ng.theme.lepton-x.mjs:42:103) at executeTemplate (core.mjs:12181:9) at renderView (core.mjs:15243:13) at createAndRenderEmbeddedLView (core.mjs:19773:5) at TemplateRef.createEmbeddedViewImpl (core.mjs:28065:31) at ViewContainerRef.createEmbeddedView (core.mjs:19945:37) at Object.next (abp-ng.core.mjs:3287:28) at ConsumerObserver.next (Subscriber.js:91:33)

  • User Avatar
    0
    masum.ulu created
    Support Team Angular Expert

    @portx-dev

    After updating version from 7.4.2 to 8.0.0, my angular app has the following error

    We've internal issue for this error, it'll be fixed with patch version

  • User Avatar
    0
    rafael.gonzales created

    There is an important error in ABP Suite for 8.0.1.

    Can't create a module even in a clean installation.

    You get the following error while creating a new module

    Please, this requires special attention to be fixed soon and this shouldn't happen in future versions since it's a basic functionality of ABP Suite

    Thanks.

  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    There is an important error in ABP Suite for 8.0.1.

    Can't create a module even in a clean installation.

    You get the following error while creating a new module

    Please, this requires special attention to be fixed soon and this shouldn't happen in future versions since it's a basic functionality of ABP Suite

    Thanks.

    Hi, can you check if your application is running or not? If it's running please stop it and then re-try to add the module.

  • User Avatar
    0
    rafael.gonzales created

    There is an important error in ABP Suite for 8.0.1.

    Can't create a module even in a clean installation.

    You get the following error while creating a new module

    Please, this requires special attention to be fixed soon and this shouldn't happen in future versions since it's a basic functionality of ABP Suite

    Thanks.

    Hi, can you check if your application is running or not? If it's running please stop it and then re-try to add the module.

    Hi, the application was not running, turned off the antivirus and created a new abp application from ABP Suite and still got that error.
    
  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    Hi, the application was not running, turned off the antivirus and created a new abp application from ABP Suite and still got that error.

    Thanks. I have addressed the problem and create a PR for it: https://github.com/abpframework/abp/pull/18702

  • User Avatar
    0
    rafael.gonzales created

    Any news about the fix? It's not possible to use ABP Suite with the last version to create a new module

  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    Any news about the fix? It's not possible to use ABP Suite with the last version to create a new module

    https://github.com/abpframework/abp/pull/18702

    With this PR, it will be fixed and will be included in the next release. In meantime, if it's so urgent for you to create a template, then you can consider to downgrade the ABP CLI and ABP Suite versions to v8.0.0.

  • User Avatar
    0
    ninomartini created

    In previous versions, I could use the ISettingManager's GetOrNullForCurrentTenantAsync and SetForCurrentTenantAsync to get and set custom application settings. In version 8.0, I expect a null when the setting does not exist. However, I get an error when the setting does not exist.

    Here is an example of a code that does not work in v8.0, but works in 7.4:

    private readonly ISettingManager _settingManager;
    
    public ExtendedSettingsAppService(ISettingManager settingManager)
    {
         _settingManager = settingManager;
    }
        
    public async Task<JotformSettingsDto> GetJotformAsync()
    {
         return new JotformSettingsDto
         {
              JotformFormUrl = await _settingManager.GetOrNullForCurrentTenantAsync("RxPortal.Jotform.JotformFormUrl"),
              JotformApiUrl = await _settingManager.GetOrNullForCurrentTenantAsync("RxPortal.Jotform.JotformApiUrl"),
              JotformApiKey = await _settingManager.GetOrNullForCurrentTenantAsync("RxPortal.Jotform.JotformApiKey"),
              JotformTeamId = await _settingManager.GetOrNullForCurrentTenantAsync("RxPortal.Jotform.JotformTeamId")
         };
    }
    
    public async Task UpdateJotformAsync(JotformSettingsDto input)
    {
         await _settingManager.SetForCurrentTenantAsync("RxPortal.Jotform.JotformFormUrl", input.JotformFormUrl);
         await _settingManager.SetForCurrentTenantAsync("RxPortal.Jotform.JotformApiUrl", input.JotformApiUrl);
         await _settingManager.SetForCurrentTenantAsync("RxPortal.Jotform.JotformApiKey", input.JotformApiKey);
         await _settingManager.SetForCurrentTenantAsync("RxPortal.Jotform.JotformTeamId", input.JotformTeamId);
    }
    

    Here is the error from the log file:

    [20:38:09 ERR] ---------- RemoteServiceErrorInfo ----------
    {
      "code": null,
      "message": "An internal error occurred during your request!",
      "details": null,
      "data": {},
      "validationErrors": null
    }
    
    [20:38:09 ERR] Undefined setting: RxPortal.Jotform.JotformFormUrl
    Volo.Abp.AbpException: Undefined setting: RxPortal.Jotform.JotformFormUrl
       at Volo.Abp.Settings.SettingDefinitionManager.GetAsync(String name)
       at Volo.Abp.SettingManagement.SettingManager.GetOrNullInternalAsync(String name, String providerName, String providerKey, Boolean fallback)
       at RxPortal.ExtendedSettings.ExtendedSettingsAppService.GetJotformAsync() in C:\Abp\rx-portal\aspnet-core\src\RxPortal.Application\ExtendedSettings\ExtendedSettingsAppService.cs:line 22
       at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
       at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
       at Volo.Abp.Authorization.AuthorizationInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
       at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
       at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
       at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
       at Volo.Abp.GlobalFeatures.GlobalFeatureInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
       at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
       at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
       at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
       at Volo.Abp.Auditing.AuditingInterceptor.ProceedByLoggingAsync(IAbpMethodInvocation invocation, AbpAuditingOptions options, IAuditingHelper auditingHelper, IAuditLogScope auditLogScope)
       at Volo.Abp.Auditing.AuditingInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
       at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
       at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
       at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
       at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
       at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
       at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
       at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
       at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
       at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
       at lambda_method5123(Closure, Object)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.&lt;InvokeActionMethodAsync&gt;g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
    --- End of stack trace from previous location ---
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
    [20:38:09 INF] Executing ObjectResult, writing value of type 'Volo.Abp.Http.RemoteServiceErrorResponse'.
    [20:38:09 INF] Executed action RxPortal.Controllers.ExtendedSettings.ExtendedSettingsController.GetJotformAsync (RxPortal.HttpApi) in 24.4663ms
    
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi @ninomartini

    I will confirm this; thanks for your feedback.

  • User Avatar
    1
    maliming created
    Support Team Fullstack Developer

    hi @ninomartini

    Now that the logic has changed, the settings must be defined before they can be used. If you have special requirements, you can override the default setting services

  • User Avatar
    0
    ninomartini created

    hi @ninomartini

    Now that the logic has changed, the settings must be defined before they can be used. If you have special requirements, you can override the default setting services

    Yes, defining the settings in advance will correct my issue in v8.0. Thank you for the quick response.

  • User Avatar
    0
    rafael.gonzales created

    I found an issue while creating Master / Detail.

    The generated MasterDto includes a wrong collection of DetailDto. It includes DetailWithNavigationPropertiesDto instead of DetailDto.

  • User Avatar
    0
    portx-dev created

    https://support.abp.io/QA/Questions/5642/Bugs--Issues-v74x#answer-3a0ebb18-2391-7ca7-ed1f-70af3864c62d

    This error still exists in version 8.0.0 Please help me fix it

  • User Avatar
    0
    rafael.gonzales created

    I can't see any Lepton or LeptonX Bug & Issues but here I go

    In

    LeptonX\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX\Themes\LeptonX\Components\SideMenu\MobileNavbar\Default.cshtml

    There is no localization for "Settings" button (Line 49) <li class="lpx-mobile-nav-tab"> <a class="lpx-mobile-nav-item" data-lpx-mobile-menu-toggle="settings"> <i class="menu-item-icon bi bi-gear-wide-connected" aria-hidden="true"></i> <span class="mobile-item-text">Settings</span> </a> </li>

    It also happens here LeptonX\src\Volo.Abp.AspNetCore.Components.Web.LeptonXTheme\Components\ApplicationLayout\TopMenu\Navigation\MobileNavbar.razor

  • User Avatar
    0
    rafael.gonzales created

    in the CLI, abp update it's not updating the project to the latest version 8.0.2. Either it's applying any changes to the code related to the new version.

  • User Avatar
    0
    rafael.gonzales created

    This issue has not been resolved https://commercial.abp.io/releases/pr/16413

    It's still happening the issue with the test and the one-to-many relationship. You need to validate the one-to-many when it's related with a Detail in the Master/Detail functionality.

    Steps to reproduce.

    Create a Master Entity named "RelatedDemo" Create a Master Entity named "MasterDemo" Create a Detail for "Demo" and name it "DemoDetail"

    In the "DemoDetail" configuration, add a one-to-many with "RelatedDemo"

    • Generate "RelatedDemo"
    • Generate "MasterDemo"
    • Generate "DemoDetail"
    • Re-generate "MasterDemo" (You need to re-generate the "MasterDemo", because if you don't do this, it will generate an issue because the DtoGenerated in "MasterDemo" after you create the detail it's of type "WithNavigationProperties" instead of the Dto one so you need to re-generate the "MasterDemo" so it will include in the automapper an Ignore for that property.

    It will throw a similar error but instead of looking for the full namespace for the RelatedDemoDataSeedContributor. It will start to look for the file in the Master entity folder instead of the folder "RelatedDemo"

    Could not find file 'C:\Users\User\Documents\GitHub\demo802\modules\DemoModule\test\DemoModule.Domain.Tests\MasterDemo\RelatedDemoDataSeedContributor.cs'.

    UPDATES

    It also happens when you have TWO one-to-many relationships of the same entity. It tries to look the DataSeedContributor of the related entities from the destination entity folder

Made with ❤️ on ABP v9.1.0-preview. Updated on November 20, 2024, 13:06