Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: SingleProject - ToDo #647

Closed
wants to merge 19 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
403 changes: 403 additions & 0 deletions reference/ToDo/src/.gitignore

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions reference/ToDo/src/.vsconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"version": "1.0",
"components": [
"Microsoft.VisualStudio.Component.CoreEditor",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.NetCore.Component.SDK",
"Microsoft.NetCore.Component.DevelopmentTools",
"Microsoft.Net.ComponentGroup.DevelopmentPrerequisites",
"Microsoft.VisualStudio.Component.TextTemplating",
"Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions",
"Microsoft.NetCore.Component.Web",
"Microsoft.VisualStudio.Component.IISExpress",
"Component.Microsoft.Web.LibraryManager",
"Microsoft.VisualStudio.ComponentGroup.Web",
"Microsoft.VisualStudio.Component.Web",
"Microsoft.VisualStudio.ComponentGroup.Web.Client",
"Microsoft.VisualStudio.Workload.NetWeb",
"Microsoft.VisualStudio.ComponentGroup.Azure.Prerequisites",
"Microsoft.VisualStudio.Workload.Azure",
"Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions.TemplateEngine",
"Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging",
"Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites",
"Microsoft.VisualStudio.Component.Debugger.JustInTime",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.Component.NetFX.Native",
"Microsoft.VisualStudio.Component.Graphics",
"Microsoft.VisualStudio.Component.Merq",
"Component.Xamarin.RemotedSimulator",
"Microsoft.VisualStudio.Component.MonoDebugger",
"Microsoft.VisualStudio.ComponentGroup.Maui.All",
"Component.Android.SDK34",
"Component.Android.SDK33",
"Component.OpenJDK",
"Microsoft.VisualStudio.Workload.NetCrossPlat",
"Microsoft.VisualStudio.Workload.NetCoreTools"
]
}
22 changes: 22 additions & 0 deletions reference/ToDo/src/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project>
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>

<!--
Adding NoWarn to remove build warnings
NU1507: Warning when there are multiple package sources when using CPM with no source mapping
NETSDK1201: Warning that specifying RID won't create self containing app
PRI257: Ignore default language (en) not being one of the included resources (eg en-us, en-uk)
-->
<NoWarn>$(NoWarn);NU1507;NETSDK1201;PRI257</NoWarn>
</PropertyGroup>

<!-- See https://aka.platform.uno/using-uno-sdk#implicit-packages for more information regarding the Implicit Packages version properties. -->
<PropertyGroup>
<UnoExtensionsVersion>4.1.23</UnoExtensionsVersion>
<UnoToolkitVersion>6.0.24</UnoToolkitVersion>
<UnoThemesVersion>5.0.13</UnoThemesVersion>
</PropertyGroup>
</Project>
2 changes: 2 additions & 0 deletions reference/ToDo/src/Directory.Build.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<Project>
</Project>
12 changes: 12 additions & 0 deletions reference/ToDo/src/Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project ToolsVersion="15.0">
<!--
To update the version of Uno, you should instead update the Sdk version in the global.json file.

See https://aka.platform.uno/using-uno-sdk for more information.
-->
<ItemGroup>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="7.4.1" />
</ItemGroup>
</Project>
87 changes: 87 additions & 0 deletions reference/ToDo/src/ToDo.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32210.308
MinimumVisualStudioVersion = 15.0.26124.0

Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ToDo", "ToDo\ToDo.csproj", "{75E8EABA-14E4-4101-A91C-504683489F05}"
EndProject

Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BADA71DC-7FFD-4EDC-9F28-FB74AEADC713}"
ProjectSection(SolutionItems) = preProject
.gitignore = .gitignore
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
global.json = global.json
Directory.Packages.props = Directory.Packages.props
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM64.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|ARM64.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhone.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x64.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x64.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x64.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x86.ActiveCfg = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x86.Build.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Debug|x86.Deploy.0 = Debug|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|Any CPU.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|Any CPU.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM64.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM64.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|ARM64.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhone.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhone.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhone.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x64.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x64.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x64.Deploy.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x86.ActiveCfg = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x86.Build.0 = Release|Any CPU
{75E8EABA-14E4-4101-A91C-504683489F05}.Release|x86.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {63B9E7B7-0BFA-489E-A40C-DC7DDD12030F}
EndGlobalSection
EndGlobal
65 changes: 65 additions & 0 deletions reference/ToDo/src/ToDo/App.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<Application x:Class="ToDo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wasm="http://platform.uno/wasm"
xmlns:utum="using:Uno.Toolkit.UI.Material"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:ToDo.Converters"
mc:Ignorable="wasm">

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- Load WinUI resources -->
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />

<!-- Load Material Toolkit resources -->
<MaterialToolkitTheme xmlns="using:Uno.Toolkit.UI.Material"
ColorOverrideSource="ms-appx:///Styles/ColorPaletteOverride.xaml"
FontOverrideSource="ms-appx:///Styles/MaterialFontsOverride.xaml" />

<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<Color x:Key="OverlayColor">#51000000</Color>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<Color x:Key="OverlayColor">#51FFFFFF</Color>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>

<!-- Application's custom styles -->
<ResourceDictionary Source="ms-appx:///Styles/FeedView.xaml" />
<ResourceDictionary Source="ms-appx:///Styles/NavigationBar.xaml" />
<ResourceDictionary Source="ms-appx:///Styles/NavigationView.xaml" />

</ResourceDictionary.MergedDictionaries>

<x:Double x:Key="LandscapeMaxPageWidth">500</x:Double>

<!-- To override the default FlyoutLightDismissOverlayBackground resource -->
<SolidColorBrush x:Key="FlyoutLightDismissOverlayBackground"
Color="{ThemeResource OverlayColor}" />

<x:Double x:Key="WideMinWindowWidth">800</x:Double>
<x:Double x:Key="ExtraWideMinWindowWidth">1000</x:Double>

<converters:FormatConverter x:Key="FormatConverter" />
<converters:StringFormatter x:Key="StringFormatter" />
<converters:StringCompareConverter x:Key="IsNullOrEmpty" Comparison="IsNullOrEmpty" />
<converters:StringCompareConverter x:Key="IsNullOrWhitespace" Comparison="IsNullOrWhitespace" />
<converters:StringCompareConverter x:Key="IsEqualToParameterValue" Comparison="IsEqualToParameterValue" />
<converters:StringCompareConverter x:Key="IsNotNullNorEmpty" Comparison="IsNullOrEmpty" InvertResult="True" />
<converters:StringCompareConverter x:Key="IsNotNullNorWhitespace" Comparison="IsNullOrWhitespace" InvertResult="True" />
<converters:StringCompareConverter x:Key="IsNotEqualToParameterValue" Comparison="IsEqualToParameterValue" InvertResult="True" />
<converters:ReferenceConverter x:Key="IsNull" ConversionMode="IsNull" />
<converters:ReferenceConverter x:Key="IsNotNull" ConversionMode="IsNotNull" />
<converters:BitmapSourceConverter x:Key="BitmapSourceConverter" />

</ResourceDictionary>
</Application.Resources>

<!-- Add resources here -->

</Application>
151 changes: 151 additions & 0 deletions reference/ToDo/src/ToDo/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
using Uno.Resizetizer;

namespace ToDo;

public partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}

public Window? MainWindow { get; private set; }
protected IHost? Host { get; private set; }

protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
var builder = this.CreateBuilder(args)
// Add navigation support for toolkit controls such as TabBar and NavigationView
.UseToolkitNavigation()
.Configure(host => host
#if DEBUG
// Switch to Development environment when running in DEBUG
.UseEnvironment(Environments.Development)
#endif
.UseConfiguration(configure: configBuilder =>
configBuilder
// Load configuration information from appconfig.json
.EmbeddedSource<App>()
.EmbeddedSource<App>("platform")

// Load OAuth configuration
.Section<Auth>()

// Load Mock configuration
.Section<Mock>()

// Enable app settings
.Section<ToDoApp>()
)
// Enable localization (see appsettings.json for supported languages)
.UseLocalization()
// Register Json serializers (ISerializer and ISerializer)
.UseSerialization()
.ConfigureServices(
(context, services) => {

var section = context.Configuration.GetSection(nameof(Mock));
var useMocks = bool.TryParse(section[nameof(Mock.IsEnabled)], out var isMocked) ? isMocked : false;
#if USE_MOCKS
// This is required for UI Testing where USE_MOCKS is enabled
useMocks=true;;
#endif

services
.AddEndpoints(context, useMocks: useMocks)
.AddServices(useMocks: useMocks);
})
.UseNavigation(ReactiveViewModelMappings.ViewModelMappings, RegisterRoutes)
);
MainWindow = builder.Window;

#if DEBUG
MainWindow.EnableHotReload();
#endif
MainWindow.SetWindowIcon();

//TODO: Initialise the theme service?
MainWindow.GetThemeService();

Host = await builder.NavigateAsync<Shell>();
}

private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes)
{
LocalizableMessageDialogViewMap BuildDialogViewMap(string section, bool delayUserInput, int defaultButtonIndex, params (object Id, string labelKeyPath)[] buttons)
{
return new LocalizableMessageDialogViewMap
(
Content: localizer => localizer![ResourceKey(ResourceKeys.DialogContent)],
Title: localizer => localizer![ResourceKey(ResourceKeys.DialogTitle)],
DelayUserInput: delayUserInput,
DefaultButtonIndex: defaultButtonIndex,
Buttons: buttons
.Select(x => new LocalizableDialogAction(LabelProvider: localizer => localizer![ResourceKey(x.labelKeyPath)], Id: x.Id))
.ToArray()
);
string ResourceKey(string keyPath)
{
// map absolute/relative path accordingly
return keyPath.StartsWith("./") ? keyPath.Substring(2) : $"Dialog_{section}_{keyPath}";
}
}

var deleteButton = (DialogResults.Affirmative, ResourceKeys.DeleteButton);
var cancelButton = (DialogResults.Negative, ResourceKeys.CancelButton);
var confirmDeleteListDialog = BuildDialogViewMap(Dialog.ConfirmDeleteList, true, 0, deleteButton, cancelButton);
var confirmDeleteTaskDialog = BuildDialogViewMap(Dialog.ConfirmDeleteTask, true, 0, deleteButton, cancelButton);
var confirmSignOutDialog = BuildDialogViewMap(Dialog.ConfirmSignOut, true, 0, (DialogResults.Affirmative, ResourceKeys.SignOutButton), cancelButton);

views.Register(
// Dialogs and Flyouts
new ViewMap<AddTaskFlyout, AddTaskViewModel>(),
new ViewMap<AddListFlyout, AddListViewModel>(),
new ViewMap<ExpirationDateFlyout, ExpirationDateViewModel>(Data: new DataMap<PickedDate>()),
new ViewMap<RenameListFlyout, RenameListViewModel>(),

// Views
new ViewMap<HomePage, HomeViewModel>(),
new ViewMap<TaskSearchFlyout>(),
new ViewMap<SearchPage, SearchViewModel>(),
new ViewMap<SettingsFlyout, SettingsViewModel>(),
new ViewMap<Shell, ShellViewModel>(),
new ViewMap<WelcomePage, WelcomeViewModel>(),
new DataViewMap<TaskListPage, TaskListViewModel, TaskList>(),
new DataViewMap<TaskPage, TaskViewModel, ToDoTask>(),
confirmDeleteListDialog,
confirmDeleteTaskDialog,
confirmSignOutDialog
);

routes.Register(
new RouteMap("", View: views.FindByViewModel<ShellViewModel>(), Nested: new RouteMap[]
{
new("Welcome", View: views.FindByViewModel<WelcomeViewModel>()),
new("Home", View: views.FindByViewModel<HomeViewModel>()),
new("TaskList", View: views.FindByViewModel<TaskListViewModel>(), Nested: new[]
{
new RouteMap("ToDo", IsDefault:true),
new RouteMap("Completed")
}),
new("Task", View: views.FindByViewModel<TaskViewModel>(), DependsOn:"TaskList"),
new("TaskSearch", View: views.FindByView<TaskSearchFlyout>(), Nested: new RouteMap[]
{
new("Search", View: views.FindByViewModel<SearchViewModel>(), IsDefault: true)
}),
new("Settings", View: views.FindByViewModel<SettingsViewModel>()),
new("AddTask", View: views.FindByViewModel<AddTaskViewModel>()),
new("AddList", View: views.FindByViewModel<AddListViewModel>()),
new("ExpirationDate", View: views.FindByViewModel<ExpirationDateViewModel>()),
new("RenameList", View: views.FindByViewModel<RenameListViewModel>()),
new(Dialog.ConfirmDeleteList, confirmDeleteListDialog),
new(Dialog.ConfirmDeleteTask, confirmDeleteTaskDialog),
new(Dialog.ConfirmSignOut, confirmSignOutDialog)
})
);
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added reference/ToDo/src/ToDo/Assets/Icons/close.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading