Got most of admin panel working. Data issues fixed

This commit is contained in:
Vincent Allen
2025-09-02 09:27:23 -04:00
parent dd3968f6ef
commit ff34eb87b9
401 changed files with 10478 additions and 10675 deletions

View File

@@ -1,14 +1,14 @@
using System.Security.Claims;
using System.Text.Json;
using OpenArchival.Blazor.Components.Account.Pages.Manage;
using OpenArchival.Blazor.Components.Account.Pages;
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using OpenArchival.Blazor.Components.Account.Pages;
using OpenArchival.Blazor.Components.Account.Pages.Manage;
using OpenArchival.Blazor.Data;
using System.Security.Claims;
using System.Text.Json;
namespace Microsoft.AspNetCore.Routing
{

View File

@@ -1,8 +1,8 @@
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using OpenArchival.Blazor.Data;
namespace OpenArchival.Blazor.Components.Account
namespace MyAppName.WebApp.Components.Account
{
// Remove the "else if (EmailSender is IdentityNoOpEmailSender)" block from RegisterConfirmation.razor after updating with a real implementation.
internal sealed class IdentityNoOpEmailSender : IEmailSender<ApplicationUser>

View File

@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Components;
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components;
namespace OpenArchival.Blazor.Components.Account
namespace MyAppName.WebApp.Components.Account
{
internal sealed class IdentityRedirectManager(NavigationManager navigationManager)
{

View File

@@ -1,11 +1,11 @@
using System.Security.Claims;
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using OpenArchival.Blazor.Data;
using System.Security.Claims;
namespace OpenArchival.Blazor.Components.Account
namespace MyAppName.WebApp.Components.Account
{
// This is a server-side AuthenticationStateProvider that revalidates the security stamp for the connected user
// every 30 minutes an interactive circuit is connected.

View File

@@ -1,7 +1,7 @@
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Identity;
using OpenArchival.Blazor.Data;
namespace OpenArchival.Blazor.Components.Account
namespace MyAppName.WebApp.Components.Account
{
internal sealed class IdentityUserAccessor(UserManager<ApplicationUser> userManager, IdentityRedirectManager redirectManager)
{

View File

@@ -2,4 +2,7 @@
<PageTitle>Access denied</PageTitle>
<MudAlert Severity="Severity.Error">You do not have access to this resource.</MudAlert>
<header>
<h1 class="text-danger">Access denied</h1>
<p class="text-danger">You do not have access to this resource.</p>
</header>

View File

@@ -3,7 +3,8 @@
@using System.Text
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IdentityRedirectManager RedirectManager

View File

@@ -3,7 +3,8 @@
@using System.Text
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager

View File

@@ -6,7 +6,9 @@
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@using OpenArchival.Blazor.Components.Account.Pages;
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@@ -21,7 +23,7 @@
<StatusMessage Message="@message" />
<h1>Register</h1>
<h2>Associate your @ProviderDisplayName account.</h2>
<MudDivider />
<hr />
<div class="alert alert-info">
You've successfully authenticated with <strong>@ProviderDisplayName</strong>.
@@ -105,8 +107,8 @@
// Sign in the user with this external login provider if the user already has a login.
var result = await SignInManager.ExternalLoginSignInAsync(
externalLoginInfo!.LoginProvider,
externalLoginInfo!.ProviderKey,
externalLoginInfo.LoginProvider,
externalLoginInfo.ProviderKey,
isPersistent: false,
bypassTwoFactor: true);
@@ -174,7 +176,7 @@
message = $"Error: {string.Join(",", result.Errors.Select(error => error.Description))}";
}
private static ApplicationUser CreateUser()
private ApplicationUser CreateUser()
{
try
{

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender
@@ -14,24 +15,24 @@
<PageTitle>Forgot your password?</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Forgot your password?</MudText>
<MudText Typo="Typo.body1" GutterBottom="true">Enter your email.</MudText>
<h1>Forgot your password?</h1>
<h2>Enter your email.</h2>
<hr />
<div class="row">
<div class="col-md-4">
<EditForm Model="Input" FormName="forgot-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<EditForm Model="Input" FormName="forgot-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
<MudItem md="12">
<MudTextField @bind-Value="Input.Email" For="@(() => Input.Email)"
Label="Email" Placeholder="name@example.com"
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Reset password</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<div class="form-floating mb-3">
<InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<label for="Input.Email" class="form-label">Email</label>
<ValidationMessage For="() => Input.Email" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Reset password</button>
</EditForm>
</div>
</div>
@code {
[SupplyParameterFromForm]

View File

@@ -2,6 +2,7 @@
<PageTitle>Forgot password confirmation</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Forgot password confirmation</MudText>
<MudText Typo="Typo.body1" GutterBottom="true">Please check your email to reset your password.</MudText>
<h1>Forgot password confirmation</h1>
<p role="alert">
Please check your email to reset your password.
</p>

View File

@@ -3,7 +3,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager
@inject ILogger<Login> Logger
@@ -12,50 +13,57 @@
<PageTitle>Log in</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Log in</MudText>
<MudGrid>
<MudItem md="6">
<StatusMessage Message="@errorMessage" />
<EditForm Model="Input" method="post" OnValidSubmit="LoginUser" FormName="login">
<DataAnnotationsValidator />
<MudText GutterBottom="true" Typo="Typo.body1">Use a local account to log in.</MudText>
<MudGrid>
<MudItem md="12">
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email"
Label="Email" Placeholder="name@example.com"
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password"
Label="Password" InputType="InputType.Password" Placeholder="password"
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudCheckBox For="@(() => Input.RememberMe)" @bind-Value="Input.RememberMe">Remember me</MudCheckBox>
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Log in</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<MudGrid Class="mt-4">
<MudItem md="12">
<MudLink Href="Account/ForgotPassword">Forgot your password?</MudLink><br />
<MudLink Href="@(NavigationManager.GetUriWithQueryParameters("Account/Register", new Dictionary<string, object?> { ["ReturnUrl"] = ReturnUrl }))">Register as a new user</MudLink><br />
<MudLink Href="Account/ResendEmailConfirmation">Resend email confirmation</MudLink>
</MudItem>
</MudGrid>
</MudItem>
<MudItem md="6">
<MudText GutterBottom="true" Typo="Typo.body1">Use another service to log in.</MudText>
<ExternalLoginPicker />
</MudItem>
</MudGrid>
<h1>Log in</h1>
<div class="row">
<div class="col-lg-6">
<section>
<StatusMessage Message="@errorMessage" />
<EditForm Model="Input" method="post" OnValidSubmit="LoginUser" FormName="login">
<DataAnnotationsValidator />
<h2>Use a local account to log in.</h2>
<hr />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<label for="Input.Email" class="form-label">Email</label>
<ValidationMessage For="() => Input.Email" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="password" />
<label for="Input.Password" class="form-label">Password</label>
<ValidationMessage For="() => Input.Password" class="text-danger" />
</div>
<div class="checkbox mb-3">
<label class="form-label">
<InputCheckbox @bind-Value="Input.RememberMe" class="darker-border-checkbox form-check-input" />
Remember me
</label>
</div>
<div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
</div>
<div>
<p>
<a href="Account/ForgotPassword">Forgot your password?</a>
</p>
<p>
<a href="@(NavigationManager.GetUriWithQueryParameters("Account/Register", new Dictionary<string, object?> { ["ReturnUrl"] = ReturnUrl }))">Register as a new user</a>
</p>
<p>
<a href="Account/ResendEmailConfirmation">Resend email confirmation</a>
</p>
</div>
</EditForm>
</section>
</div>
<div class="col-lg-4 col-lg-offset-2">
<section>
<h3>Use another service to log in.</h3>
<hr />
<ExternalLoginPicker />
</section>
</div>
</div>
@code {
private string? errorMessage;

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@@ -12,7 +13,7 @@
<PageTitle>Two-factor authentication</PageTitle>
<h1>Two-factor authentication</h1>
<MudDivider />
<hr />
<StatusMessage Message="@message" />
<p>Your login is protected with an authenticator app. Enter your authenticator code below.</p>
<div class="row">
@@ -41,7 +42,7 @@
</div>
<p>
Don't have access to your authenticator device? You can
<a class="mud-link mud-primary-text mud-link-underline-hover" href="Account/LoginWithRecoveryCode?ReturnUrl=@ReturnUrl">log in with a recovery code</a>.
<a href="Account/LoginWithRecoveryCode?ReturnUrl=@ReturnUrl">log in with a recovery code</a>.
</p>
@code {

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@@ -12,7 +13,7 @@
<PageTitle>Recovery code verification</PageTitle>
<h1>Recovery code verification</h1>
<MudDivider />
<hr />
<StatusMessage Message="@message" />
<p>
You have requested to log in with a recovery code. This login will not be remembered until you provide
@@ -24,8 +25,8 @@
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText @bind-Value="Input.RecoveryCode" class="form-control" autocomplete="off" placeholder="RecoveryCode" />
<label for="recovery-code" class="form-label">Recovery Code</label>
<InputText @bind-Value="Input.RecoveryCode" id="Input.RecoveryCode" class="form-control" autocomplete="off" placeholder="RecoveryCode" />
<label for="Input.RecoveryCode" class="form-label">Recovery Code</label>
<ValidationMessage For="() => Input.RecoveryCode" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -12,34 +13,32 @@
<PageTitle>Change password</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Change password</MudText>
<h3>Change password</h3>
<StatusMessage Message="@message" />
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
<MudItem md="12">
<MudTextField For="@(() => Input.OldPassword)" @bind-Value="Input.OldPassword" InputType="InputType.Password"
Label="Old Password" Placeholder="old password" HelperText="Please enter your old password."
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.NewPassword)" @bind-Value="Input.NewPassword" InputType="InputType.Password"
Label="New Password" Placeholder="new password" HelperText="Please enter your new password."
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.ConfirmPassword)" @bind-Value="Input.ConfirmPassword" InputType="InputType.Password"
Label="Confirm Password" Placeholder="confirm password" HelperText="Please confirm your new password."
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Update password</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.OldPassword" id="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Enter the old password" />
<label for="Input.OldPassword" class="form-label">Old password</label>
<ValidationMessage For="() => Input.OldPassword" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.NewPassword" id="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<label for="Input.NewPassword" class="form-label">New password</label>
<ValidationMessage For="() => Input.NewPassword" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<label for="Input.ConfirmPassword" class="form-label">Confirm password</label>
<ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Update password</button>
</EditForm>
</div>
</div>
@code {
private string? message;

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -12,31 +13,31 @@
<PageTitle>Delete Personal Data</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Delete personal data</MudText>
<StatusMessage Message="@message" />
<MudAlert Severity="Severity.Error" Variant="Variant.Text">
Deleting this data will permanently remove your account, and this cannot be recovered.
</MudAlert>
<h3>Delete Personal Data</h3>
<EditForm Model="Input" FormName="delete-user" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<div class="alert alert-warning" role="alert">
<p>
<strong>Deleting this data will permanently remove your account, and this cannot be recovered.</strong>
</p>
</div>
<MudGrid>
<div>
<EditForm Model="Input" FormName="delete-user" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
@if (requirePassword)
{
<MudItem md="12">
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password" InputType="InputType.Password"
Label="Password" Placeholder="password" HelperText="Please enter your new password."
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" />
</MudItem>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your password." />
<label for="Input.Password" class="form-label">Password</label>
<ValidationMessage For="() => Input.Password" class="text-danger" />
</div>
}
<MudItem md="12">
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Delete data and close my account</MudStaticButton>
</MudItem>
</MudGrid>
</EditForm>
<button class="w-100 btn btn-lg btn-danger" type="submit">Delete data and close my account</button>
</EditForm>
</div>
@code {
private string? message;

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/Disable2fa"
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender
@@ -14,43 +15,44 @@
<PageTitle>Manage email</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Manage email</MudText>
<h3>Manage email</h3>
<StatusMessage Message="@message" />
<form @onsubmit="OnSendEmailVerificationAsync" @formname="send-verification" id="send-verification-form" method="post">
<AntiforgeryToken />
</form>
<EditForm Model="Input" FormName="change-email" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
@if (isEmailConfirmed)
{
<MudItem md="12">
<MudTextField Value="@email" Label="Email" Placeholder="Please enter your email." Disabled="true" AdornmentIcon="Icons.Material.Filled.Check" AdornmentColor="Color.Success" />
</MudItem>
}
else
{
<MudItem md="12">
<MudTextField Value="@email" Label="Email" Placeholder="Please enter your email." Disabled="true" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Send verification email</MudButton>
</MudItem>
}
<MudItem md="12">
<MudTextField @bind-Value="@Input.NewEmail" For="@(() => Input.NewEmail)" UserAttributes="@(new() { { "autocomplete", "email" }, { "aria-required", "true" } } )" Label="New Email" HelperText="Please enter new email." />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Change email</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<StatusMessage Message="@message"/>
<div class="row">
<div class="col-xl-6">
<form @onsubmit="OnSendEmailVerificationAsync" @formname="send-verification" id="send-verification-form" method="post">
<AntiforgeryToken />
</form>
<EditForm Model="Input" FormName="change-email" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
@if (isEmailConfirmed)
{
<div class="form-floating mb-3 input-group">
<input type="text" value="@email" id="email" class="form-control" placeholder="Enter your email" disabled />
<div class="input-group-append">
<span class="h-100 input-group-text text-success font-weight-bold">✓</span>
</div>
<label for="email" class="form-label">Email</label>
</div>
}
else
{
<div class="form-floating mb-3">
<input type="text" value="@email" id="email" class="form-control" placeholder="Enter your email" disabled />
<label for="email" class="form-label">Email</label>
<button type="submit" class="btn btn-link" form="send-verification-form">Send verification email</button>
</div>
}
<div class="form-floating mb-3">
<InputText @bind-Value="Input.NewEmail" id="Input.NewEmail" class="form-control" autocomplete="email" aria-required="true" placeholder="Enter a new email" />
<label for="Input.NewEmail" class="form-label">New email</label>
<ValidationMessage For="() => Input.NewEmail" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Change email</button>
</EditForm>
</div>
</div>
@code {
private string? message;

View File

@@ -5,7 +5,8 @@
@using System.Text
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor
@@ -21,55 +22,49 @@
}
else
{
<MudText Typo="Typo.h6" GutterBottom="true">Configure authenticator app</MudText>
<StatusMessage Message="@message" />
<MudText Typo="Typo.body1" GutterBottom="true">To use an authenticator app go through the following steps:</MudText>
<ol class="list">
<li>
<MudText Typo="Typo.body2">
Download a two-factor authenticator app like Microsoft Authenticator for
<MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=825072">Android</MudLink> and
<MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=825073">iOS</MudLink> or
Google Authenticator for
<MudLink Target="_blank" Href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Android</MudLink> and
<MudLink Target="_blank" Href="https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8">iOS</MudLink>.
</MudText>
</li>
<li>
<MudText Typo="Typo.body2">
Scan the QR Code or enter this key into your two factor authenticator app. Spaces and casing do not matter:
</MudText>
<MudAlert Variant="Variant.Text" Severity="Severity.Info" Icon="@Icons.Material.Filled.Key">@sharedKey</MudAlert>
<MudText Typo="Typo.body2">
Learn how to <MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=852423">enable QR code generation</MudLink>.
</MudText>
<div data-url="@authenticatorUri"></div>
</li>
<li>
<MudText Typo="Typo.body2">
Once you have scanned the QR code or input the key above, your two factor authentication app will provide you
with a unique code. Enter the code in the confirmation box below.
</MudText>
<EditForm Model="Input" FormName="send-code" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
<MudItem md="12">
<MudTextField @bind-Value="@Input.Code" For="@(() => Input.Code)" Label="Verification Code" HelperText="Please enter the code." />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Verify</MudButton>
</MudItem>
</MudGrid>
</EditForm>
</li>
</ol>
<h3>Configure authenticator app</h3>
<div>
<p>To use an authenticator app go through the following steps:</p>
<ol class="list">
<li>
<p>
Download a two-factor authenticator app like Microsoft Authenticator for
<a href="https://go.microsoft.com/fwlink/?Linkid=825072">Android</a> and
<a href="https://go.microsoft.com/fwlink/?Linkid=825073">iOS</a> or
Google Authenticator for
<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Android</a> and
<a href="https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8">iOS</a>.
</p>
</li>
<li>
<p>Scan the QR Code or enter this key <kbd>@sharedKey</kbd> into your two factor authenticator app. Spaces and casing do not matter.</p>
<div class="alert alert-info">Learn how to <a href="https://go.microsoft.com/fwlink/?Linkid=852423">enable QR code generation</a>.</div>
<div></div>
<div data-url="@authenticatorUri"></div>
</li>
<li>
<p>
Once you have scanned the QR code or input the key above, your two factor authentication app will provide you
with a unique code. Enter the code in the confirmation box below.
</p>
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="send-code" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<div class="form-floating mb-3">
<InputText @bind-Value="Input.Code" id="Input.Code" class="form-control" autocomplete="off" placeholder="Enter the code" />
<label for="Input.Code" class="control-label form-label">Verification Code</label>
<ValidationMessage For="() => Input.Code" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Verify</button>
<ValidationSummary class="text-danger" role="alert" />
</EditForm>
</div>
</div>
</li>
</ol>
</div>
}
@code {

View File

@@ -2,7 +2,8 @@
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -47,7 +48,7 @@
@if (otherLogins?.Count > 0)
{
<h4>Add another service to log in.</h4>
<MudDivider />
<hr />
<form class="form-horizontal" action="Account/Manage/LinkExternalLogin" method="post">
<AntiforgeryToken />
<div>

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/GenerateRecoveryCodes"
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -11,27 +12,27 @@
<PageTitle>Profile</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Profile</MudText>
<h3>Profile</h3>
<StatusMessage />
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
<MudItem md="12">
<MudTextField Value="@username" Label="Username" Disabled="true" Placeholder="Please choose your username." />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.PhoneNumber)" @bind-Value="Input.PhoneNumber"
Label="Phone Number" HelperText="Please enter your phone number."
UserAttributes="@(new() { { "autocomplete", "tel-national" } } )" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Save</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<input type="text" value="@username" id="username" class="form-control" placeholder="Choose your username." disabled />
<label for="username" class="form-label">Username</label>
</div>
<div class="form-floating mb-3">
<InputText @bind-Value="Input.PhoneNumber" id="Input.PhoneNumber" class="form-control" placeholder="Enter your phone number" />
<label for="Input.PhoneNumber" class="form-label">Phone number</label>
<ValidationMessage For="() => Input.PhoneNumber" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Save</button>
</EditForm>
</div>
</div>
@code {
private ApplicationUser user = default!;

View File

@@ -1,34 +1,28 @@
@page "/Account/Manage/PersonalData"
@using MyAppName.WebApp.Components.Account
@inject IdentityUserAccessor UserAccessor
<PageTitle>Personal Data</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Personal data</MudText>
<StatusMessage />
<h3>Personal Data</h3>
<MudGrid>
<MudItem md="12">
<MudText Typo="Typo.body1">
Your account contains personal data that you have given us. This page allows you to download or delete that data.
</MudText>
</MudItem>
<MudItem md="12">
<MudAlert Severity="Severity.Warning" Variant="Variant.Text">
Deleting this data will permanently remove your account, and this cannot be recovered.
</MudAlert>
</MudItem>
<MudItem md="12">
<div class="row">
<div class="col-md-6">
<p>Your account contains personal data that you have given us. This page allows you to download or delete that data.</p>
<p>
<strong>Deleting this data will permanently remove your account, and this cannot be recovered.</strong>
</p>
<form action="Account/Manage/DownloadPersonalData" method="post">
<AntiforgeryToken />
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Download</MudStaticButton>
<button class="btn btn-primary" type="submit">Download</button>
</form>
</MudItem>
<MudItem md="12">
<MudLink Href="Account/Manage/DeletePersonalData" Color="Color.Error">Delete</MudLink>
</MudItem>
</MudGrid>
<p>
<a href="Account/Manage/DeletePersonalData" class="btn btn-danger">Delete</a>
</p>
</div>
</div>
@code {
[CascadingParameter]

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/ResetAuthenticator"
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -11,24 +12,24 @@
<PageTitle>Reset authenticator key</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Reset authenticator key</MudText>
<StatusMessage />
<MudAlert Severity="Severity.Warning" Variant="Variant.Text">
If you reset your authenticator key your authenticator app will not work until you reconfigure it.
</MudAlert>
<MudText Typo="Typo.body2" Class="my-4">
This process disables 2FA until you verify your authenticator app.
If you do not complete your authenticator app configuration you may lose access to your account.
</MudText>
<form @formname="reset-authenticator" @onsubmit="OnSubmitAsync" method="post">
<AntiforgeryToken />
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Reset authenticator key</MudStaticButton>
</form>
<h3>Reset authenticator key</h3>
<div class="alert alert-warning" role="alert">
<p>
<span class="glyphicon glyphicon-warning-sign"></span>
<strong>If you reset your authenticator key your authenticator app will not work until you reconfigure it.</strong>
</p>
<p>
This process disables 2FA until you verify your authenticator app.
If you do not complete your authenticator app configuration you may lose access to your account.
</p>
</div>
<div>
<form @formname="reset-authenticator" @onsubmit="OnSubmitAsync" method="post">
<AntiforgeryToken />
<button class="btn btn-danger" type="submit">Reset authenticator key</button>
</form>
</div>
@code {
[CascadingParameter]

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager

View File

@@ -2,7 +2,8 @@
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@@ -11,72 +12,63 @@
<PageTitle>Two-factor authentication (2FA)</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Two-factor authentication (2FA)</MudText>
<StatusMessage />
<h3>Two-factor authentication (2FA)</h3>
@if (canTrack)
{
if (is2faEnabled)
{
if (recoveryCodesLeft == 0)
{
<MudAlert Variant="Variant.Text" Severity="Severity.Error">You have no recovery codes left.</MudAlert>
<MudText Typo="Typo.body1" Class="pt-4">
You must <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink>
before you can log in with a recovery code.
</MudText>
<div class="alert alert-danger">
<strong>You have no recovery codes left.</strong>
<p>You must <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a> before you can log in with a recovery code.</p>
</div>
}
else if (recoveryCodesLeft == 1)
{
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">You have 1 recovery code left.</MudAlert>
<MudText Typo="Typo.body1" Class="pt-4">
You can <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink>.
</MudText>
<div class="alert alert-danger">
<strong>You have 1 recovery code left.</strong>
<p>You can <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a>.</p>
</div>
}
else if (recoveryCodesLeft <= 3)
{
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">You have @recoveryCodesLeft recovery codes left.</MudAlert>
<MudText Typo="Typo.body1" Class="pt-4">
You should <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink>.
</MudText>
<div class="alert alert-warning">
<strong>You have @recoveryCodesLeft recovery codes left.</strong>
<p>You should <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a>.</p>
</div>
}
if (isMachineRemembered)
{
<form style="display: inline-block" @formname="forget-browser" @onsubmit="OnSubmitForgetBrowserAsync" method="post">
<AntiforgeryToken />
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Forget this browser</MudStaticButton>
<button type="submit" class="btn btn-primary">Forget this browser</button>
</form>
}
<MudLink Href="Account/Manage/Disable2fa">Disable 2FA</MudLink><br />
<MudLink Href="Account/Manage/GenerateRecoveryCodes">Reset recovery codes</MudLink>
<a href="Account/Manage/Disable2fa" class="btn btn-primary">Disable 2FA</a>
<a href="Account/Manage/GenerateRecoveryCodes" class="btn btn-primary">Reset recovery codes</a>
}
<MudText Typo="Typo.h6" GutterBottom="true">Authenticator app</MudText>
<h4>Authenticator app</h4>
@if (!hasAuthenticator)
{
<MudLink Href="Account/Manage/EnableAuthenticator">Add authenticator app</MudLink><br />
<a href="Account/Manage/EnableAuthenticator" class="btn btn-primary">Add authenticator app</a>
}
else
{
<MudLink Href="Account/Manage/EnableAuthenticator">Set up authenticator app</MudLink><br />
<MudLink Href="Account/Manage/ResetAuthenticator">Reset authenticator app</MudLink>
<a href="Account/Manage/EnableAuthenticator" class="btn btn-primary">Set up authenticator app</a>
<a href="Account/Manage/ResetAuthenticator" class="btn btn-primary">Reset authenticator app</a>
}
}
else
{
<MudAlert Variant="Variant.Text" Severity="Severity.Error">Privacy and cookie policy have not been accepted.</MudAlert>
<MudText Typo="Typo.body1" Class="pt-4">
You must accept the policy before you can enable two factor authentication.
</MudText>
<div class="alert alert-danger">
<strong>Privacy and cookie policy have not been accepted.</strong>
<p>You must accept the policy before you can enable two factor authentication.</p>
</div>
}
@code {

View File

@@ -1,2 +1,3 @@
@layout ManageLayout
@using OpenArchival.Blazor.Components.Account.Shared
@layout ManageLayout
@attribute [Microsoft.AspNetCore.Authorization.Authorize]

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IUserStore<ApplicationUser> UserStore
@@ -17,43 +18,42 @@
<PageTitle>Register</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Register</MudText>
<h1>Register</h1>
<MudGrid>
<MudItem md="6">
<div class="row">
<div class="col-lg-6">
<StatusMessage Message="@Message" />
<EditForm Model="Input" asp-route-returnUrl="@ReturnUrl" method="post" OnValidSubmit="RegisterUser" FormName="register">
<DataAnnotationsValidator />
<MudText Typo="Typo.body1" GutterBottom="true">Create a new account.</MudText>
<MudGrid>
<MudItem md="12">
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email"
Label="Email" Placeholder="name@example.com"
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password"
Label="Password" InputType="InputType.Password" Placeholder="password"
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudTextField For="@(() => Input.ConfirmPassword)" @bind-Value="Input.ConfirmPassword"
Label="Confirm Password" InputType="InputType.Password" Placeholder="confirm password"
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Register</MudButton>
</MudItem>
</MudGrid>
<h2>Create a new account.</h2>
<hr />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<label for="Input.Email">Email</label>
<ValidationMessage For="() => Input.Email" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<label for="Input.Password">Password</label>
<ValidationMessage For="() => Input.Password" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<label for="Input.ConfirmPassword">Confirm Password</label>
<ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Register</button>
</EditForm>
</MudItem>
<MudItem md="6">
<MudText Typo="Typo.body1" GutterBottom="true">Use another service to register.</MudText>
<ExternalLoginPicker />
</MudItem>
</MudGrid>
</div>
<div class="col-lg-4 col-lg-offset-2">
<section>
<h3>Use another service to register.</h3>
<hr />
<ExternalLoginPicker />
</section>
</div>
</div>
@code {
private IEnumerable<IdentityError>? identityErrors;
@@ -73,8 +73,9 @@
await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None);
var emailStore = GetEmailStore();
await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None);
var result = await UserManager.CreateAsync(user, Input.Password);
await UserManager.AddToRoleAsync(user, "User");
var result = await UserManager.CreateAsync(user, Input.Password);
if (!result.Succeeded)
{
identityErrors = result.Errors;
@@ -103,7 +104,7 @@
RedirectManager.RedirectTo(ReturnUrl);
}
private static ApplicationUser CreateUser()
private ApplicationUser CreateUser()
{
try
{

View File

@@ -3,7 +3,8 @@
@using System.Text
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender
@@ -19,8 +20,8 @@
@if (emailConfirmationLink is not null)
{
<p>
This app does not currently have a real email sender registered, see <a class="mud-link mud-primary-text mud-link-underline-hover" href="https://aka.ms/aspaccountconf">these docs</a> for how to configure a real email sender.
Normally this would be emailed: <a class="mud-link mud-primary-text mud-link-underline-hover" href="@emailConfirmationLink">Click here to confirm your account</a>
This app does not currently have a real email sender registered, see <a href="https://aka.ms/aspaccountconf">these docs</a> for how to configure a real email sender.
Normally this would be emailed: <a href="@emailConfirmationLink">Click here to confirm your account</a>
</p>
}
else

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender
@@ -14,26 +15,24 @@
<PageTitle>Resend email confirmation</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Resend email confirmation</MudText>
<MudText Typo="Typo.body1" GutterBottom="true">Enter your email.</MudText>
<h1>Resend email confirmation</h1>
<h2>Enter your email.</h2>
<hr />
<StatusMessage Message="@message" />
<EditForm Model="Input" FormName="resend-email-confirmation" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<MudGrid>
<MudItem md="12">
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email"
Label="Email" Placeholder="name@example.com"
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" />
</MudItem>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Resend</MudButton>
</MudItem>
</MudGrid>
</EditForm>
<div class="row">
<div class="col-md-4">
<EditForm Model="Input" FormName="resend-email-confirmation" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" aria-required="true" placeholder="name@example.com" />
<label for="Input.Email" class="form-label">Email</label>
<ValidationMessage For="() => Input.Email" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Resend</button>
</EditForm>
</div>
</div>
@code {
private string? message;

View File

@@ -4,7 +4,8 @@
@using System.Text
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject IdentityRedirectManager RedirectManager
@inject UserManager<ApplicationUser> UserManager
@@ -13,7 +14,7 @@
<h1>Reset password</h1>
<h2>Reset your password.</h2>
<MudDivider />
<hr />
<div class="row">
<div class="col-md-4">
<StatusMessage Message="@Message" />

View File

@@ -3,5 +3,5 @@
<h1>Reset password confirmation</h1>
<p role="alert">
Your password has been reset. Please <a class="mud-link mud-primary-text mud-link-underline-hover" href="Account/Login">click here to log in</a>.
Your password has been reset. Please <a href="Account/Login">click here to log in</a>.
</p>

View File

@@ -1,3 +1,2 @@
@using MudBlazor
@using OpenArchival.Blazor.Components.Account.Shared
@using OpenArchival.Blazor.Components.Account.Shared
@attribute [ExcludeFromInteractiveRouting]

View File

@@ -1,18 +1,19 @@
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity
@using MudBlazor
@using OpenArchival.Blazor.Data
@using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager
@inject IdentityRedirectManager RedirectManager
@if (externalLogins.Length == 0)
{
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">There are no external authentication services configured.</MudAlert>
<MudText Typo="Typo.body1" Class="pt-4">
See <MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</MudLink>
about setting up this ASP.NET application to support logging in via external services
</MudText>
<div>
<p>
There are no external authentication services configured. See this <a href="https://go.microsoft.com/fwlink/?LinkID=532715">article
about setting up this ASP.NET application to support logging in via external services</a>.
</p>
</div>
}
else
{

View File

@@ -1,14 +1,18 @@
@inherits LayoutComponentBase
@layout OpenArchival.Blazor.Components.Layout.MainLayout
@using OpenArchival.Blazor.Components.Layout
@inherits LayoutComponentBase
@layout MainLayout
<MudText Typo="Typo.h3" GutterBottom="true">Manage your account</MudText>
<h1>Manage your account</h1>
<MudGrid>
<MudItem md="5">
<MudText Typo="Typo.h6" GutterBottom="true">Change your account settings</MudText>
<ManageNavMenu />
</MudItem>
<MudItem md="7">
@Body
</MudItem>
</MudGrid>
<div>
<h2>Change your account settings</h2>
<hr />
<div class="row">
<div class="col-lg-3">
<ManageNavMenu />
</div>
<div class="col-lg-9">
@Body
</div>
</div>
</div>

View File

@@ -1,19 +1,31 @@
@using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager
<MudNavMenu>
<MudNavLink Href="Account/Manage" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Person">Profile</MudNavLink>
<MudNavLink Href="Account/Manage/Email" Icon="@Icons.Material.Filled.Email">Email</MudNavLink>
<MudNavLink Href="Account/Manage/ChangePassword" Icon="@Icons.Material.Filled.Lock">Password</MudNavLink>
<ul class="nav nav-pills flex-column">
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage" Match="NavLinkMatch.All">Profile</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/Email">Email</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ChangePassword">Password</NavLink>
</li>
@if (hasExternalLogins)
{
<MudNavLink Href="Account/Manage/ExternalLogins" Icon="@Icons.Material.Filled.PhoneLocked">External logins</MudNavLink>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ExternalLogins">External logins</NavLink>
</li>
}
<MudNavLink Href="Account/Manage/TwoFactorAuthentication" Icon="@Icons.Material.Filled.LockClock">Two-factor authentication</MudNavLink>
<MudNavLink Href="Account/Manage/PersonalData" Icon="@Icons.Material.Filled.PersonRemove">Personal data</MudNavLink>
</MudNavMenu>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/TwoFactorAuthentication">Two-factor authentication</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/PersonalData">Personal data</NavLink>
</li>
</ul>
@code {
private bool hasExternalLogins;

View File

@@ -1,8 +1,10 @@
@if (!string.IsNullOrEmpty(DisplayMessage))
@using MyAppName.WebApp.Components.Account
@if (!string.IsNullOrEmpty(DisplayMessage))
{
var severity = DisplayMessage.StartsWith("Error") ? Severity.Error : Severity.Success;
<MudAlert Variant="Variant.Outlined" Severity="@severity">@DisplayMessage</MudAlert>
var statusMessageClass = DisplayMessage.StartsWith("Error") ? "danger" : "success";
<div class="alert alert-@statusMessageClass" role="alert">
@DisplayMessage
</div>
}
@code {

View File

@@ -1,5 +1,4 @@
@using Microsoft.Extensions.Options
TODO: Handle the case in which there are duplicate file names
<style>
.file-upload-input {

View File

@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Components;
namespace OpenArchival.Blazor;
public static class HelperExtensions
{
public static void ReloadPage(this NavigationManager manager)
{
manager.NavigateTo(manager.Uri, true);
}
}

View File

@@ -0,0 +1,43 @@
@page "/archiveadmin"
@using Microsoft.AspNetCore.Authorization
@using OpenArchival.Blazor.Components
@using OpenArchival.Blazor.Components.Pages.Administration.ArchiveItems
@using OpenArchival.Blazor.Components.Pages.Administration.Categories;
@attribute [Authorize(Roles = "Admin")]
<MudTabs
ApplyEffectsToContainer="true"
PanelClass=""
Centered=true>
<MudTabPanel Text="Categories">
<ViewAddCategoriesComponent></ViewAddCategoriesComponent>
</MudTabPanel>
<MudTabPanel Text="Add Grouping">
<AddArchiveGroupingComponent
GroupingPublished="Helpers.OnGroupingPublished"
ForwardLink="@null"
ClearOnPublish=true/>
</MudTabPanel>
<MudTabPanel Text="Manage Groupings">
<ArchiveGroupingsTable/>
</MudTabPanel>
</MudTabs>
@inject ArtifactEntrySharedHelpers Helpers;
@inject IDialogService DialogService;
@code {
public async Task ShowAddGroupingDialog(ArtifactGroupingRowElement validationModel)
{
var parameters = new DialogParameters { ["Model"] = validationModel, ["IsUpdate"] = true};
var options = new DialogOptions { CloseOnEscapeKey = true, BackdropClick = false };
var dialog = await DialogService.ShowAsync<AddGroupingDialog>("Create a Group", parameters, options);
var result = await dialog.Result;
}
}

View File

@@ -1,23 +1,35 @@
@page "/add"
@using OpenArchival.Blazor.Components.CustomComponents;
@using OpenArchival.Blazor.Components.CustomComponents;
@using OpenArchival.Blazor.Components.Pages.Administration.Categories
@using OpenArchival.DataAccess;
@using System.ComponentModel.DataAnnotations
@inject IDialogService DialogService
@inject NavigationManager NavigationManager;
@inject IArchiveCategoryProvider CategoryProvider;
@inject ArtifactEntrySharedHelpers Helpers;
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h5" Color="Color.Primary">Add an Archive Item</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
@if (!IsValid && _isFormDivVisible)
@foreach (var result in ValidationResults)
{
<MudAlert Severity="Severity.Error" Class="mt-4">
All identifier fields must be filled in.
</MudAlert>
<MudAlert Severity="Severity.Error">@result.ErrorMessage</MudAlert>
}
<MudGrid Justify="Justify.Center" Class="pt-4">
<MudItem>
<MudAutocomplete T="string" Label="Category" @bind-Value="Model.Category" @bind-Value:after=OnCategoryChanged SearchFunc="SearchCategory" CoerceValue=false CoerceText=false/>
<MudAutocomplete
T="ArchiveCategory"
ToStringFunc="@(val => val?.Name)"
Label="Category"
@bind-Value="Model.Category"
@bind-Value:after=OnCategoryChanged
SearchFunc="SearchCategory"
CoerceValue=false
CoerceText=false
/>
</MudItem>
<MudItem>
@@ -32,16 +44,56 @@
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Identifier</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<IdentifierTextBox @ref="_identifierTextBox" IdentifierFields="@Model.IdentifierFields"></IdentifierTextBox>
<IdentifierTextBox @ref="_identifierTextBox" IdentifierFields="@Model.IdentifierFieldValues"></IdentifierTextBox>
</MudPaper>
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<UploadDropBox FilesUploaded="OnFilesUploaded" ClearClicked="OnClearFilesClicked"></UploadDropBox>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Title</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField
T="string"
For="@(() => Model.Title)"
Placeholder="Grouping Title"
@bind-Value=Model.Title></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Description</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField
T="string"
For="@(() => Model.Description)"
Lines="5"
Placeholder="Grouping Description"
@bind-Value=Model.Description></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Type</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete
For="@(() => Model.Type)"
T="string"
Label="Artifact Type"
Class="pt-0 mt-0 pl-2 pr-2"
@bind-Value=Model.Type
SearchFunc="Helpers.SearchItemTypes"
CoerceValue=true></MudAutocomplete>
</MudPaper>
@foreach (FilePathListing listing in _filePathListings)
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<UploadDropBox
@ref="@_uploadComponent"
FilesUploaded="OnFilesUploaded"
ClearClicked="OnClearFilesClicked"></UploadDropBox>
</MudPaper>
@for (int index = 0; index < Model.ArtifactEntries.Count; ++index)
{
<ArchiveEntryCreatorCard FilePath="listing" OnValueChanged="OnChanged"></ArchiveEntryCreatorCard>
// Capture the current item in a local variable for the lambda
var currentEntry = Model.ArtifactEntries[index];
<ArchiveEntryCreatorCard Model="currentEntry"
ModelChanged="(updatedEntry) => HandleEntryUpdate(currentEntry, updatedEntry)"
InputsChanged="OnChanged"
@key="currentEntry"
ArtifactEntryIndex="index"
OnEntryDeletedClicked="() => OnDeleteEntryClicked(index)"/>
}
</div>
@@ -51,25 +103,52 @@
@*<MudCheckBox Label="Publicly Visible" T="bool" @bind-Value=Model.IsPublic></MudCheckBox>*@
</MudItem>
<MudItem Style="pr-0">
<MudItem Class="pr-0">
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="CancelClicked">Cancel</MudButton>
</MudItem>
<MudItem Style="pl-2">
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="PublishClicked">Publish</MudButton>
<MudItem Class="pl-2">
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="PublishClicked" Disabled="@(!IsValid)" >Publish</MudButton>
</MudItem>
</MudGrid>
@using System.ComponentModel.DataAnnotations
@inject IDialogService DialogService
@inject NavigationManager NavigationManager;
@inject IArchiveCategoryProvider CategoryProvider;
@code {
[Parameter]
public bool ClearOnPublish { get; set; } = true;
/// <summary>
/// The URI to navigate to if cancel is pressed. null to navigate to no page
/// </summary>
[Parameter]
public string? BackLink { get; set; } = null;
/// <summary>
/// The URI to navigate to if publish is pressed, null to navigate to no page
/// </summary>
[Parameter]
public string? ForwardLink { get; set; } = null;
/// <summary>
/// Called when publish is clicked
/// </summary>
[Parameter]
public EventCallback<ArtifactGroupingValidationModel> GroupingPublished { get; set; }
/// <summary>
/// The model to display on the form
/// </summary>
[Parameter]
public ArtifactGroupingValidationModel Model { get; set; } = new();
private UploadDropBox _uploadComponent = default!;
private IdentifierTextBox _identifierTextBox = default!;
private ElementReference _formDiv = default!;
private bool _isFormDivVisible = false;
private string _formDivStyle => _isFormDivVisible ? "" : "display: none;";
public List<string> DatesData { get; set; } = [];
@@ -80,17 +159,34 @@
private bool _categorySelected = false;
//public List<IdentifierFieldValidationModel> IdentifierFields { get; set; } = [new IdentifierFieldValidationModel() { Name = "Field One", Value = "" }, new IdentifierFieldValidationModel() { Name = "Field Two", Value = "" }, new IdentifierFieldValidationModel() { Name = "Field Three", Value = "" }];
public ArchiveItemValidationModel Model { get; set; } = new();
public bool IsValid { get; set; } = false;
/// <summary>
/// The URI to navigate to if cancel is pressed
/// </summary>
public string? BackLink { get; set; } = "/";
public string? ForwardLink { get; set; } = "/";
public List<ValidationResult> ValidationResults { get; private set; } = [];
private async Task PublishClicked(MouseEventArgs args)
{
var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
ArtifactGroupingValidationModel oldModel = Model;
if (ForwardLink is not null)
{
if (IsValid)
{
NavigationManager.NavigateTo(ForwardLink);
}
}
if (IsValid && ClearOnPublish)
{
Model = new();
await _uploadComponent.ClearClicked.InvokeAsync();
StateHasChanged();
}
await GroupingPublished.InvokeAsync(oldModel);
}
private void CancelClicked(MouseEventArgs args)
{
@@ -103,74 +199,71 @@
}
}
private void HandleEntryUpdate(ArtifactEntryValidationModel originalEntry, ArtifactEntryValidationModel updatedEntry)
{
// Find the index of the original object in our list
var index = Model.ArtifactEntries.IndexOf(originalEntry);
// If found, replace it with the updated version
if (index != -1)
{
Model.ArtifactEntries[index] = updatedEntry;
}
// Now, run the validation logic
OnChanged();
}
// You can now simplify your OnFilesUploaded method slightly
private async Task OnFilesUploaded(List<FilePathListing> args)
{
_filePathListings = args;
StateHasChanged();
// This part is tricky. Adding items while iterating can be problematic.
// A better approach is to create the entries first, then tell Blazor to render.
var newEntries = new List<ArtifactEntryValidationModel>();
foreach (var file in args)
{
// Associate the file with the entry if needed
newEntries.Add(new ArtifactEntryValidationModel { Files = [file]});
}
Model.ArtifactEntries.AddRange(newEntries);
// StateHasChanged() is implicitly called by OnChanged() if validation passes
await OnChanged();
}
private async Task OnClearFilesClicked()
{
_filePathListings = [];
Model.ArtifactEntries = [];
StateHasChanged();
await OnChanged();
}
private void PublishClicked(MouseEventArgs args)
{
var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
/*
if (ForwardLink is not null)
{
if (IsValid)
{
NavigationManager.NavigateTo(ForwardLink);
}
else
{
StateHasChanged();
}
}
else
{
throw new ArgumentNullException("No forward link provided for the add archive item page.");
}
// TODO: assign parents to all file path listings
throw new NotImplementedException();
*/
}
async Task OnChanged()
{
var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
if (IsValid)
{
StateHasChanged();
}
}
async Task OnCategoryChanged()
{
List<ArchiveCategory>? newCategory = await CategoryProvider.GetArchiveCategory(Model.Category);
if (newCategory.Count != 1)
if (Model.Category is not null)
{
throw new ArgumentException(nameof(Model.Category), $"Got {newCategory.Count} rows for category name={Model.Category}");
}
if (newCategory is not null)
{
_identifierTextBox.VerifyFormatCategory = newCategory[0];
_identifierTextBox.VerifyFormatCategory = Model.Category;
_isFormDivVisible = true;
StateHasChanged();
}
if (!_categorySelected)
{
_categorySelected = true;
if (!_categorySelected)
{
_categorySelected = true;
}
StateHasChanged();
}
@@ -192,7 +285,7 @@
}
}
private async Task<IEnumerable<string>> SearchCategory(string value, CancellationToken cancellationToken)
private async Task<IEnumerable<ArchiveCategory>> SearchCategory(string value, CancellationToken cancellationToken)
{
List<ArchiveCategory> categories;
if (string.IsNullOrEmpty(value))
@@ -204,13 +297,12 @@
categories = new((await CategoryProvider.Search(value) ?? []));
}
List<string> categoryStrings = [];
foreach (var category in categories)
{
categoryStrings.Add(category.Name);
}
return categoryStrings;
return categories;
}
private async void OnDeleteEntryClicked(int index)
{
Model.ArtifactEntries.RemoveAt(index);
StateHasChanged();
}
}

View File

@@ -0,0 +1,32 @@
<MudDialog>
<TitleContent>
<MudText Typo="Typo.h6">Create a Category</MudText>
</TitleContent>
<DialogContent>
<AddArchiveGroupingComponent Model="Model"></AddArchiveGroupingComponent>
</DialogContent>
<DialogActions>
<MudButton OnClick="OnCancel">Cancel</MudButton>
<MudButton Color="Color.Primary" OnClick="OnSubmit">OK</MudButton>
</DialogActions>
</MudDialog>
@code {
[Parameter]
public required ArtifactGroupingValidationModel Model { get; set; }
[Parameter]
public bool IsUpdate { get; set; } = false;
private void OnCancel(MouseEventArgs args)
{
throw new NotImplementedException();
}
private void OnSubmit(MouseEventArgs args)
{
throw new NotImplementedException();
}
}

View File

@@ -1,91 +1,123 @@
@using OpenArchival.Blazor.Components.CustomComponents;
@using System.ComponentModel.DataAnnotations
@using MudBlazor
@inject ArtifactEntrySharedHelpers Helpers;
@inject IArtifactDefectProvider DefectsProvider;
@inject IArtifactStorageLocationProvider StorageLocationProvider;
@inject IArchiveEntryTagProvider TagsProvider;
@inject IArtifactTypeProvider TypesProvider;
@inject IListedNameProvider ListedNameProvider;
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<h3>@FilePath.OriginalName</h3>
<MudGrid>
<MudItem>
@if (Model.Files.Count > 0) {
<MudText Typo="Typo.h6">@(Model.Files[0].OriginalName)</MudText>
}
</MudItem>
<MudItem>
<MudButton
Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="OnDeleteEntryClicked"
>Delete</MudButton>
</MudItem>
</MudGrid>
@foreach (var error in ValidationResults)
{
<MudAlert Severity="Severity.Error">
@error.ErrorMessage
</MudAlert>
}
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Title</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField Required=true Placeholder="Archive Item Title" T="string" Class="pl-4 pr-4" @bind-Value=Model.Title @bind-Value:after=OnInputsChanged></MudTextField>
<MudTextField For="@(() => Model.Title)" Required=true Placeholder="Archive Item Title" T="string" Class="pl-4 pr-4" @bind-Value=Model.Title @bind-Value:after=OnInputsChanged></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Numbering</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Enter a unique ID for this entry</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField For="@(() => Model.ArtifactNumber)" Placeholder="Numbering" T="string" @bind-Value=Model.ArtifactNumber @bind-Value:after=OnInputsChanged/>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Item Description</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField Lines=8 Placeholder="Description" T="string" Class="pl-4 pr-4" @bind-Value=Model.Description @bind-Value:after=OnInputsChanged></MudTextField>
<MudTextField For="@(() => Model.Description)" Lines=8 Placeholder="Description" T="string" Class="pl-4 pr-4" @bind-Value=Model.Description @bind-Value:after=OnInputsChanged></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Storage Location</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete T="string" Label="Storage Location" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.StorageLocation @bind-Value:after=OnInputsChanged SearchFunc="SearchStorageLocation" CoerceValue=true></MudAutocomplete>
<MudAutocomplete For="@(() => Model.StorageLocation)" T="string" Label="Storage Location" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.StorageLocation @bind-Value:after=OnInputsChanged SearchFunc="Helpers.SearchStorageLocation" CoerceValue=true></MudAutocomplete>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Type</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete T="string" Label="Artifact Type" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.ArtifactType @bind-Value:after=OnInputsChanged SearchFunc="SearchItemTypes" CoerceValue=true></MudAutocomplete>
<MudAutocomplete For="@(() => Model.Type)" T="string" Label="Artifact Type" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.Type @bind-Value:after=OnInputsChanged SearchFunc="Helpers.SearchItemTypes" CoerceValue=true></MudAutocomplete>
@* Tags entry *@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Tags</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref="@_tagsChipContainer" @bind-Items="Model.Tags">
<InputContent>
<MudAutocomplete
T="string"
OnInternalInputChanged="OnInputsChanged"
SearchFunc="SearchTags"
Value="_tagsInputValue"
ValueChanged="OnTagsInputTextChanged"
OnKeyDown="@(ev => HandleChipContainerEnter<string>(ev, _tagsChipContainer, _tagsInputValue, () => _tagsInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Tags..."
ShowProgressIndicator="true">
<MudAutocomplete T="string"
OnInternalInputChanged="OnInputsChanged"
SearchFunc="Helpers.SearchTags"
Value="_tagsInputValue"
ValueChanged="OnTagsInputTextChanged"
OnKeyDown="@(ev => HandleChipContainerEnter<string>(ev, _tagsChipContainer, _tagsInputValue, () => _tagsInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Tags..."
ShowProgressIndicator="true"
>
</MudAutocomplete>
</InputContent>
</ChipContainer>
</ChipContainer>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Listed Names</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Enter any names of the people associated with this entry.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref=_listedNamesChipContainer>
<ChipContainer T="string" @ref=_listedNamesChipContainer @bind-Items="Model.ListedNames">
<InputContent>
<MudAutocomplete
T="string"
SearchFunc="SearchListedNames"
OnInternalInputChanged="OnInputsChanged"
Value="_listedNamesInputValue"
ValueChanged="OnListedNamesTextChanged"
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _listedNamesChipContainer, _listedNamesInputValue, () => _listedNamesInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Listed Names..."
ShowProgressIndicator=true>
<MudAutocomplete T="string"
SearchFunc="Helpers.SearchListedNames"
OnInternalInputChanged="OnInputsChanged"
Value="_listedNamesInputValue"
ValueChanged="OnListedNamesTextChanged"
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _listedNamesChipContainer, _listedNamesInputValue, () => _listedNamesInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Listed Names..."
ShowProgressIndicator=true>
</MudAutocomplete>
</InputContent>
</ChipContainer>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Associated Dates</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="DateTime" @ref="_assocaitedDatesChipContainer" DisplayFunc="date=>date.ToShortDateString()">
<ChipContainer T="DateTime" @ref="_assocaitedDatesChipContainer" @bind-Items="Model.AssociatedDates" DisplayFunc="date => date.ToShortDateString()">
<InputContent>
<MudDatePicker @bind-Date=_associatedDateInputValue>
</MudDatePicker>
</InputContent>
<SubmitButton>
<MudButton
Color="Color.Primary"
OnClick="HandleAssociatedDateChipContainerAdd">+</MudButton>
<MudButton Color="Color.Primary"
OnClick="HandleAssociatedDateChipContainerAdd">+</MudButton>
</SubmitButton>
</ChipContainer>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Defects</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref=_defectsChipContainer>
<ChipContainer T="string" @ref=_defectsChipContainer @bind-Items="Model.Defects">
<InputContent>
<MudAutocomplete
T="string"
SearchFunc="SearchDefects"
OnInternalInputChanged="OnInputsChanged"
Value="_defectsInputValue"
ValueChanged="OnDefectsValueChanged"
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _defectsChipContainer, _defectsInputValue, () => _defectsInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Defects..."
ShowProgressIndicator=true>
<MudAutocomplete T="string"
SearchFunc="Helpers.SearchDefects"
OnInternalInputChanged="OnInputsChanged"
Value="_defectsInputValue"
ValueChanged="OnDefectsValueChanged"
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _defectsChipContainer, _defectsInputValue, () => _defectsInputValue = string.Empty))"
CoerceValue=true
Placeholder="Add Defects..."
ShowProgressIndicator=true>
</MudAutocomplete>
</InputContent>
</ChipContainer>
@@ -93,17 +125,16 @@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Related Artifacts</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Tag this entry with the identifier of any other entry to link them.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="ArtifactGrouping" @ref="_assocaitedArtifactsChipContainer" DisplayFunc="artifact => artifact.ArtifactGroupingIdentifier">
<ChipContainer T="ArtifactEntry" @ref="_assocaitedArtifactsChipContainer" @bind-Items="Model.RelatedArtifacts" DisplayFunc="artifact => artifact.ArtifactIdentifier">
<InputContent>
<MudAutocomplete
T="ArtifactGrouping"
OnInternalInputChanged="OnInputsChanged"
Value="_associatedArtifactValue"
ValueChanged="OnAssociatedArtifactChanged"
OnKeyDown="@(EventArgs=>HandleChipContainerEnter<ArtifactGrouping>(EventArgs, _assocaitedArtifactsChipContainer, _associatedArtifactValue, () => _associatedArtifactValue = null))"
CoerceValue="false"
Placeholder="Link artifact groupings..."
ShowProgressIndicator=true>
<MudAutocomplete T="ArtifactEntry"
OnInternalInputChanged="OnInputsChanged"
Value="_associatedArtifactValue"
ValueChanged="OnAssociatedArtifactChanged"
OnKeyDown="@(EventArgs=>HandleChipContainerEnter<ArtifactEntry>(EventArgs, _assocaitedArtifactsChipContainer, _associatedArtifactValue, () => _associatedArtifactValue = null))"
CoerceValue="false"
Placeholder="Link artifact groupings..."
ShowProgressIndicator=true>
</MudAutocomplete>
</InputContent>
</ChipContainer>
@@ -111,24 +142,35 @@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Text Contents</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Input the text transcription of the words on the artifact if applicable to aid the search engine.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField T="string" Value=_artifactTextContent ValueChanged="OnArtifactTextContentChanged"></MudTextField>
<MudTextField T="string"
Value=_artifactTextContent
ValueChanged="OnArtifactTextContentChanged"
Lines="5"
For="@(() => Model.FileTextContent)"></MudTextField>
<MudText Typo=Typo.h6 Color="Color.Primary">Additional files</MudText>
<UploadDropBox FilesUploaded="OnFilesUploaded"></UploadDropBox>
</MudPaper>
@inject IArtifactDefectProvider DefectsProvider;
@inject IArtifactStorageLocationProvider StorageLocationProvider;
@inject IArchiveEntryTagProvider TagsProvider;
@inject IArtifactTypeProvider TypesProvider;
@inject IListedNameProvider ListedNameProvider;
@code {
[Parameter]
public required FilePathListing FilePath { get; set; }
public required FilePathListing MainFilePath { get; set; }
[Parameter]
public EventCallback OnValueChanged { get; set; }
public EventCallback<ArtifactEntryValidationModel> ModelChanged { get; set; }
[Parameter]
public required ArtifactEntryValidationModel Model { get; set; } = new(){StorageLocation="hello", Title="Hello"};
public EventCallback InputsChanged { get; set; }
[Parameter]
public required ArtifactEntryValidationModel Model { get; set; } = new() { StorageLocation = "hello", Title = "Hello" };
[Parameter]
public required int ArtifactEntryIndex {get; set;}
[Parameter]
public EventCallback<int> OnEntryDeletedClicked { get; set; }
private ChipContainer<string> _tagsChipContainer;
@@ -146,49 +188,86 @@
private string _defectsInputValue = "";
private ChipContainer<ArtifactGrouping> _assocaitedArtifactsChipContainer;
private ChipContainer<ArtifactEntry> _assocaitedArtifactsChipContainer;
private ArtifactGrouping? _associatedArtifactValue = null;
private ArtifactEntry? _associatedArtifactValue = null;
private string _artifactTextContent = "";
public Task OnInputsChanged()
public bool IsValid { get; set; }
public List<ValidationResult> ValidationResults { get; private set; } = [];
public async Task OnInputsChanged()
{
return OnValueChanged.InvokeAsync();
// 1. Clear previous validation errors
ValidationResults.Clear();
var validationContext = new ValidationContext(Model);
// 2. Run the validator
IsValid = Validator.TryValidateObject(Model, validationContext, ValidationResults, validateAllProperties: true);
// 3. REMOVE this line. Let the parent's update trigger the re-render.
// StateHasChanged();
await InputsChanged.InvokeAsync();
}
private async Task OnFilesUploaded(List<FilePathListing> filePathListings)
{
if (MainFilePath is not null)
{
Model.Files = [MainFilePath];
} else
{
Model.Files = [];
}
Model.Files.AddRange(filePathListings);
}
private async Task OnFilesCleared()
{
if (MainFilePath is not null) {
Model.Files = [MainFilePath];
} else
{
Model.Files = [];
}
}
private Task OnDefectsValueChanged(string text)
{
_defectsInputValue = text;
return OnValueChanged.InvokeAsync();
return ModelChanged.InvokeAsync(Model);
}
private Task OnTagsInputTextChanged(string text)
{
_tagsInputValue = text;
return OnValueChanged.InvokeAsync();
return ModelChanged.InvokeAsync(Model);
}
private Task OnListedNamesTextChanged(string text)
{
_listedNamesInputValue = text;
return OnValueChanged.InvokeAsync();
return ModelChanged.InvokeAsync(Model);
}
private Task OnAssociatedArtifactChanged(ArtifactGrouping grouping)
private Task OnAssociatedArtifactChanged(ArtifactEntry grouping)
{
if (grouping is not null)
{
_associatedArtifactValue = grouping;
return OnValueChanged.InvokeAsync();
return ModelChanged.InvokeAsync(Model);
}
return OnValueChanged.InvokeAsync();
return ModelChanged.InvokeAsync(Model);
}
private Task OnArtifactTextContentChanged(string value)
{
return OnValueChanged.InvokeAsync();
Model.FileTextContent = value;
return ModelChanged.InvokeAsync(Model);
}
public async Task HandleChipContainerEnter<Type>(KeyboardEventArgs args, ChipContainer<Type> container, Type value, Action resetInputAction)
@@ -198,7 +277,7 @@
await container.AddItem(value);
resetInputAction?.Invoke();
StateHasChanged();
await OnValueChanged.InvokeAsync();
await ModelChanged.InvokeAsync(Model);
}
}
@@ -206,84 +285,17 @@
{
if (_associatedDateInputValue is not null)
{
await _assocaitedDatesChipContainer.AddItem((DateTime)_associatedDateInputValue);
DateTime unspecifiedDate = (DateTime)_associatedDateInputValue;
DateTime utcDate = DateTime.SpecifyKind(unspecifiedDate, DateTimeKind.Utc);
await _assocaitedDatesChipContainer.AddItem(utcDate);
_associatedDateInputValue = default;
}
}
private async Task<IEnumerable<string>> SearchDefects(string value, CancellationToken cancellationToken)
private async Task OnDeleteEntryClicked(MouseEventArgs args)
{
List<string> defects;
if (string.IsNullOrEmpty(value))
{
defects = new((await DefectsProvider.Top(25) ?? []).Select(prop => prop.Description));
}
else
{
defects = new((await DefectsProvider.Search(value) ?? []).Select(prop => prop.Description));
}
return defects;
}
private async Task<IEnumerable<string>> SearchStorageLocation(string value, CancellationToken cancellationToken)
{
List<string> storageLocations;
if (string.IsNullOrEmpty(value))
{
storageLocations = new((await StorageLocationProvider.Top(25) ?? []).Select(prop => prop.Location));
}
else
{
storageLocations = new((await StorageLocationProvider.Search(value) ?? []).Select(prop => prop.Location));
}
return storageLocations;
}
private async Task<IEnumerable<string>> SearchTags(string value, CancellationToken cancellationToken)
{
List<string> tags;
if (string.IsNullOrEmpty(value))
{
tags = new((await TagsProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
tags = new((await TagsProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return tags;
}
private async Task<IEnumerable<string>> SearchItemTypes(string value, CancellationToken cancellationToken)
{
List<string> itemTypes;
if (string.IsNullOrEmpty(value))
{
itemTypes = new((await TypesProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
itemTypes = new((await TypesProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return itemTypes;
}
private async Task<IEnumerable<string>> SearchListedNames(string value, CancellationToken cancellationToken)
{
List<string> names;
if (string.IsNullOrEmpty(value))
{
names = new((await ListedNameProvider.Top(25) ?? []).Select(prop=>$"{prop.FirstName} {prop.LastName}"));
}
else
{
names = new((await ListedNameProvider.Search(value) ?? []).Select(prop=>$"{prop.FirstName} {prop.LastName}"));
}
return names;
await OnEntryDeletedClicked.InvokeAsync(ArtifactEntryIndex);
}
}

View File

@@ -0,0 +1,125 @@
<MudDataGrid
T="ArtifactGroupingRowElement"
MultiSelection=true
Items="ArtifactGroupingRows"
Filterable=false
SelectOnRowClick=true
@ref=@DataGrid>
<ToolBarContent>
<MudButton
Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="OnDeleteClicked">Delete</MudButton>
</ToolBarContent>
<Columns>
<SelectColumn T="ArtifactGroupingRowElement"/>
<PropertyColumn
Title="Id"
Property="x=>x.ArtifactGroupingIdentifier"
Filterable="false"/>
<PropertyColumn
Title="Category"
Property="x=>x.CategoryName"
Filterable="false"/>
<PropertyColumn
Title="Title"
Property="x=>x.Title"
Filterable="false"/>
<PropertyColumn
Title="Publically Visible"
Property="x=>x.IsPublicallyVisible"
Filterable="false"/>
<TemplateColumn Title="Edit">
<CellTemplate>
<MudIconButton
Color="Color.Primary"
Icon="@Icons.Material.Filled.Edit"
Variant="Variant.Filled"
OnClick="() => OnRowEditClick(context.Item)">Edit</MudIconButton>
</CellTemplate>
</TemplateColumn>
</Columns>
<PagerContent>
<MudDataGridPager T="ArtifactGroupingRowElement"/>
</PagerContent>
</MudDataGrid>
@inject IArtifactGroupingProvider GroupingProvider;
@inject IDialogService DialogService;
@inject IArtifactGroupingProvider GroupingProvider;
@code
{
public List<ArtifactGroupingRowElement> ArtifactGroupingRows { get; set; } = new();
public MudDataGrid<ArtifactGroupingRowElement> DataGrid { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
// Load inital data
List<ArtifactGrouping> groupings = await GroupingProvider.GetGroupingsPaged(1, 25);
SetGroupingRows(groupings);
await base.OnInitializedAsync();
StateHasChanged();
}
private void SetGroupingRows(IEnumerable<ArtifactGrouping> groupings)
{
ArtifactGroupingRows.Clear();
foreach (var grouping in groupings)
{
ArtifactGroupingRows.Add(new ArtifactGroupingRowElement()
{
ArtifactGroupingIdentifier=grouping.ArtifactGroupingIdentifier ?? throw new ArgumentNullException(nameof(grouping), "Got a null grouping identifier"),
CategoryName=grouping.Category.Name,
Title=grouping.Title,
IsPublicallyVisible=grouping.IsPublicallyVisible,
Id=grouping.Id
}
);
}
}
private void OnRowEditClick(ArtifactGroupingRowElement row)
{
throw new NotImplementedException();
}
private async Task OnDeleteClicked(MouseEventArgs args)
{
HashSet<ArtifactGroupingRowElement> selected = DataGrid.SelectedItems;
bool? confirmed = await DialogService.ShowMessageBox
(
new MessageBoxOptions(){
Message=$"Are you sure you want to delete {selected.Count} groupings?",
Title="Delete Groupings",
CancelText="Cancel",
YesText="Delete"
});
if (confirmed is not null && (confirmed ?? throw new ArgumentNullException("confirmed was null")))
{
foreach (var grouping in selected)
{
await GroupingProvider.DeleteGroupingAsync(grouping.Id);
StateHasChanged();
}
}
}
}

View File

@@ -0,0 +1,316 @@
using Microsoft.EntityFrameworkCore;
using OpenArchival.DataAccess;
namespace OpenArchival.Blazor;
public class ArtifactEntrySharedHelpers
{
IArtifactDefectProvider DefectsProvider { get; set; }
IArtifactStorageLocationProvider StorageLocationProvider { get; set; }
IArchiveEntryTagProvider TagsProvider { get; set; }
IArtifactTypeProvider TypesProvider { get; set; }
IListedNameProvider ListedNameProvider { get; set; }
IDbContextFactory<ApplicationDbContext> DbContextFactory { get; set; }
public ArtifactEntrySharedHelpers(IArtifactDefectProvider defectsProvider, IArtifactStorageLocationProvider storageLocationProvider, IArchiveEntryTagProvider tagsProvider, IArtifactTypeProvider typesProvider, IListedNameProvider listedNamesProvider, IDbContextFactory<ApplicationDbContext> contextFactory)
{
DefectsProvider = defectsProvider;
StorageLocationProvider = storageLocationProvider;
TagsProvider = tagsProvider;
TypesProvider = typesProvider;
ListedNameProvider = listedNamesProvider;
DbContextFactory = contextFactory;
}
public async Task<IEnumerable<string>> SearchDefects(string value, CancellationToken cancellationToken)
{
List<string> defects;
if (string.IsNullOrEmpty(value))
{
defects = new((await DefectsProvider.Top(25) ?? []).Select(prop => prop.Description));
}
else
{
defects = new((await DefectsProvider.Search(value) ?? []).Select(prop => prop.Description));
}
return defects;
}
public async Task<IEnumerable<string>> SearchStorageLocation(string value, CancellationToken cancellationToken)
{
List<string> storageLocations;
if (string.IsNullOrEmpty(value))
{
storageLocations = new((await StorageLocationProvider.Top(25) ?? []).Select(prop => prop.Location));
}
else
{
storageLocations = new((await StorageLocationProvider.Search(value) ?? []).Select(prop => prop.Location));
}
return storageLocations;
}
public async Task<IEnumerable<string>> SearchTags(string value, CancellationToken cancellationToken)
{
List<string> tags;
if (string.IsNullOrEmpty(value))
{
tags = new((await TagsProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
tags = new((await TagsProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return tags;
}
public async Task<IEnumerable<string>> SearchItemTypes(string value, CancellationToken cancellationToken)
{
List<string> itemTypes;
if (string.IsNullOrEmpty(value))
{
itemTypes = new((await TypesProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
itemTypes = new((await TypesProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return itemTypes;
}
public async Task<IEnumerable<string>> SearchListedNames(string value, CancellationToken cancellationToken)
{
List<ListedName> names;
if (string.IsNullOrEmpty(value))
{
names = new((await ListedNameProvider.Top(25) ?? []));
}
else
{
names = new((await ListedNameProvider.Search(value) ?? []));
}
return names.Select(p => p.Value);
}
public async Task OnGroupingPublished(ArtifactGroupingValidationModel model)
{
await using var context = await DbContextFactory.CreateDbContextAsync();
var grouping = model.ToArtifactGrouping();
// Caches to track entities processed within this transaction
var processedFilePaths = new Dictionary<string, FilePathListing>();
var processedLocations = new Dictionary<string, ArtifactStorageLocation>();
var processedTags = new Dictionary<string, ArtifactEntryTag>();
var processedDefects = new Dictionary<string, ArtifactDefect>();
var processedTypes = new Dictionary<string, ArtifactType>();
var processedNames = new Dictionary<string, ListedName>();
// Process File Paths for each entry first
foreach (var entry in grouping.ChildArtifactEntries)
{
if (entry.Files is { Count: > 0 })
{
var correctedFileList = new List<FilePathListing>();
foreach (var fileListing in entry.Files)
{
var path = fileListing.Path;
if (string.IsNullOrWhiteSpace(path)) continue;
if (processedFilePaths.TryGetValue(path, out var trackedFile))
{
correctedFileList.Add(trackedFile);
}
else
{
var existingFile = await context.ArtifactFilePaths
.FirstOrDefaultAsync(f => f.Path == path);
if (existingFile != null)
{
correctedFileList.Add(existingFile);
processedFilePaths[path] = existingFile;
}
else
{
correctedFileList.Add(fileListing);
processedFilePaths[path] = fileListing;
}
}
}
entry.Files = correctedFileList;
}
}
// Process all other related entities for each entry
foreach (var entry in grouping.ChildArtifactEntries)
{
// Attach entry to its parent grouping
entry.ArtifactGrouping = grouping;
// --- Process Storage Location ---
var locationName = entry.StorageLocation?.Location;
if (!string.IsNullOrWhiteSpace(locationName))
{
if (processedLocations.TryGetValue(locationName, out var trackedLocation))
{
entry.StorageLocation = trackedLocation;
}
else
{
var existingLocation = await context.ArtifactStorageLocations
.FirstOrDefaultAsync(l => l.Location == locationName);
if (existingLocation != null)
{
entry.StorageLocation = existingLocation;
processedLocations[locationName] = existingLocation;
}
else
{
processedLocations[locationName] = entry.StorageLocation;
}
}
}
// --- Process Tags ---
if (entry.Tags is { Count: > 0 })
{
var correctedTagList = new List<ArtifactEntryTag>();
foreach (var tag in entry.Tags)
{
var tagName = tag.Name;
if (string.IsNullOrWhiteSpace(tagName)) continue;
if (processedTags.TryGetValue(tagName, out var trackedTag))
{
correctedTagList.Add(trackedTag);
}
else
{
var existingTag = await context.ArtifactEntryTags.FirstOrDefaultAsync(t => t.Name == tagName);
if (existingTag != null)
{
correctedTagList.Add(existingTag);
processedTags[tagName] = existingTag;
}
else
{
correctedTagList.Add(tag);
processedTags[tagName] = tag;
}
}
}
entry.Tags = correctedTagList;
}
// --- Process Defects ---
if (entry.Defects is { Count: > 0 })
{
var correctedDefectList = new List<ArtifactDefect>();
foreach (var defect in entry.Defects)
{
var defectDesc = defect.Description;
if (string.IsNullOrWhiteSpace(defectDesc)) continue;
if (processedDefects.TryGetValue(defectDesc, out var trackedDefect))
{
correctedDefectList.Add(trackedDefect);
}
else
{
var existingDefect = await context.ArtifactDefects.FirstOrDefaultAsync(d => d.Description == defectDesc);
if (existingDefect != null)
{
correctedDefectList.Add(existingDefect);
processedDefects[defectDesc] = existingDefect;
}
else
{
correctedDefectList.Add(defect);
processedDefects[defectDesc] = defect;
}
}
}
entry.Defects = correctedDefectList;
}
// --- Process Types ---
if (entry.Type is not null)
{
var typeName = entry.Type.Name;
if (!string.IsNullOrWhiteSpace(typeName))
{
if (processedTypes.TryGetValue(typeName, out var trackedType))
{
entry.Type = trackedType;
}
else
{
var existingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == typeName);
if (existingType != null)
{
entry.Type = existingType;
processedTypes[typeName] = existingType;
}
else
{
processedTypes[typeName] = entry.Type;
}
}
}
}
// --- Process Listed Names ---
if (entry.ListedNames is { Count: > 0 })
{
var correctedNameList = new List<ListedName>();
foreach (var name in entry.ListedNames)
{
var nameValue = name.Value;
if (string.IsNullOrWhiteSpace(nameValue)) continue;
if (processedNames.TryGetValue(nameValue, out var trackedName))
{
correctedNameList.Add(trackedName);
}
else
{
var existingName = await context.ArtifactAssociatedNames
.FirstOrDefaultAsync(n => n.Value == nameValue);
if (existingName != null)
{
correctedNameList.Add(existingName);
processedNames[nameValue] = existingName;
}
else
{
correctedNameList.Add(name);
processedNames[nameValue] = name;
}
}
}
entry.ListedNames = correctedNameList;
}
}
if (grouping.Category != null && grouping.Category.Id > 0)
{
context.Attach(grouping.Category);
}
// Add the entire graph. EF Core will correctly handle new vs. existing entities.
context.ArtifactGroupings.Add(grouping);
await context.SaveChangesAsync();
}
}

View File

@@ -1,37 +0,0 @@
using System.ComponentModel.DataAnnotations;
using OpenArchival.DataAccess;
namespace OpenArchival.Blazor;
public class ArchiveItemValidationModel
{
[Required(ErrorMessage = "A category is required", AllowEmptyStrings = false)]
public string Category { get; set; } = "";
[Required(ErrorMessage = "An item identifier is required", AllowEmptyStrings = false)]
public List<IdentifierFieldValidationModel> IdentifierFields { get; set; } = new();
public string Identifier { get; set; } = "";
[Required(ErrorMessage = "An item title is required", AllowEmptyStrings = false)]
public string Title { get; set; } = "";
public string? Description { get; set; }
public string? StorageLocation { get; set; }
public string? ArtifactType { get; set; }
public List<string> Tags { get; set; } = new();
public List<string> AssociatedNames { get; set; } = new();
public List<DateTime> AssociatedDates { get; set; } = new();
public List<string> Defects { get; set; } = new();
public List<string> RelatedArtifacts { get; set; } = new();
public bool IsPublic { get; set; } = true;
}

View File

@@ -4,19 +4,19 @@ using Microsoft.IdentityModel.Tokens;
using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations;
public class ArtifactEntryValidationModel : IValidatableObject
public class ArtifactEntryValidationModel
{
[Required(AllowEmptyStrings = false, ErrorMessage = "An artifact numbering must be supplied")]
public string? ArtifactNumber { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "A title must be provided")]
public required string Title { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public string? Type { get; set; }
public required string? StorageLocation { get; set; }
public string? StorageLocation { get; set; }
public List<string>? Tags { get; set; } = [];
@@ -28,22 +28,70 @@ public class ArtifactEntryValidationModel : IValidatableObject
public List<string>? Links { get; set; } = [];
public string? ArtifactType { get; set; }
public List<FilePathListing>? Files { get; set; } = [];
public Dictionary<string, string>? FileTextContent { get; set; } = [];
public string? FileTextContent { get; set; }
public List<ArtifactEntry> RelatedArtifacts { get; set; } = [];
/*
public IEnumerable<ValidationResult> Validate(ValidationContext context)
{
if (Links.IsNullOrEmpty() && Files.IsNullOrEmpty())
{
yield return new ValidationResult(
"Either uploaded files or add content links",
new[] {nameof(Links), nameof(Files)}
);
}
}
}
*/
public bool IsPublicallyVisible { get; set; }
public ArtifactEntry ToArtifactEntry(ArtifactGrouping? parent = null)
{
List<ArtifactEntryTag> tags = new();
if (Tags is not null)
{
foreach (var tag in Tags)
{
tags.Add(new ArtifactEntryTag() { Name = tag });
}
}
List<ArtifactDefect> defects = new();
foreach (var defect in Defects)
{
defects.Add(new ArtifactDefect() { Description=defect});
}
var entry = new ArtifactEntry()
{
Files = Files,
Type = new DataAccess.ArtifactType() { Name = Type },
ArtifactNumber = ArtifactNumber,
AssociatedDates = AssociatedDates,
Defects = defects,
Links = Links,
StorageLocation = null,
Description = Description,
FileTextContent = FileTextContent,
IsPubliclyVisible = IsPublicallyVisible,
Tags = tags,
Title = Title,
ArtifactGrouping = parent,
RelatedTo = RelatedArtifacts,
};
List<ListedName> listedNames = new();
foreach (var name in ListedNames)
{
listedNames.Add(new ListedName() { ParentArtifactEntry=entry, Value=name});
}
entry.ListedNames = listedNames;
if (!string.IsNullOrEmpty(StorageLocation))
{
entry.StorageLocation = new ArtifactStorageLocation() { Location = StorageLocation };
}
return entry;
}
}

View File

@@ -1,14 +1,76 @@
using OpenArchival.DataAccess;
using Microsoft.IdentityModel.Tokens;
using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations;
namespace OpenArchival.Blazor;
public class ArtifactGroupingValidationModel
public class ArtifactGroupingValidationModel : IValidatableObject
{
public required ArchiveCategory Category { get; set; }
[Required(ErrorMessage = "A grouping title is required.")]
public string? Title { get; set; }
public List<string>? IdentifierFieldValues { get; set; }
[Required(ErrorMessage = "A grouping description is required.")]
public string? Description { get; set; }
public List<ArtifactEntryValidationModel>? ArtifactEntries { get; set; }
[Required(ErrorMessage = "A type is required.")]
public string? Type { get; set; }
public ArchiveCategory? Category { get; set; }
public List<IdentifierFieldValidationModel> IdentifierFieldValues { get; set; } = new();
public List<ArtifactEntryValidationModel> ArtifactEntries { get; set; } = new();
public bool IsPublicallyVisible { get; set; }
public ArtifactGrouping ToArtifactGrouping()
{
IdentifierFields identifierFields = new();
identifierFields.Values = IdentifierFieldValues.Select(p => p.Value).ToList();
List<ArtifactEntry> entries = [];
foreach (var entry in ArtifactEntries)
{
entries.Add(entry.ToArtifactEntry());
}
var grouping = new ArtifactGrouping()
{
Title = Title,
Description = Description,
Category = Category,
IdentifierFields = identifierFields,
IsPublicallyVisible = true,
ChildArtifactEntries = entries,
Type = Type
};
// Create the parent link
foreach (var entry in grouping.ChildArtifactEntries)
{
entry.ArtifactGrouping = grouping;
}
return grouping;
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var entry in ArtifactEntries)
{
var context = new ValidationContext(entry);
var validationResult = new List<ValidationResult>();
bool valid = Validator.TryValidateObject(entry, context, validationResult);
foreach (var result in validationResult)
{
yield return result;
}
}
if (ArtifactEntries.IsNullOrEmpty())
{
yield return new ValidationResult("Must upload one or more files");
}
}
}

View File

@@ -1,14 +1,28 @@
@using Microsoft.EntityFrameworkCore;
@using MudBlazor.Interfaces
@page "/categorieslist"
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h6">Categories</MudText>
<MudDivider></MudDivider>
<MudList T="string">
<MudDivider Class="mb-2"></MudDivider>
<MudList T="string" Clickable="true">
@foreach (ArchiveCategory category in _categories)
{
<MudListItem Text=@category.Name OnClick="@(() => OnCategoryItemClicked(category))"></MudListItem>
<MudListItem OnClick="@(() => OnCategoryItemClicked(category))">
@category.Name
@if (ShowDeleteButton)
{
<MudListItemMeta ActionPosition="ActionPosition.End">
<MudIconButton
Icon="@Icons.Material.Filled.Delete"
Color="Color.Error"
Size="Size.Small"
OnClick="@((e) => HandleDeleteClick(category))"
/>
</MudListItemMeta>
}
</MudListItem>
}
</MudList>
@ChildContent
@@ -21,41 +35,47 @@
[Parameter]
public RenderFragment ChildContent { get; set; } = default!;
private List<ArchiveCategory> _categories = new();
[Parameter]
public bool ShowDeleteButton { get; set; } = false;
[Parameter]
public EventCallback<ArchiveCategory> ListItemClickedCallback { get; set; }
[Parameter]
public EventCallback<ArchiveCategory> OnDeleteClickedCallback { get; set; }
private List<ArchiveCategory> _categories = new();
protected override async Task OnInitializedAsync()
{
await LoadCategories();
}
private async Task LoadCategories()
{
var categories = await CategoryProvider.GetAllArchiveCategories();
if (categories is null)
{
Logger.LogError("There were no categories in the database when attempting to load the list of categories.");
_categories.Clear();
return;
}
_categories.AddRange(categories);
_categories = categories.ToList();
}
public async Task RefreshData()
{
_categories.Clear();
var categories = await CategoryProvider.GetAllArchiveCategories();
if (categories is null)
{
Logger.LogError("There were no categories in the database when attempting to load the list of categories.");
return;
}
_categories.AddRange(categories);
await LoadCategories();
StateHasChanged();
}
protected async Task OnCategoryItemClicked(ArchiveCategory category)
private async Task OnCategoryItemClicked(ArchiveCategory category)
{
await ListItemClickedCallback.InvokeAsync(category);
}
private async Task HandleDeleteClick(ArchiveCategory category)
{
await OnDeleteClickedCallback.InvokeAsync(category);
}
}

View File

@@ -77,6 +77,7 @@
[Parameter]
public string OriginalName { get; set; } = string.Empty;
private MudForm _form = default!;
private string FormatPreview { get; set; } = string.Empty;

View File

@@ -0,0 +1,22 @@
namespace OpenArchival.Blazor;
public class ArtifactGroupingRowElement
{
public required int Id { get; set; }
public required string ArtifactGroupingIdentifier { get; set; }
public required string CategoryName { get; set; }
public required string Title { get; set; }
public bool IsPublicallyVisible { get; set; }
public override bool Equals(object? o)
{
var other = o as ArtifactGroupingRowElement;
return other?.Id == Id;
}
public override int GetHashCode() => Id.GetHashCode();
}

View File

@@ -1,13 +1,18 @@
@page "/categories"
@using Microsoft.EntityFrameworkCore
@using OpenArchival.DataAccess;
@inject IDialogService DialogService
@inject IArchiveCategoryProvider CategoryProvider;
@inject ArchiveDbContext Context;
@inject IDbContextFactory<ApplicationDbContext> DbContextFactory;
@inject ILogger<ViewAddCategoriesComponent> Logger;
<CategoriesListComponent @ref=_categoriesListComponent ListItemClickedCallback="ShowFilledDialog">
<CategoriesListComponent
@ref=_categoriesListComponent
ListItemClickedCallback="ShowFilledDialog"
ShowDeleteButton=true
OnDeleteClickedCallback="DeleteCategory">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnAddClick">Add Category</MudButton>
</CategoriesListComponent>
@@ -15,6 +20,17 @@
@code {
CategoriesListComponent _categoriesListComponent = default!;
private async Task DeleteCategory(ArchiveCategory category)
{
// 1. Show a confirmation dialog (recommended)
var confirmed = await DialogService.ShowMessageBox("Confirm", $"Delete {category.Name}?", yesText:"Delete", cancelText:"Cancel");
if (confirmed != true) return;
await CategoryProvider.DeleteCategoryAsync(category);
await _categoriesListComponent.RefreshData();
StateHasChanged();
}
private async Task ShowFilledDialog(ArchiveCategory category)
{
CategoryValidationModel validationModel = CategoryValidationModel.FromArchiveCategory(category);
@@ -36,7 +52,9 @@
CategoryValidationModel model = (CategoryValidationModel)result.Data;
CategoryValidationModel.UpdateArchiveValidationModel(model, category);
await Context.SaveChangesAsync();
await using var context = await DbContextFactory.CreateDbContextAsync();
await context.SaveChangesAsync();
StateHasChanged();
await _categoriesListComponent.RefreshData();
@@ -50,8 +68,13 @@
var result = await dialog.Result;
if (result is not null && !result.Canceled && _categoriesListComponent is not null)
if (result is not null && !result.Canceled && _categoriesListComponent is not null && result.Data is not null)
{
await using var context = await DbContextFactory.CreateDbContextAsync();
CategoryValidationModel model = (CategoryValidationModel)result.Data;
context.ArchiveCategories.Add(CategoryValidationModel.ToArchiveCategory(model));
await context.SaveChangesAsync();
StateHasChanged();
await _categoriesListComponent.RefreshData();
}

View File

@@ -2,8 +2,8 @@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
@*@attribute [Authorize]*@
@attribute [Authorize(Roles = "Admin")]
<PageTitle>Auth</PageTitle>

View File

@@ -1,9 +0,0 @@
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace OpenArchival.Blazor.Data
{
public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : IdentityDbContext<ApplicationUser>(options)
{
}
}

View File

@@ -1,10 +0,0 @@
using Microsoft.AspNetCore.Identity;
namespace OpenArchival.Blazor.Data
{
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser
{
}
}

View File

@@ -1,279 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OpenArchival.Blazor.Data;
using System;
#nullable disable
namespace OpenArchival.Blazor.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("00000000000000_CreateIdentitySchema")]
partial class CreateIdentitySchema
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OpenArchival.Blazor.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderKey")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("RoleId")
.HasColumnType("nvarchar(450)");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.Property<string>("Value")
.HasColumnType("nvarchar(max)");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,276 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OpenArchival.Blazor.Data;
using System;
#nullable disable
namespace OpenArchival.Blazor.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OpenArchival.Blazor.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderKey")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("RoleId")
.HasColumnType("nvarchar(450)");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.Property<string>("Value")
.HasColumnType("nvarchar(max)");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -12,7 +12,6 @@
<PackageReference Include="CodeBeam.MudExtensions" Version="6.3.0" />
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.*" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.*" />

View File

@@ -2,49 +2,61 @@ using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using MudBlazor.Services;
using OpenArchival.Blazor;
using OpenArchival.Blazor.Components;
using OpenArchival.Blazor.Components.Account;
using OpenArchival.Blazor.Data;
using Dapper;
using Npgsql;
using OpenArchival.DataAccess;
using Microsoft.IdentityModel.Tokens;
using OpenArchival.Blazor.Components.Account;
using MyAppName.WebApp.Components.Account;
var builder = WebApplication.CreateBuilder(args);
// Add MudBlazor services
builder.Services.AddMudServices();
// Add services to the container.
// --- UI Services ---
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddMudServices();
builder.Services.AddMudExtensions();
var postgresConnectionString = builder.Configuration.GetConnectionString("PostgresConnection");
builder.Services.AddDbContextFactory<ArchiveDbContext>
(
options => options.UseNpgsql(postgresConnectionString)
);
// --- Database & Identity Configuration ---
// Get the single connection string for your PostgreSQL database.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddOptions<FileUploadOptions>().Bind(builder.Configuration.GetSection(FileUploadOptions.Key));
// Use AddDbContextFactory for Blazor Server. This is safer for managing DbContext lifecycles.
// This single ApplicationDbContext will handle both Identity and your application data.
builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
options.UseNpgsql(connectionString));
var uploadSettings = builder.Configuration.GetSection(FileUploadOptions.Key).Get<FileUploadOptions>();
if (uploadSettings is null)
{
throw new ArgumentNullException(nameof(uploadSettings), $"The provided {nameof(FileUploadOptions)} did not have a max upload size.");
}
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddServerSideBlazor().AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = uploadSettings.MaxUploadSizeBytes;
});
// Configure Identity to use ApplicationDbContext, which is now pointed at PostgreSQL.
builder.Services.AddIdentityCore<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped<IdentityUserAccessor>();
builder.Services.AddScoped<IdentityRedirectManager>();
builder.Services.AddScoped<AuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider>();
builder.Services.AddSingleton<IEmailSender<ApplicationUser>, IdentityNoOpEmailSender>();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
// --- File Upload Configuration ---
builder.Services.AddOptions<FileUploadOptions>().Bind(builder.Configuration.GetSection(FileUploadOptions.Key));
var uploadSettings = builder.Configuration.GetSection(FileUploadOptions.Key).Get<FileUploadOptions>() ?? throw new ArgumentNullException("FileUploadOptions");
builder.Services.AddServerSideBlazor().AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = uploadSettings.MaxUploadSizeBytes;
});
// --- Custom Application Services ---
builder.Services.AddScoped<IArchiveCategoryProvider, ArchiveCategoryProvider>();
builder.Services.AddScoped<IFilePathListingProvider, FilePathListingProvider>();
builder.Services.AddScoped<IArtifactStorageLocationProvider, ArtifactStorageLocationProvider>();
@@ -52,30 +64,28 @@ builder.Services.AddScoped<IArtifactDefectProvider, ArtifactDefectProvider>();
builder.Services.AddScoped<IArtifactTypeProvider, ArtifactTypeProvider>();
builder.Services.AddScoped<IArchiveEntryTagProvider, ArchiveEntryTagProvider>();
builder.Services.AddScoped<IListedNameProvider, ListedNameProvider>();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddIdentityCore<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddSingleton<IEmailSender<ApplicationUser>, IdentityNoOpEmailSender>();
builder.Services.AddScoped<ArtifactEntrySharedHelpers>();
builder.Services.AddScoped<IArtifactGroupingProvider, ArtifactGroupingProvider>();
builder.Services.AddLogging();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var serviceProvider = scope.ServiceProvider;
try
{
await IdentityDataSeeder.SeedRolesAndAdminUserAsync(serviceProvider);
}
catch (Exception ex)
{
// Log errors or handle them as needed
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
}
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
@@ -84,38 +94,16 @@ if (app.Environment.IsDevelopment())
else
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
// Add additional endpoints required by the Identity /Account Razor components.
app.MapAdditionalIdentityEndpoints();
await InitializeDatabaseAsync(app.Services);
async Task InitializeDatabaseAsync(IServiceProvider services)
{
using var scope = services.CreateScope();
var serviceProvider = scope.ServiceProvider;
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
var categoryProvider = serviceProvider.GetRequiredService<IArchiveCategoryProvider>();
// await categoryProvider.CreateCategoryAsync(new ArchiveCategory {Name="Yearbooks", Description="This is a description", FieldSeparator="-", FieldNames = [], FieldDescriptions = [] });
}
app.Run();
//TODO: Periodic clean of the uploaded files to prune ones not in the database

View File

@@ -1,6 +1,6 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-OpenArchival.Blazor-2bdd9108-567b-4b19-b97f-47edace03070;Trusted_Connection=True;MultipleActiveResultSets=true",
"DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=",
"PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password="
},
"Logging": {

View File

@@ -11,7 +11,6 @@
"CodeBeam.MudExtensions": "6.3.0",
"Dapper": "2.1.66",
"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "9.0.8",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.SqlServer": "9.0.8",
"Microsoft.EntityFrameworkCore.Tools": "9.0.8",
@@ -1196,14 +1195,7 @@
}
}
},
"System.Formats.Asn1/9.0.8": {
"runtime": {
"lib/net9.0/System.Formats.Asn1.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36511"
}
}
},
"System.Formats.Asn1/9.0.8": {},
"System.IdentityModel.Tokens.Jwt/6.35.0": {
"dependencies": {
"Microsoft.IdentityModel.JsonWebTokens": "6.35.0",
@@ -1314,14 +1306,7 @@
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Text.Json/9.0.8": {
"runtime": {
"lib/net9.0/System.Text.Json.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36511"
}
}
},
"System.Text.Json/9.0.8": {},
"System.Threading.Channels/7.0.0": {},
"System.Threading.Tasks.Extensions/4.5.4": {},
"System.Windows.Extensions/6.0.0": {
@@ -1346,6 +1331,7 @@
"OpenArchival.DataAccess/1.0.0": {
"dependencies": {
"EntityFramework": "6.5.1",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Npgsql": "9.0.3",

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"ContentRoots":["E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","E:\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}
{"ContentRoots":["D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

View File

@@ -9,9 +9,10 @@
"OpenArchival.DataAccess/1.0.0": {
"dependencies": {
"EntityFramework": "6.5.1",
"Microsoft.EntityFrameworkCore": "9.0.7",
"Microsoft.EntityFrameworkCore.Design": "9.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.Design": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Npgsql": "9.0.3",
"Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.4"
},
@@ -46,6 +47,37 @@
}
}
},
"Microsoft.AspNetCore.Cryptography.Internal/9.0.8": {
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Cryptography.Internal.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.AspNetCore.Cryptography.KeyDerivation/9.0.8": {
"dependencies": {
"Microsoft.AspNetCore.Cryptography.Internal": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Cryptography.KeyDerivation.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.AspNetCore.Identity.EntityFrameworkCore/9.0.8": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Microsoft.Extensions.Identity.Stores": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll": {
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"runtime": {
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
@@ -288,7 +320,7 @@
"Microsoft.Build.Framework": "17.8.3",
"Microsoft.CodeAnalysis.Common": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0",
"System.Text.Json": "9.0.7"
"System.Text.Json": "9.0.8"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": {
@@ -343,30 +375,30 @@
}
},
"Microsoft.CSharp/4.7.0": {},
"Microsoft.EntityFrameworkCore/9.0.7": {
"Microsoft.EntityFrameworkCore/9.0.8": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.7",
"Microsoft.EntityFrameworkCore.Analyzers": "9.0.7",
"Microsoft.Extensions.Caching.Memory": "9.0.7",
"Microsoft.Extensions.Logging": "9.0.7"
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.8",
"Microsoft.EntityFrameworkCore.Analyzers": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.dll": {
"assemblyVersion": "9.0.7.0",
"fileVersion": "9.0.725.31607"
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36802"
}
}
},
"Microsoft.EntityFrameworkCore.Abstractions/9.0.7": {
"Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
"assemblyVersion": "9.0.7.0",
"fileVersion": "9.0.725.31607"
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36802"
}
}
},
"Microsoft.EntityFrameworkCore.Analyzers/9.0.7": {},
"Microsoft.EntityFrameworkCore.Design/9.0.7": {
"Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {},
"Microsoft.EntityFrameworkCore.Design/9.0.8": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.Build.Framework": "17.8.3",
@@ -374,140 +406,166 @@
"Microsoft.CodeAnalysis.CSharp": "4.8.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0",
"Microsoft.EntityFrameworkCore.Relational": "9.0.7",
"Microsoft.Extensions.Caching.Memory": "9.0.7",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
"Microsoft.Extensions.DependencyModel": "9.0.7",
"Microsoft.Extensions.Logging": "9.0.7",
"Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
"Microsoft.Extensions.DependencyModel": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8",
"Mono.TextTemplating": "3.0.0",
"System.Text.Json": "9.0.7"
"System.Text.Json": "9.0.8"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": {
"assemblyVersion": "9.0.7.0",
"fileVersion": "9.0.725.31607"
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36802"
}
}
},
"Microsoft.EntityFrameworkCore.Relational/9.0.7": {
"Microsoft.EntityFrameworkCore.Relational/9.0.8": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.7",
"Microsoft.Extensions.Caching.Memory": "9.0.7",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
"Microsoft.Extensions.Logging": "9.0.7"
"Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": {
"assemblyVersion": "9.0.7.0",
"fileVersion": "9.0.725.31607"
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36802"
}
}
},
"Microsoft.Extensions.Caching.Abstractions/9.0.7": {
"Microsoft.Extensions.Caching.Abstractions/9.0.8": {
"dependencies": {
"Microsoft.Extensions.Primitives": "9.0.7"
"Microsoft.Extensions.Primitives": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Caching.Memory/9.0.7": {
"Microsoft.Extensions.Caching.Memory/9.0.8": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "9.0.7",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
"Microsoft.Extensions.Logging.Abstractions": "9.0.7",
"Microsoft.Extensions.Options": "9.0.7",
"Microsoft.Extensions.Primitives": "9.0.7"
"Microsoft.Extensions.Caching.Abstractions": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
"Microsoft.Extensions.Options": "9.0.8",
"Microsoft.Extensions.Primitives": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Configuration.Abstractions/9.0.7": {
"Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
"dependencies": {
"Microsoft.Extensions.Primitives": "9.0.7"
"Microsoft.Extensions.Primitives": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.DependencyInjection/9.0.7": {
"Microsoft.Extensions.DependencyInjection/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.7": {
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
"runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.DependencyModel/9.0.7": {
"Microsoft.Extensions.DependencyModel/9.0.8": {
"runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "9.0.0.7",
"fileVersion": "9.0.725.31616"
"assemblyVersion": "9.0.0.8",
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Logging/9.0.7": {
"Microsoft.Extensions.Identity.Core/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.7",
"Microsoft.Extensions.Logging.Abstractions": "9.0.7",
"Microsoft.Extensions.Options": "9.0.7"
"Microsoft.AspNetCore.Cryptography.KeyDerivation": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8",
"Microsoft.Extensions.Options": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Identity.Core.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Extensions.Identity.Stores/9.0.8": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "9.0.8",
"Microsoft.Extensions.Identity.Core": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Identity.Stores.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Extensions.Logging/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.8",
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
"Microsoft.Extensions.Options": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Logging.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/9.0.7": {
"Microsoft.Extensions.Logging.Abstractions/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Options/9.0.7": {
"Microsoft.Extensions.Options/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
"Microsoft.Extensions.Primitives": "9.0.7"
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Microsoft.Extensions.Primitives": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
"Microsoft.Extensions.Primitives/9.0.7": {
"Microsoft.Extensions.Primitives/9.0.8": {
"runtime": {
"lib/net9.0/Microsoft.Extensions.Primitives.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616"
"fileVersion": "9.0.825.36511"
}
}
},
@@ -546,7 +604,7 @@
},
"Npgsql/9.0.3": {
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "9.0.7"
"Microsoft.Extensions.Logging.Abstractions": "9.0.8"
},
"runtime": {
"lib/net8.0/Npgsql.dll": {
@@ -557,8 +615,8 @@
},
"Npgsql.EntityFrameworkCore.PostgreSQL/9.0.4": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.7",
"Microsoft.EntityFrameworkCore.Relational": "9.0.7",
"Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Npgsql": "9.0.3"
},
"runtime": {
@@ -773,7 +831,7 @@
}
},
"System.Security.Principal.Windows/4.7.0": {},
"System.Text.Json/9.0.7": {},
"System.Text.Json/9.0.8": {},
"System.Threading.Channels/7.0.0": {},
"System.Windows.Extensions/6.0.0": {
"dependencies": {
@@ -816,6 +874,27 @@
"path": "humanizer.core/2.14.1",
"hashPath": "humanizer.core.2.14.1.nupkg.sha512"
},
"Microsoft.AspNetCore.Cryptography.Internal/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NwGO0wh/IjEthBLGA6fWfIiftsNF/paA5RxWp6ji4wWazetJgQ4truR9nU2thAzzFLiXqlg8vGjdVDA8bHu0zA==",
"path": "microsoft.aspnetcore.cryptography.internal/9.0.8",
"hashPath": "microsoft.aspnetcore.cryptography.internal.9.0.8.nupkg.sha512"
},
"Microsoft.AspNetCore.Cryptography.KeyDerivation/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gK70xxXYwwPiXYKYVmLYMuIO5EOGrRtQghmM6PkgtZ/0lgLEjIs//xgSLvZkV/mroNHA1DEqTcqscEj9OzZ1IA==",
"path": "microsoft.aspnetcore.cryptography.keyderivation/9.0.8",
"hashPath": "microsoft.aspnetcore.cryptography.keyderivation.9.0.8.nupkg.sha512"
},
"Microsoft.AspNetCore.Identity.EntityFrameworkCore/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-z4q9roxXMQePwFM5tXXZS5sKkU78yYXVkj56NYYx9xKe+mxGkJMV1MaO0GFE6HnnM8bE3Xxhs0hAPw2jKbse6w==",
"path": "microsoft.aspnetcore.identity.entityframeworkcore/9.0.8",
"hashPath": "microsoft.aspnetcore.identity.entityframeworkcore.9.0.8.nupkg.sha512"
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"type": "package",
"serviceable": true,
@@ -886,110 +965,124 @@
"path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore/9.0.7": {
"Microsoft.EntityFrameworkCore/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PbD0q5ax15r91jD4TN7xbDCjldZSz4JfpYN4ZZjAkWeUyROkV92Ydg0O2/1keFA+2u3KPsDkJMmBKv2zQ06ZVg==",
"path": "microsoft.entityframeworkcore/9.0.7",
"hashPath": "microsoft.entityframeworkcore.9.0.7.nupkg.sha512"
"sha512": "sha512-bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==",
"path": "microsoft.entityframeworkcore/9.0.8",
"hashPath": "microsoft.entityframeworkcore.9.0.8.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Abstractions/9.0.7": {
"Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YUXNerEkCf4OANO+zjuMznpUW7R8XxSCqmBfYhBrbrJVc09i84KkNgeUTaOUXCGogSK/3d7ORRhMqfUobnejBg==",
"path": "microsoft.entityframeworkcore.abstractions/9.0.7",
"hashPath": "microsoft.entityframeworkcore.abstractions.9.0.7.nupkg.sha512"
"sha512": "sha512-B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==",
"path": "microsoft.entityframeworkcore.abstractions/9.0.8",
"hashPath": "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Analyzers/9.0.7": {
"Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HqiPjAvjVOsyA1svnjL81/Wk2MRQYMK/lxKVWvw0f5IcA//VcxBepVSAqe7CFirdsPXqe8rFKEwZROWZTz7Jqw==",
"path": "microsoft.entityframeworkcore.analyzers/9.0.7",
"hashPath": "microsoft.entityframeworkcore.analyzers.9.0.7.nupkg.sha512"
"sha512": "sha512-2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==",
"path": "microsoft.entityframeworkcore.analyzers/9.0.8",
"hashPath": "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Design/9.0.7": {
"Microsoft.EntityFrameworkCore.Design/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zvZ2/bRwdPrBfQ2fRd2IQL6icyIOtosZSz2QpXtsn7M+c6e4GvpNfpSxBprLfoKhH6NeAFNV9ool0Vp/1DJd/A==",
"path": "microsoft.entityframeworkcore.design/9.0.7",
"hashPath": "microsoft.entityframeworkcore.design.9.0.7.nupkg.sha512"
"sha512": "sha512-02e8OcoumSUAES3VkXrMT9EnNCUKWJoifn5+8fFEbAtRhKL3xg2a/Mj6rsAUGF7tkYFox6oKzJCn0jbm6b8Lbw==",
"path": "microsoft.entityframeworkcore.design/9.0.8",
"hashPath": "microsoft.entityframeworkcore.design.9.0.8.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Relational/9.0.7": {
"Microsoft.EntityFrameworkCore.Relational/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Yo5joquG7L79H5BhtpqP8apu+KFOAYfvmj0dZnVkPElBY14wY5qva0SOcrDWzYw5BrJrhIArfCcJCJHBvMYiKg==",
"path": "microsoft.entityframeworkcore.relational/9.0.7",
"hashPath": "microsoft.entityframeworkcore.relational.9.0.7.nupkg.sha512"
"sha512": "sha512-OVhfyxiHxMvYpwQ8Jy3YZi4koy6TK5/Q7C1oq3z6db+HEGuu6x9L1BX5zDIdJxxlRePMyO4D8ORiXj/D7+MUqw==",
"path": "microsoft.entityframeworkcore.relational/9.0.8",
"hashPath": "microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Abstractions/9.0.7": {
"Microsoft.Extensions.Caching.Abstractions/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-30necCQehcg9lFkMEIE7HczcoYGML8GUH6jlincA18d896fLZM9wl5tpTPJHgzANQE/6KXRLZSWbgevgg5csSw==",
"path": "microsoft.extensions.caching.abstractions/9.0.7",
"hashPath": "microsoft.extensions.caching.abstractions.9.0.7.nupkg.sha512"
"sha512": "sha512-4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==",
"path": "microsoft.extensions.caching.abstractions/9.0.8",
"hashPath": "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/9.0.7": {
"Microsoft.Extensions.Caching.Memory/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nDu6c8fwrHQYccLnWnvyElrdkL3rZ97TZNqL+niMFUcApVBHdpDmKcRvciGymJ4Y0iLDTOo5J2XhDQEbNb+dFg==",
"path": "microsoft.extensions.caching.memory/9.0.7",
"hashPath": "microsoft.extensions.caching.memory.9.0.7.nupkg.sha512"
"sha512": "sha512-grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==",
"path": "microsoft.extensions.caching.memory/9.0.8",
"hashPath": "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/9.0.7": {
"Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lut/kiVvNsQ120VERMUYSFhpXPpKjjql+giy03LesASPBBcC0o6+aoFdzJH9GaYpFTQ3fGVhVjKjvJDoAW5/IQ==",
"path": "microsoft.extensions.configuration.abstractions/9.0.7",
"hashPath": "microsoft.extensions.configuration.abstractions.9.0.7.nupkg.sha512"
"sha512": "sha512-yNou2KM35RvzOh4vUFtl2l33rWPvOCoba+nzEDJ+BgD8aOL/jew4WPCibQvntRfOJ2pJU8ARygSMD+pdjvDHuA==",
"path": "microsoft.extensions.configuration.abstractions/9.0.8",
"hashPath": "microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/9.0.7": {
"Microsoft.Extensions.DependencyInjection/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==",
"path": "microsoft.extensions.dependencyinjection/9.0.7",
"hashPath": "microsoft.extensions.dependencyinjection.9.0.7.nupkg.sha512"
"sha512": "sha512-JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==",
"path": "microsoft.extensions.dependencyinjection/9.0.8",
"hashPath": "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.7": {
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew==",
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.7",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.7.nupkg.sha512"
"sha512": "sha512-xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/9.0.7": {
"Microsoft.Extensions.DependencyModel/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aXEt8QW1Fj9aC81GfkMtfip4wfbkEA7VBvNkx6Rx6ZKyqXIF/9qzRtH6v/2096IDK4lt6dlQp5Ajf+kjHfUdOA==",
"path": "microsoft.extensions.dependencymodel/9.0.7",
"hashPath": "microsoft.extensions.dependencymodel.9.0.7.nupkg.sha512"
"sha512": "sha512-3CW02zNjyqJ2eORo8Zkznpw6+QvK+tYUKZgKuKuAIYdy73TRFvpaqCwYws1k6/lMSJ7ZqABfWn0/wa5bRsIJ4w==",
"path": "microsoft.extensions.dependencymodel/9.0.8",
"hashPath": "microsoft.extensions.dependencymodel.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Logging/9.0.7": {
"Microsoft.Extensions.Identity.Core/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==",
"path": "microsoft.extensions.logging/9.0.7",
"hashPath": "microsoft.extensions.logging.9.0.7.nupkg.sha512"
"sha512": "sha512-giUYz84GHAizDucZp5vWAusDO2s9Jrrg2jQ6HUQNGs5HQMKJVobLPMQSiyg8R4yecH0pIc0QjANh0B/Kw13BHA==",
"path": "microsoft.extensions.identity.core/9.0.8",
"hashPath": "microsoft.extensions.identity.core.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/9.0.7": {
"Microsoft.Extensions.Identity.Stores/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==",
"path": "microsoft.extensions.logging.abstractions/9.0.7",
"hashPath": "microsoft.extensions.logging.abstractions.9.0.7.nupkg.sha512"
"sha512": "sha512-sycaHcq78yI591+KxEdd53a7pJGQEl9H/wDsFkaPNE9g7loyq8vufPcc/9RH3KlGt5joR5Ey7PdoRSrlLjCgJg==",
"path": "microsoft.extensions.identity.stores/9.0.8",
"hashPath": "microsoft.extensions.identity.stores.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Options/9.0.7": {
"Microsoft.Extensions.Logging/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==",
"path": "microsoft.extensions.options/9.0.7",
"hashPath": "microsoft.extensions.options.9.0.7.nupkg.sha512"
"sha512": "sha512-Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==",
"path": "microsoft.extensions.logging/9.0.8",
"hashPath": "microsoft.extensions.logging.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/9.0.7": {
"Microsoft.Extensions.Logging.Abstractions/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ==",
"path": "microsoft.extensions.primitives/9.0.7",
"hashPath": "microsoft.extensions.primitives.9.0.7.nupkg.sha512"
"sha512": "sha512-pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==",
"path": "microsoft.extensions.logging.abstractions/9.0.8",
"hashPath": "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Options/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==",
"path": "microsoft.extensions.options/9.0.8",
"hashPath": "microsoft.extensions.options.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==",
"path": "microsoft.extensions.primitives/9.0.8",
"hashPath": "microsoft.extensions.primitives.9.0.8.nupkg.sha512"
},
"Microsoft.Win32.Registry/4.7.0": {
"type": "package",
@@ -1187,12 +1280,12 @@
"path": "system.security.principal.windows/4.7.0",
"hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512"
},
"System.Text.Json/9.0.7": {
"System.Text.Json/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-u/lN2FEEXs3ghj2ta8tWA4r2MS9Yni07K7jDmnz8h1UPDf0lIIIEMkWx383Zz4fJjJio7gDl+00RYuQ/7R8ZQw==",
"path": "system.text.json/9.0.7",
"hashPath": "system.text.json.9.0.7.nupkg.sha512"
"sha512": "sha512-mIQir9jBqk0V7X0Nw5hzPJZC8DuGdf+2DS3jAVsr6rq5+/VyH5rza0XGcONJUWBrZ+G6BCwNyjWYd9lncBu48A==",
"path": "system.text.json/9.0.8",
"hashPath": "system.text.json.9.0.8.nupkg.sha512"
},
"System.Threading.Channels/7.0.0": {
"type": "package",

View File

@@ -1,6 +1,6 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-OpenArchival.Blazor-2bdd9108-567b-4b19-b97f-47edace03070;Trusted_Connection=True;MultipleActiveResultSets=true",
"DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=",
"PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password="
},
"Logging": {

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+57f67e85356af6759fc0211e8a510bd5b9f63dfa")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dd3968f6effa8f45f27a3ec91c34762c88380f06")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
a1b35575568c1043399b569538c23ee93b0a3fde5462a39aaab68b815fa02e10
4cb1f71ab75baefd50d4cf23fe890ca9a8c7d28dbae39628ffdc79e6bcb2fe49

View File

@@ -20,241 +20,261 @@ build_property.MudAllowedAttributePattern =
build_property.MudAllowedAttributeList =
build_property.RootNamespace = OpenArchival.Blazor
build_property.RootNamespace = OpenArchival.Blazor
build_property.ProjectDir = E:\Open-Archival\OpenArchival.Blazor\
build_property.ProjectDir = D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = E:\Open-Archival\OpenArchival.Blazor
build_property.MSBuildProjectDirectory = D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 9.0
build_property.EnableCodeStyleSeverity =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/AccessDenied.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/AccessDenied.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEFjY2Vzc0RlbmllZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmail.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmail.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmailChange.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmailChange.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbENoYW5nZS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ExternalLogin.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ExternalLogin.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEV4dGVybmFsTG9naW4ucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPassword.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPasswordConfirmation.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPasswordConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidPasswordReset.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidPasswordReset.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRQYXNzd29yZFJlc2V0LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidUser.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidUser.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRVc2VyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Lockout.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Lockout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvY2tvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Login.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Login.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWith2fa.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWith2fa.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aDJmYS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWithRecoveryCode.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWithRecoveryCode.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aFJlY292ZXJ5Q29kZS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ChangePassword.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ChangePassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDaGFuZ2VQYXNzd29yZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/DeletePersonalData.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Component.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDb21wb25lbnQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Component1.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDb21wb25lbnQxLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/DeletePersonalData.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEZWxldGVQZXJzb25hbERhdGEucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Disable2fa.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Disable2fa.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEaXNhYmxlMmZhLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Email.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Email.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbWFpbC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/EnableAuthenticator.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/EnableAuthenticator.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbmFibGVBdXRoZW50aWNhdG9yLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ExternalLogins.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ExternalLogins.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFeHRlcm5hbExvZ2lucy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/GenerateRecoveryCodes.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/GenerateRecoveryCodes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxHZW5lcmF0ZVJlY292ZXJ5Q29kZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Index.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Index.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxJbmRleC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/PersonalData.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/PersonalData.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxQZXJzb25hbERhdGEucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ResetAuthenticator.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ResetAuthenticator.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxSZXNldEF1dGhlbnRpY2F0b3IucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/SetPassword.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/SetPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxTZXRQYXNzd29yZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/TwoFactorAuthentication.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/TwoFactorAuthentication.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxUd29GYWN0b3JBdXRoZW50aWNhdGlvbi5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/_Imports.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Register.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Register.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/RegisterConfirmation.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/RegisterConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResendEmailConfirmation.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResendEmailConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2VuZEVtYWlsQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPassword.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPasswordConfirmation.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPasswordConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmRDb25maXJtYXRpb24ucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/_Imports.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXF9JbXBvcnRzLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ExternalLoginPicker.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ExternalLoginPicker.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxFeHRlcm5hbExvZ2luUGlja2VyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageLayout.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VMYXlvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageNavMenu.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageNavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VOYXZNZW51LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/RedirectToLogin.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/RedirectToLogin.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxSZWRpcmVjdFRvTG9naW4ucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ShowRecoveryCodes.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ShowRecoveryCodes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTaG93UmVjb3ZlcnlDb2Rlcy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/StatusMessage.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/StatusMessage.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTdGF0dXNNZXNzYWdlLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/App.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/ChipContainer.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/ChipContainer.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXENoaXBDb250YWluZXIucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/UploadDropBox.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/UploadDropBox.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXFVwbG9hZERyb3BCb3gucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Layout/MainLayout.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Layout/NavMenu.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddArchiveGroupingComponent.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveConfiguration.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlQ29uZmlndXJhdGlvbi5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddArchiveGroupingComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQWRkQXJjaGl2ZUdyb3VwaW5nQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveEntryCreatorCard.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddGroupingDialog.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQWRkR3JvdXBpbmdEaWFsb2cucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveEntryCreatorCard.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQXJjaGl2ZUVudHJ5Q3JlYXRvckNhcmQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/Component.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveGroupingsTable.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQXJjaGl2ZUdyb3VwaW5nc1RhYmxlLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/Component.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/IdentifierTextBox.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/IdentifierTextBox.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcSWRlbnRpZmllclRleHRCb3gucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoriesListComponent.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoriesListComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3JpZXNMaXN0Q29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryCreatorDialog.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryCreatorDialog.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5Q3JlYXRvckRpYWxvZy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryFieldCardComponent.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryFieldCardComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5RmllbGRDYXJkQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/ViewAddCategoriesComponent.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/ViewAddCategoriesComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXFZpZXdBZGRDYXRlZ29yaWVzQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Auth.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Auth.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBdXRoLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Counter.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Counter.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xDb3VudGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Error.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Error.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Home.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Home.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Weather.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Weather.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xXZWF0aGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Routes.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/_Imports.razor]
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =

View File

@@ -1 +1 @@
326eba80d7bb6026e445989e7f52bb482aaae70f7db3f2ee6b6719c19b6c0c05
f4fe04d3a83dd960d50ee00632d4977ca7b08f3452ea570cd998617e1803dd8a

View File

@@ -621,3 +621,407 @@ E:\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcorea
E:\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.AssemblyReference.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rpswa.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfoInputs.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfo.cs
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.CoreCompileInputs.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.MvcApplicationPartsAssemblyInfo.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.sourcelink.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.exe
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.Development.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.runtime.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.exe
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.deps.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.runtimeconfig.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Core.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Identity.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CodeBeam.MudExtensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CsvHelper.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Dapper.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.SqlServer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Humanizer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Authorization.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Forms.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Web.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.Internal.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.KeyDerivation.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Metadata.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Bcl.AsyncInterfaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Build.Locator.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Design.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Relational.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.SqlServer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Memory.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Options.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Primitives.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.Extensions.Msal.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.JsonWebTokens.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Logging.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Tokens.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.JSInterop.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.SqlServer.Server.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Win32.SystemEvents.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Mono.TextTemplating.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\MudBlazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.DependencyInjection.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.ClientModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.CodeDom.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.AttributedModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Convention.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Hosting.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Runtime.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.TypedParts.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Configuration.ConfigurationManager.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.IdentityModel.Tokens.Jwt.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Memory.Data.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Runtime.Caching.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Permissions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Windows.Extensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Runtime.Caching.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjimswa.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.Blazor.styles.css
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\24gzn4tg1a-qz4batx9cb.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\stwk5nfoxp-loe7cozwzj.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\uorc1pfmvs-2jeq8efc6q.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.development.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArch.17AC99BC.Up2Date
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\refint\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.genruntimeconfig.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\ref\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.AssemblyReference.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rpswa.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.GeneratedMSBuildEditorConfig.editorconfig
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfoInputs.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfo.cs
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.CoreCompileInputs.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.MvcApplicationPartsAssemblyInfo.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.sourcelink.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.exe
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.Development.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.runtime.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.exe
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.deps.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.runtimeconfig.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Core.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Identity.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CodeBeam.MudExtensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CsvHelper.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Dapper.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.SqlServer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Humanizer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Authorization.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Forms.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Web.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.Internal.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.KeyDerivation.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Metadata.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Bcl.AsyncInterfaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Build.Locator.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Design.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Relational.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.SqlServer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Memory.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Configuration.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Options.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Primitives.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.Extensions.Msal.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.JsonWebTokens.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Logging.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Tokens.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.JSInterop.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.SqlServer.Server.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Win32.SystemEvents.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Mono.TextTemplating.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\MudBlazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.DependencyInjection.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.ClientModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.CodeDom.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.AttributedModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Convention.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Hosting.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Runtime.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.TypedParts.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Configuration.ConfigurationManager.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.IdentityModel.Tokens.Jwt.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Memory.Data.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Runtime.Caching.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Cryptography.ProtectedData.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Permissions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Windows.Extensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcoreapp2.1\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Runtime.Caching.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjimswa.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.Blazor.styles.css
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\24gzn4tg1a-qz4batx9cb.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\stwk5nfoxp-loe7cozwzj.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\uorc1pfmvs-2jeq8efc6q.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.development.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArch.17AC99BC.Up2Date
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\refint\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.genruntimeconfig.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\ref\OpenArchival.Blazor.dll

View File

@@ -1 +1 @@
d0a6fb3953398680c50cc4e2e3db4a58765accb6a23ced407e2a4d82c5cc4a51
b200e0f0470dd235c3a5cab1b38d5ba8f2e1a42e25a95a84f147aaac078e2328

View File

@@ -1 +1 @@
{"documents":{"E:\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/57f67e85356af6759fc0211e8a510bd5b9f63dfa/*"}}
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/dd3968f6effa8f45f27a3ec91c34762c88380f06/*"}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"1qg6JQFg463JgCFBqLRezrbbwdHDoJB+OfEwITXaNNk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["ykhp/DWRyaBSdvKYr7L99V2ldt2eA0lnPR/Lip\u002BNhdA="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"1qg6JQFg463JgCFBqLRezrbbwdHDoJB+OfEwITXaNNk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["49rrwWjJwaHTHSPL9a1cTI6wS9aWKEroxqNMdQj4hoU="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"dkWMOexH3+NeGsyGUK6gmxmNxkLPrN4n2MYfrYb5il0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","LoW/IbY96JtGVBQwgV4RU9pFIHWXewp133ftl6DKTIw=","mI4dZ32ilpCRzXGr\u002BWVDecoU\u002BVOLgydPqNJjMKHNdu8=","YKnUzOJSqvSXasqB1jpW74SsQF2TZE4fnPjW8aX8jbI=","RcfY8TKyA1fGkS4hI80n1fR8vUz5dHI8Zc/dBJvu/Dk=","atDNp4hCKEseULZJEhQH3J4I9EiuN3SpuYtMQDsK3qQ=","WZx9W1Vc6ZK6luZN471UsIvsu9lGKSsIEeBUar4mozs=","jkoEvaqsPzcTRdVNEMNTwjCJo/gcZcrDlC6559hnQgY=","omASLVx21WFFSIXofN7Mgt4Rbo3oabvr5fzzmsFxMvI=","lXXjxKIMOad\u002Bl8ZQu/DD0THTKOIYNutTzjUThIIU6I0=","QcnomBz1uPYwLGgZDUVATcQ2p1s03wcmM79Fx/DEFoo=","eZdFRuq9u/BpaTxhG0ao3ZFZME\u002B2DnDbMC6X120sClw=","vpHo7ABmLDBlQP55A05Sm1QDxTiMyW9IHvegQ62aO4Q=","nvLUUgeCArCSPNiBODlStpxVtUEYFpG0dUgOi14Lf9s=","u57Wi9KMnMRA2o3jz6BhqXzQVI3Ir3voSgETHjU9yMc=","sbqDm5w5rCBQ4iKkiWrHK8RFLpUzGPpJ8tEfvVVXgnA=","\u002Blhqn0VoTSgHLY5Q3qRYaIUa0LLuHtZUj7HMxrkgMLg=","T/4GaRcxvRhqOKVJuzfuuXiODiKlW8VoV\u002Bue0crYk4k=","nLRCqYrvI071yTq7isfmei\u002B9DS5/1\u002B76YBFTBhf8gy4=","E\u002B11omJsZpkHO3oOSS5YeE1RGv4n0DrDmxhs3vFwhBI=","dacKUiEwlg1CQ1D/IRZhZKHR0iZ1x9W8ngbPFqjiTnM=","0Sxw27xfqSS84Ms6vshV5R17qdwPoUbBG8eN7uAZxHw=","I75wQ9\u002BiQxmcB3r0G9AGuWkFinf\u002B9s21v3ZQ2zT4V5Y=","Z7Wm\u002B96BYhgeyHA1Q9j/eY7hgFXceWxOXETEPQD9DsI=","o5K4y7mf/1cceNZO6PYnHBcNWt39CI9prJwNvX\u002BciE0=","sYXyIiv6lbef57lkXNs6omr9yCdn9x5tSXCEwWS\u002BF5A=","KwPhL\u002BYvbPluoL8a6tMet9W9zrr1RdZOKGnjKt9KTq8=","qHL24jBTHag\u002BbiZmdcXac\u002BqgyCGRVi3GX1Bw/XlOQfg=","5r2410efCavi17uG7UMHBeR4OBgaezsjoa17tLV4rRw=","ilvddDdhFKZTHtbY6gCRxpwbRS4oiHfhPsUmxyJn/fY=","1jrMjSs7jo5Dy6V4PL7yuwmaS/qtkFzOiZQPfKBE9Gk=","SGJjB/IsL\u002B6xg/nPs6/KqtVyCZP3cXrrZ0FtoQiXjNY=","5kDmUAv6mhPhK5BC5OMQpjHRnsyUXmfcVS8fqQUU9Ak=","fL43hMRoVKDnBfjg50t0ipKeHUsl/zc64v2oUtuNb2g=","1vn1NCs4f5X6ZM8Sy9omzlMpC\u002BrIZsWZljtCjpYTNgg=","SKHt0xd1jjo84tjCANhsirvlwYC\u002B\u002ByQbSNrlz6uEOXI=","M0MgfAbpqWWC/ErtHxZoXg\u002B3Zl9JNUnwRZKruy/3s38=","CQYmRgDGkxqs2/haNK16UFZbN1z7d6hqBAfAcZczkZg=","FcngoYMPbhafYeG58adhnkxd/NW\u002B5HWIsiblAAWNDS0=","Qs8rm6/XRjP6R2bRufrwEd4Q9FhG7R9juLX5\u002Bcn8fQ0=","y6FkIKZXBJscZUhLvdVWQnXCG1Zy03oxJtWMk3K85e8=","ileX1upGYxdPFPmcVk99kDNEodZlM46nNVJIomVyl04=","y0pkoLMJfD8WwkEEb5UiCS9/42NXuQ5mZ7rPdLuZzlg=","8Mn8jnlH7fwOMBJc5P09I\u002B3ACWI6A3bD9B9LLxkmGjA=","OXO1xKYd6Ch\u002BTZbTzW/KL1e/6vDOrvsYNIUP\u002BybWUtY=","0MA7NXJNA4T1CzpXSCJCdQ6e5dIHK99Z9JWOVQBTDWw=","boJu4ZFwOZzRw1CZ/DiZCzJ\u002BsIBP/ClQEueVsZQIFtI=","3a/1UMYr3ii3NDaBhUH4AeAmDuBTnPhW6ioY\u002BxllwM0=","BlO0gHIipML9uJhpDBkxR/y8n0yCX6lhEvoQGoALQGw=","WlpAcAYMpG3h/Zk/pKjkknMA2zax0WKb/5I3EkV7w24=","3v2xrFFiX2IOwDLwkF\u002Bzceo7MRr9p1z5ja9vqolxT1g=","z8JhsSAgeJBBd\u002B9k1RT6TkOaBdtIh0Xe1JFsMUDXpX4=","hnqFfzQod\u002Bz5OYgpUfOIEqTkm3YcVMZa8TOvdtf30tY=","Z8CRap3CpUd1M7YVBIqu469P\u002BT4xwnkhyndoTr\u002Bjw1Y=","\u002BdTEUjM4KfQhNtLBonfdtHnT28NuRlxBcJumszRotrs=","/mgp\u002Buq8B6nJX/qBrMeSgxGwpftYq6yD2zMgZUB0JVU=","PAYDq0k\u002BY28zDKXkt/eAzi2Cc1o5tHSqhbZdkngG5tk=","zSQa8aZccQ0dYkljtkW6JXmQojEJlA2iXu1MOo6Db\u002Bg=","173g5Oh2i2VuhQpGAIJawm90Z6pFENG9e7tpkhcSAhI=","W6/1z4FKA65sghio\u002BFjDfEL9Id/D/DuCgcSq6vM0QIw=","BxZABb7by8p04mDwLGbOUD97EVvTyq40iiUPWUOZKdk=","q0ctPBQoqn/xQ\u002BxPmZ44z7DNCVPj/k9bdvyvPsLBkmE="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"w2zJjDlrZF5/5p80zNaW9/DaLrmtiqb1ym05zjQa8AU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"avuMhEtIo3H45UA2svfeTlnXB62DXs+d+NBSO4GjtXA=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","LoW/IbY96JtGVBQwgV4RU9pFIHWXewp133ftl6DKTIw=","mI4dZ32ilpCRzXGr\u002BWVDecoU\u002BVOLgydPqNJjMKHNdu8=","YKnUzOJSqvSXasqB1jpW74SsQF2TZE4fnPjW8aX8jbI=","RcfY8TKyA1fGkS4hI80n1fR8vUz5dHI8Zc/dBJvu/Dk=","atDNp4hCKEseULZJEhQH3J4I9EiuN3SpuYtMQDsK3qQ=","WZx9W1Vc6ZK6luZN471UsIvsu9lGKSsIEeBUar4mozs=","jkoEvaqsPzcTRdVNEMNTwjCJo/gcZcrDlC6559hnQgY=","omASLVx21WFFSIXofN7Mgt4Rbo3oabvr5fzzmsFxMvI=","lXXjxKIMOad\u002Bl8ZQu/DD0THTKOIYNutTzjUThIIU6I0=","QcnomBz1uPYwLGgZDUVATcQ2p1s03wcmM79Fx/DEFoo=","eZdFRuq9u/BpaTxhG0ao3ZFZME\u002B2DnDbMC6X120sClw=","vpHo7ABmLDBlQP55A05Sm1QDxTiMyW9IHvegQ62aO4Q=","nvLUUgeCArCSPNiBODlStpxVtUEYFpG0dUgOi14Lf9s=","u57Wi9KMnMRA2o3jz6BhqXzQVI3Ir3voSgETHjU9yMc=","sbqDm5w5rCBQ4iKkiWrHK8RFLpUzGPpJ8tEfvVVXgnA=","\u002Blhqn0VoTSgHLY5Q3qRYaIUa0LLuHtZUj7HMxrkgMLg=","T/4GaRcxvRhqOKVJuzfuuXiODiKlW8VoV\u002Bue0crYk4k=","nLRCqYrvI071yTq7isfmei\u002B9DS5/1\u002B76YBFTBhf8gy4=","E\u002B11omJsZpkHO3oOSS5YeE1RGv4n0DrDmxhs3vFwhBI=","dacKUiEwlg1CQ1D/IRZhZKHR0iZ1x9W8ngbPFqjiTnM=","0Sxw27xfqSS84Ms6vshV5R17qdwPoUbBG8eN7uAZxHw=","I75wQ9\u002BiQxmcB3r0G9AGuWkFinf\u002B9s21v3ZQ2zT4V5Y=","Z7Wm\u002B96BYhgeyHA1Q9j/eY7hgFXceWxOXETEPQD9DsI=","o5K4y7mf/1cceNZO6PYnHBcNWt39CI9prJwNvX\u002BciE0=","sYXyIiv6lbef57lkXNs6omr9yCdn9x5tSXCEwWS\u002BF5A=","KwPhL\u002BYvbPluoL8a6tMet9W9zrr1RdZOKGnjKt9KTq8=","qHL24jBTHag\u002BbiZmdcXac\u002BqgyCGRVi3GX1Bw/XlOQfg=","5r2410efCavi17uG7UMHBeR4OBgaezsjoa17tLV4rRw=","ilvddDdhFKZTHtbY6gCRxpwbRS4oiHfhPsUmxyJn/fY=","1jrMjSs7jo5Dy6V4PL7yuwmaS/qtkFzOiZQPfKBE9Gk=","SGJjB/IsL\u002B6xg/nPs6/KqtVyCZP3cXrrZ0FtoQiXjNY=","5kDmUAv6mhPhK5BC5OMQpjHRnsyUXmfcVS8fqQUU9Ak=","fL43hMRoVKDnBfjg50t0ipKeHUsl/zc64v2oUtuNb2g=","1vn1NCs4f5X6ZM8Sy9omzlMpC\u002BrIZsWZljtCjpYTNgg=","SKHt0xd1jjo84tjCANhsirvlwYC\u002B\u002ByQbSNrlz6uEOXI=","M0MgfAbpqWWC/ErtHxZoXg\u002B3Zl9JNUnwRZKruy/3s38=","CQYmRgDGkxqs2/haNK16UFZbN1z7d6hqBAfAcZczkZg=","FcngoYMPbhafYeG58adhnkxd/NW\u002B5HWIsiblAAWNDS0=","Qs8rm6/XRjP6R2bRufrwEd4Q9FhG7R9juLX5\u002Bcn8fQ0=","y6FkIKZXBJscZUhLvdVWQnXCG1Zy03oxJtWMk3K85e8=","ileX1upGYxdPFPmcVk99kDNEodZlM46nNVJIomVyl04=","y0pkoLMJfD8WwkEEb5UiCS9/42NXuQ5mZ7rPdLuZzlg=","8Mn8jnlH7fwOMBJc5P09I\u002B3ACWI6A3bD9B9LLxkmGjA=","OXO1xKYd6Ch\u002BTZbTzW/KL1e/6vDOrvsYNIUP\u002BybWUtY=","0MA7NXJNA4T1CzpXSCJCdQ6e5dIHK99Z9JWOVQBTDWw=","boJu4ZFwOZzRw1CZ/DiZCzJ\u002BsIBP/ClQEueVsZQIFtI=","3a/1UMYr3ii3NDaBhUH4AeAmDuBTnPhW6ioY\u002BxllwM0=","BlO0gHIipML9uJhpDBkxR/y8n0yCX6lhEvoQGoALQGw=","WlpAcAYMpG3h/Zk/pKjkknMA2zax0WKb/5I3EkV7w24=","3v2xrFFiX2IOwDLwkF\u002Bzceo7MRr9p1z5ja9vqolxT1g=","z8JhsSAgeJBBd\u002B9k1RT6TkOaBdtIh0Xe1JFsMUDXpX4=","hnqFfzQod\u002Bz5OYgpUfOIEqTkm3YcVMZa8TOvdtf30tY=","Z8CRap3CpUd1M7YVBIqu469P\u002BT4xwnkhyndoTr\u002Bjw1Y=","\u002BdTEUjM4KfQhNtLBonfdtHnT28NuRlxBcJumszRotrs=","/mgp\u002Buq8B6nJX/qBrMeSgxGwpftYq6yD2zMgZUB0JVU=","PAYDq0k\u002BY28zDKXkt/eAzi2Cc1o5tHSqhbZdkngG5tk=","zSQa8aZccQ0dYkljtkW6JXmQojEJlA2iXu1MOo6Db\u002Bg=","173g5Oh2i2VuhQpGAIJawm90Z6pFENG9e7tpkhcSAhI=","W6/1z4FKA65sghio\u002BFjDfEL9Id/D/DuCgcSq6vM0QIw=","BxZABb7by8p04mDwLGbOUD97EVvTyq40iiUPWUOZKdk=","q0ctPBQoqn/xQ\u002BxPmZ44z7DNCVPj/k9bdvyvPsLBkmE="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"uX1JeFdFTytYlQPawspOQefa+m0agbesQLMiaeAPgD0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"6yMjsR64sBt4b1B/FqRnEeV1bEtcafo0b0yaBC++2mE=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","niplJBQaN9/7QLiDkRvZHVu70u4FJsVdZ9GE1KT4bR8=","60HBy8v9lxxCHuWCr3jJDU9j7bsT904TCwhmFs7TGkY=","pb5yKz4MIApJ8z39LfutrKPDbuta2BL1E86CmYnkCRM=","rfibCqcCuMtg95N8wJ9faxeZ\u002BulZ8idK/RPugHk0N7w=","rVvFMjo3WlMSYnHYzjofQxtRDAeZkxL1YKbiuDW\u002BAIE=","D/Y5UnmLzNrwms/zmgtFvGFCc229dUY/oNJJCLeAkNc=","UFelDgpodRudHZR5vlGC/4LGvPaAxrkDsFTyg\u002B15E9Y=","AFU\u002BpBvjFNvLokgLHssz2HE6Hx9E43D1Unu3ZBDd68o=","qm8R3ZZIWjEmZy/E62oKWB4PLQEApL2uaiVcq5ZIgY0=","0ejf0klEgjnXfFleA\u002BoRzdXSH4hvhKw0taX/t8CnMoo=","8csUfqhyXzantst7BSF8t7BGEmfrfFodd4ox0WctT2A=","JvwJr76EG9Z0vSdHyFVpVAqoIvYN12WZXm8SugYMnmc=","rEqVehtrDRmc6aJSF\u002Bww7qSldjJz5URv73k8bzhZY9o=","gOW1xMFxBdC23Mj839IPRqScYD\u002BtUBKSeCFxmmgwdK4=","yYsRQLIhV70LQ3eeTl5U2xq/IxuEPWSBrhwd46mpq3M=","3cVv01CI7MHFArgKXF74nEWAT6JduvNBigcKx8KOQMw=","mtfGqmYfBfmVYYdGaol6lQ05xFYc8j0BmSxdNKOIonY=","V6rTdAcVbI3Rfvwl345hHMwYmyIKBQCl9BIY\u002Bl4fuEo=","bwLBFqscvHguV9K/MtD9TvuZKNTW0CmCb3a1Cy2YoWg=","kox6hybxSZPZ1nHLZ\u002BZHVwp6fi9rL\u002BqrqhBST2qIQSk=","fn/VF5C0Enqf7Vx/n7ur46DVx9E8yl3g5uy2gftcsbg=","TrtiUGMK7djB8lByW7WY57K7MYmjqXB\u002BPCzH\u002BO1xF\u002Bw=","ZOtVRtkYy3LVwy1UFRpvnr/3NgNexwdZC9tsTfjZiGs=","bBHpFzqig/CDb2U7DwIJy3/hyvkuIwQGCm8TYMYDMyc=","RBn2eWYEmz0QrZv46WQnL7HVRY3MiywStQxiRl7GMR4=","Rs3dHXp2OhfxF5Z7OSLZTGzw/QE7t9B\u002BGFmLHPWcXrk=","QLqAkoqq5z2wGK5iPFW3fn6u3TFt7\u002BC5qAnl477jTpo=","bdOKTqUHcufFkFxUJHjNLudSteuvHHnHBoseaYICRTI=","g3UMQizRNaXRlkQFLKj19so2GjLYEhR6JzIufABPYwk=","jMYfYW47VV3EoX4MSmAjRrR90I0YQiABdgaUvtwmtAE=","ia8pTl\u002BYfGWeSBvzt4ldj94pr5n2KW\u002BzRhvhvv2nujM=","apUzwxuOx8yhGnPpJ4BDj3ADEM5Mvm64M2jhAEV/fgs=","jJw7OnxWWuf1dJs1hH7yogZz2QAwynOYxHtnweTx/IQ=","9XrljF5y5X5bn\u002Bsa8GSAHYKFjO\u002BUoCe8038mpGr\u002BxCs=","pFpGHYE23\u002BahN1yA8g8QvuZ0VrG9IINmEACu8K\u002BQyNM=","Eb/3JKAKgHy9seB8x0oBVOz\u002BDVvOBUEM78ZA2YASQ\u002Bo=","mhg5XdxVL\u002BpiNyFA9CgZCJVrjdso7toW9OLPqQTTuU8=","KpmhbpEty8U6keVPQdV/jparkL0LZXugZbwejCPDCjE=","BVzSUl6VzDs/dl/DNrGFd\u002BNlu1FHbhbKkE3DJkDkdkY=","Gm0foPVT8/sv3cAV3t2aEn4NOFHYIBRAN1F\u002Bs3UUGf4=","FTcogBQsqYJ9D9vXXU/ebA9bDlLU6i\u002B2Qd3CZkgx9Ts=","91iJEQ6xILwCzXAkwPdag3M9EOOxc3e6wS5M6qUpW6c=","d4inFzKrhtd9A0Au/Zk5YYbginynHGLW4z6y\u002B2PTIjM=","i8t5peOgQqigZk7S8ZKT9O9m3hSohJSqVRVkBphNWsE=","lF3yjKIhcUx18JtlqKMrV4HzQusbqMaojpl48032CeI=","uwHBsoFQnMBHtvg51ZuFUZWbfitdYc6Im3IfWnCQjuQ=","zj8zEoubFtNbO84LSwDWHbQ/8WIuQiNb\u002BpF7X1Y9Flk=","s7jB0ijOxUP3MJGTfR1kBWj6DQE6SfP2kfoyXwQV1N8=","08ECpnuyDFu70Dt3uLn6PfEXYuVo4Kqe71vHRHlZedU=","2uURsoUpwhLUTBWQd\u002BBfn4r\u002Bjl6mepLgmEn0o8Dc2uM=","8k7Aw\u002B3J3e\u002Bge1aI\u002B8boWN48dsiimIrQQd2NMvAkewE=","meEEmo/l/xZRc3trfqCVOi6T5ArwbpH29nzezJEJPvI=","7euOxuz8g9tIfjUEapb9yCJkZ9LKmQGwKzAe31LJwYk=","XWoTp0uk5pRKqhcSJTMrYYQ/EHsOD/PUgQtBAVIAL/E=","61glfHM0cSnFwZtnWZVKwundEG5RCSNPEEG95MYzQ88=","SDA4nIiShrfDQ7xDtLms\u002BjQnVHw6ySVVDfyoRt9afDM=","idR2TEYU5QnXS8g8SXq/9u8dhcB\u002B\u002BNq9V0PI96e00Sg="],"CachedAssets":{"\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=":{"Identity":"E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-07-17T01:32:04+00:00"}},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"XVWMafEhfrS/fg2Zj7asTNqgDrfpiwoMDXnjdP5dMDc=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","S9txWBMkH4Yj1eG2HUPOkUWz9AoQkGdbSfeW8NgN\u002BxE=","o0aea9nqp02517BUOs9/nGaM6H/UnpWWtWAeDomcgV4=","y2dTx6xFkyjAzITP/\u002BSs40MCBm/Tmm7ZOBpI/DqlBFE=","ZmxUJu7Va54dnyLTpPaeb3LXxiTxJP0LRIHL\u002BnuF44c=","cg4n0kRzzWgY2qlZdUwROVqv25x8/QQaCM/NXeXHAm0=","AcEyg5sF\u002BG7h8cTd4OPHIBGSDc58NkKWM9LXnPCts2s=","VFrRe4girF3FRpDOlYSBnVrkOnl76ekWOxNm7mF4t0A=","j9/Tw8fXyMbeynWjJYmY6kJ7FJ59tcwknts73gweoEI=","8d5OfgLy6a4RJsFXKLcxA1egZHtmIKAbps5lBmeNt38=","AaPPr3bR/sBWrgmYgZKKMSIKNbQeqLf310KQRpKnfsI=","5IT4oOrh1c8VH1VjwWuD7ai4PiPBq/13R4tEiY/TSPI=","Czn9tLfHWPwVf9uh/XrNgA6Ks6J9tVB4JwfLegj/ftM=","SphdH4dZI\u002BUI/NAY8yVibP3CY6lMLtHcvNauNjiMUG4=","NuRRqbDGasbzd5BYo0DL2OjUjjh57dbMlAUsJkIwkPM=","yLN/BA9iAut9Pd7HzcSogC02i9ddxjif2fdbbGIUB70=","CPWWJ2Bp2hzILnMJAY673sNfUfm3FZSJEAufT8hMY6E=","2QKOn\u002BHTSGGnvtnKhUgPyG3helsQD0OCrMBMj\u002B7T3lw=","wtIXZYfkJHNxuSRxgTwoC\u002BU59\u002Byk38nSrpBgrm/qiAo=","9b\u002BWZIOTiDlyAbFbG434M0hhY786ENq3Fu7wCA09jUo=","87spKP4vbfUzWbrg4lDHyoNr6kpsnJEK24nTFEP9rck=","/vMoyd2fA4sgtfeJQc7cppdLQDn8TcwztXnss03HUUw=","oNCxGtvhYEhZorlxe3gldEXtD1YdpsMnXGcFwqqeeQw=","Ld9r0/i9fUO7QsnlP7r1KKriqtVDmSx8cLG0in2YMSo=","53lPHr9hM1ATjEpC\u002B2/TXZeAlArG\u002BcTVBOU0rnOCSYY=","XPDTlgt2uSfOwx8b0oKHXnDrOjRanq/v7VC/aAqsKsg=","XA43zdGlmTrdY6wEAYknKYBFN9IztLZ2jSrofw0b6V4=","InYJRKMtWl6vOkkIYW9DWTiLIRhMbWwp/GcLrfgTYhs=","b/\u002BexuVW46WvMaRrT/V89clZeIFOODWEpaVshFcyvdA=","A0ZKYLLhNwY/0fzk/IVDeOqWtMmS3l3OqAUcDcBwc/A=","CVg6HDxR8p\u002BKSy1NlJ3zIKBQvgufzL\u002BppFGICUQ\u002Bt3w=","QIOQB6Fr0POEbCmn8nJHkvxhD/MBJBkLkRbYJLA/IYQ=","JJFYlRoX9pKL3BogzIBb9yD5WmSNP4CS7LqbhDK3ZV0=","m//7eW/q\u002B\u002BS7cLBAJncoxjjMdd4ob9yeVwXyO\u002BUT9eI=","bK\u002BMzz3RPOuZoQyDguWcV6QBHxrg2U2\u002B/bAVZ\u002BgpVmE=","Xo3U/owG8nW3wjViQjnwmTJExAAnQChLevgIL6SxVgs=","SfZ1OYxt3htPAa47uV4vmWa1Bdgc4ieW\u002B9xakLRDHO8=","vzc7efbyllU994SpWhcuSAj24nDhk3qWXXJzCFKhIec=","Hv9au18n6omxvLxP0EsBJ8HeLnUAyfa1Jg4xpVg87no=","adO3IRtQJ9N8t04wKkZwPZiqyI0LJOP6xF/Suhog1JE=","4pzRrv9HLcQeFngePzOiTXUmXw1iRIiKRoSCce0cugM=","ngTcMNcqz/xhWZBn5CPSCOvjsrREr0HuEN5UW941TxA=","M9OQdzerfnWfXeRb3kqjQR22ZEAOhPUxnUuB5YzydL0=","orh0CcK78/TtV1LjA11aYsn/YxKYUBNSni\u002BannRaWeI=","UGiYv\u002B7Q0HlOyGACdO9FzYJXDNFgT/cKO8xYQLlx5eg=","mplxK8c12PonhfXKpL\u002BHRLxWkaWn30SmMhIBChvSCVE=","BiFEtxAeulxzg4093ODVO/hBU6BTvilbCg7luNc0QSk=","DKhaZ5fHA5jhqYZosYg5BHMriRJHTo30JRbiC\u002BOpd3c=","h0g/Fvvw0atLURHfHCthiHIOZpDTYQ3D\u002BxmffXCZTGs=","OX7hVhGLcy1hGsMR9Q6K5e1m9Inuxss\u002B3dBLxzpfxGo=","zSEvxET0DOTN2cpCiXQExXCGOxdoXNvPpmHsUTUhTXM=","ePeQgUMQPfE9ZZdl8jI2rfGshuKKHGpnajQ0M5shZSk=","BZMtXiMXFAikFlU3GpSO4qnu4ytUYCrr\u002BH44xQ0sqVg=","WhBc1hqkyc8177jVvo4eQuWlpHVI96iHm4VFZAOO7Fc=","mcMbV2\u002BNCfk5eAGwoYnsWOyN8b8NuAO7iH1ewAHyW6U=","DcLX4hxLgf7iG7fZIKLj7eUITuiIGEgGnDYTCSAmcII=","nzN2wI8kPPjBRWwSKLalEYmrDXyx2Y8f5S\u002BJCKVFj1o=","3QVdUFr8xuBbDhinUAe\u002BtHZRSDw8whCbedlQRGg3ByU=","Uml6Zk4Nd3yDJrKkoHqxmSCEYTiat3222CyFbAAoU28=","GstRCs2Ap1VD2t\u002BJ6nr0UpVFlKhrBm8Fi9PmSQbgj\u002B8=","sr4sunvZGYlxTk47R8QnORuMVrTEufupLlUwtph8jAE=","fm0hNxD23Xg4KufltLQTxCmPvcM3fZYY\u002B7jlnuLutTc=","DH6X9\u002BUzPeMZmgXVBMIcvPEMbk70kYRRprZcygSB9Q8="],"CachedAssets":{"Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=":{"Identity":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-08-12T18:28:17.583355+00:00"}},"CachedCopyCandidates":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
7UxNhFjzx9q9fjpjqAnwb5kIFP4yRdO/xgX54/7tGJc=
locj772PPuINB/J15NsKtk4cyOwyvBk04k+4hYZqXlQ=

View File

@@ -1 +1 @@
{"ContentRoots":["E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","E:\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}
{"ContentRoots":["D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

View File

@@ -87,3 +87,134 @@ E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json

View File

@@ -1 +0,0 @@
D:\Open-Archival\OpenArchival.Blazor\wwwroot\favicon.ico

Some files were not shown because too many files have changed in this diff Show More