mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-20 13:23:20 -07:00
Merge branch 'DotNetCore' of https://github.com/tidusjar/Ombi into DotNetCore
This commit is contained in:
commit
42d594622d
10 changed files with 70 additions and 62 deletions
|
@ -86,7 +86,7 @@ Search the existing requests to see if your suggestion has already been submitte
|
||||||
|
|
||||||
# Preview
|
# Preview
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
|
|
|
@ -93,9 +93,12 @@ namespace Ombi.Schedule.Jobs.Plex
|
||||||
}
|
}
|
||||||
if (userManagementSettings.DefaultRoles.Any())
|
if (userManagementSettings.DefaultRoles.Any())
|
||||||
{
|
{
|
||||||
|
// Get the new user object to avoid any concurrency failures
|
||||||
|
var dbUser =
|
||||||
|
await _userManager.Users.FirstOrDefaultAsync(x => x.UserName == newUser.UserName);
|
||||||
foreach (var defaultRole in userManagementSettings.DefaultRoles)
|
foreach (var defaultRole in userManagementSettings.DefaultRoles)
|
||||||
{
|
{
|
||||||
await _userManager.AddToRoleAsync(newUser, defaultRole);
|
await _userManager.AddToRoleAsync(dbUser, defaultRole);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,14 @@ import { JwtModule } from "@auth0/angular-jwt";
|
||||||
import { NgbModule } from "@ng-bootstrap/ng-bootstrap";
|
import { NgbModule } from "@ng-bootstrap/ng-bootstrap";
|
||||||
import { TranslateLoader, TranslateModule } from "@ngx-translate/core";
|
import { TranslateLoader, TranslateModule } from "@ngx-translate/core";
|
||||||
import { TranslateHttpLoader } from "@ngx-translate/http-loader";
|
import { TranslateHttpLoader } from "@ngx-translate/http-loader";
|
||||||
|
import { CookieService } from "ng2-cookies";
|
||||||
import { GrowlModule } from "primeng/components/growl/growl";
|
import { GrowlModule } from "primeng/components/growl/growl";
|
||||||
import { ButtonModule, CaptchaModule,ConfirmationService, ConfirmDialogModule, DataTableModule,DialogModule, SharedModule, TooltipModule } from "primeng/primeng";
|
import { ButtonModule, CaptchaModule,ConfirmationService, ConfirmDialogModule, DataTableModule,DialogModule, SharedModule, TooltipModule } from "primeng/primeng";
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { AppComponent } from "./app.component";
|
import { AppComponent } from "./app.component";
|
||||||
|
|
||||||
|
import { CookieComponent } from "./auth/cookie.component";
|
||||||
import { PageNotFoundComponent } from "./errors/not-found.component";
|
import { PageNotFoundComponent } from "./errors/not-found.component";
|
||||||
import { LandingPageComponent } from "./landingpage/landingpage.component";
|
import { LandingPageComponent } from "./landingpage/landingpage.component";
|
||||||
import { LoginComponent } from "./login/login.component";
|
import { LoginComponent } from "./login/login.component";
|
||||||
|
@ -55,6 +57,7 @@ const routes: Routes = [
|
||||||
{ path: "reset", component: ResetPasswordComponent },
|
{ path: "reset", component: ResetPasswordComponent },
|
||||||
{ path: "token", component: TokenResetPasswordComponent },
|
{ path: "token", component: TokenResetPasswordComponent },
|
||||||
{ path: "landingpage", component: LandingPageComponent },
|
{ path: "landingpage", component: LandingPageComponent },
|
||||||
|
{ path: "auth/cookie", component: CookieComponent },
|
||||||
];
|
];
|
||||||
|
|
||||||
// AoT requires an exported function for factories
|
// AoT requires an exported function for factories
|
||||||
|
@ -120,6 +123,7 @@ export function HttpLoaderFactory(http: HttpClient, platformLocation: PlatformLo
|
||||||
LandingPageComponent,
|
LandingPageComponent,
|
||||||
ResetPasswordComponent,
|
ResetPasswordComponent,
|
||||||
TokenResetPasswordComponent,
|
TokenResetPasswordComponent,
|
||||||
|
CookieComponent,
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
RequestService,
|
RequestService,
|
||||||
|
@ -132,6 +136,7 @@ export function HttpLoaderFactory(http: HttpClient, platformLocation: PlatformLo
|
||||||
LandingPageService,
|
LandingPageService,
|
||||||
ConfirmationService,
|
ConfirmationService,
|
||||||
ImageService,
|
ImageService,
|
||||||
|
CookieService,
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent],
|
bootstrap: [AppComponent],
|
||||||
})
|
})
|
||||||
|
|
|
@ -36,26 +36,26 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>{{ 'Requests.Status' | translate }} </span>
|
<span>{{ 'Requests.Status' | translate }} </span>
|
||||||
<span class="label label-success">{{request.status}}</span>
|
<span class="label label-success" id="requestedStatusLabel">{{request.status}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span>{{ 'Requests.RequestStatus' | translate }} </span>
|
<span>{{ 'Requests.RequestStatus' | translate }} </span>
|
||||||
<span *ngIf="request.available" class="label label-success" [translate]="'Common.Available'"></span>
|
<span *ngIf="request.available" class="label label-success" id="availableLabel" [translate]="'Common.Available'"></span>
|
||||||
<span *ngIf="request.approved && !request.available" class="label label-info" [translate]="'Common.ProcessingRequest'"></span>
|
<span *ngIf="request.approved && !request.available" id="processingRequestLabel" class="label label-info" [translate]="'Common.ProcessingRequest'"></span>
|
||||||
<span *ngIf="request.denied" class="label label-danger" [translate]="'Common.RequestDenied'"></span>
|
<span *ngIf="request.denied" class="label label-danger" id="requestDeclinedLabel" [translate]="'Common.RequestDenied'"></span>
|
||||||
<span *ngIf="request.deniedReason" title="{{request.deniedReason}}"><i class="fa fa-info-circle"></i></span>
|
<span *ngIf="request.deniedReason" title="{{request.deniedReason}}"><i class="fa fa-info-circle"></i></span>
|
||||||
<span *ngIf="!request.approved && !request.availble && !request.denied" class="label label-warning" [translate]="'Common.PendingApproval'"></span>
|
<span *ngIf="!request.approved && !request.availble && !request.denied" id="pendingApprovalLabel" class="label label-warning" [translate]="'Common.PendingApproval'"></span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="request.denied">
|
<div *ngIf="request.denied" id="requestDenied">
|
||||||
{{ 'Requests.Denied' | translate }} <i style="color:red;" class="fa fa-check"></i>
|
{{ 'Requests.Denied' | translate }} <i style="color:red;" class="fa fa-check"></i>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div>{{ 'Requests.ReleaseDate' | translate }} {{request.releaseDate | date}}</div>
|
<div id="releaseDate">{{ 'Requests.ReleaseDate' | translate }} {{request.releaseDate | date}}</div>
|
||||||
<div>{{ 'Requests.RequestedDate' | translate }} {{request.requestedDate | date}}</div>
|
<div id="requestedDate">{{ 'Requests.RequestedDate' | translate }} {{request.requestedDate | date}}</div>
|
||||||
<br />
|
<br />
|
||||||
<div *ngIf="isAdmin">
|
<div *ngIf="isAdmin">
|
||||||
<div *ngIf="request.qualityOverrideTitle">{{ 'Requests.QualityOverride' | translate }} <span>{{request.qualityOverrideTitle}} </span></div>
|
<div *ngIf="request.qualityOverrideTitle">{{ 'Requests.QualityOverride' | translate }} <span>{{request.qualityOverrideTitle}} </span></div>
|
||||||
|
|
|
@ -69,11 +69,11 @@
|
||||||
{{ep.airDate | date: 'dd/MM/yyyy' }}
|
{{ep.airDate | date: 'dd/MM/yyyy' }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span *ngIf="child.denied" class="label label-danger" [translate]="'Common.Denied'"></span>
|
<span *ngIf="child.denied" class="label label-danger" id="deniedLabel" [translate]="'Common.Denied'"></span>
|
||||||
<span *ngIf="!child.denied && ep.available" class="label label-success" [translate]="'Common.Available'"></span>
|
<span *ngIf="!child.denied && ep.available" class="label label-success" id="availableLabel" [translate]="'Common.Available'"></span>
|
||||||
<span *ngIf="!child.denied &&ep.approved && !ep.available" class="label label-info" [translate]="'Common.ProcessingRequest'"></span>
|
<span *ngIf="!child.denied &&ep.approved && !ep.available" class="label label-info" id="processingRequestLabel" [translate]="'Common.ProcessingRequest'"></span>
|
||||||
<div *ngIf="!child.denied && !ep.approved">
|
<div *ngIf="!child.denied && !ep.approved">
|
||||||
<div *ngIf="!ep.available"><span class="label label-warning" [translate]="'Common.PendingApproval'"></span></div>
|
<div *ngIf="!ep.available"><span class="label label-warning" id="pendingApprovalLabel" [translate]="'Common.PendingApproval'"></span></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -39,17 +39,17 @@
|
||||||
<h4>{{result.title}} ({{result.releaseDate | date: 'yyyy'}})</h4>
|
<h4>{{result.title}} ({{result.releaseDate | date: 'yyyy'}})</h4>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<span *ngIf="result.releaseDate" class="label label-info" target="_blank">{{ 'Search.ReleaseDate' | translate }} {{result.releaseDate | date: 'dd/MM/yyyy'}}</span>
|
<span *ngIf="result.releaseDate" class="label label-info" id="releaseDateLabel" target="_blank">{{ 'Search.ReleaseDate' | translate }} {{result.releaseDate | date: 'dd/MM/yyyy'}}</span>
|
||||||
|
|
||||||
<a *ngIf="result.homepage" href="{{result.homepage}}" target="_blank"><span class="label label-info" [translate]="'Search.Movies.HomePage'"></span></a>
|
<a *ngIf="result.homepage" href="{{result.homepage}}" id="homePageLabel" target="_blank"><span class="label label-info" [translate]="'Search.Movies.HomePage'"></span></a>
|
||||||
|
|
||||||
<a *ngIf="result.trailer" href="{{result.trailer}}" target="_blank"><span class="label label-info" [translate]="'Search.Movies.Trailer'"></span></a>
|
<a *ngIf="result.trailer" href="{{result.trailer}}" id="trailerLabel" target="_blank"><span class="label label-info" [translate]="'Search.Movies.Trailer'"></span></a>
|
||||||
<span *ngIf="result.quality" class="label label-success">{{result.quality}}p</span>
|
<span *ngIf="result.quality" id="qualityLabel" class="label label-success">{{result.quality}}p</span>
|
||||||
|
|
||||||
<ng-template [ngIf]="result.available"><span class="label label-success" [translate]="'Common.Available'"></span></ng-template>
|
<ng-template [ngIf]="result.available"><span class="label label-success" id="availableLabel" [translate]="'Common.Available'"></span></ng-template>
|
||||||
<ng-template [ngIf]="result.approved && !result.available"><span class="label label-info" [translate]="'Common.ProcessingRequest'"></span></ng-template>
|
<ng-template [ngIf]="result.approved && !result.available"><span class="label label-info" id="processingRequestLabel" [translate]="'Common.ProcessingRequest'"></span></ng-template>
|
||||||
<ng-template [ngIf]="result.requested && !result.approved && !result.available"><span class="label label-warning" [translate]="'Common.PendingApproval'"></span></ng-template>
|
<ng-template [ngIf]="result.requested && !result.approved && !result.available"><span class="label label-warning" id="pendingApprovalLabel" [translate]="'Common.PendingApproval'"></span></ng-template>
|
||||||
<ng-template [ngIf]="!result.requested && !result.available && !result.approved"><span class="label label-danger" [translate]="'Common.NotRequested'"></span></ng-template>
|
<ng-template [ngIf]="!result.requested && !result.available && !result.approved"><span class="label label-danger" id="notRequestedLabel" [translate]="'Common.NotRequested'"></span></ng-template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,11 +54,11 @@
|
||||||
{{ep.airDate | date: 'dd/MM/yyyy' }}
|
{{ep.airDate | date: 'dd/MM/yyyy' }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<ng-template [ngIf]="ep.available"><span class="label label-success">Available</span></ng-template>
|
<ng-template [ngIf]="ep.available"><span class="label label-success" id="availableLabel">Available</span></ng-template>
|
||||||
<ng-template [ngIf]="ep.approved && !ep.available "><span class="label label-info">Processing Request</span></ng-template>
|
<ng-template [ngIf]="ep.approved && !ep.available "><span class="label label-info" id="processingRequestLabel">Processing Request</span></ng-template>
|
||||||
<ng-template [ngIf]="ep.selected"><span class="label label-info">Selected</span></ng-template>
|
<ng-template [ngIf]="ep.selected"><span class="label label-info" id="selectedLabel">Selected</span></ng-template>
|
||||||
<ng-template [ngIf]="ep.requested && !ep.approved && !ep.available && !ep.selected"><span class="label label-warning">Pending Approval</span></ng-template>
|
<ng-template [ngIf]="ep.requested && !ep.approved && !ep.available && !ep.selected"><span class="label label-warning" id="pendingApprovalLabel">Pending Approval</span></ng-template>
|
||||||
<ng-template [ngIf]="!ep.requested && !ep.available && !ep.approved"><span class="label label-danger">Not Requested</span></ng-template>
|
<ng-template [ngIf]="!ep.requested && !ep.available && !ep.approved"><span class="label label-danger" id="notRequetsedLabel">Not Requested</span></ng-template>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td>
|
<td>
|
||||||
|
|
|
@ -53,21 +53,21 @@
|
||||||
<h4>{{node.data.title}} ({{node.data.firstAired | date: 'yyyy'}})</h4>
|
<h4>{{node.data.title}} ({{node.data.firstAired | date: 'yyyy'}})</h4>
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
<span *ngIf="node.data.status" class="label label-primary" target="_blank">{{node.data.status}}</span>
|
<span *ngIf="node.data.status" class="label label-primary" id="statusLabel" target="_blank">{{node.data.status}}</span>
|
||||||
|
|
||||||
|
|
||||||
<span *ngIf="node.data.firstAired" class="label label-info" target="_blank">Air Date: {{node.data.firstAired | date: 'dd/MM/yyyy'}}</span>
|
<span *ngIf="node.data.firstAired" class="label label-info" target="_blank" id="airDateLabel">Air Date: {{node.data.firstAired | date: 'dd/MM/yyyy'}}</span>
|
||||||
|
|
||||||
<span *ngIf="node.data.network" class="label label-info" target="_blank">{{node.data.network}}</span>
|
<span *ngIf="node.data.network" class="label label-info" id="networkLabel" target="_blank">{{node.data.network}}</span>
|
||||||
|
|
||||||
|
|
||||||
<ng-template [ngIf]="node.data.available"><span class="label label-success">Available</span></ng-template>
|
<ng-template [ngIf]="node.data.available"><span class="label label-success" id="availableLabel">Available</span></ng-template>
|
||||||
<ng-template [ngIf]="node.data.partlyAvailable"><span class="label label-warning">Partially Available</span></ng-template>
|
<ng-template [ngIf]="node.data.partlyAvailable"><span class="label label-warning" id="partiallyAvailableLabel">Partially Available</span></ng-template>
|
||||||
|
|
||||||
|
|
||||||
<a *ngIf="node.data.homepage" href="{{node.data.homepage}}" target="_blank"><span class="label label-info">HomePage</span></a>
|
<a *ngIf="node.data.homepage" href="{{node.data.homepage}}" target="_blank"><span class="label label-info" id="homepageLabel">HomePage</span></a>
|
||||||
|
|
||||||
<a *ngIf="node.data.trailer" href="{{node.data.trailer}}" target="_blank"><span class="label label-info">Trailer</span></a>
|
<a *ngIf="node.data.trailer" href="{{node.data.trailer}}" target="_blank"><span class="label label-info" id="trailerLabel">Trailer</span></a>
|
||||||
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
54
src/Ombi/package-lock.json
generated
54
src/Ombi/package-lock.json
generated
|
@ -5061,6 +5061,7 @@
|
||||||
"resolved": "https://registry.npmjs.org/npm/-/npm-5.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/npm/-/npm-5.5.1.tgz",
|
||||||
"integrity": "sha512-M3aO8EjHebaCw6uur4C86SZqkypnoaEVo5R63FEEU0dw9wLxf/JlwWtJItShYVyQS2WDxG2It10GEe5GmVEM2Q==",
|
"integrity": "sha512-M3aO8EjHebaCw6uur4C86SZqkypnoaEVo5R63FEEU0dw9wLxf/JlwWtJItShYVyQS2WDxG2It10GEe5GmVEM2Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"JSONStream": "1.3.1",
|
||||||
"abbrev": "1.1.1",
|
"abbrev": "1.1.1",
|
||||||
"ansi-regex": "3.0.0",
|
"ansi-regex": "3.0.0",
|
||||||
"ansicolors": "0.3.2",
|
"ansicolors": "0.3.2",
|
||||||
|
@ -5092,7 +5093,6 @@
|
||||||
"ini": "1.3.4",
|
"ini": "1.3.4",
|
||||||
"init-package-json": "1.10.1",
|
"init-package-json": "1.10.1",
|
||||||
"is-cidr": "1.0.0",
|
"is-cidr": "1.0.0",
|
||||||
"JSONStream": "1.3.1",
|
|
||||||
"lazy-property": "1.0.0",
|
"lazy-property": "1.0.0",
|
||||||
"libnpx": "9.6.0",
|
"libnpx": "9.6.0",
|
||||||
"lockfile": "1.0.3",
|
"lockfile": "1.0.3",
|
||||||
|
@ -5167,6 +5167,24 @@
|
||||||
"write-file-atomic": "2.1.0"
|
"write-file-atomic": "2.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"JSONStream": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"bundled": true,
|
||||||
|
"requires": {
|
||||||
|
"jsonparse": "1.3.1",
|
||||||
|
"through": "2.3.8"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"jsonparse": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"bundled": true
|
||||||
|
},
|
||||||
|
"through": {
|
||||||
|
"version": "2.3.8",
|
||||||
|
"bundled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"abbrev": {
|
"abbrev": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"bundled": true
|
"bundled": true
|
||||||
|
@ -5540,24 +5558,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"JSONStream": {
|
|
||||||
"version": "1.3.1",
|
|
||||||
"bundled": true,
|
|
||||||
"requires": {
|
|
||||||
"jsonparse": "1.3.1",
|
|
||||||
"through": "2.3.8"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"jsonparse": {
|
|
||||||
"version": "1.3.1",
|
|
||||||
"bundled": true
|
|
||||||
},
|
|
||||||
"through": {
|
|
||||||
"version": "2.3.8",
|
|
||||||
"bundled": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lazy-property": {
|
"lazy-property": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"bundled": true
|
"bundled": true
|
||||||
|
@ -10509,14 +10509,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
|
||||||
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
|
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
|
||||||
},
|
},
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "5.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"string-width": {
|
"string-width": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||||
|
@ -10527,6 +10519,14 @@
|
||||||
"strip-ansi": "3.0.1"
|
"strip-ansi": "3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"stringstream": {
|
"stringstream": {
|
||||||
"version": "0.0.5",
|
"version": "0.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
"primeng": "^4.3.0",
|
"primeng": "^4.3.0",
|
||||||
"reflect-metadata": "0.1.10",
|
"reflect-metadata": "0.1.10",
|
||||||
"run-sequence": "^2.2.0",
|
"run-sequence": "^2.2.0",
|
||||||
"rxjs": "^5.5.2",
|
"rxjs": "5.5.2",
|
||||||
"sass-loader": "^6.0.6",
|
"sass-loader": "^6.0.6",
|
||||||
"style-loader": "^0.19.0",
|
"style-loader": "^0.19.0",
|
||||||
"to-string-loader": "^1.1.5",
|
"to-string-loader": "^1.1.5",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue