From bce0115285dce6caa3f75378e3e9e7b33980e8cb Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Mon, 21 Sep 2020 17:11:16 -0700 Subject: [PATCH 001/212] Generate types from OpenAPI --- .gitignore | 3 +- Public API v1.yaml | 250 ++++++++++++++++----------------- package-lock.json | 97 +++++++++++++ package.json | 5 +- src/app/main/main.component.ts | 2 +- src/app/posts.services.ts | 53 +++---- 6 files changed, 257 insertions(+), 153 deletions(-) diff --git a/.gitignore b/.gitignore index 9d2ac87..32c9fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ backend/subscriptions/playlists/* backend/subscriptions/archives/* backend/*.exe src/assets/default.json +src/api-types backend/appdata/db.json backend/appdata/archives/archive_audio.txt backend/appdata/archives/archive_video.txt @@ -65,4 +66,4 @@ backend/appdata/logs/error.log backend/appdata/users.json backend/users/* backend/appdata/cookies.txt -backend/public \ No newline at end of file +backend/public diff --git a/Public API v1.yaml b/Public API v1.yaml index e82328a..15013e0 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -21,14 +21,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body' + $ref: '#/components/schemas/Mp3DownloadRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200' + $ref: '#/components/schemas/Mp3DownloadResponse' + '500': + description: Server download error security: - Auth query parameter: [] /api/tomp4: @@ -46,14 +48,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_1' + $ref: '#/components/schemas/Mp4DownloadRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_1' + $ref: '#/components/schemas/Mp4DownloadResponse' + '500': + description: Server download error security: - Auth query parameter: [] /api/getMp3s: @@ -69,8 +73,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_2' - requestBody: {} + $ref: '#/components/schemas/GetMp3sResponse' security: - Auth query parameter: [] /api/getMp4s: @@ -86,7 +89,23 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_3' + $ref: '#/components/schemas/GetMp4sResponse' + security: + - Auth query parameter: [] + /api/getAllFiles: + post: + tags: + - files + summary: Get all files + description: Gets all files and playlists stored in the db + operationId: get-getAllFiles + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllFilesResponse' security: - Auth query parameter: [] /api/getFile: @@ -100,14 +119,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_2' + $ref: '#/components/schemas/GetFileRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_4' + $ref: '#/components/schemas/GetFileResponse' security: - Auth query parameter: [] /api/enableSharing: @@ -122,7 +141,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_3' + $ref: '#/components/schemas/SharingToggle' responses: '200': description: OK @@ -144,7 +163,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_4' + $ref: '#/components/schemas/SharingToggle' responses: '200': description: OK @@ -718,7 +737,7 @@ paths: type: object properties: user: - $ref: '#/components/schemas/user' + $ref: '#/components/schemas/User' token: type: string permissions: @@ -761,7 +780,7 @@ paths: type: object properties: user: - $ref: '#/components/schemas/user' + $ref: '#/components/schemas/User' description: Use this endpoint to register a user. It will only work if registration is enabled. requestBody: content: @@ -958,7 +977,7 @@ paths: users: type: array items: - $ref: '#/components/schemas/user' + $ref: '#/components/schemas/User' description: 'Gets all users, returns a list of the user objects including their user permissions, videos, playlists, subscriptions, etc.' security: - Auth query parameter: [] @@ -966,7 +985,12 @@ paths: - multi-user mode components: schemas: - body: + FileType: + type: string + enum: + - audio + - video + BaseDownloadRequest: required: - url type: object @@ -975,64 +999,72 @@ components: type: string customQualityConfiguration: type: string + description: Video format code. Overrides other quality options. example: '251' - maxBitrate: - type: string - example: '160' customArgs: type: string + description: Custom command-line arguments for youtubedl. Overrides all other options, except url. customOutput: type: string + description: Custom output filename template. youtubeUsername: type: string + description: Login with this account ID youtubePassword: type: string - inline_response_200: + description: Account password + ui_uid: + type: string + nullable: true + Mp3DownloadRequest: + allOf: + - $ref: '#/components/schemas/BaseDownloadRequest' + - type: object + properties: + maxBitrate: + type: string + description: Specify ffmpeg/avconv audio quality + example: '160' + Mp4DownloadRequest: + allOf: + - $ref: '#/components/schemas/BaseDownloadRequest' + - type: object + properties: + selectedHeight: + type: string + description: Height of the video, if known + example: '1080' + BaseDownloadResponse: required: - - audiopathEncoded - uid type: object properties: uid: type: string file_names: - type: string - audiopathEncoded: - type: string - body_1: - required: - - url - type: object - properties: - url: - type: string - customQualityConfiguration: - type: string - example: 242+251 - selectedHeight: - type: string - example: '1080' - customArgs: - type: string - customOutput: - type: string - youtubeUsername: - type: string - youtubePassword: - type: string - inline_response_200_1: - required: - - uid - - videopathEncoded - type: object - properties: - uid: - type: string - file_names: - type: string - videopathEncoded: - type: string - inline_response_200_2: + nullable: true + type: array + items: + type: string + Mp3DownloadResponse: + allOf: + - $ref: '#/components/schemas/BaseDownloadResponse' + - type: object + required: + - audiopathEncoded + properties: + audiopathEncoded: + type: string + Mp4DownloadResponse: + allOf: + - $ref: '#/components/schemas/BaseDownloadResponse' + - type: object + required: + - videopathEncoded + properties: + videopathEncoded: + type: string + GetMp3sResponse: required: - mp3s - playlists @@ -1041,48 +1073,66 @@ components: mp3s: type: array items: - $ref: '#/components/schemas/inline_response_200_2_mp3s' + $ref: '#/components/schemas/DatabaseFile' playlists: type: array description: All audio playlists items: - $ref: '#/components/schemas/inline_response_200_2_playlists' - inline_response_200_3: + $ref: '#/components/schemas/Playlist' + GetMp4sResponse: required: - mp4s + - playlists type: object properties: mp4s: type: array items: - $ref: '#/components/schemas/inline_response_200_3_mp4s' + $ref: '#/components/schemas/DatabaseFile' playlists: type: array description: All video playlists items: - type: object - body_2: + $ref: '#/components/schemas/Playlist' + GetAllFilesResponse: + required: + - files + - playlists + type: object + properties: + files: + type: array + items: + $ref: '#/components/schemas/DatabaseFile' + playlists: + type: array + description: All video playlists + items: + $ref: '#/components/schemas/Playlist' + GetFileRequest: required: - uid type: object properties: uid: type: string + description: Video UID type: + $ref: '#/components/schemas/FileType' + uuid: type: string - inline_response_200_4: + description: User UID + GetFileResponse: required: - - file - success type: object properties: success: - type: string + type: boolean file: - $ref: '#/components/schemas/inline_response_200_2_mp3s' - body_3: + $ref: '#/components/schemas/DatabaseFile' + SharingToggle: required: - - is_playlist - type - uid type: object @@ -1090,7 +1140,7 @@ components: uid: type: string type: - type: string + $ref: '#/components/schemas/FileType' is_playlist: type: boolean inline_response_200_5: @@ -1100,19 +1150,6 @@ components: properties: success: type: boolean - body_4: - required: - - type - - uid - type: object - properties: - type: - type: string - uid: - type: string - description: uid is either the video uid or the playlist ID - is_playlist: - type: boolean body_5: required: - url @@ -1303,7 +1340,7 @@ components: type: object properties: playlist: - $ref: '#/components/schemas/inline_response_200_2_playlists' + $ref: '#/components/schemas/Playlist' type: type: string success: @@ -1457,7 +1494,7 @@ components: properties: new_config_file: type: object - inline_response_200_2_mp3s: + DatabaseFile: required: - duration - id @@ -1497,7 +1534,7 @@ components: type: string sharingEnabled: type: boolean - inline_response_200_2_playlists: + Playlist: required: - fileNames - id @@ -1515,45 +1552,6 @@ components: type: string thumbnailURL: type: string - inline_response_200_3_mp4s: - required: - - duration - - id - - isAudio - - path - - size - - thumbnailURL - - title - - uid - - upload_date - - uploader - - url - type: object - properties: - id: - type: string - title: - type: string - thumbnailURL: - type: string - isAudio: - type: boolean - duration: - type: number - url: - type: string - uploader: - type: string - size: - type: number - path: - type: string - upload_date: - type: string - uid: - type: string - sharingEnabled: - type: boolean inline_response_200_6_new_sub: required: - id @@ -1633,7 +1631,7 @@ components: type: string type: type: string - user: + User: title: user type: object properties: diff --git a/package-lock.json b/package-lock.json index 08cd667..2cfdacc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9618,6 +9618,76 @@ "is-wsl": "^2.1.1" } }, + "openapi-typescript-codegen": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.4.11.tgz", + "integrity": "sha512-KWhJE4xlFXDd7sNyEiJeUx7+H1hqQ+WETzwrcXCE+CNR+pmfKkOH87fjPRUPu1TY3hSgDgZ6ex7F3lWLbirvMQ==", + "dev": true, + "requires": { + "camelcase": "6.0.0", + "commander": "6.1.0", + "handlebars": "4.7.6", + "js-yaml": "3.14.0", + "mkdirp": "1.0.4", + "path": "0.12.7", + "rimraf": "3.0.2" + }, + "dependencies": { + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "commander": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", + "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -10048,6 +10118,33 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "dev": true, + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", diff --git a/package.json b/package.json index 14aa13e..0e1ff92 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", - "electron": "ng build --base-href ./ && electron ." + "electron": "ng build --base-href ./ && electron .", + "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true", + "prepare": "npm run generate" }, "engines": { "node": "12.3.1", @@ -66,6 +68,7 @@ "karma-coverage-istanbul-reporter": "^1.2.1", "karma-jasmine": "~1.1.0", "karma-jasmine-html-reporter": "^0.2.2", + "openapi-typescript-codegen": "^0.4.11", "protractor": "~5.1.2", "ts-node": "~3.0.4", "tslint": "~5.3.2" diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index b444e11..3625449 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -63,7 +63,7 @@ export class MainComponent implements OnInit { youtubeUsername = null; youtubePassword = null; urlError = false; - path = ''; + path: string | string[] = ''; url = ''; exists = ''; percentDownloaded: number; diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 416fd2d..2153f73 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -8,9 +8,9 @@ import { THEMES_CONFIG } from '../themes'; import { Router, CanActivate } from '@angular/router'; import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; -import { v4 as uuid } from 'uuid'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; +import type { FileType, GetAllFilesResponse, GetFileRequest, GetFileResponse, GetMp3sResponse, GetMp4sResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse } from 'api-types'; @Injectable() export class PostsService implements CanActivate { @@ -25,7 +25,9 @@ export class PostsService implements CanActivate { // auth auth_token = '4241b401-7236-493e-92b5-b72696b9d853'; session_id = null; - httpOptions = null; + httpOptions: { + params: HttpParams + }; http_params: string = null; unauthorized = false; @@ -155,27 +157,29 @@ export class PostsService implements CanActivate { } // tslint:disable-next-line: max-line-length - makeMP3(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, ui_uid = null) { - return this.http.post(this.path + 'tomp3', {url: url, - maxBitrate: selectedQuality, - customQualityConfiguration: customQualityConfiguration, - customArgs: customArgs, - customOutput: customOutput, - youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword, - ui_uid: ui_uid}, this.httpOptions); + makeMP3(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, ui_uid: string = null) { + const body: Mp3DownloadRequest = {url: url, + maxBitrate: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + ui_uid: ui_uid} + return this.http.post(this.path + 'tomp3', body, this.httpOptions); } // tslint:disable-next-line: max-line-length makeMP4(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, ui_uid = null) { - return this.http.post(this.path + 'tomp4', {url: url, - selectedHeight: selectedQuality, - customQualityConfiguration: customQualityConfiguration, - customArgs: customArgs, - customOutput: customOutput, - youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword, - ui_uid: ui_uid}, this.httpOptions); + const body: Mp4DownloadRequest = {url: url, + selectedHeight: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + ui_uid: ui_uid} + return this.http.post(this.path + 'tomp4', body, this.httpOptions); } killAllDownloads() { @@ -207,19 +211,20 @@ export class PostsService implements CanActivate { } getMp3s() { - return this.http.get(this.path + 'getMp3s', this.httpOptions); + return this.http.get(this.path + 'getMp3s', this.httpOptions); } getMp4s() { - return this.http.get(this.path + 'getMp4s', this.httpOptions); + return this.http.get(this.path + 'getMp4s', this.httpOptions); } - getFile(uid, type, uuid = null) { - return this.http.post(this.path + 'getFile', {uid: uid, type: type, uuid: uuid}, this.httpOptions); + getFile(uid: string, type: FileType, uuid: string = null) { + const body: GetFileRequest = {uid: uid, type: type, uuid: uuid}; + return this.http.post(this.path + 'getFile', body, this.httpOptions); } getAllFiles() { - return this.http.post(this.path + 'getAllFiles', {}, this.httpOptions); + return this.http.post(this.path + 'getAllFiles', {}, this.httpOptions); } downloadFileFromServer(fileName, type, outputName = null, fullPathProvided = null, subscriptionName = null, subPlaylist = null, From b667e1dc7970bf57ca17095b6e3be77d0e3063ec Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Thu, 24 Sep 2020 14:16:13 -0700 Subject: [PATCH 002/212] Add additional named types --- Public API v1.yaml | 261 +++++++++++++++++++++----------------- src/app/posts.services.ts | 17 ++- 2 files changed, 156 insertions(+), 122 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 15013e0..2289c3b 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -395,7 +395,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_14' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK @@ -436,7 +436,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_16' + $ref: '#/components/schemas/DeleteFileRequest' responses: '200': description: OK @@ -581,7 +581,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_21' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK @@ -637,33 +637,7 @@ paths: content: application/json: schema: - type: object - properties: - downloads: - type: object - properties: - uid: - type: string - downloading: - type: boolean - complete: - type: boolean - url: - type: string - type: - type: string - percent_complete: - type: string - is_playlist: - type: boolean - timestamp_start: - type: number - timestamp_end: - type: number - fileNames: - type: array - items: - type: string + $ref: '#/components/schemas/GetAllDownloadsResponse' operationId: get-api-downloads description: Retrieves all downloads recorded by the server and their status. security: @@ -678,46 +652,12 @@ paths: content: application/json: schema: - type: object - properties: - download: - type: object - properties: - uid: - type: string - downloading: - type: boolean - complete: - type: boolean - url: - type: string - type: - type: string - percent_complete: - type: string - is_playlist: - type: boolean - timestamp_start: - type: number - timestamp_end: - type: number - fileNames: - type: array - items: - type: string + $ref: '#/components/schemas/GetDownloadResponse' requestBody: content: application/json: schema: - type: object - properties: - session_id: - type: string - download_id: - type: string - required: - - session_id - - download_id + $ref: '#/components/schemas/GetDownloadRequest' description: '' description: "Gets a single download using its download_id and session_id. session_id is the device fingerprint. If none was provided at the time of download, then set session_id is 'undeclared'." security: @@ -809,6 +749,10 @@ paths: responses: '200': description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' requestBody: content: application/json: @@ -816,8 +760,12 @@ paths: type: object properties: change_object: + required: + - uid type: object properties: + uid: + type: string name: type: string role: @@ -839,10 +787,7 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' description: Deletes a user by its uid. requestBody: content: @@ -879,14 +824,14 @@ paths: permissions: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' user: type: object properties: permissions: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' description: Gets the available roles and their permissions security: - Auth query parameter: [] @@ -902,10 +847,7 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' description: "Changes the permissions for a user. Available values for each permission are: `default`, `yes`, and `no`. `default` will use the user's role's default permission." security: - Auth query parameter: [] @@ -913,18 +855,7 @@ paths: content: application/json: schema: - type: object - properties: - user_uid: - type: string - permission: - type: string - new_value: - type: string - required: - - user_uid - - permission - - new_value + $ref: '#/components/schemas/ChangeUserPermissionsRequest' tags: - multi-user mode /api/changeRolePermissions: @@ -937,26 +868,12 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' requestBody: content: application/json: schema: - type: object - properties: - role: - type: string - permission: - type: string - new_value: - type: string - required: - - role - - permission - - new_value + $ref: '#/components/schemas/ChangeRolePermissionsRequest' description: 'Changes the permissions for a role. Available values for each permission are: `yes`, and `no`.' security: - Auth query parameter: [] @@ -985,6 +902,13 @@ paths: - multi-user mode components: schemas: + SuccessObject: + required: + - success + type: object + properties: + success: + type: boolean FileType: type: string enum: @@ -1064,6 +988,33 @@ components: properties: videopathEncoded: type: string + GetDownloadRequest: + type: object + properties: + session_id: + type: string + download_id: + type: string + required: + - session_id + - download_id + GetDownloadResponse: + type: object + properties: + download: + $ref: '#/components/schemas/Download' + nullable: true + GetAllDownloadsResponse: + type: object + properties: + downloads: + type: object + description: Map of Session ID to inner map + additionalProperties: + type: object + description: Map of Download UID to downoad + additionalProperties: + $ref: '#/components/schemas/Download' GetMp3sResponse: required: - mp3s @@ -1370,13 +1321,6 @@ components: type: string type: type: string - body_14: - required: - - uid - type: object - properties: - uid: - type: string body_15: required: - fileNames @@ -1402,7 +1346,7 @@ components: subscriptionPlaylist: type: boolean description: Only used for subscriptions - body_16: + DeleteFileRequest: required: - fileName - type @@ -1411,7 +1355,7 @@ components: fileName: type: string type: - type: string + $ref: '#/components/schemas/FileType' apidownloadArchive_sub: required: - archive_dir @@ -1470,13 +1414,15 @@ components: new_api_key: type: string example: 4241b401-7236-493e-92b5-b72696b9d853 - body_21: + DeleteMp3Mp4Request: required: - uid type: object properties: uid: type: string + blacklistMode: + type: boolean inline_response_200_17: required: - config_file @@ -1552,6 +1498,49 @@ components: type: string thumbnailURL: type: string + Download: + required: + - uid + - ui_uid + - downloading + - complete + - url + - type + - percent_complete + - is_playlist + - timestamp_start + type: object + properties: + uid: + type: string + ui_uid: + type: string + downloading: + type: boolean + complete: + type: boolean + url: + type: string + type: + type: string + percent_complete: + type: number + is_playlist: + type: boolean + timestamp_start: + type: number + timestamp_end: + type: number + filesize: + type: number + nullable: true + error: + type: string + description: Error text, set if download fails. + fileNames: + type: array + items: + type: string inline_response_200_6_new_sub: required: - id @@ -1674,11 +1663,51 @@ components: permissions: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' permission_overrides: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' + UserPermission: + type: string + enum: + - filemanager + - settings + - subscriptions + - sharing + - advanced_download + - downloads_manager + BaseChangePermissionsRequest: + required: + - permission + - new_value + type: object + properties: + permission: + $ref: '#/components/schemas/UserPermission' + new_value: + type: string + enum: + - 'yes' + - 'no' + ChangeUserPermissionsRequest: + allOf: + - $ref: '#/components/schemas/BaseChangePermissionsRequest' + - type: object + properties: + user_uid: + type: string + required: + - user_uid + ChangeRolePermissionsRequest: + allOf: + - $ref: '#/components/schemas/BaseChangePermissionsRequest' + - type: object + properties: + role: + type: string + required: + - role file: title: file type: object diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 2153f73..c6784f5 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -10,7 +10,10 @@ import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; -import type { FileType, GetAllFilesResponse, GetFileRequest, GetFileResponse, GetMp3sResponse, GetMp4sResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse } from 'api-types'; +import type { DeleteMp3Mp4Request, FileType, GetAllFilesResponse, GetFileRequest, GetFileResponse, GetMp3sResponse, GetMp4sResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse } from 'api-types'; +import { GetAllDownloadsResponse } from 'api-types/models/GetAllDownloadsResponse'; +import { GetDownloadResponse } from 'api-types/models/GetDownloadResponse'; +import { GetDownloadRequest } from 'api-types/models/GetDownloadRequest'; @Injectable() export class PostsService implements CanActivate { @@ -203,10 +206,11 @@ export class PostsService implements CanActivate { } deleteFile(uid: string, isAudio: boolean, blacklistMode = false) { + const body: DeleteMp3Mp4Request = {uid: uid, blacklistMode: blacklistMode} if (isAudio) { - return this.http.post(this.path + 'deleteMp3', {uid: uid, blacklistMode: blacklistMode}, this.httpOptions); + return this.http.post(this.path + 'deleteMp3', body, this.httpOptions); } else { - return this.http.post(this.path + 'deleteMp4', {uid: uid, blacklistMode: blacklistMode}, this.httpOptions); + return this.http.post(this.path + 'deleteMp4', body, this.httpOptions); } } @@ -330,12 +334,13 @@ export class PostsService implements CanActivate { // current downloads getCurrentDownloads() { - return this.http.get(this.path + 'downloads', this.httpOptions); + return this.http.get(this.path + 'downloads', this.httpOptions); } // current download - getCurrentDownload(session_id, download_id) { - return this.http.post(this.path + 'download', {download_id: download_id, session_id: session_id}, this.httpOptions); + getCurrentDownload(session_id: string, download_id: string) { + const body: GetDownloadRequest = {download_id: download_id, session_id: session_id}; + return this.http.post(this.path + 'download', body, this.httpOptions); } // clear downloads. download_id is optional, if it exists only 1 download will be cleared From 62c79c267e805ea16682be0aace33c640b12629d Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Thu, 24 Sep 2020 15:15:23 -0700 Subject: [PATCH 003/212] Add additional types, mainly for subscriptions --- Public API v1.yaml | 226 ++++++++++++++------------------------ src/app/posts.services.ts | 56 +++++++--- 2 files changed, 126 insertions(+), 156 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 2289c3b..589e91f 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -184,14 +184,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_5' + $ref: '#/components/schemas/SubscribeRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_6' + $ref: '#/components/schemas/SubscribeResponse' security: - Auth query parameter: [] /api/unsubscribe: @@ -205,14 +205,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_6' + $ref: '#/components/schemas/UnsubscribeRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_7' + $ref: '#/components/schemas/UnsubscribeResponse' security: - Auth query parameter: [] /api/deleteSubscriptionFile: @@ -226,14 +226,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_7' + $ref: '#/components/schemas/DeleteSubscriptionFileRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_8' + $ref: '#/components/schemas/SuccessObject' '500': description: Internal Server Error security: @@ -249,14 +249,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_8' + $ref: '#/components/schemas/GetSubscriptionRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_9' + $ref: '#/components/schemas/GetSubscriptionResponse' security: - Auth query parameter: [] /api/downloadVideosForSubscription: @@ -270,14 +270,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_9' + $ref: '#/components/schemas/DownloadVideosForSubscriptionRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_10' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/getAllSubscriptions: @@ -297,7 +297,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_11' + $ref: '#/components/schemas/GetAllSubscriptionsResponse' security: - Auth query parameter: [] /api/createPlaylist: @@ -360,7 +360,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/deletePlaylist: @@ -457,6 +457,8 @@ paths: responses: '200': description: The archive text file is sent as a response + '404': + description: If the archive dir is not found, 404 is sent as a response security: - Auth query parameter: [] /api/updaterStatus: @@ -1094,16 +1096,11 @@ components: $ref: '#/components/schemas/FileType' is_playlist: type: boolean - inline_response_200_5: - required: - - success - type: object - properties: - success: - type: boolean - body_5: + SubscribeRequest: required: + - name - url + - streamingOnly type: object properties: name: @@ -1114,46 +1111,32 @@ components: type: string streamingOnly: type: boolean - inline_response_200_6: + audioOnly: + type: boolean + customArgs: + type: string + customFileOutput: + type: string + SubscribeResponse: required: - new_sub type: object properties: new_sub: - $ref: '#/components/schemas/inline_response_200_6_new_sub' + $ref: '#/components/schemas/Subscription' error: type: string - apiunsubscribe_sub: - required: - - id - - name - - url - - videos - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - videos: - type: array - items: - type: object - body_6: + UnsubscribeRequest: required: - sub type: object properties: sub: - $ref: '#/components/schemas/apiunsubscribe_sub' + $ref: '#/components/schemas/SubscriptionRequestData' deleteMode: type: boolean description: Defaults to false - inline_response_200_7: + UnsubscribeResponse: required: - success type: object @@ -1162,30 +1145,7 @@ components: type: boolean error: type: string - apideleteSubscriptionFile_sub: - required: - - id - - isPlaylist - - name - - url - - videos - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - videos: - type: array - items: - type: object - body_7: + DeleteSubscriptionFileRequest: required: - file - sub @@ -1193,50 +1153,41 @@ components: properties: file: type: string + file_uid: + type: string sub: - $ref: '#/components/schemas/apideleteSubscriptionFile_sub' + $ref: '#/components/schemas/SubscriptionRequestData' deleteForever: type: boolean description: 'If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings.' - inline_response_200_8: - type: object - properties: - success: - type: boolean - body_8: + GetSubscriptionRequest: required: - - subID + - id type: object properties: - subID: + id: type: string - inline_response_200_9: + description: Subscription ID + GetSubscriptionResponse: required: - files - subscription type: object properties: subscription: - $ref: '#/components/schemas/inline_response_200_9_subscription' + $ref: '#/components/schemas/Subscription' files: type: array items: type: object - body_9: + DownloadVideosForSubscriptionRequest: required: - subID type: object properties: subID: type: string - inline_response_200_10: - required: - - success - type: object - properties: - success: - type: number - inline_response_200_11: + GetAllSubscriptionsResponse: required: - subscriptions type: object @@ -1244,7 +1195,7 @@ components: subscriptions: type: array items: - $ref: '#/components/schemas/inline_response_200_11_subscriptions' + $ref: '#/components/schemas/Subscription' body_10: required: - fileNames @@ -1356,20 +1307,18 @@ components: type: string type: $ref: '#/components/schemas/FileType' - apidownloadArchive_sub: - required: - - archive_dir - type: object - properties: - archive_dir: - type: string - body_17: + DownloadArchiveRequest: required: - sub type: object properties: sub: - $ref: '#/components/schemas/apidownloadArchive_sub' + required: + - archive_dir + type: object + properties: + archive_dir: + type: string inline_response_200_14: required: - details @@ -1541,11 +1490,32 @@ components: type: array items: type: string - inline_response_200_6_new_sub: + SubscriptionRequestData: + required: + - id + - name + type: object + properties: + name: + type: string + id: + type: string + type: + $ref: '#/components/schemas/FileType' + isPlaylist: + type: boolean + archive: + type: string + Subscription: required: - id - name - url + - type + - user_uid + - streamingOnly + - isPlaylist + - videos type: object properties: name: @@ -1554,53 +1524,27 @@ components: type: string id: type: string + type: + $ref: '#/components/schemas/FileType' + user_uid: + type: string + nullable: true streamingOnly: type: boolean + isPlaylist: + type: boolean + archive: + type: string timerange: type: string - inline_response_200_9_subscription: - required: - - archive - - id - - isPlaylist - - name - - url - type: object - properties: - name: + custom_args: type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - archive: - type: string - inline_response_200_11_subscriptions: - required: - - archive - - id - - isPlaylist - - name - - streamingOnly - - url - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - archive: + custom_output: type: string + videos: + type: array + items: + type: object inline_response_200_12_new_playlist: required: - fileNames diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index c6784f5..92b2b43 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -10,10 +10,32 @@ import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; -import type { DeleteMp3Mp4Request, FileType, GetAllFilesResponse, GetFileRequest, GetFileResponse, GetMp3sResponse, GetMp4sResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse } from 'api-types'; -import { GetAllDownloadsResponse } from 'api-types/models/GetAllDownloadsResponse'; -import { GetDownloadResponse } from 'api-types/models/GetDownloadResponse'; -import { GetDownloadRequest } from 'api-types/models/GetDownloadRequest'; +import { + DeleteMp3Mp4Request, + DeleteSubscriptionFileRequest, + FileType, + GetAllDownloadsResponse, + GetAllFilesResponse, + GetAllSubscriptionsResponse, + GetDownloadResponse, + GetDownloadRequest, + GetFileRequest, + GetFileResponse, + GetMp3sResponse, + GetMp4sResponse, + GetSubscriptionRequest, + GetSubscriptionResponse, + Mp3DownloadRequest, + Mp3DownloadResponse, + Mp4DownloadRequest, + Mp4DownloadResponse, + SubscribeRequest, + SubscribeResponse, + SubscriptionRequestData, + SuccessObject, + UnsubscribeRequest, + UnsubscribeResponse +} from 'api-types'; @Injectable() export class PostsService implements CanActivate { @@ -306,30 +328,34 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'deletePlaylist', {playlistID: playlistID, type: type}, this.httpOptions); } - createSubscription(url, name, timerange = null, streamingOnly = false, audioOnly = false, customArgs = null, customFileOutput = null) { - return this.http.post(this.path + 'subscribe', {url: url, name: name, timerange: timerange, streamingOnly: streamingOnly, - audioOnly: audioOnly, customArgs: customArgs, customFileOutput: customFileOutput}, this.httpOptions); + createSubscription(url: string, name: string, timerange: string = null, streamingOnly = false, audioOnly = false, customArgs: string = null, customFileOutput: string = null) { + const body: SubscribeRequest = {url: url, name: name, timerange: timerange, streamingOnly: streamingOnly, + audioOnly: audioOnly, customArgs: customArgs, customFileOutput: customFileOutput}; + return this.http.post(this.path + 'subscribe', body, this.httpOptions); } updateSubscription(subscription) { return this.http.post(this.path + 'updateSubscription', {subscription: subscription}, this.httpOptions); } - unsubscribe(sub, deleteMode = false) { - return this.http.post(this.path + 'unsubscribe', {sub: sub, deleteMode: deleteMode}, this.httpOptions) + unsubscribe(sub: SubscriptionRequestData, deleteMode = false) { + const body: UnsubscribeRequest = {sub: sub, deleteMode: deleteMode}; + return this.http.post(this.path + 'unsubscribe', body, this.httpOptions) } - deleteSubscriptionFile(sub, file, deleteForever, file_uid) { - return this.http.post(this.path + 'deleteSubscriptionFile', {sub: sub, file: file, deleteForever: deleteForever, - file_uid: file_uid}, this.httpOptions) + deleteSubscriptionFile(sub: SubscriptionRequestData, file: string, deleteForever: boolean, file_uid: string) { + const body: DeleteSubscriptionFileRequest = {sub: sub, file: file, deleteForever: deleteForever, + file_uid: file_uid}; + return this.http.post(this.path + 'deleteSubscriptionFile', body, this.httpOptions) } - getSubscription(id) { - return this.http.post(this.path + 'getSubscription', {id: id}, this.httpOptions); + getSubscription(id: string) { + const body: GetSubscriptionRequest = {id: id}; + return this.http.post(this.path + 'getSubscription', body, this.httpOptions); } getAllSubscriptions() { - return this.http.post(this.path + 'getAllSubscriptions', {}, this.httpOptions); + return this.http.post(this.path + 'getAllSubscriptions', {}, this.httpOptions); } // current downloads From 4d74c375f4c5ad188b28e3ae243abab158987244 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Thu, 24 Sep 2020 15:39:37 -0700 Subject: [PATCH 004/212] Add playlist types --- Public API v1.yaml | 114 +++++++++++++++++------------ src/app/main/main.component.ts | 5 +- src/app/player/player.component.ts | 5 +- src/app/posts.services.ts | 60 +++++++++------ 4 files changed, 112 insertions(+), 72 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 589e91f..96ba54d 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -148,7 +148,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/disableSharing: @@ -170,7 +170,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/subscribe: @@ -311,14 +311,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_10' + $ref: '#/components/schemas/CreatePlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_12' + $ref: '#/components/schemas/CreatePlaylistResponse' security: - Auth query parameter: [] /api/getPlaylist: @@ -332,28 +332,49 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_11' + $ref: '#/components/schemas/GetPlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_13' + $ref: '#/components/schemas/GetPlaylistResponse' security: - Auth query parameter: [] /api/updatePlaylist: post: tags: - playlists - summary: Update playlist files - description: Updates the list of filenames in the playlist object + summary: Update playlist + description: Updates the playlist object operationId: post-api-updatePlaylist requestBody: content: application/json: schema: - $ref: '#/components/schemas/body_12' + $ref: '#/components/schemas/UpdatePlaylistRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/updatePlaylistFiles: + post: + tags: + - playlists + summary: Update playlist files + description: Updates the list of filenames in the playlist object + operationId: post-api-updatePlaylistFiles + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePlaylistFilesRequest' responses: '200': description: OK @@ -374,14 +395,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_13' + $ref: '#/components/schemas/DeletePlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/deleteMp4: @@ -495,7 +516,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/isPinSet: @@ -532,7 +553,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/setPin: @@ -552,7 +573,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] description: '' @@ -625,7 +646,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/downloads: @@ -1196,12 +1217,13 @@ components: type: array items: $ref: '#/components/schemas/Subscription' - body_10: + CreatePlaylistRequest: required: - fileNames - playlistName - thumbnailURL - type + - duration type: object properties: playlistName: @@ -1211,30 +1233,33 @@ components: items: type: string type: - type: string + $ref: '#/components/schemas/FileType' thumbnailURL: type: string - inline_response_200_12: + duration: + type: number + CreatePlaylistResponse: required: - new_playlist - success type: object properties: new_playlist: - $ref: '#/components/schemas/inline_response_200_12_new_playlist' + $ref: '#/components/schemas/Playlist' success: type: boolean - body_11: + GetPlaylistRequest: required: - playlistID - - type type: object properties: playlistID: type: string type: + $ref: '#/components/schemas/FileType' + uuid: type: string - inline_response_200_13: + GetPlaylistResponse: required: - playlist - success @@ -1244,10 +1269,17 @@ components: playlist: $ref: '#/components/schemas/Playlist' type: - type: string + $ref: '#/components/schemas/FileType' success: type: boolean - body_12: + UpdatePlaylistRequest: + required: + - playlist + type: object + properties: + playlist: + $ref: '#/components/schemas/Playlist' + UpdatePlaylistFilesRequest: required: - fileNames - playlistID @@ -1261,8 +1293,8 @@ components: items: type: string type: - type: string - body_13: + $ref: '#/components/schemas/FileType' + DeletePlaylistRequest: required: - playlistID - type @@ -1271,7 +1303,7 @@ components: playlistID: type: string type: - type: string + $ref: '#/components/schemas/FileType' body_15: required: - fileNames @@ -1435,6 +1467,9 @@ components: - id - name - thumbnailURL + - type + - registered + - duration type: object properties: name: @@ -1447,6 +1482,12 @@ components: type: string thumbnailURL: type: string + type: + $ref: '#/components/schemas/FileType' + registered: + type: number + duration: + type: number Download: required: - uid @@ -1545,25 +1586,6 @@ components: type: array items: type: object - inline_response_200_12_new_playlist: - required: - - fileNames - - id - - name - - thumbnailURL - - type - type: object - properties: - name: - type: string - fileNames: - type: string - id: - type: string - thumbnailURL: - type: string - type: - type: string User: title: user type: object diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 3625449..28e672c 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -20,6 +20,7 @@ import { CreatePlaylistComponent } from 'app/create-playlist/create-playlist.com import { Platform } from '@angular/cdk/platform'; import { v4 as uuid } from 'uuid'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; +import type { FileType } from 'api-types'; export let audioFilesMouseHovering = false; export let videoFilesMouseHovering = false; @@ -453,7 +454,7 @@ export class MainComponent implements OnInit { } public removePlaylistMp3(playlistID, index) { - this.postsService.removePlaylist(playlistID, 'audio').subscribe(res => { + this.postsService.removePlaylist(playlistID, 'audio' as FileType).subscribe(res => { if (res['success']) { this.playlists.audio.splice(index, 1); this.openSnackBar('Playlist successfully removed.', ''); @@ -472,7 +473,7 @@ export class MainComponent implements OnInit { } public removePlaylistMp4(playlistID, index) { - this.postsService.removePlaylist(playlistID, 'video').subscribe(res => { + this.postsService.removePlaylist(playlistID, 'video' as FileType).subscribe(res => { if (res['success']) { this.playlists.video.splice(index, 1); this.openSnackBar('Playlist successfully removed.', ''); diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 3640d7ad..79eb371 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -7,6 +7,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { InputDialogComponent } from 'app/input-dialog/input-dialog.component'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-media-dialog.component'; +import type { FileType } from 'api-types'; export interface IMedia { title: string; @@ -360,7 +361,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { // Eventually do additional checks on name if (name) { const fileNames = this.getFileNames(); - this.postsService.createPlaylist(name, fileNames, this.type, null).subscribe(res => { + this.postsService.createPlaylist(name, fileNames, this.type as FileType, null).subscribe(res => { if (res['success']) { dialogRef.close(); const new_playlist = res['new_playlist']; @@ -401,7 +402,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { updatePlaylist() { const fileNames = this.getFileNames(); this.playlist_updating = true; - this.postsService.updatePlaylistFiles(this.id, fileNames, this.type).subscribe(res => { + this.postsService.updatePlaylistFiles(this.id, fileNames, this.type as FileType).subscribe(res => { this.playlist_updating = false; if (res['success']) { const fileNamesEncoded = fileNames.join('|nvr|'); diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 92b2b43..c7e7322 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -11,7 +11,10 @@ import { BehaviorSubject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; import { + CreatePlaylistRequest, + CreatePlaylistResponse, DeleteMp3Mp4Request, + DeletePlaylistRequest, DeleteSubscriptionFileRequest, FileType, GetAllDownloadsResponse, @@ -23,18 +26,24 @@ import { GetFileResponse, GetMp3sResponse, GetMp4sResponse, + GetPlaylistRequest, + GetPlaylistResponse, GetSubscriptionRequest, GetSubscriptionResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse, + Playlist, + SharingToggle, SubscribeRequest, SubscribeResponse, SubscriptionRequestData, SuccessObject, UnsubscribeRequest, - UnsubscribeResponse + UnsubscribeResponse, + UpdatePlaylistFilesRequest, + UpdatePlaylistRequest, } from 'api-types'; @Injectable() @@ -293,39 +302,46 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); } - enableSharing(uid, type, is_playlist) { - return this.http.post(this.path + 'enableSharing', {uid: uid, type: type, is_playlist: is_playlist}, this.httpOptions); + enableSharing(uid: string, type: FileType, is_playlist: boolean) { + const body: SharingToggle = {uid: uid, type: type, is_playlist: is_playlist}; + return this.http.post(this.path + 'enableSharing', body, this.httpOptions); } - disableSharing(uid, type, is_playlist) { - return this.http.post(this.path + 'disableSharing', {uid: uid, type: type, is_playlist: is_playlist}, this.httpOptions); + disableSharing(uid: string, type: FileType, is_playlist: boolean) { + const body: SharingToggle = {uid: uid, type: type, is_playlist: is_playlist}; + return this.http.post(this.path + 'disableSharing', body, this.httpOptions); } - createPlaylist(playlistName, fileNames, type, thumbnailURL, duration = null) { - return this.http.post(this.path + 'createPlaylist', {playlistName: playlistName, - fileNames: fileNames, - type: type, - thumbnailURL: thumbnailURL, - duration: duration}, this.httpOptions); + createPlaylist(playlistName: string, fileNames: string[], type: FileType, thumbnailURL: string, duration: number = null) { + const body: CreatePlaylistRequest = {playlistName: playlistName, + fileNames: fileNames, + type: type, + thumbnailURL: thumbnailURL, + duration: duration}; + return this.http.post(this.path + 'createPlaylist', body, this.httpOptions); } - getPlaylist(playlistID, type, uuid = null) { - return this.http.post(this.path + 'getPlaylist', {playlistID: playlistID, - type: type, uuid: uuid}, this.httpOptions); + getPlaylist(playlistID: string, type: FileType, uuid: string = null) { + const body: GetPlaylistRequest = {playlistID: playlistID, + type: type, uuid: uuid}; + return this.http.post(this.path + 'getPlaylist', body, this.httpOptions); } - updatePlaylist(playlist) { - return this.http.post(this.path + 'updatePlaylist', {playlist: playlist}, this.httpOptions); + updatePlaylist(playlist: Playlist) { + const body: UpdatePlaylistRequest = {playlist: playlist}; + return this.http.post(this.path + 'updatePlaylist', body, this.httpOptions); } - updatePlaylistFiles(playlistID, fileNames, type) { - return this.http.post(this.path + 'updatePlaylistFiles', {playlistID: playlistID, - fileNames: fileNames, - type: type}, this.httpOptions); + updatePlaylistFiles(playlistID: string, fileNames: string[], type: FileType) { + const body: UpdatePlaylistFilesRequest = {playlistID: playlistID, + fileNames: fileNames, + type: type}; + return this.http.post(this.path + 'updatePlaylistFiles', body, this.httpOptions); } - removePlaylist(playlistID, type) { - return this.http.post(this.path + 'deletePlaylist', {playlistID: playlistID, type: type}, this.httpOptions); + removePlaylist(playlistID: string, type: FileType) { + const body: DeletePlaylistRequest = {playlistID: playlistID, type: type}; + return this.http.post(this.path + 'deletePlaylist', body, this.httpOptions); } createSubscription(url: string, name: string, timerange: string = null, streamingOnly = false, audioOnly = false, customArgs: string = null, customFileOutput: string = null) { From fe7a3075d6dca48058518815e1f37b7fa216e237 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Fri, 25 Sep 2020 10:26:05 -0700 Subject: [PATCH 005/212] Rename last few active API routes --- Public API v1.yaml | 75 +++++++++++-------- .../recent-videos/recent-videos.component.ts | 9 ++- .../update-progress-dialog.component.ts | 3 +- src/app/main/main.component.ts | 8 +- src/app/player/player.component.ts | 8 +- src/app/posts.services.ts | 72 +++++++++++------- .../subscription/subscription.component.ts | 3 +- 7 files changed, 106 insertions(+), 72 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 96ba54d..e508fd5 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -437,11 +437,7 @@ paths: content: application/json: schema: - type: object - properties: {} - application/xml: - schema: - $ref: '#/components/schemas/body_15' + $ref: '#/components/schemas/DownloadFileRequest' responses: '200': description: 'The file itself is in the response, as well as an options object.' @@ -474,7 +470,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_17' + $ref: '#/components/schemas/DownloadArchiveRequest' responses: '200': description: The archive text file is sent as a response @@ -495,7 +491,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_14' + $ref: '#/components/schemas/UpdaterStatus' security: - Auth query parameter: [] /api/updateServer: @@ -509,7 +505,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_18' + $ref: '#/components/schemas/UpdateServerRequest' responses: '200': description: OK @@ -590,7 +586,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_16' + $ref: '#/components/schemas/GenerateNewApiKeyResponse' security: - Auth query parameter: [] /api/deleteMp3: @@ -627,7 +623,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_17' + $ref: '#/components/schemas/ConfigResponse' security: - Auth query parameter: [] /api/setConfig: @@ -639,7 +635,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_22' + $ref: '#/components/schemas/SetConfigRequest' responses: '200': description: OK @@ -647,6 +643,8 @@ paths: application/json: schema: $ref: '#/components/schemas/SuccessObject' + '404': + description: Tried to save invalid config file. security: - Auth query parameter: [] /api/downloads: @@ -937,6 +935,13 @@ components: enum: - audio - video + Config: + required: + - YoutubeDLMaterial + type: object + properties: + YoutubeDLMaterial: + type: object BaseDownloadRequest: required: - url @@ -1304,29 +1309,33 @@ components: type: string type: $ref: '#/components/schemas/FileType' - body_15: + DownloadFileRequest: required: - fileNames - type type: object properties: fileNames: - type: array - description: Array of 1 or more files to download - items: - type: string + oneOf: + - type: string + - type: array + description: Array of 1 or more files to download + items: + type: string zip_mode: type: boolean type: - type: string + $ref: '#/components/schemas/FileType' outputName: type: string fullPathProvided: + type: boolean + uuid: type: string subscriptionName: type: boolean description: Only used for subscriptions - subscriptionPlaylist: + subPlaylist: type: boolean description: Only used for subscriptions DeleteFileRequest: @@ -1351,7 +1360,7 @@ components: properties: archive_dir: type: string - inline_response_200_14: + UpdaterStatus: required: - details - updating @@ -1361,7 +1370,11 @@ components: type: boolean details: type: string - body_18: + error: + type: boolean + UpdateServerRequest: + required: + - tag type: object properties: tag: @@ -1387,7 +1400,7 @@ components: properties: unhashed_pin: type: string - inline_response_200_16: + GenerateNewApiKeyResponse: required: - new_api_key type: object @@ -1404,23 +1417,23 @@ components: type: string blacklistMode: type: boolean - inline_response_200_17: + ConfigResponse: required: - config_file - success type: object properties: config_file: - type: object + $ref: '#/components/schemas/Config' success: type: boolean - body_22: + SetConfigRequest: required: - new_config_file type: object properties: new_config_file: - type: object + $ref: '#/components/schemas/Config' DatabaseFile: required: - duration @@ -1621,7 +1634,7 @@ components: subscriptions: type: array items: - $ref: '#/components/schemas/inline_response_200_9_subscription' + $ref: '#/components/schemas/Subscription' created: type: number role: @@ -1643,6 +1656,11 @@ components: - sharing - advanced_download - downloads_manager + YesNo: + type: string + enum: + - 'yes' + - 'no' BaseChangePermissionsRequest: required: - permission @@ -1652,10 +1670,7 @@ components: permission: $ref: '#/components/schemas/UserPermission' new_value: - type: string - enum: - - 'yes' - - 'no' + $ref: '#/components/schemas/YesNo' ChangeUserPermissionsRequest: allOf: - $ref: '#/components/schemas/BaseChangePermissionsRequest' diff --git a/src/app/components/recent-videos/recent-videos.component.ts b/src/app/components/recent-videos/recent-videos.component.ts index 8333f79..11a6dcc 100644 --- a/src/app/components/recent-videos/recent-videos.component.ts +++ b/src/app/components/recent-videos/recent-videos.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { Router } from '@angular/router'; +import type { FileType } from '../../../api-types'; @Component({ selector: 'app-recent-videos', @@ -161,7 +162,7 @@ export class RecentVideosComponent implements OnInit { // normal subscriptions !new_tab ? this.router.navigate(['/player', {fileNames: file.id, type: file.isAudio ? 'audio' : 'video', subscriptionName: sub.name, - subPlaylist: sub.isPlaylist}]) + subPlaylist: sub.isPlaylist}]) : window.open(`/#/player;fileNames=${file.id};type=${file.isAudio ? 'audio' : 'video'};subscriptionName=${sub.name};subPlaylist=${sub.isPlaylist}`); } } else { @@ -186,7 +187,7 @@ export class RecentVideosComponent implements OnInit { } downloadSubscriptionFile(file) { - const type = file.isAudio ? 'audio' : 'video'; + const type = (file.isAudio ? 'audio' : 'video') as FileType; const ext = type === 'audio' ? '.mp3' : '.mp4' const sub = this.postsService.getSubscriptionByID(file.sub_id); this.postsService.downloadFileFromServer(file.id, type, null, null, sub.name, sub.isPlaylist, @@ -199,7 +200,7 @@ export class RecentVideosComponent implements OnInit { } downloadNormalFile(file) { - const type = file.isAudio ? 'audio' : 'video'; + const type = (file.isAudio ? 'audio' : 'video') as FileType; const ext = type === 'audio' ? '.mp3' : '.mp4' const name = file.id; this.downloading_content[type][name] = true; @@ -276,7 +277,7 @@ export class RecentVideosComponent implements OnInit { const result = b.registered - a.registered; return result; } - + durationStringToNumber(dur_str) { let num_sum = 0; const dur_str_parts = dur_str.split(':'); diff --git a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts index fe1fbf4..9ca066f 100644 --- a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts +++ b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { MatSnackBar } from '@angular/material/snack-bar'; +import type { UpdaterStatus } from '../../../api-types'; @Component({ selector: 'app-update-progress-dialog', @@ -9,7 +10,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; }) export class UpdateProgressDialogComponent implements OnInit { - updateStatus = null; + updateStatus: UpdaterStatus = null; updateInterval = 250; errored = false; diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 28e672c..c0bb894 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -20,7 +20,7 @@ import { CreatePlaylistComponent } from 'app/create-playlist/create-playlist.com import { Platform } from '@angular/cdk/platform'; import { v4 as uuid } from 'uuid'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; -import type { FileType } from 'api-types'; +import type { FileType } from '../../api-types'; export let audioFilesMouseHovering = false; export let videoFilesMouseHovering = false; @@ -34,7 +34,7 @@ export interface Download { percent_complete: number; downloading: boolean; is_playlist: boolean; - error: boolean | string; + error?: boolean | string; fileNames?: string[]; complete?: boolean; timestamp_start?: number; @@ -740,7 +740,7 @@ export class MainComponent implements OnInit { downloadAudioFile(name) { this.downloading_content['audio'][name] = true; - this.postsService.downloadFileFromServer(name, 'audio').subscribe(res => { + this.postsService.downloadFileFromServer(name, 'audio' as FileType).subscribe(res => { this.downloading_content['audio'][name] = false; const blob: Blob = res; saveAs(blob, decodeURIComponent(name) + '.mp3'); @@ -757,7 +757,7 @@ export class MainComponent implements OnInit { downloadVideoFile(name) { this.downloading_content['video'][name] = true; - this.postsService.downloadFileFromServer(name, 'video').subscribe(res => { + this.postsService.downloadFileFromServer(name, 'video' as FileType).subscribe(res => { this.downloading_content['video'][name] = false; const blob: Blob = res; saveAs(blob, decodeURIComponent(name) + '.mp4'); diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 79eb371..57e2ea4 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -7,7 +7,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { InputDialogComponent } from 'app/input-dialog/input-dialog.component'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-media-dialog.component'; -import type { FileType } from 'api-types'; +import type { FileType } from '../../api-types'; export interface IMedia { title: string; @@ -35,7 +35,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { // params fileNames: string[]; - type: string; + type: FileType; id = null; // used for playlists (not subscription) uid = null; // used for non-subscription files (audio, video, playlist) subscriptionName = null; @@ -74,7 +74,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { ngOnInit(): void { this.innerWidth = window.innerWidth; - this.type = this.route.snapshot.paramMap.get('type'); + this.type = this.route.snapshot.paramMap.get('type') as FileType; this.id = this.route.snapshot.paramMap.get('id'); this.uid = this.route.snapshot.paramMap.get('uid'); this.subscriptionName = this.route.snapshot.paramMap.get('subscriptionName'); @@ -160,7 +160,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { if (!this.id) { // regular video/audio file (not playlist) this.fileNames = [this.db_file['id']]; - this.type = this.db_file['isAudio'] ? 'audio' : 'video'; + this.type = (this.db_file['isAudio'] ? 'audio' : 'video') as FileType; if (!already_has_filenames) { this.parseFileNames(); } } } diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index c7e7322..d0fad49 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -10,13 +10,19 @@ import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; -import { +import type { + ChangeRolePermissionsRequest, + ChangeUserPermissionsRequest, + ConfigResponse, CreatePlaylistRequest, CreatePlaylistResponse, DeleteMp3Mp4Request, DeletePlaylistRequest, DeleteSubscriptionFileRequest, + DownloadArchiveRequest, + DownloadFileRequest, FileType, + GenerateNewApiKeyResponse, GetAllDownloadsResponse, GetAllFilesResponse, GetAllSubscriptionsResponse, @@ -35,16 +41,21 @@ import { Mp4DownloadRequest, Mp4DownloadResponse, Playlist, + SetConfigRequest, SharingToggle, SubscribeRequest, SubscribeResponse, SubscriptionRequestData, SuccessObject, + UpdaterStatus, UnsubscribeRequest, UnsubscribeResponse, UpdatePlaylistFilesRequest, UpdatePlaylistRequest, -} from 'api-types'; + UpdateServerRequest, + UserPermission, + YesNo, +} from '../api-types'; @Injectable() export class PostsService implements CanActivate { @@ -224,7 +235,7 @@ export class PostsService implements CanActivate { if (isDevMode()) { return this.http.get('./assets/default.json'); } else { - return this.http.get(this.path + 'config', this.httpOptions); + return this.http.get(this.path + 'config', this.httpOptions); } } @@ -233,7 +244,8 @@ export class PostsService implements CanActivate { } setConfig(config) { - return this.http.post(this.path + 'setConfig', {new_config_file: config}, this.httpOptions); + const body: SetConfigRequest = {new_config_file: config}; + return this.http.post(this.path + 'setConfig', body, this.httpOptions); } deleteFile(uid: string, isAudio: boolean, blacklistMode = false) { @@ -262,19 +274,19 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {}, this.httpOptions); } - downloadFileFromServer(fileName, type, outputName = null, fullPathProvided = null, subscriptionName = null, subPlaylist = null, - uid = null, uuid = null, id = null) { - return this.http.post(this.path + 'downloadFile', {fileNames: fileName, - type: type, - zip_mode: Array.isArray(fileName), - outputName: outputName, - fullPathProvided: fullPathProvided, - subscriptionName: subscriptionName, - subPlaylist: subPlaylist, - uuid: uuid, - uid: uid, - id: id - }, + downloadFileFromServer(fileName: string | string[], type: FileType, outputName: string = null, fullPathProvided: boolean = null, subscriptionName: boolean = null, subPlaylist: boolean = null, + uid = null, uuid: string = null, id = null) { + const body: DownloadFileRequest = {fileNames: fileName, + type: type, + zip_mode: Array.isArray(fileName), + outputName: outputName, + fullPathProvided: fullPathProvided, + subscriptionName: subscriptionName, + subPlaylist: subPlaylist, + uuid: uuid, + id: id, + }; + return this.http.post(this.path + 'downloadFile', body, {responseType: 'blob', params: this.httpOptions.params}); } @@ -283,7 +295,8 @@ export class PostsService implements CanActivate { } downloadArchive(sub) { - return this.http.post(this.path + 'downloadArchive', {sub: sub}, {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadArchiveRequest = {sub: sub}; + return this.http.post(this.path + 'downloadArchive', body, {responseType: 'blob', params: this.httpOptions.params}); } getFileInfo(fileNames, type, urlMode) { @@ -299,7 +312,7 @@ export class PostsService implements CanActivate { } generateNewAPIKey() { - return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); + return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); } enableSharing(uid: string, type: FileType, is_playlist: boolean) { @@ -393,12 +406,13 @@ export class PostsService implements CanActivate { } // updates the server to the latest version - updateServer(tag) { - return this.http.post(this.path + 'updateServer', {tag: tag}, this.httpOptions); + updateServer(tag: string) { + const body: UpdateServerRequest = {tag: tag}; + return this.http.post(this.path + 'updateServer', body, this.httpOptions); } getUpdaterStatus() { - return this.http.get(this.path + 'updaterStatus', this.httpOptions); + return this.http.get(this.path + 'updaterStatus', this.httpOptions); } // gets tag of the latest version of youtubedl-material @@ -534,11 +548,11 @@ export class PostsService implements CanActivate { } changeUser(change_obj) { - return this.http.post(this.path + 'updateUser', {change_object: change_obj}, this.httpOptions); + return this.http.post(this.path + 'updateUser', {change_object: change_obj}, this.httpOptions); } deleteUser(uid) { - return this.http.post(this.path + 'deleteUser', {uid: uid}, this.httpOptions); + return this.http.post(this.path + 'deleteUser', {uid: uid}, this.httpOptions); } changeUserPassword(user_uid, new_password) { @@ -553,13 +567,15 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getRoles', {}, this.httpOptions); } - setUserPermission(user_uid, permission, new_value) { - return this.http.post(this.path + 'changeUserPermissions', {user_uid: user_uid, permission: permission, new_value: new_value}, + setUserPermission(user_uid: string, permission: UserPermission, new_value: YesNo) { + const body: ChangeUserPermissionsRequest = {user_uid: user_uid, permission: permission, new_value: new_value}; + return this.http.post(this.path + 'changeUserPermissions', body, this.httpOptions); } - setRolePermission(role_name, permission, new_value) { - return this.http.post(this.path + 'changeRolePermissions', {role: role_name, permission: permission, new_value: new_value}, + setRolePermission(role_name: string, permission: UserPermission, new_value: YesNo) { + const body: ChangeRolePermissionsRequest = {role: role_name, permission: permission, new_value: new_value}; + return this.http.post(this.path + 'changeRolePermissions', body, this.httpOptions); } diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index 794a268..eb2f35b 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -3,6 +3,7 @@ import { PostsService } from 'app/posts.services'; import { ActivatedRoute, Router, ParamMap } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { EditSubscriptionDialogComponent } from 'app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component'; +import type { FileType } from '../../../api-types'; @Component({ selector: 'app-subscription', @@ -151,7 +152,7 @@ export class SubscriptionComponent implements OnInit { } this.downloading = true; - this.postsService.downloadFileFromServer(fileNames, 'video', this.subscription.name, true).subscribe(res => { + this.postsService.downloadFileFromServer(fileNames, 'video' as FileType, this.subscription.name, true).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, this.subscription.name + '.zip'); From 70d1afce762f71684823b9f66c558df83d804e4c Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Fri, 25 Sep 2020 10:46:55 -0700 Subject: [PATCH 006/212] Move user schemas so they can be imported --- Public API v1.yaml | 191 +++++++++++++++++++++----------------- src/app/posts.services.ts | 46 +++++---- 2 files changed, 134 insertions(+), 103 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index e508fd5..70d56c5 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -695,35 +695,13 @@ paths: content: application/json: schema: - type: object - properties: - user: - $ref: '#/components/schemas/User' - token: - type: string - permissions: - type: array - items: - type: string - available_permissions: - type: array - items: - type: string + $ref: '#/components/schemas/LoginResponse' description: Use this method to log into a user using their username and password and receive a jwt auth token so you can send per-user requests. requestBody: content: application/json: schema: - type: object - properties: - userid: - type: string - description: 'This is the username, not the user uid' - password: - type: string - required: - - userid - - password + $ref: '#/components/schemas/LoginRequest' security: - Auth query parameter: [] tags: @@ -738,27 +716,13 @@ paths: content: application/json: schema: - type: object - properties: - user: - $ref: '#/components/schemas/User' + $ref: '#/components/schemas/RegisterResponse' description: Use this endpoint to register a user. It will only work if registration is enabled. requestBody: content: application/json: schema: - type: object - properties: - userid: - type: string - username: - type: string - password: - type: string - required: - - userid - - username - - password + $ref: '#/components/schemas/RegisterRequest' security: - Auth query parameter: [] tags: @@ -778,21 +742,7 @@ paths: content: application/json: schema: - type: object - properties: - change_object: - required: - - uid - type: object - properties: - uid: - type: string - name: - type: string - role: - type: string - required: - - change_object + $ref: '#/components/schemas/UpdateUserRequest' description: Updates certain properties for a user. Only two are possible right now. security: - Auth query parameter: [] @@ -814,12 +764,7 @@ paths: content: application/json: schema: - type: object - properties: - uid: - type: string - required: - - uid + $ref: '#/components/schemas/DeleteUserRequest' security: - Auth query parameter: [] tags: @@ -834,25 +779,7 @@ paths: content: application/json: schema: - type: object - properties: - roles: - type: object - properties: - admin: - type: object - properties: - permissions: - type: array - items: - $ref: '#/components/schemas/UserPermission' - user: - type: object - properties: - permissions: - type: array - items: - $ref: '#/components/schemas/UserPermission' + $ref: '#/components/schemas/GetRolesResponse' description: Gets the available roles and their permissions security: - Auth query parameter: [] @@ -910,12 +837,7 @@ paths: content: application/json: schema: - type: object - properties: - users: - type: array - items: - $ref: '#/components/schemas/User' + $ref: '#/components/schemas/GetUsersResponse' description: 'Gets all users, returns a list of the user objects including their user permissions, videos, playlists, subscriptions, etc.' security: - Auth query parameter: [] @@ -1695,6 +1617,103 @@ components: properties: id: type: string + RegisterRequest: + required: + - userid + - username + - password + type: object + properties: + userid: + type: string + username: + type: string + password: + type: string + RegisterResponse: + type: object + properties: + user: + $ref: '#/components/schemas/User' + LoginRequest: + required: + - username + - password + type: object + properties: + username: + type: string + password: + type: string + LoginResponse: + type: object + properties: + user: + $ref: '#/components/schemas/User' + token: + type: string + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + available_permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + UpdateUserRequest: + required: + - change_object + type: object + properties: + change_object: + required: + - uid + type: object + properties: + uid: + type: string + name: + type: string + role: + type: string + DeleteUserRequest: + required: + - uid + type: object + properties: + uid: + type: string + GetUsersResponse: + required: + - users + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + GetRolesResponse: + required: + - roles + type: object + properties: + roles: + type: object + properties: + admin: + type: object + properties: + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + user: + type: object + properties: + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' securitySchemes: Auth query parameter: name: apiKey diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index d0fad49..976298c 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -19,6 +19,7 @@ import type { DeleteMp3Mp4Request, DeletePlaylistRequest, DeleteSubscriptionFileRequest, + DeleteUserRequest, DownloadArchiveRequest, DownloadFileRequest, FileType, @@ -34,13 +35,19 @@ import type { GetMp4sResponse, GetPlaylistRequest, GetPlaylistResponse, + GetRolesResponse, GetSubscriptionRequest, GetSubscriptionResponse, + GetUsersResponse, + LoginRequest, + LoginResponse, Mp3DownloadRequest, Mp3DownloadResponse, Mp4DownloadRequest, Mp4DownloadResponse, Playlist, + RegisterRequest, + RegisterResponse, SetConfigRequest, SharingToggle, SubscribeRequest, @@ -53,6 +60,7 @@ import type { UpdatePlaylistFilesRequest, UpdatePlaylistRequest, UpdateServerRequest, + UpdateUserRequest, UserPermission, YesNo, } from '../api-types'; @@ -444,9 +452,9 @@ export class PostsService implements CanActivate { } // user methods - login(username, password) { - const call = this.http.post(this.path + 'auth/login', {username: username, password: password}, this.httpOptions); - return call; + login(username: string, password: string) { + const body: LoginRequest = {username: username, password: password}; + return this.http.post(this.path + 'auth/login', body, this.httpOptions); } // user methods @@ -481,10 +489,11 @@ export class PostsService implements CanActivate { } // user methods - register(username, password) { - const call = this.http.post(this.path + 'auth/register', {userid: username, - username: username, - password: password}, this.httpOptions); + register(username: string, password: string) { + const body: RegisterRequest = {userid: username, + username: username, + password: password} + const call = this.http.post(this.path + 'auth/register', body, this.httpOptions); return call; } @@ -529,10 +538,11 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'auth/adminExists', {}, this.httpOptions); } - createAdminAccount(password) { - return this.http.post(this.path + 'auth/register', {userid: 'admin', - username: 'admin', - password: password}, this.httpOptions); + createAdminAccount(password: string) { + const body: RegisterRequest = {userid: 'admin', + username: 'admin', + password: password}; + return this.http.post(this.path + 'auth/register', body, this.httpOptions); } checkAdminCreationStatus(force_show = false) { @@ -547,12 +557,14 @@ export class PostsService implements CanActivate { }); } - changeUser(change_obj) { - return this.http.post(this.path + 'updateUser', {change_object: change_obj}, this.httpOptions); + changeUser(change_obj: UpdateUserRequest['change_object']) { + const body: UpdateUserRequest = {change_object: change_obj}; + return this.http.post(this.path + 'updateUser', body, this.httpOptions); } - deleteUser(uid) { - return this.http.post(this.path + 'deleteUser', {uid: uid}, this.httpOptions); + deleteUser(uid: string) { + const body: DeleteUserRequest = {uid: uid}; + return this.http.post(this.path + 'deleteUser', body, this.httpOptions); } changeUserPassword(user_uid, new_password) { @@ -560,11 +572,11 @@ export class PostsService implements CanActivate { } getUsers() { - return this.http.post(this.path + 'getUsers', {}, this.httpOptions); + return this.http.post(this.path + 'getUsers', {}, this.httpOptions); } getRoles() { - return this.http.post(this.path + 'getRoles', {}, this.httpOptions); + return this.http.post(this.path + 'getRoles', {}, this.httpOptions); } setUserPermission(user_uid: string, permission: UserPermission, new_value: YesNo) { From 111254824631891d53d91b9ad05a5f176c3376d9 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Fri, 25 Sep 2020 10:47:25 -0700 Subject: [PATCH 007/212] Commit api types --- .gitignore | 1 - src/api-types/index.ts | 70 +++++++++++++++++++ .../models/BaseChangePermissionsRequest.ts | 11 +++ src/api-types/models/BaseDownloadRequest.ts | 29 ++++++++ src/api-types/models/BaseDownloadResponse.ts | 9 +++ .../models/ChangeRolePermissionsRequest.ts | 9 +++ .../models/ChangeUserPermissionsRequest.ts | 9 +++ src/api-types/models/Config.ts | 8 +++ src/api-types/models/ConfigResponse.ts | 10 +++ src/api-types/models/CreatePlaylistRequest.ts | 13 ++++ .../models/CreatePlaylistResponse.ts | 10 +++ src/api-types/models/DatabaseFile.ts | 22 ++++++ src/api-types/models/DeleteFileRequest.ts | 10 +++ src/api-types/models/DeleteMp3Mp4Request.ts | 9 +++ src/api-types/models/DeletePlaylistRequest.ts | 10 +++ .../models/DeleteSubscriptionFileRequest.ts | 15 ++++ src/api-types/models/DeleteUserRequest.ts | 8 +++ src/api-types/models/Dictionary.ts | 7 ++ src/api-types/models/Download.ts | 23 ++++++ .../models/DownloadArchiveRequest.ts | 10 +++ src/api-types/models/DownloadFileRequest.ts | 22 ++++++ .../DownloadVideosForSubscriptionRequest.ts | 8 +++ src/api-types/models/File.ts | 8 +++ src/api-types/models/FileType.ts | 9 +++ .../models/GenerateNewApiKeyResponse.ts | 8 +++ .../models/GetAllDownloadsResponse.ts | 13 ++++ src/api-types/models/GetAllFilesResponse.ts | 14 ++++ .../models/GetAllSubscriptionsResponse.ts | 9 +++ src/api-types/models/GetDownloadRequest.ts | 9 +++ src/api-types/models/GetDownloadResponse.ts | 9 +++ src/api-types/models/GetFileRequest.ts | 17 +++++ src/api-types/models/GetFileResponse.ts | 10 +++ src/api-types/models/GetMp3sResponse.ts | 14 ++++ src/api-types/models/GetMp4sResponse.ts | 14 ++++ src/api-types/models/GetPlaylistRequest.ts | 11 +++ src/api-types/models/GetPlaylistResponse.ts | 12 ++++ src/api-types/models/GetRolesResponse.ts | 16 +++++ .../models/GetSubscriptionRequest.ts | 11 +++ .../models/GetSubscriptionResponse.ts | 10 +++ src/api-types/models/GetUsersResponse.ts | 9 +++ src/api-types/models/LoginRequest.ts | 9 +++ src/api-types/models/LoginResponse.ts | 13 ++++ src/api-types/models/Mp3DownloadRequest.ts | 12 ++++ src/api-types/models/Mp3DownloadResponse.ts | 9 +++ src/api-types/models/Mp4DownloadRequest.ts | 12 ++++ src/api-types/models/Mp4DownloadResponse.ts | 9 +++ src/api-types/models/Playlist.ts | 15 ++++ src/api-types/models/RegisterRequest.ts | 10 +++ src/api-types/models/RegisterResponse.ts | 9 +++ src/api-types/models/SetConfigRequest.ts | 9 +++ src/api-types/models/SharingToggle.ts | 11 +++ src/api-types/models/SubscribeRequest.ts | 14 ++++ src/api-types/models/SubscribeResponse.ts | 10 +++ src/api-types/models/Subscription.ts | 20 ++++++ .../models/SubscriptionRequestData.ts | 13 ++++ src/api-types/models/SuccessObject.ts | 8 +++ src/api-types/models/UnsubscribeRequest.ts | 13 ++++ src/api-types/models/UnsubscribeResponse.ts | 9 +++ .../models/UpdatePlaylistFilesRequest.ts | 11 +++ src/api-types/models/UpdatePlaylistRequest.ts | 9 +++ src/api-types/models/UpdateServerRequest.ts | 8 +++ src/api-types/models/UpdateUserRequest.ts | 12 ++++ src/api-types/models/UpdaterStatus.ts | 10 +++ src/api-types/models/User.ts | 25 +++++++ src/api-types/models/UserPermission.ts | 13 ++++ src/api-types/models/YesNo.ts | 9 +++ src/api-types/models/body_19.ts | 8 +++ src/api-types/models/body_20.ts | 8 +++ .../models/inline_response_200_15.ts | 8 +++ 69 files changed, 851 insertions(+), 1 deletion(-) create mode 100644 src/api-types/index.ts create mode 100644 src/api-types/models/BaseChangePermissionsRequest.ts create mode 100644 src/api-types/models/BaseDownloadRequest.ts create mode 100644 src/api-types/models/BaseDownloadResponse.ts create mode 100644 src/api-types/models/ChangeRolePermissionsRequest.ts create mode 100644 src/api-types/models/ChangeUserPermissionsRequest.ts create mode 100644 src/api-types/models/Config.ts create mode 100644 src/api-types/models/ConfigResponse.ts create mode 100644 src/api-types/models/CreatePlaylistRequest.ts create mode 100644 src/api-types/models/CreatePlaylistResponse.ts create mode 100644 src/api-types/models/DatabaseFile.ts create mode 100644 src/api-types/models/DeleteFileRequest.ts create mode 100644 src/api-types/models/DeleteMp3Mp4Request.ts create mode 100644 src/api-types/models/DeletePlaylistRequest.ts create mode 100644 src/api-types/models/DeleteSubscriptionFileRequest.ts create mode 100644 src/api-types/models/DeleteUserRequest.ts create mode 100644 src/api-types/models/Dictionary.ts create mode 100644 src/api-types/models/Download.ts create mode 100644 src/api-types/models/DownloadArchiveRequest.ts create mode 100644 src/api-types/models/DownloadFileRequest.ts create mode 100644 src/api-types/models/DownloadVideosForSubscriptionRequest.ts create mode 100644 src/api-types/models/File.ts create mode 100644 src/api-types/models/FileType.ts create mode 100644 src/api-types/models/GenerateNewApiKeyResponse.ts create mode 100644 src/api-types/models/GetAllDownloadsResponse.ts create mode 100644 src/api-types/models/GetAllFilesResponse.ts create mode 100644 src/api-types/models/GetAllSubscriptionsResponse.ts create mode 100644 src/api-types/models/GetDownloadRequest.ts create mode 100644 src/api-types/models/GetDownloadResponse.ts create mode 100644 src/api-types/models/GetFileRequest.ts create mode 100644 src/api-types/models/GetFileResponse.ts create mode 100644 src/api-types/models/GetMp3sResponse.ts create mode 100644 src/api-types/models/GetMp4sResponse.ts create mode 100644 src/api-types/models/GetPlaylistRequest.ts create mode 100644 src/api-types/models/GetPlaylistResponse.ts create mode 100644 src/api-types/models/GetRolesResponse.ts create mode 100644 src/api-types/models/GetSubscriptionRequest.ts create mode 100644 src/api-types/models/GetSubscriptionResponse.ts create mode 100644 src/api-types/models/GetUsersResponse.ts create mode 100644 src/api-types/models/LoginRequest.ts create mode 100644 src/api-types/models/LoginResponse.ts create mode 100644 src/api-types/models/Mp3DownloadRequest.ts create mode 100644 src/api-types/models/Mp3DownloadResponse.ts create mode 100644 src/api-types/models/Mp4DownloadRequest.ts create mode 100644 src/api-types/models/Mp4DownloadResponse.ts create mode 100644 src/api-types/models/Playlist.ts create mode 100644 src/api-types/models/RegisterRequest.ts create mode 100644 src/api-types/models/RegisterResponse.ts create mode 100644 src/api-types/models/SetConfigRequest.ts create mode 100644 src/api-types/models/SharingToggle.ts create mode 100644 src/api-types/models/SubscribeRequest.ts create mode 100644 src/api-types/models/SubscribeResponse.ts create mode 100644 src/api-types/models/Subscription.ts create mode 100644 src/api-types/models/SubscriptionRequestData.ts create mode 100644 src/api-types/models/SuccessObject.ts create mode 100644 src/api-types/models/UnsubscribeRequest.ts create mode 100644 src/api-types/models/UnsubscribeResponse.ts create mode 100644 src/api-types/models/UpdatePlaylistFilesRequest.ts create mode 100644 src/api-types/models/UpdatePlaylistRequest.ts create mode 100644 src/api-types/models/UpdateServerRequest.ts create mode 100644 src/api-types/models/UpdateUserRequest.ts create mode 100644 src/api-types/models/UpdaterStatus.ts create mode 100644 src/api-types/models/User.ts create mode 100644 src/api-types/models/UserPermission.ts create mode 100644 src/api-types/models/YesNo.ts create mode 100644 src/api-types/models/body_19.ts create mode 100644 src/api-types/models/body_20.ts create mode 100644 src/api-types/models/inline_response_200_15.ts diff --git a/.gitignore b/.gitignore index 32c9fd9..c99f53f 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,6 @@ backend/subscriptions/playlists/* backend/subscriptions/archives/* backend/*.exe src/assets/default.json -src/api-types backend/appdata/db.json backend/appdata/archives/archive_audio.txt backend/appdata/archives/archive_video.txt diff --git a/src/api-types/index.ts b/src/api-types/index.ts new file mode 100644 index 0000000..5a0b927 --- /dev/null +++ b/src/api-types/index.ts @@ -0,0 +1,70 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; +export type { BaseDownloadRequest } from './models/BaseDownloadRequest'; +export type { BaseDownloadResponse } from './models/BaseDownloadResponse'; +export type { body_19 } from './models/body_19'; +export type { body_20 } from './models/body_20'; +export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermissionsRequest'; +export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest'; +export type { Config } from './models/Config'; +export type { ConfigResponse } from './models/ConfigResponse'; +export type { CreatePlaylistRequest } from './models/CreatePlaylistRequest'; +export type { CreatePlaylistResponse } from './models/CreatePlaylistResponse'; +export type { DatabaseFile } from './models/DatabaseFile'; +export type { DeleteFileRequest } from './models/DeleteFileRequest'; +export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; +export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; +export type { DeleteSubscriptionFileRequest } from './models/DeleteSubscriptionFileRequest'; +export type { DeleteUserRequest } from './models/DeleteUserRequest'; +export type { Download } from './models/Download'; +export type { DownloadArchiveRequest } from './models/DownloadArchiveRequest'; +export type { DownloadFileRequest } from './models/DownloadFileRequest'; +export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; +export type { File } from './models/File'; +export { FileType } from './models/FileType'; +export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse'; +export type { GetAllDownloadsResponse } from './models/GetAllDownloadsResponse'; +export type { GetAllFilesResponse } from './models/GetAllFilesResponse'; +export type { GetAllSubscriptionsResponse } from './models/GetAllSubscriptionsResponse'; +export type { GetDownloadRequest } from './models/GetDownloadRequest'; +export type { GetDownloadResponse } from './models/GetDownloadResponse'; +export type { GetFileRequest } from './models/GetFileRequest'; +export type { GetFileResponse } from './models/GetFileResponse'; +export type { GetMp3sResponse } from './models/GetMp3sResponse'; +export type { GetMp4sResponse } from './models/GetMp4sResponse'; +export type { GetPlaylistRequest } from './models/GetPlaylistRequest'; +export type { GetPlaylistResponse } from './models/GetPlaylistResponse'; +export type { GetRolesResponse } from './models/GetRolesResponse'; +export type { GetSubscriptionRequest } from './models/GetSubscriptionRequest'; +export type { GetSubscriptionResponse } from './models/GetSubscriptionResponse'; +export type { GetUsersResponse } from './models/GetUsersResponse'; +export type { inline_response_200_15 } from './models/inline_response_200_15'; +export type { LoginRequest } from './models/LoginRequest'; +export type { LoginResponse } from './models/LoginResponse'; +export type { Mp3DownloadRequest } from './models/Mp3DownloadRequest'; +export type { Mp3DownloadResponse } from './models/Mp3DownloadResponse'; +export type { Mp4DownloadRequest } from './models/Mp4DownloadRequest'; +export type { Mp4DownloadResponse } from './models/Mp4DownloadResponse'; +export type { Playlist } from './models/Playlist'; +export type { RegisterRequest } from './models/RegisterRequest'; +export type { RegisterResponse } from './models/RegisterResponse'; +export type { SetConfigRequest } from './models/SetConfigRequest'; +export type { SharingToggle } from './models/SharingToggle'; +export type { SubscribeRequest } from './models/SubscribeRequest'; +export type { SubscribeResponse } from './models/SubscribeResponse'; +export type { Subscription } from './models/Subscription'; +export type { SubscriptionRequestData } from './models/SubscriptionRequestData'; +export type { SuccessObject } from './models/SuccessObject'; +export type { UnsubscribeRequest } from './models/UnsubscribeRequest'; +export type { UnsubscribeResponse } from './models/UnsubscribeResponse'; +export type { UpdatePlaylistFilesRequest } from './models/UpdatePlaylistFilesRequest'; +export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; +export type { UpdaterStatus } from './models/UpdaterStatus'; +export type { UpdateServerRequest } from './models/UpdateServerRequest'; +export type { UpdateUserRequest } from './models/UpdateUserRequest'; +export type { User } from './models/User'; +export { UserPermission } from './models/UserPermission'; +export { YesNo } from './models/YesNo'; diff --git a/src/api-types/models/BaseChangePermissionsRequest.ts b/src/api-types/models/BaseChangePermissionsRequest.ts new file mode 100644 index 0000000..6551d46 --- /dev/null +++ b/src/api-types/models/BaseChangePermissionsRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { UserPermission } from './UserPermission'; +import { YesNo } from './YesNo'; + +export interface BaseChangePermissionsRequest { + permission: UserPermission; + new_value: YesNo; +} diff --git a/src/api-types/models/BaseDownloadRequest.ts b/src/api-types/models/BaseDownloadRequest.ts new file mode 100644 index 0000000..b6cf3fb --- /dev/null +++ b/src/api-types/models/BaseDownloadRequest.ts @@ -0,0 +1,29 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface BaseDownloadRequest { + url: string; + /** + * Video format code. Overrides other quality options. + */ + customQualityConfiguration?: string; + /** + * Custom command-line arguments for youtubedl. Overrides all other options, except url. + */ + customArgs?: string; + /** + * Custom output filename template. + */ + customOutput?: string; + /** + * Login with this account ID + */ + youtubeUsername?: string; + /** + * Account password + */ + youtubePassword?: string; + ui_uid?: string | null; +} diff --git a/src/api-types/models/BaseDownloadResponse.ts b/src/api-types/models/BaseDownloadResponse.ts new file mode 100644 index 0000000..83d848f --- /dev/null +++ b/src/api-types/models/BaseDownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface BaseDownloadResponse { + uid: string; + file_names?: Array | null; +} diff --git a/src/api-types/models/ChangeRolePermissionsRequest.ts b/src/api-types/models/ChangeRolePermissionsRequest.ts new file mode 100644 index 0000000..a6f6ed9 --- /dev/null +++ b/src/api-types/models/ChangeRolePermissionsRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; + +export interface ChangeRolePermissionsRequest extends BaseChangePermissionsRequest { + role: string; +} diff --git a/src/api-types/models/ChangeUserPermissionsRequest.ts b/src/api-types/models/ChangeUserPermissionsRequest.ts new file mode 100644 index 0000000..e6f044a --- /dev/null +++ b/src/api-types/models/ChangeUserPermissionsRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; + +export interface ChangeUserPermissionsRequest extends BaseChangePermissionsRequest { + user_uid: string; +} diff --git a/src/api-types/models/Config.ts b/src/api-types/models/Config.ts new file mode 100644 index 0000000..509c42f --- /dev/null +++ b/src/api-types/models/Config.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Config { + YoutubeDLMaterial: any; +} diff --git a/src/api-types/models/ConfigResponse.ts b/src/api-types/models/ConfigResponse.ts new file mode 100644 index 0000000..b493361 --- /dev/null +++ b/src/api-types/models/ConfigResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Config } from './Config'; + +export interface ConfigResponse { + config_file: Config; + success: boolean; +} diff --git a/src/api-types/models/CreatePlaylistRequest.ts b/src/api-types/models/CreatePlaylistRequest.ts new file mode 100644 index 0000000..e497dff --- /dev/null +++ b/src/api-types/models/CreatePlaylistRequest.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface CreatePlaylistRequest { + playlistName: string; + fileNames: Array; + type: FileType; + thumbnailURL: string; + duration: number; +} diff --git a/src/api-types/models/CreatePlaylistResponse.ts b/src/api-types/models/CreatePlaylistResponse.ts new file mode 100644 index 0000000..7d5a98c --- /dev/null +++ b/src/api-types/models/CreatePlaylistResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface CreatePlaylistResponse { + new_playlist: Playlist; + success: boolean; +} diff --git a/src/api-types/models/DatabaseFile.ts b/src/api-types/models/DatabaseFile.ts new file mode 100644 index 0000000..d6009b2 --- /dev/null +++ b/src/api-types/models/DatabaseFile.ts @@ -0,0 +1,22 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DatabaseFile { + id: string; + title: string; + thumbnailURL: string; + isAudio: boolean; + /** + * In seconds + */ + duration: number; + url: string; + uploader: string; + size: number; + path: string; + upload_date: string; + uid: string; + sharingEnabled?: boolean; +} diff --git a/src/api-types/models/DeleteFileRequest.ts b/src/api-types/models/DeleteFileRequest.ts new file mode 100644 index 0000000..c64af6c --- /dev/null +++ b/src/api-types/models/DeleteFileRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface DeleteFileRequest { + fileName: string; + type: FileType; +} diff --git a/src/api-types/models/DeleteMp3Mp4Request.ts b/src/api-types/models/DeleteMp3Mp4Request.ts new file mode 100644 index 0000000..f6d65d6 --- /dev/null +++ b/src/api-types/models/DeleteMp3Mp4Request.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteMp3Mp4Request { + uid: string; + blacklistMode?: boolean; +} diff --git a/src/api-types/models/DeletePlaylistRequest.ts b/src/api-types/models/DeletePlaylistRequest.ts new file mode 100644 index 0000000..25830bb --- /dev/null +++ b/src/api-types/models/DeletePlaylistRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface DeletePlaylistRequest { + playlistID: string; + type: FileType; +} diff --git a/src/api-types/models/DeleteSubscriptionFileRequest.ts b/src/api-types/models/DeleteSubscriptionFileRequest.ts new file mode 100644 index 0000000..aebe91b --- /dev/null +++ b/src/api-types/models/DeleteSubscriptionFileRequest.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { SubscriptionRequestData } from './SubscriptionRequestData'; + +export interface DeleteSubscriptionFileRequest { + file: string; + file_uid?: string; + sub: SubscriptionRequestData; + /** + * If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings. + */ + deleteForever?: boolean; +} diff --git a/src/api-types/models/DeleteUserRequest.ts b/src/api-types/models/DeleteUserRequest.ts new file mode 100644 index 0000000..a994369 --- /dev/null +++ b/src/api-types/models/DeleteUserRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteUserRequest { + uid: string; +} diff --git a/src/api-types/models/Dictionary.ts b/src/api-types/models/Dictionary.ts new file mode 100644 index 0000000..8ba0443 --- /dev/null +++ b/src/api-types/models/Dictionary.ts @@ -0,0 +1,7 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type Dictionary = { + [key: string]: T; +} diff --git a/src/api-types/models/Download.ts b/src/api-types/models/Download.ts new file mode 100644 index 0000000..b4d91d9 --- /dev/null +++ b/src/api-types/models/Download.ts @@ -0,0 +1,23 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Download { + uid: string; + ui_uid: string; + downloading: boolean; + complete: boolean; + url: string; + type: string; + percent_complete: number; + is_playlist: boolean; + timestamp_start: number; + timestamp_end?: number; + filesize?: number | null; + /** + * Error text, set if download fails. + */ + error?: string; + fileNames?: Array; +} diff --git a/src/api-types/models/DownloadArchiveRequest.ts b/src/api-types/models/DownloadArchiveRequest.ts new file mode 100644 index 0000000..46c5c45 --- /dev/null +++ b/src/api-types/models/DownloadArchiveRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DownloadArchiveRequest { + sub: { + archive_dir: string, + }; +} diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts new file mode 100644 index 0000000..18c6cac --- /dev/null +++ b/src/api-types/models/DownloadFileRequest.ts @@ -0,0 +1,22 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface DownloadFileRequest { + fileNames: ; + zip_mode?: boolean; + type: FileType; + outputName?: string; + fullPathProvided?: boolean; + uuid?: string; + /** + * Only used for subscriptions + */ + subscriptionName?: boolean; + /** + * Only used for subscriptions + */ + subPlaylist?: boolean; +} diff --git a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts new file mode 100644 index 0000000..4b64af3 --- /dev/null +++ b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DownloadVideosForSubscriptionRequest { + subID: string; +} diff --git a/src/api-types/models/File.ts b/src/api-types/models/File.ts new file mode 100644 index 0000000..2e81613 --- /dev/null +++ b/src/api-types/models/File.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface File { + id?: string; +} diff --git a/src/api-types/models/FileType.ts b/src/api-types/models/FileType.ts new file mode 100644 index 0000000..e1b6f79 --- /dev/null +++ b/src/api-types/models/FileType.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum FileType { + AUDIO = 'audio', + VIDEO = 'video', +} \ No newline at end of file diff --git a/src/api-types/models/GenerateNewApiKeyResponse.ts b/src/api-types/models/GenerateNewApiKeyResponse.ts new file mode 100644 index 0000000..d96a464 --- /dev/null +++ b/src/api-types/models/GenerateNewApiKeyResponse.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GenerateNewApiKeyResponse { + new_api_key: string; +} diff --git a/src/api-types/models/GetAllDownloadsResponse.ts b/src/api-types/models/GetAllDownloadsResponse.ts new file mode 100644 index 0000000..1f99a85 --- /dev/null +++ b/src/api-types/models/GetAllDownloadsResponse.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Dictionary } from './Dictionary'; +import { Download } from './Download'; + +export interface GetAllDownloadsResponse { + /** + * Map of Session ID to inner map + */ + downloads?: Dictionary>; +} diff --git a/src/api-types/models/GetAllFilesResponse.ts b/src/api-types/models/GetAllFilesResponse.ts new file mode 100644 index 0000000..79f7fc6 --- /dev/null +++ b/src/api-types/models/GetAllFilesResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetAllFilesResponse { + files: Array; + /** + * All video playlists + */ + playlists: Array; +} diff --git a/src/api-types/models/GetAllSubscriptionsResponse.ts b/src/api-types/models/GetAllSubscriptionsResponse.ts new file mode 100644 index 0000000..fafb6f5 --- /dev/null +++ b/src/api-types/models/GetAllSubscriptionsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface GetAllSubscriptionsResponse { + subscriptions: Array; +} diff --git a/src/api-types/models/GetDownloadRequest.ts b/src/api-types/models/GetDownloadRequest.ts new file mode 100644 index 0000000..9ad5fdf --- /dev/null +++ b/src/api-types/models/GetDownloadRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetDownloadRequest { + session_id: string; + download_id: string; +} diff --git a/src/api-types/models/GetDownloadResponse.ts b/src/api-types/models/GetDownloadResponse.ts new file mode 100644 index 0000000..b027cbf --- /dev/null +++ b/src/api-types/models/GetDownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Download } from './Download'; + +export interface GetDownloadResponse { + download?: Download | null; +} diff --git a/src/api-types/models/GetFileRequest.ts b/src/api-types/models/GetFileRequest.ts new file mode 100644 index 0000000..0d85afb --- /dev/null +++ b/src/api-types/models/GetFileRequest.ts @@ -0,0 +1,17 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface GetFileRequest { + /** + * Video UID + */ + uid: string; + type?: FileType; + /** + * User UID + */ + uuid?: string; +} diff --git a/src/api-types/models/GetFileResponse.ts b/src/api-types/models/GetFileResponse.ts new file mode 100644 index 0000000..71b3563 --- /dev/null +++ b/src/api-types/models/GetFileResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; + +export interface GetFileResponse { + success: boolean; + file?: DatabaseFile; +} diff --git a/src/api-types/models/GetMp3sResponse.ts b/src/api-types/models/GetMp3sResponse.ts new file mode 100644 index 0000000..13f03dc --- /dev/null +++ b/src/api-types/models/GetMp3sResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetMp3sResponse { + mp3s: Array; + /** + * All audio playlists + */ + playlists: Array; +} diff --git a/src/api-types/models/GetMp4sResponse.ts b/src/api-types/models/GetMp4sResponse.ts new file mode 100644 index 0000000..9ef2c1f --- /dev/null +++ b/src/api-types/models/GetMp4sResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetMp4sResponse { + mp4s: Array; + /** + * All video playlists + */ + playlists: Array; +} diff --git a/src/api-types/models/GetPlaylistRequest.ts b/src/api-types/models/GetPlaylistRequest.ts new file mode 100644 index 0000000..ca86a2d --- /dev/null +++ b/src/api-types/models/GetPlaylistRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface GetPlaylistRequest { + playlistID: string; + type?: FileType; + uuid?: string; +} diff --git a/src/api-types/models/GetPlaylistResponse.ts b/src/api-types/models/GetPlaylistResponse.ts new file mode 100644 index 0000000..c3bf7c9 --- /dev/null +++ b/src/api-types/models/GetPlaylistResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Playlist } from './Playlist'; + +export interface GetPlaylistResponse { + playlist: Playlist; + type: FileType; + success: boolean; +} diff --git a/src/api-types/models/GetRolesResponse.ts b/src/api-types/models/GetRolesResponse.ts new file mode 100644 index 0000000..ce5e696 --- /dev/null +++ b/src/api-types/models/GetRolesResponse.ts @@ -0,0 +1,16 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { UserPermission } from './UserPermission'; + +export interface GetRolesResponse { + roles: { + admin?: { + permissions?: Array, + }, + user?: { + permissions?: Array, + }, + }; +} diff --git a/src/api-types/models/GetSubscriptionRequest.ts b/src/api-types/models/GetSubscriptionRequest.ts new file mode 100644 index 0000000..99ee221 --- /dev/null +++ b/src/api-types/models/GetSubscriptionRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetSubscriptionRequest { + /** + * Subscription ID + */ + id: string; +} diff --git a/src/api-types/models/GetSubscriptionResponse.ts b/src/api-types/models/GetSubscriptionResponse.ts new file mode 100644 index 0000000..9d2209a --- /dev/null +++ b/src/api-types/models/GetSubscriptionResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface GetSubscriptionResponse { + subscription: Subscription; + files: Array; +} diff --git a/src/api-types/models/GetUsersResponse.ts b/src/api-types/models/GetUsersResponse.ts new file mode 100644 index 0000000..f5f9eb0 --- /dev/null +++ b/src/api-types/models/GetUsersResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; + +export interface GetUsersResponse { + users: Array; +} diff --git a/src/api-types/models/LoginRequest.ts b/src/api-types/models/LoginRequest.ts new file mode 100644 index 0000000..a06327f --- /dev/null +++ b/src/api-types/models/LoginRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface LoginRequest { + username: string; + password: string; +} diff --git a/src/api-types/models/LoginResponse.ts b/src/api-types/models/LoginResponse.ts new file mode 100644 index 0000000..c94f444 --- /dev/null +++ b/src/api-types/models/LoginResponse.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; +import { UserPermission } from './UserPermission'; + +export interface LoginResponse { + user?: User; + token?: string; + permissions?: Array; + available_permissions?: Array; +} diff --git a/src/api-types/models/Mp3DownloadRequest.ts b/src/api-types/models/Mp3DownloadRequest.ts new file mode 100644 index 0000000..b4b4f8f --- /dev/null +++ b/src/api-types/models/Mp3DownloadRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseDownloadRequest } from './BaseDownloadRequest'; + +export interface Mp3DownloadRequest extends BaseDownloadRequest { + /** + * Specify ffmpeg/avconv audio quality + */ + maxBitrate?: string; +} diff --git a/src/api-types/models/Mp3DownloadResponse.ts b/src/api-types/models/Mp3DownloadResponse.ts new file mode 100644 index 0000000..32924a6 --- /dev/null +++ b/src/api-types/models/Mp3DownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseDownloadResponse } from './BaseDownloadResponse'; + +export interface Mp3DownloadResponse extends BaseDownloadResponse { + audiopathEncoded: string; +} diff --git a/src/api-types/models/Mp4DownloadRequest.ts b/src/api-types/models/Mp4DownloadRequest.ts new file mode 100644 index 0000000..faeb6ab --- /dev/null +++ b/src/api-types/models/Mp4DownloadRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseDownloadRequest } from './BaseDownloadRequest'; + +export interface Mp4DownloadRequest extends BaseDownloadRequest { + /** + * Height of the video, if known + */ + selectedHeight?: string; +} diff --git a/src/api-types/models/Mp4DownloadResponse.ts b/src/api-types/models/Mp4DownloadResponse.ts new file mode 100644 index 0000000..0763c07 --- /dev/null +++ b/src/api-types/models/Mp4DownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseDownloadResponse } from './BaseDownloadResponse'; + +export interface Mp4DownloadResponse extends BaseDownloadResponse { + videopathEncoded: string; +} diff --git a/src/api-types/models/Playlist.ts b/src/api-types/models/Playlist.ts new file mode 100644 index 0000000..1afe993 --- /dev/null +++ b/src/api-types/models/Playlist.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface Playlist { + name: string; + fileNames: Array; + id: string; + thumbnailURL: string; + type: FileType; + registered: number; + duration: number; +} diff --git a/src/api-types/models/RegisterRequest.ts b/src/api-types/models/RegisterRequest.ts new file mode 100644 index 0000000..73bee22 --- /dev/null +++ b/src/api-types/models/RegisterRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface RegisterRequest { + userid: string; + username: string; + password: string; +} diff --git a/src/api-types/models/RegisterResponse.ts b/src/api-types/models/RegisterResponse.ts new file mode 100644 index 0000000..4e45b65 --- /dev/null +++ b/src/api-types/models/RegisterResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; + +export interface RegisterResponse { + user?: User; +} diff --git a/src/api-types/models/SetConfigRequest.ts b/src/api-types/models/SetConfigRequest.ts new file mode 100644 index 0000000..41ef52a --- /dev/null +++ b/src/api-types/models/SetConfigRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Config } from './Config'; + +export interface SetConfigRequest { + new_config_file: Config; +} diff --git a/src/api-types/models/SharingToggle.ts b/src/api-types/models/SharingToggle.ts new file mode 100644 index 0000000..2de90fc --- /dev/null +++ b/src/api-types/models/SharingToggle.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface SharingToggle { + uid: string; + type: FileType; + is_playlist?: boolean; +} diff --git a/src/api-types/models/SubscribeRequest.ts b/src/api-types/models/SubscribeRequest.ts new file mode 100644 index 0000000..d475cb9 --- /dev/null +++ b/src/api-types/models/SubscribeRequest.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface SubscribeRequest { + name: string; + url: string; + timerange?: string; + streamingOnly: boolean; + audioOnly?: boolean; + customArgs?: string; + customFileOutput?: string; +} diff --git a/src/api-types/models/SubscribeResponse.ts b/src/api-types/models/SubscribeResponse.ts new file mode 100644 index 0000000..fa4c235 --- /dev/null +++ b/src/api-types/models/SubscribeResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface SubscribeResponse { + new_sub: Subscription; + error?: string; +} diff --git a/src/api-types/models/Subscription.ts b/src/api-types/models/Subscription.ts new file mode 100644 index 0000000..8cd369e --- /dev/null +++ b/src/api-types/models/Subscription.ts @@ -0,0 +1,20 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface Subscription { + name: string; + url: string; + id: string; + type: FileType; + user_uid: string | null; + streamingOnly: boolean; + isPlaylist: boolean; + archive?: string; + timerange?: string; + custom_args?: string; + custom_output?: string; + videos: Array; +} diff --git a/src/api-types/models/SubscriptionRequestData.ts b/src/api-types/models/SubscriptionRequestData.ts new file mode 100644 index 0000000..6c99499 --- /dev/null +++ b/src/api-types/models/SubscriptionRequestData.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface SubscriptionRequestData { + name: string; + id: string; + type?: FileType; + isPlaylist?: boolean; + archive?: string; +} diff --git a/src/api-types/models/SuccessObject.ts b/src/api-types/models/SuccessObject.ts new file mode 100644 index 0000000..cd0a11e --- /dev/null +++ b/src/api-types/models/SuccessObject.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface SuccessObject { + success: boolean; +} diff --git a/src/api-types/models/UnsubscribeRequest.ts b/src/api-types/models/UnsubscribeRequest.ts new file mode 100644 index 0000000..598faee --- /dev/null +++ b/src/api-types/models/UnsubscribeRequest.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { SubscriptionRequestData } from './SubscriptionRequestData'; + +export interface UnsubscribeRequest { + sub: SubscriptionRequestData; + /** + * Defaults to false + */ + deleteMode?: boolean; +} diff --git a/src/api-types/models/UnsubscribeResponse.ts b/src/api-types/models/UnsubscribeResponse.ts new file mode 100644 index 0000000..0f0d991 --- /dev/null +++ b/src/api-types/models/UnsubscribeResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UnsubscribeResponse { + success: boolean; + error?: string; +} diff --git a/src/api-types/models/UpdatePlaylistFilesRequest.ts b/src/api-types/models/UpdatePlaylistFilesRequest.ts new file mode 100644 index 0000000..3fa95c2 --- /dev/null +++ b/src/api-types/models/UpdatePlaylistFilesRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface UpdatePlaylistFilesRequest { + playlistID: string; + fileNames: Array; + type: FileType; +} diff --git a/src/api-types/models/UpdatePlaylistRequest.ts b/src/api-types/models/UpdatePlaylistRequest.ts new file mode 100644 index 0000000..1eaee52 --- /dev/null +++ b/src/api-types/models/UpdatePlaylistRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface UpdatePlaylistRequest { + playlist: Playlist; +} diff --git a/src/api-types/models/UpdateServerRequest.ts b/src/api-types/models/UpdateServerRequest.ts new file mode 100644 index 0000000..95db6e4 --- /dev/null +++ b/src/api-types/models/UpdateServerRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateServerRequest { + tag: string; +} diff --git a/src/api-types/models/UpdateUserRequest.ts b/src/api-types/models/UpdateUserRequest.ts new file mode 100644 index 0000000..c6e2f05 --- /dev/null +++ b/src/api-types/models/UpdateUserRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateUserRequest { + change_object: { + uid: string, + name?: string, + role?: string, + }; +} diff --git a/src/api-types/models/UpdaterStatus.ts b/src/api-types/models/UpdaterStatus.ts new file mode 100644 index 0000000..19e513c --- /dev/null +++ b/src/api-types/models/UpdaterStatus.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdaterStatus { + updating: boolean; + details: string; + error?: boolean; +} diff --git a/src/api-types/models/User.ts b/src/api-types/models/User.ts new file mode 100644 index 0000000..8a49d3c --- /dev/null +++ b/src/api-types/models/User.ts @@ -0,0 +1,25 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; +import { UserPermission } from './UserPermission'; + +export interface User { + uid?: string; + name?: string; + passhash?: string; + files?: { + audio?: Array, + video?: Array, + }; + playlists?: { + audio?: Array, + video?: Array, + }; + subscriptions?: Array; + created?: number; + role?: string; + permissions?: Array; + permission_overrides?: Array; +} diff --git a/src/api-types/models/UserPermission.ts b/src/api-types/models/UserPermission.ts new file mode 100644 index 0000000..b22ef87 --- /dev/null +++ b/src/api-types/models/UserPermission.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum UserPermission { + FILEMANAGER = 'filemanager', + SETTINGS = 'settings', + SUBSCRIPTIONS = 'subscriptions', + SHARING = 'sharing', + ADVANCED_DOWNLOAD = 'advanced_download', + DOWNLOADS_MANAGER = 'downloads_manager', +} \ No newline at end of file diff --git a/src/api-types/models/YesNo.ts b/src/api-types/models/YesNo.ts new file mode 100644 index 0000000..dbe9c62 --- /dev/null +++ b/src/api-types/models/YesNo.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum YesNo { + YES = 'yes', + NO = 'no', +} \ No newline at end of file diff --git a/src/api-types/models/body_19.ts b/src/api-types/models/body_19.ts new file mode 100644 index 0000000..b0ce9cb --- /dev/null +++ b/src/api-types/models/body_19.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface body_19 { + input_pin: string; +} diff --git a/src/api-types/models/body_20.ts b/src/api-types/models/body_20.ts new file mode 100644 index 0000000..84a7b47 --- /dev/null +++ b/src/api-types/models/body_20.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface body_20 { + unhashed_pin: string; +} diff --git a/src/api-types/models/inline_response_200_15.ts b/src/api-types/models/inline_response_200_15.ts new file mode 100644 index 0000000..bb98ac6 --- /dev/null +++ b/src/api-types/models/inline_response_200_15.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface inline_response_200_15 { + is_set: boolean; +} From d1311d00ea2e06ed900017f91bf52f780a366078 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Sat, 26 Sep 2020 14:50:10 -0700 Subject: [PATCH 008/212] Use named arguments with download file --- Public API v1.yaml | 10 +++++++++- src/api-types/models/DownloadFileRequest.ts | 4 +++- .../custom-playlists.component.ts | 2 +- .../recent-videos/recent-videos.component.ts | 16 +++++++++------- src/app/main/main.component.ts | 2 +- src/app/player/player.component.ts | 12 ++++++++---- src/app/posts.services.ts | 14 ++++++++++---- .../subscription/subscription.component.ts | 2 +- 8 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 70d56c5..866493e 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -127,6 +127,8 @@ paths: application/json: schema: $ref: '#/components/schemas/GetFileResponse' + '401': + description: User is not authorized to view the file. security: - Auth query parameter: [] /api/enableSharing: @@ -441,6 +443,8 @@ paths: responses: '200': description: 'The file itself is in the response, as well as an options object.' + '401': + description: User is not authorized to view the file. security: - Auth query parameter: [] /api/deleteFile: @@ -1254,8 +1258,12 @@ components: type: boolean uuid: type: string + uid: + type: string + id: + type: string subscriptionName: - type: boolean + type: string description: Only used for subscriptions subPlaylist: type: boolean diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index 18c6cac..61816c9 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -11,10 +11,12 @@ export interface DownloadFileRequest { outputName?: string; fullPathProvided?: boolean; uuid?: string; + uid?: string; + id?: string; /** * Only used for subscriptions */ - subscriptionName?: boolean; + subscriptionName?: string; /** * Only used for subscriptions */ diff --git a/src/app/components/custom-playlists/custom-playlists.component.ts b/src/app/components/custom-playlists/custom-playlists.component.ts index d2d65d6..3212708 100644 --- a/src/app/components/custom-playlists/custom-playlists.component.ts +++ b/src/app/components/custom-playlists/custom-playlists.component.ts @@ -71,7 +71,7 @@ export class CustomPlaylistsComponent implements OnInit { } downloadPlaylist(fileNames, type, zipName = null, playlistID = null) { - this.postsService.downloadFileFromServer(fileNames, type, zipName).subscribe(res => { + this.postsService.downloadFileFromServer(fileNames, type, {outputName: zipName}).subscribe(res => { if (playlistID) { this.downloading_content[type][playlistID] = false }; const blob: Blob = res; saveAs(blob, zipName + '.zip'); diff --git a/src/app/components/recent-videos/recent-videos.component.ts b/src/app/components/recent-videos/recent-videos.component.ts index 11a6dcc..b90fee5 100644 --- a/src/app/components/recent-videos/recent-videos.component.ts +++ b/src/app/components/recent-videos/recent-videos.component.ts @@ -190,13 +190,15 @@ export class RecentVideosComponent implements OnInit { const type = (file.isAudio ? 'audio' : 'video') as FileType; const ext = type === 'audio' ? '.mp3' : '.mp4' const sub = this.postsService.getSubscriptionByID(file.sub_id); - this.postsService.downloadFileFromServer(file.id, type, null, null, sub.name, sub.isPlaylist, - this.postsService.user ? this.postsService.user.uid : null, null).subscribe(res => { - const blob: Blob = res; - saveAs(blob, file.id + ext); - }, err => { - console.log(err); - }); + this.postsService.downloadFileFromServer( + file.id, type, + {subscriptionName: sub.name, subPlaylist: sub.isPlaylist, uid: this.postsService.user ? this.postsService.user.uid : null} + ).subscribe(res => { + const blob: Blob = res; + saveAs(blob, file.id + ext); + }, err => { + console.log(err); + }); } downloadNormalFile(file) { diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index c0bb894..e524057 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -773,7 +773,7 @@ export class MainComponent implements OnInit { } downloadPlaylist(fileNames, type, zipName = null, playlistID = null) { - this.postsService.downloadFileFromServer(fileNames, type, zipName).subscribe(res => { + this.postsService.downloadFileFromServer(fileNames, type, {outputName: zipName}).subscribe(res => { if (playlistID) { this.downloading_content[type][playlistID] = false }; const blob: Blob = res; saveAs(blob, zipName + '.zip'); diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 57e2ea4..c6fb53d 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -318,8 +318,10 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { const zipName = fileNames[0].split(' ')[0] + fileNames[1].split(' ')[0]; this.downloading = true; - this.postsService.downloadFileFromServer(fileNames, this.type, zipName, null, null, null, null, - !this.uuid ? this.postsService.user.uid : this.uuid, this.id).subscribe(res => { + this.postsService.downloadFileFromServer( + fileNames, this.type, + {outputName: zipName, uuid: !this.uuid ? this.postsService.user.uid : this.uuid, id: this.id} + ).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, zipName + '.zip'); @@ -333,8 +335,10 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { const ext = (this.type === 'audio') ? '.mp3' : '.mp4'; const filename = this.playlist[0].title; this.downloading = true; - this.postsService.downloadFileFromServer(filename, this.type, null, null, this.subscriptionName, this.subPlaylist, - this.is_shared ? this.db_file['uid'] : null, this.uuid).subscribe(res => { + this.postsService.downloadFileFromServer( + filename, this.type, + {subscriptionName: this.subscriptionName, subPlaylist: this.subPlaylist, uid: this.is_shared ? this.db_file['uid'] : null, uuid: this.uuid} + ).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, filename + ext); diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 976298c..be2f39e 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -282,8 +282,14 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {}, this.httpOptions); } - downloadFileFromServer(fileName: string | string[], type: FileType, outputName: string = null, fullPathProvided: boolean = null, subscriptionName: boolean = null, subPlaylist: boolean = null, - uid = null, uuid: string = null, id = null) { + downloadFileFromServer( + fileName: string | string[], type: FileType, + options: {outputName?: string, fullPathProvided?: boolean, subscriptionName?: string, subPlaylist?: boolean, uid?: string, uuid?: string, id?: string} = {} + ) { + const {outputName = null, fullPathProvided = null, + subscriptionName = null, subPlaylist = null, + uid = null, uuid = null, id = null} = options; + const body: DownloadFileRequest = {fileNames: fileName, type: type, zip_mode: Array.isArray(fileName), @@ -291,11 +297,11 @@ export class PostsService implements CanActivate { fullPathProvided: fullPathProvided, subscriptionName: subscriptionName, subPlaylist: subPlaylist, + uid: uid, uuid: uuid, id: id, }; - return this.http.post(this.path + 'downloadFile', body, - {responseType: 'blob', params: this.httpOptions.params}); + return this.http.post(this.path + 'downloadFile', body, {responseType: 'blob', params: this.httpOptions.params}); } uploadCookiesFile(fileFormData) { diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index eb2f35b..2c8f9dd 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -152,7 +152,7 @@ export class SubscriptionComponent implements OnInit { } this.downloading = true; - this.postsService.downloadFileFromServer(fileNames, 'video' as FileType, this.subscription.name, true).subscribe(res => { + this.postsService.downloadFileFromServer(fileNames, 'video' as FileType, {outputName: this.subscription.name, fullPathProvided: true}).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, this.subscription.name + '.zip'); From 389c5b5df327b2054478a33632406af6470aae64 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Sat, 26 Sep 2020 14:50:39 -0700 Subject: [PATCH 009/212] Take out import type --- .../components/custom-playlists/custom-playlists.component.ts | 2 +- src/app/components/recent-videos/recent-videos.component.ts | 2 +- .../update-progress-dialog/update-progress-dialog.component.ts | 2 +- src/app/main/main.component.ts | 2 +- src/app/player/player.component.ts | 2 +- src/app/posts.services.ts | 2 +- src/app/subscription/subscription/subscription.component.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/app/components/custom-playlists/custom-playlists.component.ts b/src/app/components/custom-playlists/custom-playlists.component.ts index 3212708..d4fd013 100644 --- a/src/app/components/custom-playlists/custom-playlists.component.ts +++ b/src/app/components/custom-playlists/custom-playlists.component.ts @@ -91,7 +91,7 @@ export class CustomPlaylistsComponent implements OnInit { this.getAllPlaylists(); }); } - + editPlaylistDialog(args) { const playlist = args.playlist; const index = args.index; diff --git a/src/app/components/recent-videos/recent-videos.component.ts b/src/app/components/recent-videos/recent-videos.component.ts index b90fee5..2bbd96b 100644 --- a/src/app/components/recent-videos/recent-videos.component.ts +++ b/src/app/components/recent-videos/recent-videos.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { Router } from '@angular/router'; -import type { FileType } from '../../../api-types'; +import { FileType } from '../../../api-types'; @Component({ selector: 'app-recent-videos', diff --git a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts index 9ca066f..4862839 100644 --- a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts +++ b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { MatSnackBar } from '@angular/material/snack-bar'; -import type { UpdaterStatus } from '../../../api-types'; +import { UpdaterStatus } from '../../../api-types'; @Component({ selector: 'app-update-progress-dialog', diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index e524057..376d573 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -20,7 +20,7 @@ import { CreatePlaylistComponent } from 'app/create-playlist/create-playlist.com import { Platform } from '@angular/cdk/platform'; import { v4 as uuid } from 'uuid'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; -import type { FileType } from '../../api-types'; +import { FileType } from '../../api-types'; export let audioFilesMouseHovering = false; export let videoFilesMouseHovering = false; diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index c6fb53d..ca845c1 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -7,7 +7,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { InputDialogComponent } from 'app/input-dialog/input-dialog.component'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-media-dialog.component'; -import type { FileType } from '../../api-types'; +import { FileType } from '../../api-types'; export interface IMedia { title: string; diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index be2f39e..8258ef7 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -10,7 +10,7 @@ import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; -import type { +import { ChangeRolePermissionsRequest, ChangeUserPermissionsRequest, ConfigResponse, diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index 2c8f9dd..ffbbde5 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -3,7 +3,7 @@ import { PostsService } from 'app/posts.services'; import { ActivatedRoute, Router, ParamMap } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { EditSubscriptionDialogComponent } from 'app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component'; -import type { FileType } from '../../../api-types'; +import { FileType } from '../../../api-types'; @Component({ selector: 'app-subscription', From 2cf0c61facd04d3311b64fd33eeea8e456d906f8 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Sat, 26 Sep 2020 14:53:51 -0700 Subject: [PATCH 010/212] Default booleans to false --- src/app/posts.services.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 8258ef7..66c8a38 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -286,8 +286,8 @@ export class PostsService implements CanActivate { fileName: string | string[], type: FileType, options: {outputName?: string, fullPathProvided?: boolean, subscriptionName?: string, subPlaylist?: boolean, uid?: string, uuid?: string, id?: string} = {} ) { - const {outputName = null, fullPathProvided = null, - subscriptionName = null, subPlaylist = null, + const {outputName = null, fullPathProvided = false, + subscriptionName = null, subPlaylist = false, uid = null, uuid = null, id = null} = options; const body: DownloadFileRequest = {fileNames: fileName, From b9f6d290610b409dc781060679686b5858e6fa1b Mon Sep 17 00:00:00 2001 From: controlol <46456214+controlol@users.noreply.github.com> Date: Thu, 4 Mar 2021 12:45:54 +0100 Subject: [PATCH 011/212] escape paths for use with commandline escape qualityPath and fullOutput for use with commandline In order to successfully download files from subscriptions these strings should be escaped to work properly in the commandline. I have seen you use almost the same function (generateArgs()) in app.js. Even though I have never had a problem with this outside subscriptions I would suggest to do the same for that function starting on line 1405 --- backend/subscriptions.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 3a6e0a3..5a0cd5d 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -366,11 +366,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de let appendedBasePath = getAppendedBasePath(sub, basePath); - let fullOutput = `${appendedBasePath}/%(title)s.%(ext)s`; + let fullOutput = `'${appendedBasePath}/%(title)s.%(ext)s'`; if (desired_path) { - fullOutput = `${desired_path}.%(ext)s`; + fullOutput = `'${desired_path}.%(ext)s'`; } else if (sub.custom_output) { - fullOutput = `${appendedBasePath}/${sub.custom_output}.%(ext)s`; + fullOutput = `'${appendedBasePath}/${sub.custom_output}.%(ext)s'`; } let downloadConfig = ['-o', fullOutput, !redownload ? '-ciw' : '-ci', '--write-info-json', '--print-json']; @@ -381,8 +381,8 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de qualityPath.push('-x'); qualityPath.push('--audio-format', 'mp3'); } else { - if (!sub.maxQuality || sub.maxQuality === 'best') qualityPath = ['-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4']; - else qualityPath = ['-f', `bestvideo[height<=${sub.maxQuality}]+bestaudio/best[height<=${sub.maxQuality}]`, '--merge-output-format', 'mp4']; + if (!sub.maxQuality || sub.maxQuality === 'best') qualityPath = ['-f', '\'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4\'']; + else qualityPath = ['-f', `'bestvideo[height<=${sub.maxQuality}]+bestaudio/best[height<=${sub.maxQuality}]'`, '--merge-output-format', 'mp4']; } downloadConfig.push(...qualityPath) From 7e9d1d30dae415c2264ba0a96e30aed49380c872 Mon Sep 17 00:00:00 2001 From: controlol <46456214+controlol@users.noreply.github.com> Date: Thu, 4 Mar 2021 13:46:39 +0100 Subject: [PATCH 012/212] patch qualityPath qualityPath should not be escaped, this results in `could not find format error` --- backend/subscriptions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 5a0cd5d..51b070a 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -381,8 +381,8 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de qualityPath.push('-x'); qualityPath.push('--audio-format', 'mp3'); } else { - if (!sub.maxQuality || sub.maxQuality === 'best') qualityPath = ['-f', '\'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4\'']; - else qualityPath = ['-f', `'bestvideo[height<=${sub.maxQuality}]+bestaudio/best[height<=${sub.maxQuality}]'`, '--merge-output-format', 'mp4']; + if (!sub.maxQuality || sub.maxQuality === 'best') qualityPath = ['-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4']; + else qualityPath = ['-f', `bestvideo[height<=${sub.maxQuality}]+bestaudio/best[height<=${sub.maxQuality}]`, '--merge-output-format', 'mp4']; } downloadConfig.push(...qualityPath) From 677af3712bbf5748277a5d88d85fb0cf719210b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Sep 2021 19:35:35 +0000 Subject: [PATCH 013/212] Bump axios from 0.21.1 to 0.21.2 in /backend Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 14 +++++++------- backend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index f68e7c4..63a7e66 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -316,11 +316,11 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.2.tgz", + "integrity": "sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "backoff": { @@ -1267,9 +1267,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, "forever-agent": { "version": "0.6.1", diff --git a/backend/package.json b/backend/package.json index 8d4579d..ac96767 100644 --- a/backend/package.json +++ b/backend/package.json @@ -33,7 +33,7 @@ "archiver": "^3.1.1", "async": "^3.1.0", "async-mutex": "^0.3.1", - "axios": "^0.21.1", + "axios": "^0.21.2", "bcryptjs": "^2.4.0", "compression": "^1.7.4", "config": "^3.2.3", From 1e9eec1b553c534e57afdb3290c9ef54dd9ee5a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Sep 2021 19:36:01 +0000 Subject: [PATCH 014/212] Bump electron from 8.2.0 to 9.4.0 Bumps [electron](https://github.com/electron/electron) from 8.2.0 to 9.4.0. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v8.2.0...v9.4.0) Signed-off-by: dependabot[bot] --- package-lock.json | 165 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 75 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ac2dfa..cad23bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1622,9 +1622,9 @@ } }, "@electron/get": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.9.0.tgz", - "integrity": "sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.0.tgz", + "integrity": "sha512-+SjZhRuRo+STTO1Fdhzqnv9D2ZhjxXP6egsJ9kiO8dtP68cDx7dFCwWi64dlMQV7sWcfW1OYCW4wviEBzmRsfQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -1634,7 +1634,7 @@ "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", + "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "dependencies": { @@ -1648,6 +1648,12 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -3015,9 +3021,9 @@ "dev": true }, "boolean": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", + "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", "dev": true, "optional": true }, @@ -3298,9 +3304,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -3313,9 +3319,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true } } @@ -3774,9 +3780,9 @@ } }, "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "optional": true, "requires": { @@ -4799,9 +4805,9 @@ "dev": true }, "electron": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-8.2.0.tgz", - "integrity": "sha512-mnV43gKCrCUMHLmGws/DU/l8LhaxrFD53A4ofwtthdCqOZWGIdk1+eMphiVumXR5a3lC64XVvmXQ2k28i7F/zw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-9.4.0.tgz", + "integrity": "sha512-hOC4q0jkb+UDYZRy8vrZ1IANnq+jznZnbkD62OEo06nU+hIbp2IrwDRBNuSLmQ3cwZMVir0WSIA1qEVK0PkzGA==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -5007,9 +5013,9 @@ "dev": true }, "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "err-code": { @@ -6276,34 +6282,37 @@ } }, "global-agent": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", - "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz", + "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==", "dev": true, "optional": true, "requires": { - "boolean": "^3.0.0", - "core-js": "^3.6.4", + "boolean": "^3.0.1", + "core-js": "^3.6.5", "es6-error": "^4.1.1", - "matcher": "^2.1.0", - "roarr": "^2.15.2", - "semver": "^7.1.2", - "serialize-error": "^5.0.0" + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" }, "dependencies": { "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", + "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==", "dev": true, "optional": true }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -6326,9 +6335,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", "dev": true, "optional": true, "requires": { @@ -8427,19 +8436,19 @@ } }, "matcher": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", - "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, "optional": true, "requires": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^4.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "optional": true } @@ -10662,6 +10671,12 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11717,13 +11732,13 @@ } }, "roarr": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.2.tgz", - "integrity": "sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, "optional": true, "requires": { - "boolean": "^3.0.0", + "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", @@ -11810,15 +11825,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "sass": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", @@ -12033,19 +12039,19 @@ } }, "serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "optional": true, "requires": { - "type-fest": "^0.8.0" + "type-fest": "^0.13.1" }, "dependencies": { "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "optional": true } @@ -13403,15 +13409,6 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, "ts-md5": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.7.tgz", @@ -13843,14 +13840,6 @@ "dev": true, "requires": { "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } } }, "use": { @@ -13865,12 +13854,6 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", diff --git a/package.json b/package.json index ad1f6f9..57b692e 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", "codelyzer": "^6.0.0", - "electron": "^8.0.1", + "electron": "^9.4.0", "eslint": "^7.32.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", From a9244e28a7c8042171a2267315d68aba4c3fc12f Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 29 Jul 2021 06:34:47 +0000 Subject: [PATCH 015/212] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/zh_Hans/ --- src/assets/i18n/messages.zh.xlf | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/assets/i18n/messages.zh.xlf b/src/assets/i18n/messages.zh.xlf index a0b6008..7de9a79 100644 --- a/src/assets/i18n/messages.zh.xlf +++ b/src/assets/i18n/messages.zh.xlf @@ -2573,6 +2573,150 @@ Auto-generated label + + Share file + 共享文件 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + 重新启动服务器 + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + 无法获取数据库信息。更多信息请查看服务器日志。 + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + 数据库转移到 + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + 测试连接字符串 + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + 示例: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB 连接字符串 + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + 每张表的记录数 + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + 数据库位置: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + 允许播放列表分类 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + 启用此设置后,如果单个视频匹配某个类别,则整个播放列表将收到该类别。 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + 数据库 + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + 播放时随机排序 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + 裁剪终点 (秒) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + 裁剪起始点 (秒) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + 裁剪文件 + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From 71ed7c45ace21e5b2b9421fe5703cf1b83b695fe Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Thu, 29 Jul 2021 12:08:36 +0000 Subject: [PATCH 016/212] Translated using Weblate (Dutch) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nl/ --- src/assets/i18n/messages.nl.xlf | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 0049336..73902fc 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -2512,6 +2512,150 @@ Video duration label + + Share file + Bestand delen + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Server herstarten + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + De databankinformatie kan niet worden opgehaald. Bekijk voor meer informatie de serverlogboeken. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + DB overzetten naar + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Tekenreeks testen + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Voorbeeld: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB-verbindingstekenreeks + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Aantal items per tabel + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Databanklocatie: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Afspeellijsten categoriseren + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Schakel in om een categorie toe te kennen aan een volledige afspeellijst als ook maar één video overeenkomt. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Databank + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Willkeurig afspelen + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Bijsnijden tot (in seconden) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Bijsnijden vanaf (in seconden) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Bestand bijsnijden + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From 09beaa6c39fe6765c7aa85f27ab5ad790c76e9b1 Mon Sep 17 00:00:00 2001 From: Adolfo Jayme Barrientos Date: Fri, 30 Jul 2021 23:47:36 +0000 Subject: [PATCH 017/212] Translated using Weblate (Spanish) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/es/ --- src/assets/i18n/messages.es.xlf | 203 ++++++++++++++++++++++++++++---- 1 file changed, 178 insertions(+), 25 deletions(-) diff --git a/src/assets/i18n/messages.es.xlf b/src/assets/i18n/messages.es.xlf index 04a30ba..d618f15 100644 --- a/src/assets/i18n/messages.es.xlf +++ b/src/assets/i18n/messages.es.xlf @@ -48,7 +48,7 @@ Arg value - Valor de arg + Valor de argumento Add arg @@ -103,8 +103,8 @@ Avanzado - Simulated command: - Commando simulado: + Simulated command: + Orden simulada: Use custom args @@ -135,8 +135,8 @@ La ruta es relativa a la ruta de descarga de la config. No incluya el extensión. - Use authentication - Usa autenticación + Use authentication + Utilizar autenticación Username @@ -308,7 +308,7 @@ Default - Defecto + Predeterminado Dark @@ -432,7 +432,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - No se requiere mucho más que cambiar la configuración de la extensión para establecer la URL de la interfaz. + No se requiere mucho más que cambiar la configuración de la extensión para establecer el URL de la interfaz. Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. @@ -472,7 +472,7 @@ Save - Salvar + Guardar {VAR_SELECT, select, true {Close} false {Cancel} other {otha} } @@ -480,7 +480,7 @@ About YoutubeDL-Material - Sobre YoutubeDL-Material + Acerca de YoutubeDL-Material is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. @@ -512,7 +512,7 @@ to create an issue! - para crear una cuestión! + para crear un informe. Your Profile @@ -584,11 +584,11 @@ Enable sharing - Habilitar compartir + Activar compartición Use timestamp - Usar marca de tiempo + Utilizar cronomarcador Seconds @@ -596,7 +596,7 @@ Copy to clipboard - Copiar al Portapapeles + Copiar en el portapapeles Save changes @@ -652,7 +652,7 @@ Subscribe - Subscribe + Suscribirse Type: @@ -712,7 +712,7 @@ Updater - Updater + Actualizador Select a version: @@ -752,7 +752,7 @@ New password - Nueva contraseña + Contraseña nueva Set new password @@ -764,7 +764,7 @@ Yes - Si + No @@ -805,7 +805,7 @@ Search Base - Search Base + Base de búsquedas app/settings/settings.component.html 333 @@ -814,7 +814,7 @@ Search Filter - Search Filter + Filtro de búsqueda app/settings/settings.component.html 338 @@ -823,7 +823,7 @@ Bind Credentials - Bind Credentials + Credenciales de vinculación app/settings/settings.component.html 328 @@ -832,7 +832,7 @@ Bind DN - Bind DN + DN de vinculación app/settings/settings.component.html 323 @@ -922,7 +922,7 @@ Kill all downloads - Mata todas las descargas + Forzar término de todas las descargas app/settings/settings.component.html 139 @@ -967,7 +967,7 @@ Upload new cookies - Subir nuevas cookies + Cargar «cookies» nuevas app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -1316,7 +1316,7 @@ Redownload fresh uploads - Volver a descargar nuevas cargas + Volver a descargar cargas nuevas src/app/settings/settings.component.html 63 @@ -1388,7 +1388,7 @@ No videos found. - No se encontraron vídeos. + No se encontró ningún vídeo. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1469,6 +1469,159 @@ Max quality placeholder + + Auto-generated + Generado automáticamente + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Share file + Compartir archivo + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Reiniciar servidor + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + No se pudo recuperar la información de la base de datos. Compruebe los registros del servidor para obtener detalles. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transferir BD a + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Probar cadena de conexión + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Ejemplo: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Cadena de conexión de MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Registros por tabla + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Ubicación de base de datos: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Permitir categorización de listas + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Con esta opción activada, si un único vídeo coincide con una categoría, toda la lista de reproducción se clasificará en la misma. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Base de datos + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Aleatorizar orden al reproducir + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Recortar hasta (s) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Recortar a partir de (s) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Recortar archivo + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From 62fe940b2f914ef07745e39052bdf500f0ff37ef Mon Sep 17 00:00:00 2001 From: Adolfo Jayme Barrientos Date: Fri, 30 Jul 2021 23:45:40 +0000 Subject: [PATCH 018/212] Translated using Weblate (Catalan) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ca/ --- src/assets/i18n/messages.ca.xlf | 214 ++++++++++++++++++++++++++------ 1 file changed, 179 insertions(+), 35 deletions(-) diff --git a/src/assets/i18n/messages.ca.xlf b/src/assets/i18n/messages.ca.xlf index 874cdec..53e7aae 100644 --- a/src/assets/i18n/messages.ca.xlf +++ b/src/assets/i18n/messages.ca.xlf @@ -1125,7 +1125,7 @@ The download was successful - La descàrrega ha estat correcta + La baixada ha estat correcta src/app/download-item/download-item.component.html 8 @@ -1138,7 +1138,7 @@ An error has occurred - S'ha produït un error + S’ha produït un error src/app/download-item/download-item.component.html 9 @@ -1232,7 +1232,7 @@ You have no channel subscriptions. - No tens cap subscripció al canal. + No teniu cap subscripció a canals. src/app/subscriptions/subscriptions.component.html 24 @@ -1250,7 +1250,7 @@ You have no playlist subscriptions. - No tens cap subscripció a la llista de reproducció. + No teniu cap subscripció a llistes de reproducció. src/app/subscriptions/subscriptions.component.html 43 @@ -1268,7 +1268,7 @@ Downloader - Descarregador + Baixador src/app/settings/settings.component.html 102 @@ -1492,7 +1492,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - Ruta de descàrregues de només d'àudio. És relatiu a la carpeta arrel de YTDL-Material. + Camí de baixades només d’àudio. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 110 @@ -1501,7 +1501,7 @@ Video folder path - Ruta de la carpeta de vídeo + Camí de la carpeta de vídeo src/app/settings/settings.component.html 116 @@ -1510,7 +1510,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - Ruta de descàrregues de vídeo. És relatiu a la carpeta arrel de YTDL-Material. + Camí de baixades de vídeo. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 117 @@ -1591,7 +1591,7 @@ Kill all downloads - Mata totes les descàrregues + Finalitza totes les baixades src/app/settings/settings.component.html 175 @@ -1681,7 +1681,7 @@ This will delete your old API key! - Això suprimirà la vostra clau de l’API anterior! + Això suprimirà la vostra clau de l’API anterior. src/app/settings/settings.component.html 223 @@ -1837,7 +1837,7 @@ Generate 'audio only' bookmarklet - Genereu el marcador 'només àudio' + Genera una miniaplicació «només d’àudio» src/app/settings/settings.component.html 272 @@ -1855,7 +1855,7 @@ Use default downloading agent - Utilitzeu l'agent de descàrrega predeterminat + Utilitza l’agent de baixada per defecte src/app/settings/settings.component.html 295 @@ -1864,7 +1864,7 @@ Select a download agent - Seleccioneu un agent de descàrrega + Seleccioneu un agent de baixada src/app/settings/settings.component.html 299 @@ -1891,7 +1891,7 @@ Allow advanced download - Permet la descàrrega avançada + Permet la baixada avançada src/app/settings/settings.component.html 336 @@ -1918,7 +1918,7 @@ Allow user registration - Permetre el registre d’usuari + Permet el registre d’usuaris src/app/settings/settings.component.html 359 @@ -2008,7 +2008,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - és un descarregador de YouTube de codi obert construït segons les especificacions de Material Design de Google. Podeu descarregar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per estar al dia amb els nous vídeos. + és un baixador de YouTube de codi obert construït segons les especificacions Material Design de Google. Podeu baixar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per a estar al dia amb les novetats. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2044,7 +2044,7 @@ to create an issue! - per crear un report de problema! + per a crear un informe d’error. src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2179,7 +2179,7 @@ No downloads available! - No hi ha cap descàrrega disponible! + No hi ha cap baixada disponible. src/app/components/downloads/downloads.component.html 25 @@ -2188,7 +2188,7 @@ Your Profile - El teu perfil + El vostre perfil src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2197,7 +2197,7 @@ Logout - Tancar sessió + Finalitza la sessió src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2233,7 +2233,7 @@ Create admin account - Crea un compte d'administrador + Crea un compte administratiu src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2242,7 +2242,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - No s'ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d'un compte d'administrador amb el nom d'usuari 'admin'. + No s’ha detectat cap compte administratiu per defecte. Això crearà i definirà la contrasenya d’un compte administratiu amb el nom d’usuari «admin». src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2305,7 +2305,7 @@ Manage user - Gestiona l'usuari + Gestiona l’usuari src/app/components/modify-users/modify-users.component.html 70 @@ -2318,7 +2318,7 @@ Delete user - Suprimeix l'usuari + Suprimeix l’usuari src/app/components/modify-users/modify-users.component.html 73 @@ -2327,7 +2327,7 @@ Edit user - Edita l'usuari + Edita l’usuari src/app/components/modify-users/modify-users.component.html 66 @@ -2336,7 +2336,7 @@ User UID: - UID d'usuari: + UID de l’usuari: src/app/components/manage-user/manage-user.component.html 4 @@ -2345,7 +2345,7 @@ New password - Nova contrasenya + Contrasenya nova src/app/components/manage-user/manage-user.component.html 8 @@ -2354,7 +2354,7 @@ Set new password - Establir una contrasenya nova + Defineix una contrasenya nova src/app/components/manage-user/manage-user.component.html 10 @@ -2434,7 +2434,7 @@ Open file - Obrir fitxer + Obre el fitxer src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2452,7 +2452,7 @@ Go to subscription - Anar a la subscripció + Vés a la subscripció src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2461,7 +2461,7 @@ Delete and redownload - Suprimeix i torna a descarregar + Suprimeix i torna a baixar src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2474,7 +2474,7 @@ Delete forever - Esborra per sempre + Suprimeix per sempre src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2487,7 +2487,7 @@ See more. - Veure més. + Mostra’n més. src/app/components/see-more/see-more.component.html 5,6 @@ -2496,7 +2496,7 @@ See less. - Veure menys. + Mostra’n menys. src/app/components/see-more/see-more.component.html 8,9 @@ -2505,13 +2505,157 @@ Length: - Llargada: + Durada: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 Video duration label + + Transfer DB to + Transfereix la BD a + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Prova la cadena de connexió + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + MongoDB Connection String + Cadena de connexió del MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Amb aquest paràmetre activat, si un sol vídeo coincideix amb alguna categoria, tota la llista de reproducció s’hi classificarà. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database information could not be retrieved. Check the server logs for more information. + No s’ha pogut recuperar la informació de la base de dades. Comproveu els registres del servidor per a conéixer-ne més detalls. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Randomize order when playing + Aleatoritza l’ordre en reproduir + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Restart server + Reinicia el servidor + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Example: + Exemple: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Records per table + Registres per taula + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Ubicació de la base de dades: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Permet la categorització de les llistes + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Database + Base de dades + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Share file + Compartició del fitxer + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Crop to (seconds) + Escapça fins a (segons) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Escapça des de (segons) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Escapça el fitxer + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From d53c6d88ef0effc03aa87bd9f2d83afe0464baa5 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Thu, 5 Aug 2021 08:51:46 +0000 Subject: [PATCH 019/212] Translated using Weblate (Russian) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ru/ --- src/assets/i18n/messages.ru.xlf | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/assets/i18n/messages.ru.xlf b/src/assets/i18n/messages.ru.xlf index db59ed7..c4384a4 100644 --- a/src/assets/i18n/messages.ru.xlf +++ b/src/assets/i18n/messages.ru.xlf @@ -2584,6 +2584,150 @@ Type select + + Share file + Поделиться файлом + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Перезагрузить сервер + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Не удалось получить информацию о базе данных. Проверьте журналы сервера для получения дополнительной информации. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Передача БД в + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Строка тестового подключения + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Пример: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Строка подключения MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Записи в одной таблице + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Расположение базы данных: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Разрешить категоризацию плейлистов + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + При включении этой настройки, если одно видео соответствует категории, весь список воспроизведения получит эту категорию. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + База данных + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Случайный порядок при проигрывании + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Обрезать до (секунд) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Обрезать от (секунд) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Обрезать файл + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From ea5756293d1116c23c43cc64e6dbb8138985aa46 Mon Sep 17 00:00:00 2001 From: Adolfo Jayme Barrientos Date: Fri, 6 Aug 2021 22:42:57 +0000 Subject: [PATCH 020/212] Translated using Weblate (Spanish) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/es/ --- src/assets/i18n/messages.es.xlf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/assets/i18n/messages.es.xlf b/src/assets/i18n/messages.es.xlf index d618f15..65b531f 100644 --- a/src/assets/i18n/messages.es.xlf +++ b/src/assets/i18n/messages.es.xlf @@ -132,7 +132,7 @@ Path is relative to the config download path. Don't include extension. - La ruta es relativa a la ruta de descarga de la config. No incluya el extensión. + La ruta es relativa a la ruta de descarga de la configuración. No incluya el extensión. Use authentication @@ -200,7 +200,7 @@ Close - Cerca + Cerrar ID: @@ -556,7 +556,7 @@ About - Sobre + Acerca de Home @@ -724,7 +724,7 @@ Session ID: - ID de sesión: + Id. de sesión: (current) @@ -1136,7 +1136,7 @@ An error has occurred: - Un error ha ocurrido: + Ha ocurrido un error: app/download-item/download-item.component.html 27 @@ -1145,7 +1145,7 @@ An error has occurred - Un error ha ocurrido + Ha ocurrido un error app/download-item/download-item.component.html 9 @@ -1154,7 +1154,7 @@ The download was successful - La descarga era exitosa + La descarga fue exitosa app/download-item/download-item.component.html 8 @@ -1172,7 +1172,7 @@ Clear all downloads - Claro todas las descargas + Borrar todas las descargas app/components/downloads/downloads.component.html 18 From 7be4ad4d41732429fbecd20ca799844c2c7d2f8d Mon Sep 17 00:00:00 2001 From: UnlimitedCookies Date: Tue, 17 Aug 2021 15:17:33 +0000 Subject: [PATCH 021/212] Translated using Weblate (German) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/de/ --- src/assets/i18n/messages.de.xlf | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/assets/i18n/messages.de.xlf b/src/assets/i18n/messages.de.xlf index 70672a7..5d6c121 100644 --- a/src/assets/i18n/messages.de.xlf +++ b/src/assets/i18n/messages.de.xlf @@ -2554,6 +2554,150 @@ Max quality placeholder + + Share file + Datei teilen + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Server neu starten + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Datenbankinformationen konnten nicht abgerufen werden. Sehe in den Server-Logs nach, um mehr Informationen zu erhalten. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transferiere Datenbank zu + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Verbindungstest-String + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Beispiel: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB Verbindungs-String + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Einträge pro Tabelle + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Datenbankstandort: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Erlaube Playlist-Kategorisierung + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Sofern diese Einstellung eingeschaltet ist, wird die gesamte Playlist einer Kategorie zugeordnet, sobald ein einzelnes Video mit der Kategorie übereinstimmt. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Datenbank + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Reihenfolge beim Abspielen randomisieren + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Zuschneiden bis (Sekunden) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Zuschneiden ab (Sekunden) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Datei zuschneiden + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From 8f5361bd1adf14d63bbafa17d8b314a674838193 Mon Sep 17 00:00:00 2001 From: mamingwang Date: Wed, 25 Aug 2021 05:10:45 +0200 Subject: [PATCH 022/212] Added translation using Weblate (Basa (Cameroon)) --- src/assets/i18n/messages.bas.xlf | 2634 ++++++++++++++++++++++++++++++ 1 file changed, 2634 insertions(+) create mode 100644 src/assets/i18n/messages.bas.xlf diff --git a/src/assets/i18n/messages.bas.xlf b/src/assets/i18n/messages.bas.xlf new file mode 100644 index 0000000..1e080e4 --- /dev/null +++ b/src/assets/i18n/messages.bas.xlf @@ -0,0 +1,2634 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From f4854e10ad701ab4e3de29952e0860645997b378 Mon Sep 17 00:00:00 2001 From: Kaantaja Date: Wed, 25 Aug 2021 20:41:20 +0200 Subject: [PATCH 023/212] Added translation using Weblate (Finnish) --- src/assets/i18n/messages.fi.xlf | 2634 +++++++++++++++++++++++++++++++ 1 file changed, 2634 insertions(+) create mode 100644 src/assets/i18n/messages.fi.xlf diff --git a/src/assets/i18n/messages.fi.xlf b/src/assets/i18n/messages.fi.xlf new file mode 100644 index 0000000..0262fa0 --- /dev/null +++ b/src/assets/i18n/messages.fi.xlf @@ -0,0 +1,2634 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From 1cdae9f26f2ed4d201347e6e74113f0f0c2fa983 Mon Sep 17 00:00:00 2001 From: Kaantaja Date: Wed, 25 Aug 2021 19:31:51 +0000 Subject: [PATCH 024/212] Translated using Weblate (Finnish) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/fi/ --- src/assets/i18n/messages.fi.xlf | 560 ++++++++++++++++---------------- 1 file changed, 280 insertions(+), 280 deletions(-) diff --git a/src/assets/i18n/messages.fi.xlf b/src/assets/i18n/messages.fi.xlf index 0262fa0..f4fa7b0 100644 --- a/src/assets/i18n/messages.fi.xlf +++ b/src/assets/i18n/messages.fi.xlf @@ -4,7 +4,7 @@ About - + Tietoa src/app/app.component.html 32 @@ -13,7 +13,7 @@ Profile - + Profiili src/app/app.component.html 19 @@ -22,7 +22,7 @@ Dark - + Tumma src/app/app.component.html 23 @@ -35,7 +35,7 @@ Settings - + Asetukset src/app/app.component.html 28 @@ -48,7 +48,7 @@ Home - + Koti src/app/app.component.html 43 @@ -57,7 +57,7 @@ Login - + Kirjaudu src/app/app.component.html 44 @@ -74,7 +74,7 @@ Subscriptions - + Tilaukset src/app/app.component.html 45 @@ -83,7 +83,7 @@ Downloads - + Lataukset src/app/app.component.html 46 @@ -91,8 +91,8 @@ Navigation menu Downloads Page title - Only Audio - + Only Audio + Vain ääni src/app/main/main.component.html 65,66 @@ -100,8 +100,8 @@ Only Audio checkbox - Download - + Download + Tallenna src/app/main/main.component.html 79,80 @@ -109,8 +109,8 @@ Main download button - Quality - + Quality + Laatu src/app/main/main.component.html 19,20 @@ -119,7 +119,7 @@ Use URL - + Käytä osoitelinkkiä src/app/main/main.component.html 51 @@ -127,8 +127,8 @@ YT search Use URL button for searched video - View - + View + Näytä src/app/main/main.component.html 55,56 @@ -136,8 +136,8 @@ YT search View button for searched video - Multi-download Mode - + Multi-download Mode + Multitallennustila src/app/main/main.component.html 70,71 @@ -145,8 +145,8 @@ Multi-download Mode checkbox - Cancel - + Cancel + Peruuta src/app/main/main.component.html 84,85 @@ -154,8 +154,8 @@ Cancel download button - Advanced - + Advanced + Kehittynyt src/app/main/main.component.html 96,97 @@ -163,8 +163,8 @@ Advanced download mode panel - Use custom args - + Use custom args + Käytä mukautettuja argumentteja src/app/main/main.component.html 110,111 @@ -173,7 +173,7 @@ Custom args - + Mukautetut argumentit src/app/main/main.component.html 115 @@ -189,8 +189,8 @@ Custom args placeholder - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Ei tarvetta sisällyttää osoitelinkkiä, riittää pelkkä loppuosa. Argumentit erotellaan kahdella pilkulla, eli näin: ,, src/app/main/main.component.html 118,119 @@ -198,8 +198,8 @@ Custom Args input hint - Use custom output - + Use custom output + Käytä mukautettua ulostuloa src/app/main/main.component.html 126,127 @@ -208,7 +208,7 @@ Custom output - + Mukautettu ulostulo src/app/main/main.component.html 130 @@ -217,7 +217,7 @@ Documentation - + Dokumentaatio src/app/main/main.component.html 132 @@ -242,7 +242,7 @@ Path is relative to the config download path. Don't include extension. - + Polku vastaa config-tallennuksen polkua. Älä sisällytä liitännäistä. src/app/main/main.component.html 133 @@ -262,8 +262,8 @@ Custom Output input hint - Crop file - + Crop file + Rajaa tiedosto src/app/main/main.component.html 155,156 @@ -272,7 +272,7 @@ Crop from (seconds) - + Rajaa jostain (sekuntia) src/app/main/main.component.html 159 @@ -281,7 +281,7 @@ Crop to (seconds) - + Rajaa johonkin (sekuntia) src/app/main/main.component.html 164 @@ -289,8 +289,8 @@ Crop to placeholder - Simulated command: - + Simulated command: + Simuloitu komento: src/app/main/main.component.html 102,103 @@ -298,8 +298,8 @@ Simulated command label - Use authentication - + Use authentication + Käytä tunnistautumista src/app/main/main.component.html 140,141 @@ -308,7 +308,7 @@ Username - + Käyttäjänimi src/app/main/main.component.html 144 @@ -317,7 +317,7 @@ Password - + Salasana src/app/main/main.component.html 149 @@ -334,7 +334,7 @@ Create a playlist - + Luo soittolista src/app/create-playlist/create-playlist.component.html 1 @@ -343,7 +343,7 @@ Name - + Nimi src/app/create-playlist/create-playlist.component.html 6 @@ -360,7 +360,7 @@ Type - + Tyyppi src/app/create-playlist/create-playlist.component.html 11 @@ -369,7 +369,7 @@ Audio - + Ääni src/app/create-playlist/create-playlist.component.html 12 @@ -378,7 +378,7 @@ Video - + Video src/app/create-playlist/create-playlist.component.html 13 @@ -387,7 +387,7 @@ Audio files - + Äänitiedostot src/app/create-playlist/create-playlist.component.html 19 @@ -396,7 +396,7 @@ Videos - + Videot src/app/create-playlist/create-playlist.component.html 20 @@ -409,7 +409,7 @@ Subscribe to playlist or channel - + Tilaa soittolista tai kanava src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -418,7 +418,7 @@ URL - + URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 8 @@ -431,7 +431,7 @@ The playlist or channel URL - + Soittolistan tai kanavan osoitelinkki src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -440,7 +440,7 @@ Custom name - + Mukautettu nimi src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -449,7 +449,7 @@ Download all uploads - + Tallenna kaikki lataukset src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -462,7 +462,7 @@ Max quality - + Maksimilaatu src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 40 @@ -475,7 +475,7 @@ Audio-only mode - + Vain ääni -tila src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -488,7 +488,7 @@ Streaming-only mode - + Vain suoratoisto -tila src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -501,7 +501,7 @@ These are added after the standard args. - + Nämä lisätään standardiargumenttien perään. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -514,7 +514,7 @@ Custom file output - + Mukautettu tiedoston ulostulo src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -531,7 +531,7 @@ Cancel - + Peruuta src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -556,7 +556,7 @@ Subscribe - + Tilaa src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -565,7 +565,7 @@ Download videos uploaded in the last - + Tallenna videot, jotka on ladattu viimeisen src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -578,7 +578,7 @@ Type: - + Tyyppi: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 5 @@ -587,7 +587,7 @@ URL: - + URL: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 9 @@ -600,7 +600,7 @@ ID: - + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -617,7 +617,7 @@ Close - + Sulje src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -662,7 +662,7 @@ Export Archive - + Vientiarkisto src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -671,7 +671,7 @@ Unsubscribe - + Poista tilaus src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -680,7 +680,7 @@ (Paused) - + (Pysäytetty) src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -705,7 +705,7 @@ Archive: - + Arkisto: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -714,7 +714,7 @@ Name: - + Nimi: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 5 @@ -727,7 +727,7 @@ Uploader: - + Lataaja: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 13 @@ -736,7 +736,7 @@ File size: - + Tiedostokoko: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 17 @@ -745,7 +745,7 @@ Path: - + Polku: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 21 @@ -754,7 +754,7 @@ Upload Date: - + Latauspäivämäärä: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 25 @@ -763,7 +763,7 @@ Category: - + Kategoria: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 29 @@ -772,7 +772,7 @@ Modify youtube-dl args - + Muokkaa youtube-dl -argumentteja src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -781,7 +781,7 @@ Simulated new args - + Simuloidut uudet argumentit src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -790,7 +790,7 @@ Add an arg - + Lisää argumentti src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -799,7 +799,7 @@ Search by category - + Etsi kategorian perusteella src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -808,7 +808,7 @@ Use arg value - + Käytä argumentin arvoa src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -817,7 +817,7 @@ Add arg - + Lisää argumentti src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -826,7 +826,7 @@ Modify - + Muokkaa src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -835,7 +835,7 @@ Arg value - + Argumentin arvo src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -844,7 +844,7 @@ Updater - + Päivittäjä src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 @@ -853,7 +853,7 @@ Register a user - + Rekisteröi käyttäjä src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -862,7 +862,7 @@ User name - + Käyttäjän nimi src/app/dialogs/add-user-dialog/add-user-dialog.component.html 6 @@ -871,7 +871,7 @@ Register - + Rekisteröidy src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -884,7 +884,7 @@ Upload new cookies - + Lataa uusia evästeitä src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -893,7 +893,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - + HUOMIO: Uusien evästeiden lataaminen korvaa vanhat evästeet. Huomioi myös, että evästeet ovat palveluntarjoajalaajuisia, ei käyttäjäkohtaisia. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -902,7 +902,7 @@ Drag and Drop - + Raahaa ja pudota src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 11 @@ -911,7 +911,7 @@ Modify playlist - + Muokkaa soittolistaa src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -920,7 +920,7 @@ Save - + Tallenna src/app/dialogs/modify-playlist/modify-playlist.component.html 43 @@ -945,7 +945,7 @@ Randomize order when playing - + Aseta satunnainen toistojärjestys src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -954,7 +954,7 @@ Add content - + Lisää sisältöä src/app/dialogs/modify-playlist/modify-playlist.component.html 24 @@ -962,8 +962,8 @@ Add content - Normal order  - + Normal order + Tavallinen järjestys src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -971,8 +971,8 @@ Normal order - Reverse order  - + Reverse order + Käänteinen järjestys src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -981,7 +981,7 @@ My videos - + Minun videot src/app/components/recent-videos/recent-videos.component.html 20 @@ -990,7 +990,7 @@ Search - + Etsi src/app/components/recent-videos/recent-videos.component.html 24 @@ -1007,7 +1007,7 @@ No videos found. - + Ei löydetty videoita. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1016,7 +1016,7 @@ Editing - + Muokataan src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1025,7 +1025,7 @@ Paused - + Pysäytetty src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1034,7 +1034,7 @@ Editing category - + Kategorian muokkaaminen src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1043,7 +1043,7 @@ Rules - + Säännöt src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 10 @@ -1052,7 +1052,7 @@ Add new rule - + Luo uusi sääntö src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1061,7 +1061,7 @@ Download Twitch Chat - + Tallenna Twitch-chat src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1070,7 +1070,7 @@ Edit - + Muokkaa src/app/file-card/file-card.component.html 19 @@ -1083,7 +1083,7 @@ Delete - + Poista src/app/file-card/file-card.component.html 20 @@ -1104,7 +1104,7 @@ Info - + Tietoa src/app/file-card/file-card.component.html 24 @@ -1121,7 +1121,7 @@ Count: - + Lukumäärä: src/app/file-card/file-card.component.html 8 @@ -1130,7 +1130,7 @@ Delete and blacklist - + Poista ja estä src/app/file-card/file-card.component.html 26 @@ -1143,7 +1143,7 @@ views - + näyttökertaa src/app/player/player.component.html 15 @@ -1152,7 +1152,7 @@ The download was successful - + Tallennus onnistui src/app/download-item/download-item.component.html 8 @@ -1165,7 +1165,7 @@ An error has occurred - + Tapahtui virhe src/app/download-item/download-item.component.html 9 @@ -1178,7 +1178,7 @@ Details - + Lisätietoja src/app/download-item/download-item.component.html 18 @@ -1187,7 +1187,7 @@ An error has occurred: - + Tapahtui virhe: src/app/download-item/download-item.component.html 27 @@ -1196,7 +1196,7 @@ Download start: - + Tallennuksen aloitus: src/app/download-item/download-item.component.html 32 @@ -1205,7 +1205,7 @@ Download end: - + Tallennuksen loppu: src/app/download-item/download-item.component.html 35 @@ -1214,7 +1214,7 @@ File path(s): - + Tiedostopolku/-polut: src/app/download-item/download-item.component.html 38 @@ -1223,7 +1223,7 @@ Your subscriptions - + Sinun tilauksesi src/app/subscriptions/subscriptions.component.html 3 @@ -1232,7 +1232,7 @@ Channels - + Kanavat src/app/subscriptions/subscriptions.component.html 8 @@ -1241,7 +1241,7 @@ Playlists - + Soittolistat src/app/subscriptions/subscriptions.component.html 27 @@ -1250,7 +1250,7 @@ Name not available. Channel retrieval in progress. - + Nimi ei saatavilla. Kanavan nouto kesken. src/app/subscriptions/subscriptions.component.html 14 @@ -1259,7 +1259,7 @@ You have no channel subscriptions. - + Sinulla ei ole kanavatilauksia. src/app/subscriptions/subscriptions.component.html 24 @@ -1268,7 +1268,7 @@ Name not available. Playlist retrieval in progress. - + Nimi ei saatavilla. Soittolistan nouto kesken. src/app/subscriptions/subscriptions.component.html 33 @@ -1277,7 +1277,7 @@ You have no playlist subscriptions. - + Sinulla ei ole soittolistatilauksia. src/app/subscriptions/subscriptions.component.html 43 @@ -1286,7 +1286,7 @@ Main - + Päävalikko src/app/settings/settings.component.html 12 @@ -1295,7 +1295,7 @@ Downloader - + Tallentaja src/app/settings/settings.component.html 102 @@ -1304,7 +1304,7 @@ Extra - + Extra src/app/settings/settings.component.html 185 @@ -1313,7 +1313,7 @@ Database - + Tietokanta src/app/settings/settings.component.html 284 @@ -1322,7 +1322,7 @@ Advanced - + Kehittynyt src/app/settings/settings.component.html 320 @@ -1331,7 +1331,7 @@ Users - + Käyttäjät src/app/settings/settings.component.html 403 @@ -1344,7 +1344,7 @@ Logs - + Lokit src/app/settings/settings.component.html 451 @@ -1357,7 +1357,7 @@ {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - + {VAR_SELECT, select, true {Sulje} false {Peruuta} other {muu}} src/app/settings/settings.component.html 467 @@ -1366,7 +1366,7 @@ URL this app will be accessed from, without the port. - + Osoite, josta yhdistetään tähän sovellukseen, ilman porttia. src/app/settings/settings.component.html 19 @@ -1375,7 +1375,7 @@ Port - + Portti src/app/settings/settings.component.html 24 @@ -1384,7 +1384,7 @@ The desired port. Default is 17442. - + Toivottu portti. Oletus on 17442. src/app/settings/settings.component.html 25 @@ -1393,7 +1393,7 @@ Multi-user mode - + Monikäyttäjätila src/app/settings/settings.component.html 34 @@ -1402,7 +1402,7 @@ Users base path - + Käyttäjien peruspolku src/app/settings/settings.component.html 38 @@ -1411,7 +1411,7 @@ Base path for users and their downloaded videos. - + Peruspolku käyttäjille ja niiden tallennetuille videoille. src/app/settings/settings.component.html 39 @@ -1420,7 +1420,7 @@ Allow subscriptions - + Salli tilaukset src/app/settings/settings.component.html 48 @@ -1429,7 +1429,7 @@ Subscriptions base path - + Tilausten peruspolku src/app/settings/settings.component.html 52 @@ -1438,7 +1438,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - + Peruspolku videoille sinun tilaamiltasi kanavilta ja soittolistoilta. Se vastaa YTDL-Materialin root-kansiota. src/app/settings/settings.component.html 53 @@ -1447,7 +1447,7 @@ Check interval - + Tarkistusväli src/app/settings/settings.component.html 58 @@ -1456,7 +1456,7 @@ Unit is seconds, only include numbers. - + Yksikkö on sekuntia, sisällytä vain numeroita. src/app/settings/settings.component.html 59 @@ -1465,7 +1465,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - + Joskus uudet videot tallennetaan ennen kuin ne ovat täysin valmisteltuja. Tämä asetus tarkoittaa, että uudet videot tarkistetaan seuraavana päivänä korkealaatuisemman version varalta. src/app/settings/settings.component.html 63 @@ -1474,7 +1474,7 @@ Redownload fresh uploads - + Uudelleentallenna tuoreet lataukset src/app/settings/settings.component.html 63 @@ -1483,7 +1483,7 @@ Theme - + Teema src/app/settings/settings.component.html 72 @@ -1492,7 +1492,7 @@ Default - + Oletus src/app/settings/settings.component.html 74 @@ -1501,7 +1501,7 @@ Allow theme change - + Salli teeman muuttaminen src/app/settings/settings.component.html 80 @@ -1510,7 +1510,7 @@ Language - + Kieli src/app/settings/settings.component.html 89 @@ -1519,7 +1519,7 @@ Audio folder path - + Äänen tiedostopolku src/app/settings/settings.component.html 109 @@ -1528,7 +1528,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - + Polku ainoastaan äänimuotoisia tallennuksia varten. Se vastaa YTDL-Materialin root-kansiota. src/app/settings/settings.component.html 110 @@ -1537,7 +1537,7 @@ Video folder path - + Videon tiedostopolku src/app/settings/settings.component.html 116 @@ -1546,7 +1546,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - + Polku videomuotoisille tallennuksille. Se vastaa YTDL-Materialin root-kansiota. src/app/settings/settings.component.html 117 @@ -1555,7 +1555,7 @@ Default file output - + Oletusarvoinen tiedoston ulostulo src/app/settings/settings.component.html 123 @@ -1564,7 +1564,7 @@ Path is relative to the above download paths. Don't include extension. - + Polku vastaa yllä olevia tallennuspolkuja. Älä sisällytä liitännäistä. src/app/settings/settings.component.html 126 @@ -1573,7 +1573,7 @@ Global custom args - + Globaalit mukautetut argumentit src/app/settings/settings.component.html 133 @@ -1582,7 +1582,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - + Globaalit mukautetut argumentit latauksille, jotka ovat kotisivulla. Argumentit eritellään kahdella pilkulla, eli näin: ,, src/app/settings/settings.component.html 134 @@ -1591,7 +1591,7 @@ Categories - + Kategoriat src/app/settings/settings.component.html 144 @@ -1600,7 +1600,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - + Kun tämä asetus on päällä, jos yksittäinen video vastaa kategoriaa, koko soittolista saa kyseisen kategorian. src/app/settings/settings.component.html 158 @@ -1609,7 +1609,7 @@ Allow playlist categorization - + Salli soittolistan kategoriasointi src/app/settings/settings.component.html 158 @@ -1618,7 +1618,7 @@ Use youtube-dl archive - + Käytä youtube-dl arkistoa src/app/settings/settings.component.html 166 @@ -1627,7 +1627,7 @@ Include thumbnail - + Sisällytä pienoiskuvake src/app/settings/settings.component.html 170 @@ -1636,7 +1636,7 @@ Include metadata - + Sisällytä metadata src/app/settings/settings.component.html 174 @@ -1645,7 +1645,7 @@ Kill all downloads - + Tapa kaikki tallennukset src/app/settings/settings.component.html 178 @@ -1654,7 +1654,7 @@ Top title - + Yläotsikko src/app/settings/settings.component.html 191 @@ -1663,7 +1663,7 @@ File manager enabled - + Tiedostonhallintaohjelma sallittu src/app/settings/settings.component.html 196 @@ -1672,7 +1672,7 @@ Downloads manager enabled - + Tallennustenhallintaohjelma sallittu src/app/settings/settings.component.html 199 @@ -1681,7 +1681,7 @@ Allow quality select - + Salli laadun valinta src/app/settings/settings.component.html 202 @@ -1690,7 +1690,7 @@ Download only mode - + Vain tallennus -tila src/app/settings/settings.component.html 205 @@ -1699,7 +1699,7 @@ Allow multi-download mode - + Salli monitallennus -tila src/app/settings/settings.component.html 208 @@ -1708,7 +1708,7 @@ Enable Public API - + Salli julkinen API src/app/settings/settings.component.html 216 @@ -1717,7 +1717,7 @@ Public API Key - + Julkinen API-avain src/app/settings/settings.component.html 221 @@ -1726,7 +1726,7 @@ View documentation - + Näytä dokumentaatio src/app/settings/settings.component.html 222 @@ -1735,7 +1735,7 @@ This will delete your old API key! - + Tämä poistaa sinun vanhan API-avaimen! src/app/settings/settings.component.html 226 @@ -1744,7 +1744,7 @@ Generate - + Luo src/app/settings/settings.component.html 226 @@ -1753,7 +1753,7 @@ Use YouTube API - + Käytä YouTube API:a src/app/settings/settings.component.html 235 @@ -1762,7 +1762,7 @@ Youtube API Key - + YouTube API-avain src/app/settings/settings.component.html 239 @@ -1771,7 +1771,7 @@ Generating a key is easy! - + Avaimen luominen on helppoa! src/app/settings/settings.component.html 240 @@ -1784,7 +1784,7 @@ Use Twitch API - + Käytä Twitch API:a src/app/settings/settings.component.html 244 @@ -1793,7 +1793,7 @@ Twitch API Key - + Twitch API-avain src/app/settings/settings.component.html 251 @@ -1802,7 +1802,7 @@ Also known as a Client ID. - + Tunnetaan myös nimellä Client ID. src/app/settings/settings.component.html 252 @@ -1811,7 +1811,7 @@ Auto-download Twitch Chat - + Tallenna automaattisesti Twitch-chat src/app/settings/settings.component.html 247 @@ -1820,7 +1820,7 @@ Click here - + Klikkaa tänne src/app/settings/settings.component.html 262 @@ -1837,7 +1837,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - + ladataksesi virallisen YouTubeDL-Materialin Chrome-liitännäisen manuaalisesti. src/app/settings/settings.component.html 262 @@ -1846,7 +1846,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - + Sinun täytyy manuaalisesti ladata liitännäinen ja muokata liitännäise asetuksia säätääksesi frontend-osoitelinkin. src/app/settings/settings.component.html 263 @@ -1855,7 +1855,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - + asentaaksesi virallisen YoutubeDL-Material Firefox-laajennuksen suoraan Firefoxin laajennussivulta. src/app/settings/settings.component.html 268 @@ -1864,7 +1864,7 @@ Detailed setup instructions. - + Tarkat asennusohjeet. src/app/settings/settings.component.html 269 @@ -1873,7 +1873,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - + Ei vaadita paljoa muuta kuin liitännäisen asetuksen vaihtaminen, jotta saa säädettyä frontend-osoitelinkin. src/app/settings/settings.component.html 269 @@ -1882,7 +1882,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - + Raahaa alla oleva linkki kirjanmerkkeihisi, ja voit aloittaa! Siirry haluamaasi YouTube-videoon ja klikkaa kirjanmerkkiä. src/app/settings/settings.component.html 274 @@ -1891,7 +1891,7 @@ Generate 'audio only' bookmarklet - + Luo 'vain ääni' kirjanmerkki src/app/settings/settings.component.html 275 @@ -1900,7 +1900,7 @@ Database location: - + Tietokannan sijainti: src/app/settings/settings.component.html 290 @@ -1909,7 +1909,7 @@ Records per table - + Tallenteita per taulukko src/app/settings/settings.component.html 291 @@ -1918,7 +1918,7 @@ MongoDB Connection String - + MongoDB-yhteyden merkkijono src/app/settings/settings.component.html 299 @@ -1927,7 +1927,7 @@ Example: - + Esimerkki: src/app/settings/settings.component.html 300 @@ -1936,7 +1936,7 @@ Test connection string - + Testaa yhteys merkkijono src/app/settings/settings.component.html 304 @@ -1944,8 +1944,8 @@ Test connection string button - Transfer DB to - + Transfer DB to + Siirrä DB kohteeseen src/app/settings/settings.component.html 308 @@ -1954,7 +1954,7 @@ Database information could not be retrieved. Check the server logs for more information. - + Tietokantainformaatiota ei voitu noutaa. Tarkista palvelimen lokit saadaksesi lisätietoa. src/app/settings/settings.component.html 312 @@ -1963,7 +1963,7 @@ Select a downloader - + Valitse tallentaja src/app/settings/settings.component.html 326 @@ -1972,7 +1972,7 @@ Use default downloading agent - + Käytä oletusarvoista tallennusagenttia src/app/settings/settings.component.html 335 @@ -1981,7 +1981,7 @@ Select a download agent - + Valitse tallennusagentti src/app/settings/settings.component.html 339 @@ -1990,7 +1990,7 @@ Log Level - + Lokin taso src/app/settings/settings.component.html 353 @@ -1999,7 +1999,7 @@ Login expiration - + Kirjautumisen vanhentuminen src/app/settings/settings.component.html 365 @@ -2008,7 +2008,7 @@ Allow advanced download - + Salli kehittynyt tallennus src/app/settings/settings.component.html 376 @@ -2017,7 +2017,7 @@ Use Cookies - + Käytä evästeitä src/app/settings/settings.component.html 384 @@ -2026,7 +2026,7 @@ Set Cookies - + Aseta evästeet src/app/settings/settings.component.html 385 @@ -2035,7 +2035,7 @@ Restart server - + Uudelleenkäynnistä palvelin src/app/settings/settings.component.html 397 @@ -2044,7 +2044,7 @@ Allow user registration - + Salli käyttäjän rekisteröityminen src/app/settings/settings.component.html 407 @@ -2053,7 +2053,7 @@ Auth method - + Tunnistautumismetodi src/app/settings/settings.component.html 411 @@ -2062,7 +2062,7 @@ Internal - + Sisäinen src/app/settings/settings.component.html 413 @@ -2071,7 +2071,7 @@ LDAP - + LDAP src/app/settings/settings.component.html 416 @@ -2080,7 +2080,7 @@ LDAP URL - + LDAP URL src/app/settings/settings.component.html 423 @@ -2089,7 +2089,7 @@ Bind DN - + Sido DN src/app/settings/settings.component.html 428 @@ -2098,7 +2098,7 @@ Bind Credentials - + Sido kredentiaalit src/app/settings/settings.component.html 433 @@ -2107,7 +2107,7 @@ Search Base - + Etsi basea src/app/settings/settings.component.html 438 @@ -2116,7 +2116,7 @@ Search Filter - + Hakusuodatin src/app/settings/settings.component.html 443 @@ -2125,7 +2125,7 @@ About YoutubeDL-Material - + Tietoa YoutubeDL-Material -ohjelmasta src/app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2134,7 +2134,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - + on avoimen koodin YouTube-tallennusohjelma, joka on tehty Googlen Material Design -vaatimusten mukaisesti. Voit saumattomasti tallentaa suosikkivideosi videona tai äänenä. Voit jopa tilata suosikkikanaviasi ja soittolistojasi pysyäksesi ajan tasalla heidän uusista videoista. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2143,7 +2143,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - + -sovelluksessa on upeita ominaisuuksia! Laaja API, Docker-tuki ja kielituki. Lue kaikista ominaisuuksista lisää klikkaamalla GitHub-kuvaketta yllä. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2152,7 +2152,7 @@ Installed version: - + Asennettu versio: src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2161,7 +2161,7 @@ Found a bug or have a suggestion? - + Löysitkö bugin tai onko sinulla ehdotuksia? src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2170,7 +2170,7 @@ to create an issue! - + luodaksesi ilmoituksen! src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2179,7 +2179,7 @@ Checking for updates... - + Tarkistetaan päivityksiä… src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2188,7 +2188,7 @@ Update available - + Päivitys saatavilla src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2197,7 +2197,7 @@ You can update from the settings menu. - + Voit päivittää asetusvalikon kautta. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2206,7 +2206,7 @@ Select a version: - + Valitse versio: src/app/updater/updater.component.html 3 @@ -2215,7 +2215,7 @@ Enable sharing - + Salli jakaminen src/app/dialogs/share-media-dialog/share-media-dialog.component.html 9 @@ -2224,7 +2224,7 @@ Use timestamp - + Käytä aikaleimaa src/app/dialogs/share-media-dialog/share-media-dialog.component.html 12 @@ -2233,7 +2233,7 @@ Seconds - + Sekuntia src/app/dialogs/share-media-dialog/share-media-dialog.component.html 14 @@ -2242,7 +2242,7 @@ Copy to clipboard - + Kopioi leikepöydälle src/app/dialogs/share-media-dialog/share-media-dialog.component.html 23 @@ -2251,7 +2251,7 @@ Share playlist - + Jaa soittolista src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2260,7 +2260,7 @@ Share file - + Jaa tiedosto src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2269,7 +2269,7 @@ Session ID: - + Session ID: src/app/components/downloads/downloads.component.html 5 @@ -2278,7 +2278,7 @@ Clear all downloads - + Tyhjennä kaikki tallennukset src/app/components/downloads/downloads.component.html 18 @@ -2287,7 +2287,7 @@ (current) - + (nykyinen) src/app/components/downloads/downloads.component.html 6 @@ -2296,7 +2296,7 @@ No downloads available! - + Ei tallennuksia saatavilla! src/app/components/downloads/downloads.component.html 25 @@ -2305,7 +2305,7 @@ Your Profile - + Sinun profiilisi src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2314,7 +2314,7 @@ Logout - + Kirjaudu ulos src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2323,7 +2323,7 @@ UID: - + UID: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 9 @@ -2332,7 +2332,7 @@ Created: - + Luotu: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 12 @@ -2341,7 +2341,7 @@ You are not logged in. - + Et ole kirjautuneena. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2350,7 +2350,7 @@ Create admin account - + Luo ylläpitäjän tili src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2359,7 +2359,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - + Ei oletusarvoista ylläpitäjätiliä tunnistettu. Tämä luo ja asettaa ylläpitäjän salanan käyttäjänimen kanssa muotoon 'admin'. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2368,7 +2368,7 @@ Create - + Luo src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2377,7 +2377,7 @@ Add Users - + Lisää käyttäjiä src/app/components/modify-users/modify-users.component.html 90 @@ -2386,7 +2386,7 @@ Edit Role - + Muokkaa roolia src/app/components/modify-users/modify-users.component.html 95 @@ -2394,8 +2394,8 @@ Edit role - User name - + User name + Käyttäjän nimi src/app/components/modify-users/modify-users.component.html 17 @@ -2403,8 +2403,8 @@ Username users table header - Role - + Role + Rooli src/app/components/modify-users/modify-users.component.html 35 @@ -2412,8 +2412,8 @@ Role users table header - Actions - + Actions + Toiminnot src/app/components/modify-users/modify-users.component.html 55 @@ -2422,7 +2422,7 @@ Manage user - + Hallitse käyttäjää src/app/components/modify-users/modify-users.component.html 70 @@ -2435,7 +2435,7 @@ Delete user - + Poista käyttäjä src/app/components/modify-users/modify-users.component.html 73 @@ -2444,7 +2444,7 @@ Edit user - + Muokkaa käyttäjää src/app/components/modify-users/modify-users.component.html 66 @@ -2453,7 +2453,7 @@ User UID: - + Käyttäjä UID: src/app/components/manage-user/manage-user.component.html 4 @@ -2462,7 +2462,7 @@ New password - + Uusi salasana src/app/components/manage-user/manage-user.component.html 8 @@ -2471,7 +2471,7 @@ Set new password - + Aseta uusi salasana src/app/components/manage-user/manage-user.component.html 10 @@ -2480,7 +2480,7 @@ Use role default - + Käytä roolia oletus src/app/components/manage-user/manage-user.component.html 19 @@ -2489,7 +2489,7 @@ Yes - + Kyllä src/app/components/manage-user/manage-user.component.html 20 @@ -2502,7 +2502,7 @@ No - + Ei src/app/components/manage-user/manage-user.component.html 21 @@ -2515,7 +2515,7 @@ Manage role - + Hallitse roolia src/app/components/manage-role/manage-role.component.html 1 @@ -2524,7 +2524,7 @@ Lines: - + Rivit: src/app/components/logs-viewer/logs-viewer.component.html 22 @@ -2533,7 +2533,7 @@ Clear logs - + Tyhjennä lokit src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2542,7 +2542,7 @@ Auto-generated - + Automaattisesti luotu src/app/components/unified-file-card/unified-file-card.component.html 5 @@ -2551,7 +2551,7 @@ Open file - + Avaa tiedosto src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2560,7 +2560,7 @@ Open file in new tab - + Avaa tiedosto uudessa välilehdessä src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2569,7 +2569,7 @@ Go to subscription - + Siirry tilaukseen src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2578,7 +2578,7 @@ Delete and redownload - + Poista ja tallenna uudelleen src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2591,7 +2591,7 @@ Delete forever - + Poista pysyvästi src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2603,8 +2603,8 @@ Delete forever subscription video button - See more. - + See more. + Katso enemmän. src/app/components/see-more/see-more.component.html 5,6 @@ -2612,8 +2612,8 @@ See more - See less. - + See less. + Katso vähemmän. src/app/components/see-more/see-more.component.html 8,9 @@ -2622,7 +2622,7 @@ Length: - + Pituus: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 From 3651a021ce45ba561523fc5fb3198360669dafb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Tue, 14 Sep 2021 08:53:34 +0200 Subject: [PATCH 025/212] =?UTF-8?q?Added=20translation=20using=20Weblate?= =?UTF-8?q?=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/i18n/messages.nb-NO.xlf | 2634 ++++++++++++++++++++++++++++ 1 file changed, 2634 insertions(+) create mode 100644 src/assets/i18n/messages.nb-NO.xlf diff --git a/src/assets/i18n/messages.nb-NO.xlf b/src/assets/i18n/messages.nb-NO.xlf new file mode 100644 index 0000000..921537c --- /dev/null +++ b/src/assets/i18n/messages.nb-NO.xlf @@ -0,0 +1,2634 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From 60030ac525c7ef1ce23f43a2c4419bb90313fa42 Mon Sep 17 00:00:00 2001 From: Reza Almanda Date: Tue, 14 Sep 2021 06:28:37 +0000 Subject: [PATCH 026/212] Translated using Weblate (Indonesian) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/id/ --- src/assets/i18n/messages.id.xlf | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/assets/i18n/messages.id.xlf b/src/assets/i18n/messages.id.xlf index fde0f21..cc36167 100644 --- a/src/assets/i18n/messages.id.xlf +++ b/src/assets/i18n/messages.id.xlf @@ -2512,6 +2512,150 @@ Video duration label + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Jika pengaturan ini diaktifkan, saat satu video cocok dengan kategori, seluruh daftar putar akan menerima kategori tersebut. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Share file + Berbagi berkas + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Mulai ulang server + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Informasi basis data tidak dapat diambil. Periksa log server untuk informasi lebih lanjut. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transfer BD ke + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Uji koneksi string + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Contoh: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + String Koneksi MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Catatan per tabel + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Lokasi basisdata: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Izinkan kategorisasi daftar putar + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Database + Basisdata + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Acak urutan saat memainkan + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Pangkas ke (detik) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Pangkas dari (detik) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Pangkas berkas + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + From 244e3949243b7adce3034dbaa595962f25e63b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Tue, 14 Sep 2021 07:12:13 +0000 Subject: [PATCH 027/212] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 56.7% (147 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nb_NO/ --- src/assets/i18n/messages.nb-NO.xlf | 554 ++++++++++++++--------------- 1 file changed, 277 insertions(+), 277 deletions(-) diff --git a/src/assets/i18n/messages.nb-NO.xlf b/src/assets/i18n/messages.nb-NO.xlf index 921537c..fdc2764 100644 --- a/src/assets/i18n/messages.nb-NO.xlf +++ b/src/assets/i18n/messages.nb-NO.xlf @@ -4,7 +4,7 @@ About - + Om src/app/app.component.html 32 @@ -13,7 +13,7 @@ Profile - + Profil src/app/app.component.html 19 @@ -22,7 +22,7 @@ Dark - + Mørk src/app/app.component.html 23 @@ -35,7 +35,7 @@ Settings - + Innstillinger src/app/app.component.html 28 @@ -48,7 +48,7 @@ Home - + Hjem src/app/app.component.html 43 @@ -57,7 +57,7 @@ Login - + Logg inn src/app/app.component.html 44 @@ -74,7 +74,7 @@ Subscriptions - + Abonnementer src/app/app.component.html 45 @@ -83,7 +83,7 @@ Downloads - + Nedlastinger src/app/app.component.html 46 @@ -91,8 +91,8 @@ Navigation menu Downloads Page title - Only Audio - + Only Audio + Kun lyd src/app/main/main.component.html 65,66 @@ -100,8 +100,8 @@ Only Audio checkbox - Download - + Download + Last ned src/app/main/main.component.html 79,80 @@ -109,8 +109,8 @@ Main download button - Quality - + Quality + Kvalitet src/app/main/main.component.html 19,20 @@ -119,7 +119,7 @@ Use URL - + Bruk nettadresse src/app/main/main.component.html 51 @@ -127,8 +127,8 @@ YT search Use URL button for searched video - View - + View + Vis src/app/main/main.component.html 55,56 @@ -136,8 +136,8 @@ YT search View button for searched video - Multi-download Mode - + Multi-download Mode + Multi-nedlastingsmodus src/app/main/main.component.html 70,71 @@ -145,8 +145,8 @@ Multi-download Mode checkbox - Cancel - + Cancel + Avbryt src/app/main/main.component.html 84,85 @@ -154,8 +154,8 @@ Cancel download button - Advanced - + Advanced + Avansert src/app/main/main.component.html 96,97 @@ -163,8 +163,8 @@ Advanced download mode panel - Use custom args - + Use custom args + Bruk egendefinerte argumenter src/app/main/main.component.html 110,111 @@ -173,7 +173,7 @@ Custom args - + Egendefinerte argumenter src/app/main/main.component.html 115 @@ -190,7 +190,7 @@ No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + src/app/main/main.component.html 118,119 @@ -199,7 +199,7 @@ Use custom output - + src/app/main/main.component.html 126,127 @@ -208,7 +208,7 @@ Custom output - + src/app/main/main.component.html 130 @@ -217,7 +217,7 @@ Documentation - + Dokumentasjon src/app/main/main.component.html 132 @@ -242,7 +242,7 @@ Path is relative to the config download path. Don't include extension. - + src/app/main/main.component.html 133 @@ -262,8 +262,8 @@ Custom Output input hint - Crop file - + Crop file + Beskjær fil src/app/main/main.component.html 155,156 @@ -272,7 +272,7 @@ Crop from (seconds) - + Beskjær fra (sekunder) src/app/main/main.component.html 159 @@ -281,7 +281,7 @@ Crop to (seconds) - + Beskjær til (sekunder) src/app/main/main.component.html 164 @@ -289,8 +289,8 @@ Crop to placeholder - Simulated command: - + Simulated command: + Simulert kommando: src/app/main/main.component.html 102,103 @@ -298,8 +298,8 @@ Simulated command label - Use authentication - + Use authentication + Bruk identitetsbekreftelse src/app/main/main.component.html 140,141 @@ -308,7 +308,7 @@ Username - + Brukernavn src/app/main/main.component.html 144 @@ -317,7 +317,7 @@ Password - + Passord src/app/main/main.component.html 149 @@ -334,7 +334,7 @@ Create a playlist - + Opprett en spilleliste src/app/create-playlist/create-playlist.component.html 1 @@ -343,7 +343,7 @@ Name - + Navn src/app/create-playlist/create-playlist.component.html 6 @@ -360,7 +360,7 @@ Type - + Type src/app/create-playlist/create-playlist.component.html 11 @@ -369,7 +369,7 @@ Audio - + Lyd src/app/create-playlist/create-playlist.component.html 12 @@ -378,7 +378,7 @@ Video - + Video src/app/create-playlist/create-playlist.component.html 13 @@ -387,7 +387,7 @@ Audio files - + Lydfiler src/app/create-playlist/create-playlist.component.html 19 @@ -396,7 +396,7 @@ Videos - + Videoer src/app/create-playlist/create-playlist.component.html 20 @@ -409,7 +409,7 @@ Subscribe to playlist or channel - + Abonner på spilleliste eller kanal src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -418,7 +418,7 @@ URL - + Nettadresse src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 8 @@ -431,7 +431,7 @@ The playlist or channel URL - + Spillelistens eller kanalens nettadresse src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -440,7 +440,7 @@ Custom name - + Egendefinert navn src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -449,7 +449,7 @@ Download all uploads - + Last ned alle opplastninger src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -462,7 +462,7 @@ Max quality - + Maksimal kvalitet src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 40 @@ -475,7 +475,7 @@ Audio-only mode - + «Kun lyd»-modus src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -488,7 +488,7 @@ Streaming-only mode - + «Kun strømming»-modus src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -501,7 +501,7 @@ These are added after the standard args. - + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -514,7 +514,7 @@ Custom file output - + Egendefinert filutdata src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -531,7 +531,7 @@ Cancel - + Avbryt src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -556,7 +556,7 @@ Subscribe - + Abonner src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -565,7 +565,7 @@ Download videos uploaded in the last - + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -578,7 +578,7 @@ Type: - + Type: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 5 @@ -587,7 +587,7 @@ URL: - + Nettadresse: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 9 @@ -600,7 +600,7 @@ ID: - + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -617,7 +617,7 @@ Close - + Lukk src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -662,7 +662,7 @@ Export Archive - + Eksporter arkiv src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -671,7 +671,7 @@ Unsubscribe - + Opphev abonnement src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -680,7 +680,7 @@ (Paused) - + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -705,7 +705,7 @@ Archive: - + Arkiv: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -714,7 +714,7 @@ Name: - + Navn: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 5 @@ -727,7 +727,7 @@ Uploader: - + Opplaster: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 13 @@ -736,7 +736,7 @@ File size: - + Filstørrelse: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 17 @@ -745,7 +745,7 @@ Path: - + Sti: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 21 @@ -754,7 +754,7 @@ Upload Date: - + Opplastingsdato: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 25 @@ -763,7 +763,7 @@ Category: - + Kategori: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 29 @@ -772,7 +772,7 @@ Modify youtube-dl args - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -781,7 +781,7 @@ Simulated new args - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -790,7 +790,7 @@ Add an arg - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -799,7 +799,7 @@ Search by category - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -808,7 +808,7 @@ Use arg value - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -817,7 +817,7 @@ Add arg - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -826,7 +826,7 @@ Modify - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -835,7 +835,7 @@ Arg value - + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -844,7 +844,7 @@ Updater - + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 @@ -853,7 +853,7 @@ Register a user - + Registrer en bruker src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -862,7 +862,7 @@ User name - + Brukernavn src/app/dialogs/add-user-dialog/add-user-dialog.component.html 6 @@ -871,7 +871,7 @@ Register - + src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -884,7 +884,7 @@ Upload new cookies - + Last opp nye kaker src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -893,7 +893,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -902,7 +902,7 @@ Drag and Drop - + Dra og slipp src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 11 @@ -911,7 +911,7 @@ Modify playlist - + Endre spilleliste src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -920,7 +920,7 @@ Save - + Lagre src/app/dialogs/modify-playlist/modify-playlist.component.html 43 @@ -945,7 +945,7 @@ Randomize order when playing - + src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -954,7 +954,7 @@ Add content - + Legg til innhold src/app/dialogs/modify-playlist/modify-playlist.component.html 24 @@ -962,8 +962,8 @@ Add content - Normal order  - + Normal order + Normal rekkefølge src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -971,8 +971,8 @@ Normal order - Reverse order  - + Reverse order + Omvendt rekkefølge src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -981,7 +981,7 @@ My videos - + Mine videoer src/app/components/recent-videos/recent-videos.component.html 20 @@ -990,7 +990,7 @@ Search - + Søk src/app/components/recent-videos/recent-videos.component.html 24 @@ -1007,7 +1007,7 @@ No videos found. - + Fant ingen videoer. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1016,7 +1016,7 @@ Editing - + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1025,7 +1025,7 @@ Paused - + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1034,7 +1034,7 @@ Editing category - + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1043,7 +1043,7 @@ Rules - + Regler src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 10 @@ -1052,7 +1052,7 @@ Add new rule - + Legg til ny regel src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1061,7 +1061,7 @@ Download Twitch Chat - + src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1070,7 +1070,7 @@ Edit - + Rediger src/app/file-card/file-card.component.html 19 @@ -1083,7 +1083,7 @@ Delete - + Slett src/app/file-card/file-card.component.html 20 @@ -1104,7 +1104,7 @@ Info - + Info src/app/file-card/file-card.component.html 24 @@ -1121,7 +1121,7 @@ Count: - + Antall: src/app/file-card/file-card.component.html 8 @@ -1130,7 +1130,7 @@ Delete and blacklist - + Slett og svartelist src/app/file-card/file-card.component.html 26 @@ -1143,7 +1143,7 @@ views - + visninger src/app/player/player.component.html 15 @@ -1152,7 +1152,7 @@ The download was successful - + Nedlastet src/app/download-item/download-item.component.html 8 @@ -1165,7 +1165,7 @@ An error has occurred - + src/app/download-item/download-item.component.html 9 @@ -1178,7 +1178,7 @@ Details - + Detaljer src/app/download-item/download-item.component.html 18 @@ -1187,7 +1187,7 @@ An error has occurred: - + src/app/download-item/download-item.component.html 27 @@ -1196,7 +1196,7 @@ Download start: - + Nedlastingsstart: src/app/download-item/download-item.component.html 32 @@ -1205,7 +1205,7 @@ Download end: - + Nedlastingsslutt: src/app/download-item/download-item.component.html 35 @@ -1214,7 +1214,7 @@ File path(s): - + Filsti(er): src/app/download-item/download-item.component.html 38 @@ -1223,7 +1223,7 @@ Your subscriptions - + Dine abonnementer src/app/subscriptions/subscriptions.component.html 3 @@ -1232,7 +1232,7 @@ Channels - + Kanaler src/app/subscriptions/subscriptions.component.html 8 @@ -1241,7 +1241,7 @@ Playlists - + Spillelister src/app/subscriptions/subscriptions.component.html 27 @@ -1250,7 +1250,7 @@ Name not available. Channel retrieval in progress. - + src/app/subscriptions/subscriptions.component.html 14 @@ -1259,7 +1259,7 @@ You have no channel subscriptions. - + Du har ingen kanalabonnementer. src/app/subscriptions/subscriptions.component.html 24 @@ -1268,7 +1268,7 @@ Name not available. Playlist retrieval in progress. - + Navn er ikke tilgjengelig. Spillelistemottak underveis … src/app/subscriptions/subscriptions.component.html 33 @@ -1277,7 +1277,7 @@ You have no playlist subscriptions. - + Du har ingen spillelisteabonnementer. src/app/subscriptions/subscriptions.component.html 43 @@ -1286,7 +1286,7 @@ Main - + src/app/settings/settings.component.html 12 @@ -1295,7 +1295,7 @@ Downloader - + Nedlaster src/app/settings/settings.component.html 102 @@ -1304,7 +1304,7 @@ Extra - + Ekstra src/app/settings/settings.component.html 185 @@ -1313,7 +1313,7 @@ Database - + Database src/app/settings/settings.component.html 284 @@ -1322,7 +1322,7 @@ Advanced - + Avansert src/app/settings/settings.component.html 320 @@ -1331,7 +1331,7 @@ Users - + Brukere src/app/settings/settings.component.html 403 @@ -1344,7 +1344,7 @@ Logs - + Logger src/app/settings/settings.component.html 451 @@ -1357,7 +1357,7 @@ {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - + src/app/settings/settings.component.html 467 @@ -1366,7 +1366,7 @@ URL this app will be accessed from, without the port. - + src/app/settings/settings.component.html 19 @@ -1375,7 +1375,7 @@ Port - + Port src/app/settings/settings.component.html 24 @@ -1384,7 +1384,7 @@ The desired port. Default is 17442. - + Foretrukket port. Forvalget er 17442. src/app/settings/settings.component.html 25 @@ -1393,7 +1393,7 @@ Multi-user mode - + Multibrukermodus src/app/settings/settings.component.html 34 @@ -1402,7 +1402,7 @@ Users base path - + src/app/settings/settings.component.html 38 @@ -1411,7 +1411,7 @@ Base path for users and their downloaded videos. - + src/app/settings/settings.component.html 39 @@ -1420,7 +1420,7 @@ Allow subscriptions - + Tillat abonnementer src/app/settings/settings.component.html 48 @@ -1429,7 +1429,7 @@ Subscriptions base path - + src/app/settings/settings.component.html 52 @@ -1438,7 +1438,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - + src/app/settings/settings.component.html 53 @@ -1447,7 +1447,7 @@ Check interval - + src/app/settings/settings.component.html 58 @@ -1456,7 +1456,7 @@ Unit is seconds, only include numbers. - + src/app/settings/settings.component.html 59 @@ -1465,7 +1465,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - + src/app/settings/settings.component.html 63 @@ -1474,7 +1474,7 @@ Redownload fresh uploads - + src/app/settings/settings.component.html 63 @@ -1483,7 +1483,7 @@ Theme - + src/app/settings/settings.component.html 72 @@ -1492,7 +1492,7 @@ Default - + Forvalg src/app/settings/settings.component.html 74 @@ -1501,7 +1501,7 @@ Allow theme change - + Tillat draktendring src/app/settings/settings.component.html 80 @@ -1510,7 +1510,7 @@ Language - + Språk src/app/settings/settings.component.html 89 @@ -1519,7 +1519,7 @@ Audio folder path - + Lydmappesti src/app/settings/settings.component.html 109 @@ -1528,7 +1528,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - + src/app/settings/settings.component.html 110 @@ -1537,7 +1537,7 @@ Video folder path - + Videomappesti src/app/settings/settings.component.html 116 @@ -1546,7 +1546,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - + src/app/settings/settings.component.html 117 @@ -1555,7 +1555,7 @@ Default file output - + src/app/settings/settings.component.html 123 @@ -1564,7 +1564,7 @@ Path is relative to the above download paths. Don't include extension. - + src/app/settings/settings.component.html 126 @@ -1573,7 +1573,7 @@ Global custom args - + src/app/settings/settings.component.html 133 @@ -1582,7 +1582,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - + src/app/settings/settings.component.html 134 @@ -1591,7 +1591,7 @@ Categories - + src/app/settings/settings.component.html 144 @@ -1600,7 +1600,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - + src/app/settings/settings.component.html 158 @@ -1609,7 +1609,7 @@ Allow playlist categorization - + Tillat spillelistekategorisering src/app/settings/settings.component.html 158 @@ -1618,7 +1618,7 @@ Use youtube-dl archive - + src/app/settings/settings.component.html 166 @@ -1627,7 +1627,7 @@ Include thumbnail - + Inkluder miniatyrbilde src/app/settings/settings.component.html 170 @@ -1636,7 +1636,7 @@ Include metadata - + Inkluder metadata src/app/settings/settings.component.html 174 @@ -1645,7 +1645,7 @@ Kill all downloads - + src/app/settings/settings.component.html 178 @@ -1654,7 +1654,7 @@ Top title - + Topptittel src/app/settings/settings.component.html 191 @@ -1663,7 +1663,7 @@ File manager enabled - + src/app/settings/settings.component.html 196 @@ -1672,7 +1672,7 @@ Downloads manager enabled - + src/app/settings/settings.component.html 199 @@ -1681,7 +1681,7 @@ Allow quality select - + Tillat valg av kvalitet src/app/settings/settings.component.html 202 @@ -1690,7 +1690,7 @@ Download only mode - + src/app/settings/settings.component.html 205 @@ -1699,7 +1699,7 @@ Allow multi-download mode - + src/app/settings/settings.component.html 208 @@ -1708,7 +1708,7 @@ Enable Public API - + src/app/settings/settings.component.html 216 @@ -1717,7 +1717,7 @@ Public API Key - + src/app/settings/settings.component.html 221 @@ -1726,7 +1726,7 @@ View documentation - + Vis dokumentasjon src/app/settings/settings.component.html 222 @@ -1735,7 +1735,7 @@ This will delete your old API key! - + src/app/settings/settings.component.html 226 @@ -1744,7 +1744,7 @@ Generate - + Generer src/app/settings/settings.component.html 226 @@ -1753,7 +1753,7 @@ Use YouTube API - + Bruk YouTube-API src/app/settings/settings.component.html 235 @@ -1762,7 +1762,7 @@ Youtube API Key - + API-nøkkel for YouTube src/app/settings/settings.component.html 239 @@ -1771,7 +1771,7 @@ Generating a key is easy! - + src/app/settings/settings.component.html 240 @@ -1784,7 +1784,7 @@ Use Twitch API - + Bruk Twitch-API src/app/settings/settings.component.html 244 @@ -1793,7 +1793,7 @@ Twitch API Key - + API-nøkkel for Twitch src/app/settings/settings.component.html 251 @@ -1802,7 +1802,7 @@ Also known as a Client ID. - + src/app/settings/settings.component.html 252 @@ -1811,7 +1811,7 @@ Auto-download Twitch Chat - + src/app/settings/settings.component.html 247 @@ -1820,7 +1820,7 @@ Click here - + Klikk her src/app/settings/settings.component.html 262 @@ -1837,7 +1837,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - + src/app/settings/settings.component.html 262 @@ -1846,7 +1846,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - + src/app/settings/settings.component.html 263 @@ -1855,7 +1855,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - + src/app/settings/settings.component.html 268 @@ -1864,7 +1864,7 @@ Detailed setup instructions. - + src/app/settings/settings.component.html 269 @@ -1873,7 +1873,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - + src/app/settings/settings.component.html 269 @@ -1882,7 +1882,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - + src/app/settings/settings.component.html 274 @@ -1891,7 +1891,7 @@ Generate 'audio only' bookmarklet - + src/app/settings/settings.component.html 275 @@ -1900,7 +1900,7 @@ Database location: - + src/app/settings/settings.component.html 290 @@ -1909,7 +1909,7 @@ Records per table - + src/app/settings/settings.component.html 291 @@ -1918,7 +1918,7 @@ MongoDB Connection String - + src/app/settings/settings.component.html 299 @@ -1927,7 +1927,7 @@ Example: - + src/app/settings/settings.component.html 300 @@ -1936,7 +1936,7 @@ Test connection string - + src/app/settings/settings.component.html 304 @@ -1945,7 +1945,7 @@ Transfer DB to - + src/app/settings/settings.component.html 308 @@ -1954,7 +1954,7 @@ Database information could not be retrieved. Check the server logs for more information. - + src/app/settings/settings.component.html 312 @@ -1963,7 +1963,7 @@ Select a downloader - + src/app/settings/settings.component.html 326 @@ -1972,7 +1972,7 @@ Use default downloading agent - + src/app/settings/settings.component.html 335 @@ -1981,7 +1981,7 @@ Select a download agent - + src/app/settings/settings.component.html 339 @@ -1990,7 +1990,7 @@ Log Level - + src/app/settings/settings.component.html 353 @@ -1999,7 +1999,7 @@ Login expiration - + src/app/settings/settings.component.html 365 @@ -2008,7 +2008,7 @@ Allow advanced download - + src/app/settings/settings.component.html 376 @@ -2017,7 +2017,7 @@ Use Cookies - + Bruk kaker src/app/settings/settings.component.html 384 @@ -2026,7 +2026,7 @@ Set Cookies - + src/app/settings/settings.component.html 385 @@ -2035,7 +2035,7 @@ Restart server - + Utfør omstart av tjener src/app/settings/settings.component.html 397 @@ -2044,7 +2044,7 @@ Allow user registration - + Tillat brukerregistrering src/app/settings/settings.component.html 407 @@ -2053,7 +2053,7 @@ Auth method - + src/app/settings/settings.component.html 411 @@ -2062,7 +2062,7 @@ Internal - + src/app/settings/settings.component.html 413 @@ -2071,7 +2071,7 @@ LDAP - + LDAP src/app/settings/settings.component.html 416 @@ -2080,7 +2080,7 @@ LDAP URL - + LDAP-nettadresse src/app/settings/settings.component.html 423 @@ -2089,7 +2089,7 @@ Bind DN - + src/app/settings/settings.component.html 428 @@ -2098,7 +2098,7 @@ Bind Credentials - + src/app/settings/settings.component.html 433 @@ -2107,7 +2107,7 @@ Search Base - + src/app/settings/settings.component.html 438 @@ -2116,7 +2116,7 @@ Search Filter - + src/app/settings/settings.component.html 443 @@ -2125,7 +2125,7 @@ About YoutubeDL-Material - + Om mateirell YouTube-DL src/app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2134,7 +2134,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - + src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2143,7 +2143,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - + src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2152,7 +2152,7 @@ Installed version: - + src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2161,7 +2161,7 @@ Found a bug or have a suggestion? - + src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2170,7 +2170,7 @@ to create an issue! - + src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2179,7 +2179,7 @@ Checking for updates... - + src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2188,7 +2188,7 @@ Update available - + src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2197,7 +2197,7 @@ You can update from the settings menu. - + src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2206,7 +2206,7 @@ Select a version: - + src/app/updater/updater.component.html 3 @@ -2215,7 +2215,7 @@ Enable sharing - + src/app/dialogs/share-media-dialog/share-media-dialog.component.html 9 @@ -2224,7 +2224,7 @@ Use timestamp - + Bruk tidsstempel src/app/dialogs/share-media-dialog/share-media-dialog.component.html 12 @@ -2233,7 +2233,7 @@ Seconds - + Sekunder src/app/dialogs/share-media-dialog/share-media-dialog.component.html 14 @@ -2242,7 +2242,7 @@ Copy to clipboard - + Kopier til utklippstavle src/app/dialogs/share-media-dialog/share-media-dialog.component.html 23 @@ -2251,7 +2251,7 @@ Share playlist - + Del spilleliste src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2260,7 +2260,7 @@ Share file - + Del fil src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2269,7 +2269,7 @@ Session ID: - + Økts-ID: src/app/components/downloads/downloads.component.html 5 @@ -2278,7 +2278,7 @@ Clear all downloads - + Tøm alle nedlastninger src/app/components/downloads/downloads.component.html 18 @@ -2287,7 +2287,7 @@ (current) - + (nåværende) src/app/components/downloads/downloads.component.html 6 @@ -2296,7 +2296,7 @@ No downloads available! - + src/app/components/downloads/downloads.component.html 25 @@ -2305,7 +2305,7 @@ Your Profile - + Din profil src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2314,7 +2314,7 @@ Logout - + Logg ut src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2323,7 +2323,7 @@ UID: - + UID: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 9 @@ -2332,7 +2332,7 @@ Created: - + Opprettet: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 12 @@ -2341,7 +2341,7 @@ You are not logged in. - + Du er ikke innlogget. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2350,7 +2350,7 @@ Create admin account - + Opprett administratorkonto src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2359,7 +2359,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2368,7 +2368,7 @@ Create - + Opprett src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2377,7 +2377,7 @@ Add Users - + Legg til brukere src/app/components/modify-users/modify-users.component.html 90 @@ -2386,7 +2386,7 @@ Edit Role - + Rediger rolle src/app/components/modify-users/modify-users.component.html 95 @@ -2394,8 +2394,8 @@ Edit role - User name - + User name + Brukernavn src/app/components/modify-users/modify-users.component.html 17 @@ -2403,8 +2403,8 @@ Username users table header - Role - + Role + Rolle src/app/components/modify-users/modify-users.component.html 35 @@ -2412,8 +2412,8 @@ Role users table header - Actions - + Actions + Handlinger src/app/components/modify-users/modify-users.component.html 55 @@ -2422,7 +2422,7 @@ Manage user - + Håndter bruker src/app/components/modify-users/modify-users.component.html 70 @@ -2435,7 +2435,7 @@ Delete user - + Slett bruker src/app/components/modify-users/modify-users.component.html 73 @@ -2444,7 +2444,7 @@ Edit user - + Rediger bruker src/app/components/modify-users/modify-users.component.html 66 @@ -2453,7 +2453,7 @@ User UID: - + Bruker-UID: src/app/components/manage-user/manage-user.component.html 4 @@ -2462,7 +2462,7 @@ New password - + Nytt passord src/app/components/manage-user/manage-user.component.html 8 @@ -2471,7 +2471,7 @@ Set new password - + Sett nytt passord src/app/components/manage-user/manage-user.component.html 10 @@ -2480,7 +2480,7 @@ Use role default - + src/app/components/manage-user/manage-user.component.html 19 @@ -2489,7 +2489,7 @@ Yes - + Ja src/app/components/manage-user/manage-user.component.html 20 @@ -2502,7 +2502,7 @@ No - + Nei src/app/components/manage-user/manage-user.component.html 21 @@ -2515,7 +2515,7 @@ Manage role - + Håndter rolle src/app/components/manage-role/manage-role.component.html 1 @@ -2524,7 +2524,7 @@ Lines: - + Linjer: src/app/components/logs-viewer/logs-viewer.component.html 22 @@ -2533,7 +2533,7 @@ Clear logs - + Tøm logger src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2542,7 +2542,7 @@ Auto-generated - + Auto-generert src/app/components/unified-file-card/unified-file-card.component.html 5 @@ -2551,7 +2551,7 @@ Open file - + Åpne fil src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2560,7 +2560,7 @@ Open file in new tab - + Åpne fil i ny fane src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2569,7 +2569,7 @@ Go to subscription - + Gå til abonnement src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2578,7 +2578,7 @@ Delete and redownload - + Slett og last ned igjen src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2591,7 +2591,7 @@ Delete forever - + Slett for godt src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2603,8 +2603,8 @@ Delete forever subscription video button - See more. - + See more. + Vis mer. src/app/components/see-more/see-more.component.html 5,6 @@ -2612,8 +2612,8 @@ See more - See less. - + See less. + Vis mindre. src/app/components/see-more/see-more.component.html 8,9 @@ -2622,7 +2622,7 @@ Length: - + Lengde: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 From 70cc611dfe8c68661e2cec0a48f18365c7111372 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 17 Sep 2021 04:42:37 +0200 Subject: [PATCH 028/212] Added translation using Weblate (Korean) --- src/assets/i18n/messages.ko.xlf | 2634 +++++++++++++++++++++++++++++++ 1 file changed, 2634 insertions(+) create mode 100644 src/assets/i18n/messages.ko.xlf diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf new file mode 100644 index 0000000..ae35068 --- /dev/null +++ b/src/assets/i18n/messages.ko.xlf @@ -0,0 +1,2634 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From d545926821851754389b410bdf6cadd3e3998f80 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 17 Sep 2021 05:46:06 +0000 Subject: [PATCH 029/212] Translated using Weblate (Korean) Currently translated at 100.0% (259 of 259 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ko/ --- src/assets/i18n/messages.ko.xlf | 560 ++++++++++++++++---------------- 1 file changed, 280 insertions(+), 280 deletions(-) diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf index ae35068..3746351 100644 --- a/src/assets/i18n/messages.ko.xlf +++ b/src/assets/i18n/messages.ko.xlf @@ -4,7 +4,7 @@ About - + 대하여 src/app/app.component.html 32 @@ -13,7 +13,7 @@ Profile - + 프로필 src/app/app.component.html 19 @@ -22,7 +22,7 @@ Dark - + 다크 src/app/app.component.html 23 @@ -35,7 +35,7 @@ Settings - + 설정 src/app/app.component.html 28 @@ -48,7 +48,7 @@ Home - + src/app/app.component.html 43 @@ -57,7 +57,7 @@ Login - + 로그인 src/app/app.component.html 44 @@ -74,7 +74,7 @@ Subscriptions - + 구독 src/app/app.component.html 45 @@ -83,7 +83,7 @@ Downloads - + 다운로드 src/app/app.component.html 46 @@ -91,8 +91,8 @@ Navigation menu Downloads Page title - Only Audio - + Only Audio + 오디오만 src/app/main/main.component.html 65,66 @@ -100,8 +100,8 @@ Only Audio checkbox - Download - + Download + 다운로드 src/app/main/main.component.html 79,80 @@ -109,8 +109,8 @@ Main download button - Quality - + Quality + 품질 src/app/main/main.component.html 19,20 @@ -119,7 +119,7 @@ Use URL - + URL 이용 src/app/main/main.component.html 51 @@ -127,8 +127,8 @@ YT search Use URL button for searched video - View - + View + 보기 src/app/main/main.component.html 55,56 @@ -136,8 +136,8 @@ YT search View button for searched video - Multi-download Mode - + Multi-download Mode + 복수 다운로드 모드 src/app/main/main.component.html 70,71 @@ -145,8 +145,8 @@ Multi-download Mode checkbox - Cancel - + Cancel + 취소 src/app/main/main.component.html 84,85 @@ -154,8 +154,8 @@ Cancel download button - Advanced - + Advanced + 고급 src/app/main/main.component.html 96,97 @@ -163,8 +163,8 @@ Advanced download mode panel - Use custom args - + Use custom args + 사용자 지정 인수 이용 src/app/main/main.component.html 110,111 @@ -173,7 +173,7 @@ Custom args - + 사용자 지정 인수 src/app/main/main.component.html 115 @@ -189,8 +189,8 @@ Custom args placeholder - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + URL을 포함할 필요가 없습니다. 이후의 모든 항목만 포함하면 됩니다. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, src/app/main/main.component.html 118,119 @@ -198,8 +198,8 @@ Custom Args input hint - Use custom output - + Use custom output + 사용자 지정 출력 사용 src/app/main/main.component.html 126,127 @@ -208,7 +208,7 @@ Custom output - + 사용자 지정 출력 src/app/main/main.component.html 130 @@ -217,7 +217,7 @@ Documentation - + 문서 src/app/main/main.component.html 132 @@ -242,7 +242,7 @@ Path is relative to the config download path. Don't include extension. - + 경로는 설정된 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. src/app/main/main.component.html 133 @@ -262,8 +262,8 @@ Custom Output input hint - Crop file - + Crop file + 파일 자르기 src/app/main/main.component.html 155,156 @@ -272,7 +272,7 @@ Crop from (seconds) - + 자르기 시작지점 (초) src/app/main/main.component.html 159 @@ -281,7 +281,7 @@ Crop to (seconds) - + 자르기 마무리지점 (초) src/app/main/main.component.html 164 @@ -289,8 +289,8 @@ Crop to placeholder - Simulated command: - + Simulated command: + 시뮬레이션된 명령: src/app/main/main.component.html 102,103 @@ -298,8 +298,8 @@ Simulated command label - Use authentication - + Use authentication + 인증 사용 src/app/main/main.component.html 140,141 @@ -308,7 +308,7 @@ Username - + 아이디 src/app/main/main.component.html 144 @@ -317,7 +317,7 @@ Password - + 비밀번호 src/app/main/main.component.html 149 @@ -334,7 +334,7 @@ Create a playlist - + 재생목록 만들기 src/app/create-playlist/create-playlist.component.html 1 @@ -343,7 +343,7 @@ Name - + 제목 src/app/create-playlist/create-playlist.component.html 6 @@ -360,7 +360,7 @@ Type - + 종류 src/app/create-playlist/create-playlist.component.html 11 @@ -369,7 +369,7 @@ Audio - + 오디오 src/app/create-playlist/create-playlist.component.html 12 @@ -378,7 +378,7 @@ Video - + 동영상 src/app/create-playlist/create-playlist.component.html 13 @@ -387,7 +387,7 @@ Audio files - + 오디오 파일 src/app/create-playlist/create-playlist.component.html 19 @@ -396,7 +396,7 @@ Videos - + 동영상 src/app/create-playlist/create-playlist.component.html 20 @@ -409,7 +409,7 @@ Subscribe to playlist or channel - + 재생목록이나 채널 구독 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -418,7 +418,7 @@ URL - + URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 8 @@ -431,7 +431,7 @@ The playlist or channel URL - + 재생목록이나 채널 URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -440,7 +440,7 @@ Custom name - + 사용자 지정 이름 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -449,7 +449,7 @@ Download all uploads - + 모든 업로드 된 파일 다운로드 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -462,7 +462,7 @@ Max quality - + 최고 화질 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 40 @@ -475,7 +475,7 @@ Audio-only mode - + 오디오 전용 모드 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -488,7 +488,7 @@ Streaming-only mode - + 스트리밍 전용 모드 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -501,7 +501,7 @@ These are added after the standard args. - + 이것들은 일반적인 인수 뒤에 추가됩니다. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -514,7 +514,7 @@ Custom file output - + 사용자 지정 파일 출력 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -531,7 +531,7 @@ Cancel - + 취소 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -556,7 +556,7 @@ Subscribe - + 구독 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -565,7 +565,7 @@ Download videos uploaded in the last - + 마지막으로 업로드된 동영상 다운로드 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -578,7 +578,7 @@ Type: - + 종류: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 5 @@ -587,7 +587,7 @@ URL: - + URL: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 9 @@ -600,7 +600,7 @@ ID: - + 아이디: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -617,7 +617,7 @@ Close - + 닫기 src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -662,7 +662,7 @@ Export Archive - + 아카이브 내보내기 src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -671,7 +671,7 @@ Unsubscribe - + 구독 취소 src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -680,7 +680,7 @@ (Paused) - + (일시정지) src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -705,7 +705,7 @@ Archive: - + 아카이브: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -714,7 +714,7 @@ Name: - + 제목: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 5 @@ -727,7 +727,7 @@ Uploader: - + 업로더: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 13 @@ -736,7 +736,7 @@ File size: - + 파일 크기: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 17 @@ -745,7 +745,7 @@ Path: - + 경로: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 21 @@ -754,7 +754,7 @@ Upload Date: - + 업로드 날짜: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 25 @@ -763,7 +763,7 @@ Category: - + 카테고리: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 29 @@ -772,7 +772,7 @@ Modify youtube-dl args - + Youtube-dl 인수 수정 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -781,7 +781,7 @@ Simulated new args - + 시뮬레이션된 새 인수 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -790,7 +790,7 @@ Add an arg - + 인수 추가 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -799,7 +799,7 @@ Search by category - + 카테고리로 찾기 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -808,7 +808,7 @@ Use arg value - + 인수 값 이용 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -817,7 +817,7 @@ Add arg - + 인수 추가 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -826,7 +826,7 @@ Modify - + 수정 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -835,7 +835,7 @@ Arg value - + 인수 값 src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -844,7 +844,7 @@ Updater - + 업데이터 src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 @@ -853,7 +853,7 @@ Register a user - + 사용자 등록 src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -862,7 +862,7 @@ User name - + 아이디 src/app/dialogs/add-user-dialog/add-user-dialog.component.html 6 @@ -871,7 +871,7 @@ Register - + 등록 src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -884,7 +884,7 @@ Upload new cookies - + 새 쿠키 업로드 src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -893,7 +893,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - + 참고: 새로운 쿠키를 추가하면 이전 쿠키를 덮어씁니다. 또한 쿠키는 사용자 개인이 아닌 전체에 적용됩니다. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -902,7 +902,7 @@ Drag and Drop - + 드래그 앤 드롭 src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 11 @@ -911,7 +911,7 @@ Modify playlist - + 재생목록 수정 src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -920,7 +920,7 @@ Save - + 저장 src/app/dialogs/modify-playlist/modify-playlist.component.html 43 @@ -945,7 +945,7 @@ Randomize order when playing - + 재생할 때 재생목록 섞기 src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -954,7 +954,7 @@ Add content - + 콘텐츠 추가 src/app/dialogs/modify-playlist/modify-playlist.component.html 24 @@ -962,8 +962,8 @@ Add content - Normal order  - + Normal order + 기본 순서 src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -971,8 +971,8 @@ Normal order - Reverse order  - + Reverse order + 순서 거꾸로 src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -981,7 +981,7 @@ My videos - + 내 동영상 src/app/components/recent-videos/recent-videos.component.html 20 @@ -990,7 +990,7 @@ Search - + 검색 src/app/components/recent-videos/recent-videos.component.html 24 @@ -1007,7 +1007,7 @@ No videos found. - + 동영상 없음. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1016,7 +1016,7 @@ Editing - + 수정중 src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1025,7 +1025,7 @@ Paused - + 일시정지됨 src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1034,7 +1034,7 @@ Editing category - + 카테고리 수정중 src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1043,7 +1043,7 @@ Rules - + 규칙 src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 10 @@ -1052,7 +1052,7 @@ Add new rule - + 새로운 규칙 추가 src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1061,7 +1061,7 @@ Download Twitch Chat - + 트위치 채팅 다운로드 src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1070,7 +1070,7 @@ Edit - + 수정 src/app/file-card/file-card.component.html 19 @@ -1083,7 +1083,7 @@ Delete - + 삭제 src/app/file-card/file-card.component.html 20 @@ -1104,7 +1104,7 @@ Info - + 정보 src/app/file-card/file-card.component.html 24 @@ -1121,7 +1121,7 @@ Count: - + 동영상 수: src/app/file-card/file-card.component.html 8 @@ -1130,7 +1130,7 @@ Delete and blacklist - + 삭제하고 블랙리스트 추가 src/app/file-card/file-card.component.html 26 @@ -1143,7 +1143,7 @@ views - + 조회수 src/app/player/player.component.html 15 @@ -1152,7 +1152,7 @@ The download was successful - + 성공적으로 다운로드 완료 src/app/download-item/download-item.component.html 8 @@ -1165,7 +1165,7 @@ An error has occurred - + 에러 발생 src/app/download-item/download-item.component.html 9 @@ -1178,7 +1178,7 @@ Details - + 세부사항 src/app/download-item/download-item.component.html 18 @@ -1187,7 +1187,7 @@ An error has occurred: - + 에러 발생: src/app/download-item/download-item.component.html 27 @@ -1196,7 +1196,7 @@ Download start: - + 다운로드 시작: src/app/download-item/download-item.component.html 32 @@ -1205,7 +1205,7 @@ Download end: - + 다운로드 끝: src/app/download-item/download-item.component.html 35 @@ -1214,7 +1214,7 @@ File path(s): - + 파일 경로(들): src/app/download-item/download-item.component.html 38 @@ -1223,7 +1223,7 @@ Your subscriptions - + 구독중 src/app/subscriptions/subscriptions.component.html 3 @@ -1232,7 +1232,7 @@ Channels - + 채널 src/app/subscriptions/subscriptions.component.html 8 @@ -1241,7 +1241,7 @@ Playlists - + 재생목록 src/app/subscriptions/subscriptions.component.html 27 @@ -1250,7 +1250,7 @@ Name not available. Channel retrieval in progress. - + 이름이 유효하지 않음. 채널 검색중. src/app/subscriptions/subscriptions.component.html 14 @@ -1259,7 +1259,7 @@ You have no channel subscriptions. - + 구독중인 채널이 없습니다. src/app/subscriptions/subscriptions.component.html 24 @@ -1268,7 +1268,7 @@ Name not available. Playlist retrieval in progress. - + 이름이 유효하지 않음. 플레이리스트 검색중. src/app/subscriptions/subscriptions.component.html 33 @@ -1277,7 +1277,7 @@ You have no playlist subscriptions. - + 구독중인 재생목록이 없습니다. src/app/subscriptions/subscriptions.component.html 43 @@ -1286,7 +1286,7 @@ Main - + 메인 src/app/settings/settings.component.html 12 @@ -1295,7 +1295,7 @@ Downloader - + 다운로더 src/app/settings/settings.component.html 102 @@ -1304,7 +1304,7 @@ Extra - + 추가 src/app/settings/settings.component.html 185 @@ -1313,7 +1313,7 @@ Database - + 데이터베이스 src/app/settings/settings.component.html 284 @@ -1322,7 +1322,7 @@ Advanced - + 고급 src/app/settings/settings.component.html 320 @@ -1331,7 +1331,7 @@ Users - + 사용자 src/app/settings/settings.component.html 403 @@ -1344,7 +1344,7 @@ Logs - + 로그 src/app/settings/settings.component.html 451 @@ -1357,7 +1357,7 @@ {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - + {VAR_SELECT, select, true {닫다} false {취소} other {기타}} src/app/settings/settings.component.html 467 @@ -1366,7 +1366,7 @@ URL this app will be accessed from, without the port. - + 포트를 제외한 이 앱에 접속할 URL. src/app/settings/settings.component.html 19 @@ -1375,7 +1375,7 @@ Port - + 포트 src/app/settings/settings.component.html 24 @@ -1384,7 +1384,7 @@ The desired port. Default is 17442. - + 포트 설정. 기본 포트는 17442 입니다. src/app/settings/settings.component.html 25 @@ -1393,7 +1393,7 @@ Multi-user mode - + 복수 사용자 모드 src/app/settings/settings.component.html 34 @@ -1402,7 +1402,7 @@ Users base path - + 사용자 기본 경로 src/app/settings/settings.component.html 38 @@ -1411,7 +1411,7 @@ Base path for users and their downloaded videos. - + 사용자와 그들의 동영상 다운로드를 위한 기본 경로. src/app/settings/settings.component.html 39 @@ -1420,7 +1420,7 @@ Allow subscriptions - + 구독 허용 src/app/settings/settings.component.html 48 @@ -1429,7 +1429,7 @@ Subscriptions base path - + 구독 기본 경로 src/app/settings/settings.component.html 52 @@ -1438,7 +1438,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - + 구독된 채널과 재생목록에서 나온 영상들을 위한 기본 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. src/app/settings/settings.component.html 53 @@ -1447,7 +1447,7 @@ Check interval - + 확인 간격 src/app/settings/settings.component.html 58 @@ -1456,7 +1456,7 @@ Unit is seconds, only include numbers. - + 단위는 초이며, 숫자만 넣으세요. src/app/settings/settings.component.html 59 @@ -1465,7 +1465,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - + 가끔 새 동영상이 최고 화질 처리 전에 다운로드 될 때가 있습니다. 이 설정은 새 동영상이 더 높은 화질의 버전이 있는지 다음 날짜에 확인됨을 의미합니다. src/app/settings/settings.component.html 63 @@ -1474,7 +1474,7 @@ Redownload fresh uploads - + 높은 화질 재다운로드 src/app/settings/settings.component.html 63 @@ -1483,7 +1483,7 @@ Theme - + 테마 src/app/settings/settings.component.html 72 @@ -1492,7 +1492,7 @@ Default - + 기본 src/app/settings/settings.component.html 74 @@ -1501,7 +1501,7 @@ Allow theme change - + 테마 변경 허용 src/app/settings/settings.component.html 80 @@ -1510,7 +1510,7 @@ Language - + 언어 src/app/settings/settings.component.html 89 @@ -1519,7 +1519,7 @@ Audio folder path - + 오디오 폴더 경로 src/app/settings/settings.component.html 109 @@ -1528,7 +1528,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - + 오디오 전용 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. src/app/settings/settings.component.html 110 @@ -1537,7 +1537,7 @@ Video folder path - + 동영상 폴더 경로 src/app/settings/settings.component.html 116 @@ -1546,7 +1546,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - + 동영상 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. src/app/settings/settings.component.html 117 @@ -1555,7 +1555,7 @@ Default file output - + 기본 파일 출력 src/app/settings/settings.component.html 123 @@ -1564,7 +1564,7 @@ Path is relative to the above download paths. Don't include extension. - + 경로는 위의 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. src/app/settings/settings.component.html 126 @@ -1573,7 +1573,7 @@ Global custom args - + 전반적으로 적용될 사용자 지정 인수 src/app/settings/settings.component.html 133 @@ -1582,7 +1582,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - + 홈페이지에서의 다운로드에 대해 전반적으로 적용될 사용자 지정 인수. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, src/app/settings/settings.component.html 134 @@ -1591,7 +1591,7 @@ Categories - + 카테고리 src/app/settings/settings.component.html 144 @@ -1600,7 +1600,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - + 이 설정을 사용하면, 하나의 동영상이 카테고리와 일치할 경우, 전체 재생목록에 해당 카테고리가 표시됩니다. src/app/settings/settings.component.html 158 @@ -1609,7 +1609,7 @@ Allow playlist categorization - + 재생목록 카테고리화 허용 src/app/settings/settings.component.html 158 @@ -1618,7 +1618,7 @@ Use youtube-dl archive - + Youtube-dl 아카이브 사용 src/app/settings/settings.component.html 166 @@ -1627,7 +1627,7 @@ Include thumbnail - + 썸네일 포함 src/app/settings/settings.component.html 170 @@ -1636,7 +1636,7 @@ Include metadata - + 메타데이터 포함 src/app/settings/settings.component.html 174 @@ -1645,7 +1645,7 @@ Kill all downloads - + 모든 다운로드 종료 src/app/settings/settings.component.html 178 @@ -1654,7 +1654,7 @@ Top title - + 상위 제목 src/app/settings/settings.component.html 191 @@ -1663,7 +1663,7 @@ File manager enabled - + 파일 매니저 설정됨 src/app/settings/settings.component.html 196 @@ -1672,7 +1672,7 @@ Downloads manager enabled - + 다운로드 매니저 설정됨 src/app/settings/settings.component.html 199 @@ -1681,7 +1681,7 @@ Allow quality select - + 화질 선택 허용 src/app/settings/settings.component.html 202 @@ -1690,7 +1690,7 @@ Download only mode - + 다운로드 전용 모드 src/app/settings/settings.component.html 205 @@ -1699,7 +1699,7 @@ Allow multi-download mode - + 복수 다운로드 모드 허용 src/app/settings/settings.component.html 208 @@ -1708,7 +1708,7 @@ Enable Public API - + 오픈 API 허용 src/app/settings/settings.component.html 216 @@ -1717,7 +1717,7 @@ Public API Key - + 오픈 API 키 src/app/settings/settings.component.html 221 @@ -1726,7 +1726,7 @@ View documentation - + 문서 보기 src/app/settings/settings.component.html 222 @@ -1735,7 +1735,7 @@ This will delete your old API key! - + 이것은 예전 API키를 지울 것입니다! src/app/settings/settings.component.html 226 @@ -1744,7 +1744,7 @@ Generate - + 생성 src/app/settings/settings.component.html 226 @@ -1753,7 +1753,7 @@ Use YouTube API - + 유튜브 API 사용 src/app/settings/settings.component.html 235 @@ -1762,7 +1762,7 @@ Youtube API Key - + 유튜브 API 키 src/app/settings/settings.component.html 239 @@ -1771,7 +1771,7 @@ Generating a key is easy! - + 키를 만드는 것은 쉽습니다! src/app/settings/settings.component.html 240 @@ -1784,7 +1784,7 @@ Use Twitch API - + 트위치 API 사용 src/app/settings/settings.component.html 244 @@ -1793,7 +1793,7 @@ Twitch API Key - + 트위치 API 키 src/app/settings/settings.component.html 251 @@ -1802,7 +1802,7 @@ Also known as a Client ID. - + 클라이언트 ID라고도 알려져 있음. src/app/settings/settings.component.html 252 @@ -1811,7 +1811,7 @@ Auto-download Twitch Chat - + 트위치 채팅 자동 다운로드 src/app/settings/settings.component.html 247 @@ -1820,7 +1820,7 @@ Click here - + 이곳을 누르세요 src/app/settings/settings.component.html 262 @@ -1837,7 +1837,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - + 공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위해. src/app/settings/settings.component.html 262 @@ -1846,7 +1846,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - + 반드시 확장 프로그램을 수동으로 실행하고 확장 프로그램 설정을 수정하여 프론트엔드 URL을 설정해야 합니다. src/app/settings/settings.component.html 263 @@ -1855,7 +1855,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - + 파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위해. src/app/settings/settings.component.html 268 @@ -1864,7 +1864,7 @@ Detailed setup instructions. - + 자세한 설정 지침. src/app/settings/settings.component.html 269 @@ -1873,7 +1873,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - + 프론트엔드 URL을 설정하기 위해 확장 프로그램 설정을 변경하는 것 외에는 필요한 것이 많지 않습니다. src/app/settings/settings.component.html 269 @@ -1882,7 +1882,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - + 아래 링크를 북마크에 끌어다 놓으시면 됩니다! 이제 그냥 다운로드하고자 하는 유튜브 비디오 페이지에서 북마크를 클릭하면 됩니다. src/app/settings/settings.component.html 274 @@ -1891,7 +1891,7 @@ Generate 'audio only' bookmarklet - + '오디오 전용' 북마크 생성 src/app/settings/settings.component.html 275 @@ -1900,7 +1900,7 @@ Database location: - + 데이터베이스 위치: src/app/settings/settings.component.html 290 @@ -1909,7 +1909,7 @@ Records per table - + 테이블당 레코드 src/app/settings/settings.component.html 291 @@ -1918,7 +1918,7 @@ MongoDB Connection String - + 몽고DB 연결 문자열 src/app/settings/settings.component.html 299 @@ -1927,7 +1927,7 @@ Example: - + 예시: src/app/settings/settings.component.html 300 @@ -1936,7 +1936,7 @@ Test connection string - + 연결 문자열 테스트 src/app/settings/settings.component.html 304 @@ -1944,8 +1944,8 @@ Test connection string button - Transfer DB to - + Transfer DB to + DB 전환 src/app/settings/settings.component.html 308 @@ -1954,7 +1954,7 @@ Database information could not be retrieved. Check the server logs for more information. - + 데이터베이스 정보를 검색할 수 없습니다. 자세한 내용은 서버 로그를 확인하세요. src/app/settings/settings.component.html 312 @@ -1963,7 +1963,7 @@ Select a downloader - + 다운로더 선택 src/app/settings/settings.component.html 326 @@ -1972,7 +1972,7 @@ Use default downloading agent - + 기본 다운로드 에이전트 사용 src/app/settings/settings.component.html 335 @@ -1981,7 +1981,7 @@ Select a download agent - + 다운로드 에이전트 선택 src/app/settings/settings.component.html 339 @@ -1990,7 +1990,7 @@ Log Level - + 로그 레벨 src/app/settings/settings.component.html 353 @@ -1999,7 +1999,7 @@ Login expiration - + 로그인 만료 src/app/settings/settings.component.html 365 @@ -2008,7 +2008,7 @@ Allow advanced download - + 고급 다운로드 허용 src/app/settings/settings.component.html 376 @@ -2017,7 +2017,7 @@ Use Cookies - + 쿠키 사용 src/app/settings/settings.component.html 384 @@ -2026,7 +2026,7 @@ Set Cookies - + 쿠키 설정 src/app/settings/settings.component.html 385 @@ -2035,7 +2035,7 @@ Restart server - + 서버 재시작 src/app/settings/settings.component.html 397 @@ -2044,7 +2044,7 @@ Allow user registration - + 사용자 등록 허용 src/app/settings/settings.component.html 407 @@ -2053,7 +2053,7 @@ Auth method - + 인증 방법 src/app/settings/settings.component.html 411 @@ -2062,7 +2062,7 @@ Internal - + 내부 src/app/settings/settings.component.html 413 @@ -2071,7 +2071,7 @@ LDAP - + LDAP src/app/settings/settings.component.html 416 @@ -2080,7 +2080,7 @@ LDAP URL - + LDAP URL src/app/settings/settings.component.html 423 @@ -2089,7 +2089,7 @@ Bind DN - + Bind DN src/app/settings/settings.component.html 428 @@ -2098,7 +2098,7 @@ Bind Credentials - + Bind Credentials src/app/settings/settings.component.html 433 @@ -2107,7 +2107,7 @@ Search Base - + 기본 검색 src/app/settings/settings.component.html 438 @@ -2116,7 +2116,7 @@ Search Filter - + 검색 필터 src/app/settings/settings.component.html 443 @@ -2125,7 +2125,7 @@ About YoutubeDL-Material - + YoutubeDL-Material에 대하여 src/app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2134,7 +2134,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - + 은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신은 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 할 수도 있습니다. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2143,7 +2143,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - + 은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 모든 지원되는 기능을 확인해보세요. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2152,7 +2152,7 @@ Installed version: - + 설치된 버전: src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2161,7 +2161,7 @@ Found a bug or have a suggestion? - + 버그를 찾았거나 제안하실 사항이 있으신가요? src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2170,7 +2170,7 @@ to create an issue! - + 이슈를 생성하기 위해! src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2179,7 +2179,7 @@ Checking for updates... - + 업데이트 확인중... src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2188,7 +2188,7 @@ Update available - + 업데이트 가능 src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2197,7 +2197,7 @@ You can update from the settings menu. - + 설정 메뉴에서 업데이트를 할 수 있습니다. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2206,7 +2206,7 @@ Select a version: - + 선택된 버전: src/app/updater/updater.component.html 3 @@ -2215,7 +2215,7 @@ Enable sharing - + 공유 허용 src/app/dialogs/share-media-dialog/share-media-dialog.component.html 9 @@ -2224,7 +2224,7 @@ Use timestamp - + 타임스탬프 사용 src/app/dialogs/share-media-dialog/share-media-dialog.component.html 12 @@ -2233,7 +2233,7 @@ Seconds - + src/app/dialogs/share-media-dialog/share-media-dialog.component.html 14 @@ -2242,7 +2242,7 @@ Copy to clipboard - + 클립보드에 복사 src/app/dialogs/share-media-dialog/share-media-dialog.component.html 23 @@ -2251,7 +2251,7 @@ Share playlist - + 재생목록 공유 src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2260,7 +2260,7 @@ Share file - + 파일 공유 src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2269,7 +2269,7 @@ Session ID: - + 세션 아이디: src/app/components/downloads/downloads.component.html 5 @@ -2278,7 +2278,7 @@ Clear all downloads - + 모든 다운로드된 항목 지우기 src/app/components/downloads/downloads.component.html 18 @@ -2287,7 +2287,7 @@ (current) - + (현재) src/app/components/downloads/downloads.component.html 6 @@ -2296,7 +2296,7 @@ No downloads available! - + 다운로드된 항목 없음! src/app/components/downloads/downloads.component.html 25 @@ -2305,7 +2305,7 @@ Your Profile - + 프로필 src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2314,7 +2314,7 @@ Logout - + 로그아웃 src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2323,7 +2323,7 @@ UID: - + UID: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 9 @@ -2332,7 +2332,7 @@ Created: - + 생성됨: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 12 @@ -2341,7 +2341,7 @@ You are not logged in. - + 로그인하지 않았습니다. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2350,7 +2350,7 @@ Create admin account - + 관리자 계정 생성 src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2359,7 +2359,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - + 기본 관리자 계정이 감지되지 않았습니다. 이것은 'admin'이라는 ID를 가진 관리자 계정을 만들고, 비밀번호를 설정할 것입니다. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2368,7 +2368,7 @@ Create - + 생성 src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2377,7 +2377,7 @@ Add Users - + 사용자 추가 src/app/components/modify-users/modify-users.component.html 90 @@ -2386,7 +2386,7 @@ Edit Role - + 역할 수정 src/app/components/modify-users/modify-users.component.html 95 @@ -2394,8 +2394,8 @@ Edit role - User name - + User name + ID src/app/components/modify-users/modify-users.component.html 17 @@ -2403,8 +2403,8 @@ Username users table header - Role - + Role + 역할 src/app/components/modify-users/modify-users.component.html 35 @@ -2412,8 +2412,8 @@ Role users table header - Actions - + Actions + 액션 src/app/components/modify-users/modify-users.component.html 55 @@ -2422,7 +2422,7 @@ Manage user - + 사용자 관리 src/app/components/modify-users/modify-users.component.html 70 @@ -2435,7 +2435,7 @@ Delete user - + 사용자 삭제 src/app/components/modify-users/modify-users.component.html 73 @@ -2444,7 +2444,7 @@ Edit user - + 사용자 수정 src/app/components/modify-users/modify-users.component.html 66 @@ -2453,7 +2453,7 @@ User UID: - + 사용자 UID: src/app/components/manage-user/manage-user.component.html 4 @@ -2462,7 +2462,7 @@ New password - + 새 비밀번호 src/app/components/manage-user/manage-user.component.html 8 @@ -2471,7 +2471,7 @@ Set new password - + 새 비밀번호 설정 src/app/components/manage-user/manage-user.component.html 10 @@ -2480,7 +2480,7 @@ Use role default - + 기본 역할 사용 src/app/components/manage-user/manage-user.component.html 19 @@ -2489,7 +2489,7 @@ Yes - + src/app/components/manage-user/manage-user.component.html 20 @@ -2502,7 +2502,7 @@ No - + 아니오 src/app/components/manage-user/manage-user.component.html 21 @@ -2515,7 +2515,7 @@ Manage role - + 역할 관리 src/app/components/manage-role/manage-role.component.html 1 @@ -2524,7 +2524,7 @@ Lines: - + 줄: src/app/components/logs-viewer/logs-viewer.component.html 22 @@ -2533,7 +2533,7 @@ Clear logs - + 로그 지우기 src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2542,7 +2542,7 @@ Auto-generated - + 자동으로 생성됨 src/app/components/unified-file-card/unified-file-card.component.html 5 @@ -2551,7 +2551,7 @@ Open file - + 파일 열기 src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2560,7 +2560,7 @@ Open file in new tab - + 새 탭에서 파일 열기 src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2569,7 +2569,7 @@ Go to subscription - + 구독중으로 가기 src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2578,7 +2578,7 @@ Delete and redownload - + 삭제하고 재다운로드 src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2591,7 +2591,7 @@ Delete forever - + 영원히 삭제 src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2603,8 +2603,8 @@ Delete forever subscription video button - See more. - + See more. + 더 보기. src/app/components/see-more/see-more.component.html 5,6 @@ -2612,8 +2612,8 @@ See more - See less. - + See less. + 간략히 보기. src/app/components/see-more/see-more.component.html 8,9 @@ -2622,7 +2622,7 @@ Length: - + 길이: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 From 75fc09ed99a4ffd0ecc0333eb23232db43a90d43 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 23:51:07 -0600 Subject: [PATCH 030/212] Improved arg simulation -- now uses same method as the actual download Added checkbox for advanced custom args to either replace all args or append --- backend/app.js | 25 +++++- backend/downloader.js | 4 +- src/app/main/main.component.css | 4 +- src/app/main/main.component.html | 25 +++--- src/app/main/main.component.ts | 140 ++++++++++++------------------- src/app/posts.services.ts | 16 +++- 6 files changed, 113 insertions(+), 101 deletions(-) diff --git a/backend/app.js b/backend/app.js index 33363d9..97a29df 100644 --- a/backend/app.js +++ b/backend/app.js @@ -987,8 +987,9 @@ app.post('/api/downloadFile', optionalJwt, async function(req, res) { const url = req.body.url; const type = req.body.type; const user_uid = req.isAuthenticated() ? req.user.uid : null; - var options = { + const options = { customArgs: req.body.customArgs, + additionalArgs: req.body.additionalArgs, customOutput: req.body.customOutput, selectedHeight: req.body.selectedHeight, customQualityConfiguration: req.body.customQualityConfiguration, @@ -996,7 +997,7 @@ app.post('/api/downloadFile', optionalJwt, async function(req, res) { youtubePassword: req.body.youtubePassword, ui_uid: req.body.ui_uid, cropFileSettings: req.body.cropFileSettings - } + }; const download = await downloader_api.createDownload(url, type, options, user_uid); @@ -1012,6 +1013,26 @@ app.post('/api/killAllDownloads', optionalJwt, async function(req, res) { res.send(result_obj); }); +app.post('/api/generateArgs', optionalJwt, async function(req, res) { + const url = req.body.url; + const type = req.body.type; + const user_uid = req.isAuthenticated() ? req.user.uid : null; + const options = { + customArgs: req.body.customArgs, + additionalArgs: req.body.additionalArgs, + customOutput: req.body.customOutput, + selectedHeight: req.body.selectedHeight, + customQualityConfiguration: req.body.customQualityConfiguration, + youtubeUsername: req.body.youtubeUsername, + youtubePassword: req.body.youtubePassword, + ui_uid: req.body.ui_uid, + cropFileSettings: req.body.cropFileSettings + }; + + const args = await downloader_api.generateArgs(url, type, options, user_uid, true); + res.send({args: args}); +}); + // gets all download mp3s app.get('/api/getMp3s', optionalJwt, async function(req, res) { // TODO: simplify diff --git a/backend/downloader.js b/backend/downloader.js index 16aaaa8..1c428ea 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -369,7 +369,7 @@ async function downloadQueuedFile(download_uid) { // helper functions -exports.generateArgs = async (url, type, options, user_uid = null) => { +exports.generateArgs = async (url, type, options, user_uid = null, simulated = false) => { const audioFolderPath = config_api.getConfigItem('ytdl_audio_folder_path'); const videoFolderPath = config_api.getConfigItem('ytdl_video_folder_path'); @@ -510,7 +510,7 @@ exports.generateArgs = async (url, type, options, user_uid = null) => { // filter out incompatible args downloadConfig = filterArgs(downloadConfig, is_audio); - logger.verbose(`youtube-dl args being used: ${downloadConfig.join(',')}`); + if (!simulated) logger.verbose(`youtube-dl args being used: ${downloadConfig.join(',')}`); return downloadConfig; } diff --git a/src/app/main/main.component.css b/src/app/main/main.component.css index e2325f2..5a712ae 100644 --- a/src/app/main/main.component.css +++ b/src/app/main/main.component.css @@ -129,7 +129,9 @@ mat-form-field.mat-form-field { } .edit-button { - margin-left: 10px; + margin-left: 5px; + margin-top: -6px; + margin-bottom: -5px; top: -5px; } diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index 3bfdc23..cba6565 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -111,8 +111,13 @@ + + + Replace args + + - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, @@ -127,7 +132,7 @@ - + Documentation. Path is relative to the config download path. Don't include extension. @@ -140,13 +145,13 @@ Use authentication - - + +
- - + +
@@ -155,13 +160,13 @@ Crop file - - + +
- - + +
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 996d819..37653ba 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList } from '@angular/core'; import {PostsService} from '../posts.services'; import {FileCardComponent} from '../file-card/file-card.component'; -import { Observable } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import {FormControl, Validators} from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -9,7 +9,6 @@ import { saveAs } from 'file-saver'; import { YoutubeSearchService, Result } from '../youtube-search.service'; import { Router, ActivatedRoute } from '@angular/router'; import { Platform } from '@angular/cdk/platform'; -import { v4 as uuid } from 'uuid'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; import { RecentVideosComponent } from 'app/components/recent-videos/recent-videos.component'; @@ -50,6 +49,7 @@ export class MainComponent implements OnInit { customArgsEnabled = false; customArgs = null; customOutputEnabled = false; + replaceArgs = false; customOutput = null; youtubeAuthEnabled = false; youtubeUsername = null; @@ -212,6 +212,7 @@ export class MainComponent implements OnInit { error: false }; + argsChangedSubject: Subject = new Subject(false); simulatedOutput = ''; constructor(public postsService: PostsService, private youtubeSearch: YoutubeSearchService, public snackBar: MatSnackBar, @@ -224,8 +225,6 @@ export class MainComponent implements OnInit { if (this.autoStartDownload) { this.downloadClicked(); } - - setInterval(() => this.getSimulatedOutput(), 1000); } async loadConfig() { @@ -261,6 +260,10 @@ export class MainComponent implements OnInit { this.customOutputEnabled = localStorage.getItem('customOutputEnabled') === 'true'; } + if (localStorage.getItem('replaceArgs') !== null) { + this.replaceArgs = localStorage.getItem('replaceArgs') === 'true'; + } + if (localStorage.getItem('youtubeAuthEnabled') !== null) { this.youtubeAuthEnabled = localStorage.getItem('youtubeAuthEnabled') === 'true'; } @@ -323,6 +326,12 @@ export class MainComponent implements OnInit { this.autoStartDownload = true; } + this.argsChangedSubject + .debounceTime(500) + .subscribe((should_simulate) => { + if (should_simulate) this.getSimulatedOutput(); + }); + this.setCols(); } @@ -412,7 +421,8 @@ export class MainComponent implements OnInit { this.urlError = false; // get common args - const customArgs = (this.customArgsEnabled ? this.customArgs : null); + const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); + const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); const customOutput = (this.customOutputEnabled ? this.customOutput : null); const youtubeUsername = (this.youtubeAuthEnabled && this.youtubeUsername ? this.youtubeUsername : null); const youtubePassword = (this.youtubeAuthEnabled && this.youtubePassword ? this.youtubePassword : null); @@ -445,7 +455,7 @@ export class MainComponent implements OnInit { this.downloadingfile = true; this.postsService.downloadFile(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), - customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { + customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { this.current_download = res['download']; this.downloads.push(res['download']); this.download_uids.push(res['download']['uid']); @@ -593,6 +603,7 @@ export class MainComponent implements OnInit { if (str !== this.last_valid_url && this.allowQualitySelect) { // get info this.getURLInfo(str); + this.argsChangedSubject.next(true); } this.last_valid_url = str; } @@ -630,79 +641,44 @@ export class MainComponent implements OnInit { } } - getSimulatedOutput() { - const customArgsExists = this.customArgsEnabled && this.customArgs; - const globalArgsExists = this.globalCustomArgs && this.globalCustomArgs !== ''; + argChanged(): void { + this.argsChangedSubject.next(true); + } - let full_string_array: string[] = []; - const base_string_array = ['youtube-dl', this.url]; + getSimulatedOutput(): void { + // this function should be very similar to downloadFile() + const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); + const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); + const customOutput = (this.customOutputEnabled ? this.customOutput : null); + const youtubeUsername = (this.youtubeAuthEnabled && this.youtubeUsername ? this.youtubeUsername : null); + const youtubePassword = (this.youtubeAuthEnabled && this.youtubePassword ? this.youtubePassword : null); - if (customArgsExists) { - this.simulatedOutput = base_string_array.join(' ') + ' ' + this.customArgs.split(',,').join(' '); - return this.simulatedOutput; - } + const type = this.audioOnly ? 'audio' : 'video'; - full_string_array.push(...base_string_array); + const customQualityConfiguration = type === 'audio' ? this.getSelectedAudioFormat() : this.getSelectedVideoFormat(); - const base_path = this.audioOnly ? this.audioFolderPath : this.videoFolderPath; - const ext = this.audioOnly ? '.mp3' : '.mp4'; - // gets output - let output_string_array = ['-o', base_path + '%(title)s' + ext]; - if (this.customOutputEnabled && this.customOutput) { - output_string_array = ['-o', base_path + this.customOutput + ext]; - } - // before pushing output, should check if using an external downloader - if (!this.useDefaultDownloadingAgent && this.customDownloadingAgent === 'aria2c') { - full_string_array.push('--external-downloader', 'aria2c'); - } - // pushes output - full_string_array.push(...output_string_array); + let cropFileSettings = null; - // logic splits into audio and video modes - if (this.audioOnly) { - // adds base audio string - const format_array = []; - const audio_format = this.getSelectedAudioFormat(); - if (audio_format) { - format_array.push('-f', audio_format); - } else if (this.selectedQuality) { - format_array.push('--audio-quality', this.selectedQuality['format_id']); + if (this.cropFile) { + cropFileSettings = { + cropFileStart: this.cropFileStart, + cropFileEnd: this.cropFileEnd } - - // pushes formats - full_string_array.splice(2, 0, ...format_array); - - const additional_params = ['-x', '--audio-format', 'mp3', '--write-info-json', '--print-json']; - - full_string_array.push(...additional_params); - } else { - // adds base video string - let format_array = ['-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4']; - const video_format = this.getSelectedVideoFormat(); - if (video_format) { - format_array = ['-f', video_format]; - } else if (this.selectedQuality) { - format_array = [`bestvideo[height=${this.selectedQuality['format_id']}]+bestaudio/best[height=${this.selectedQuality}]`]; - } - - // pushes formats - full_string_array.splice(2, 0, ...format_array); - - const additional_params = ['--write-info-json', '--print-json']; - - full_string_array.push(...additional_params); } - if (this.use_youtubedl_archive) { - full_string_array.push('--download-archive', 'archive.txt'); - } - - if (globalArgsExists) { - full_string_array = full_string_array.concat(this.globalCustomArgs.split(',,')); - } - - this.simulatedOutput = full_string_array.join(' '); - return this.simulatedOutput; + this.postsService.generateArgs(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), + customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { + const simulated_args = res['args']; + if (simulated_args) { + // hide password if needed + const passwordIndex = simulated_args.indexOf('--password'); + console.log(passwordIndex); + if (passwordIndex !== -1 && passwordIndex !== simulated_args.length - 1) { + simulated_args[passwordIndex + 1] = simulated_args[passwordIndex + 1].replace(/./g, '*'); + } + this.simulatedOutput = `youtube-dl ${this.url} ${simulated_args.join(' ')}`; + } + }); } errorFormats(url) { @@ -746,6 +722,7 @@ export class MainComponent implements OnInit { videoModeChanged(new_val) { this.selectedQuality = ''; localStorage.setItem('audioOnly', new_val.checked.toString()); + this.argsChangedSubject.next(true); } autoplayChanged(new_val) { @@ -754,29 +731,22 @@ export class MainComponent implements OnInit { customArgsEnabledChanged(new_val) { localStorage.setItem('customArgsEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customOutputEnabled) { - this.customOutputEnabled = false; - localStorage.setItem('customOutputEnabled', 'false'); + this.argsChangedSubject.next(true); + } - this.youtubeAuthEnabled = false; - localStorage.setItem('youtubeAuthEnabled', 'false'); - } + replaceArgsChanged(new_val) { + localStorage.setItem('replaceArgs', new_val.checked.toString()); + this.argsChangedSubject.next(true); } customOutputEnabledChanged(new_val) { localStorage.setItem('customOutputEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customArgsEnabled) { - this.customArgsEnabled = false; - localStorage.setItem('customArgsEnabled', 'false'); - } + this.argsChangedSubject.next(true); } youtubeAuthEnabledChanged(new_val) { localStorage.setItem('youtubeAuthEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customArgsEnabled) { - this.customArgsEnabled = false; - localStorage.setItem('customArgsEnabled', 'false'); - } + this.argsChangedSubject.next(true); } getAudioAndVideoFormats(formats) { diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 22faa70..bee6500 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -175,11 +175,25 @@ export class PostsService implements CanActivate { } // tslint:disable-next-line: max-line-length - downloadFile(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { + downloadFile(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { return this.http.post(this.path + 'downloadFile', {url: url, selectedHeight: selectedQuality, customQualityConfiguration: customQualityConfiguration, customArgs: customArgs, + additionalArgs: additionalArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + type: type, + cropFileSettings: cropFileSettings}, this.httpOptions); + } + + generateArgs(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { + return this.http.post(this.path + 'generateArgs', {url: url, + selectedHeight: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + additionalArgs: additionalArgs, customOutput: customOutput, youtubeUsername: youtubeUsername, youtubePassword: youtubePassword, From ec7f04552f241518cb542e6ca2dc1a7be770f208 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 23:56:04 -0600 Subject: [PATCH 031/212] Fixed mangled Subject initialization in main component --- src/app/main/main.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 37653ba..00e1c61 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -212,7 +212,7 @@ export class MainComponent implements OnInit { error: false }; - argsChangedSubject: Subject = new Subject(false); + argsChangedSubject: Subject = new Subject(); simulatedOutput = ''; constructor(public postsService: PostsService, private youtubeSearch: YoutubeSearchService, public snackBar: MatSnackBar, From 562eaa1b9b5c15ac2052eaf953d24b5e58156c5f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 22 Sep 2021 19:27:25 -0600 Subject: [PATCH 032/212] Added support for generate NFO files for Kodi Minor UI updates to settings --- backend/appdata/default.json | 3 +- backend/config.js | 3 +- backend/consts.js | 5 ++ backend/db.js | 3 +- backend/downloader.js | 20 +++++ backend/package-lock.json | 73 ++++++++++++++++ backend/package.json | 1 + backend/test/sample.info.json | 1 + backend/test/tests.js | 10 +++ backend/utils.js | 8 +- src/app/settings/settings.component.html | 103 ++++++++++++----------- src/app/settings/settings.component.ts | 26 +++++- 12 files changed, 197 insertions(+), 59 deletions(-) create mode 100644 backend/test/sample.info.json diff --git a/backend/appdata/default.json b/backend/appdata/default.json index 04f76de..44f2f02 100644 --- a/backend/appdata/default.json +++ b/backend/appdata/default.json @@ -33,7 +33,8 @@ "use_twitch_API": false, "twitch_API_key": "", "twitch_auto_download_chat": false, - "use_sponsorblock_API": false + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", diff --git a/backend/config.js b/backend/config.js index e50c472..95e364c 100644 --- a/backend/config.js +++ b/backend/config.js @@ -208,7 +208,8 @@ const DEFAULT_CONFIG = { "use_twitch_API": false, "twitch_API_key": "", "twitch_auto_download_chat": false, - "use_sponsorblock_API": false + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", diff --git a/backend/consts.js b/backend/consts.js index 1f25021..849fa4c 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -114,6 +114,11 @@ exports.CONFIG_ITEMS = { 'key': 'ytdl_use_sponsorblock_api', 'path': 'YoutubeDLMaterial.API.use_sponsorblock_API' }, + 'ytdl_generate_nfo_files': { + 'key': 'ytdl_generate_nfo_files', + 'path': 'YoutubeDLMaterial.API.generate_NFO_files' + }, + // Themes 'ytdl_default_theme': { diff --git a/backend/db.js b/backend/db.js index a4c8080..18f9064 100644 --- a/backend/db.js +++ b/backend/db.js @@ -217,8 +217,7 @@ function generateFileObject(file_path, type) { var title = jsonobj.title; var url = jsonobj.webpage_url; var uploader = jsonobj.uploader; - var upload_date = jsonobj.upload_date; - upload_date = upload_date ? `${upload_date.substring(0, 4)}-${upload_date.substring(4, 6)}-${upload_date.substring(6, 8)}` : 'N/A'; + var upload_date = utils.formatDateString(jsonobj.upload_date); var size = stats.size; diff --git a/backend/downloader.js b/backend/downloader.js index 1c428ea..86e6f5e 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -11,6 +11,7 @@ const youtubedl = require('youtube-dl'); const logger = require('./logger'); const config_api = require('./config'); const twitch_api = require('./twitch'); +const { create } = require('xmlbuilder2'); const categories_api = require('./categories'); const utils = require('./utils'); @@ -328,6 +329,10 @@ async function downloadQueuedFile(download_uid) { if (!success) logger.error('Failed to apply ID3 tag to audio file ' + output_json['_filename']); } + if (config_api.getConfigItem('ytdl_generate_nfo_files')) { + exports.generateNFOFile(output_json, `${filepath_no_extension}.nfo`); + } + if (options.cropFileSettings) { await utils.cropFile(full_file_path, options.cropFileSettings.cropFileStart, options.cropFileSettings.cropFileEnd, ext); } @@ -603,4 +608,19 @@ async function checkDownloadPercent(download_uid) { const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2); await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete}); }); +} + +exports.generateNFOFile = (info, output_path) => { + const nfo_obj = { + episodedetails: { + title: info['fulltitle'], + episode: info['playlist_index'] ? info['playlist_index'] : undefined, + premiered: utils.formatDateString(info['upload_date']), + plot: `${info['uploader_url']}\n${info['description']}\n${info['playlist_title'] ? info['playlist_title'] : ''}`, + director: info['artist'] ? info['artist'] : info['uploader'] + } + }; + const doc = create(nfo_obj); + const xml = doc.end({ prettyPrint: true }); + fs.writeFileSync(output_path, xml); } \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index fbade26..7c691f8 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -4,6 +4,38 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "requires": { + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1117,6 +1149,11 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3030,6 +3067,11 @@ "memory-pager": "^1.0.2" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -3593,6 +3635,37 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, + "xmlbuilder2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", + "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", + "requires": { + "@oozcitak/dom": "1.15.10", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "@types/node": "*", + "js-yaml": "3.14.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index c857561..339e94a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -66,6 +66,7 @@ "unzipper": "^0.10.10", "uuidv4": "^6.0.6", "winston": "^3.2.1", + "xmlbuilder2": "^3.0.2", "youtube-dl": "^3.0.2" } } diff --git a/backend/test/sample.info.json b/backend/test/sample.info.json new file mode 100644 index 0000000..8d65c5b --- /dev/null +++ b/backend/test/sample.info.json @@ -0,0 +1 @@ +{"fps": 25, "webpage_url_basename": "watch", "vbr": 3546.159, "age_limit": 0, "_filename": "video\\20091024 - Rick Astley - Never Gonna Give You Up (Official Music Video).mp4", "height": 1080, "description": "Rick Astley's official music video for \u201cNever Gonna Give You Up", "thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "resolution": null, "webpage_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "average_rating": 4.894496, "ext": "mp4", "formats": [{"fps": null, "abr": 46.492, "height": null, "format_id": "249", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=249&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1232413&dur=212.061&lmt=1624945854503369&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOQPPrlgzOqNtORq4sWu11c9B7xu7oDsAw2tubKwfknwAiBqNjjMPHEVKlGNnOplfYZ_zuITnJ0PQAicXP1qyYRDWA%3D%3D&sig=AOq0QJ8wRgIhAOBiYeG7Pq0puYb5QjUVfMdTQStw09143tjience7YyJAiEAyK77-fXJ55w7RP2_ML9Gysg9ZrqhjcBzsolQIVHx6I4=", "format": "249 - audio only (tiny)", "filesize": 1232413, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 46.492, "width": null}, {"fps": null, "abr": 61.494, "height": null, "format_id": "250", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=250&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1630086&dur=212.061&lmt=1624945852595198&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgGn2dRpsfP4xqu8rwvbRoH6SV9eCoQNr9KhOHIzWHcfwCIQCNXPD8U5zRz8nOD86M7E79GYNf9sR1QYI8Q0vRwh90zQ%3D%3D&sig=AOq0QJ8wRAIgMX4-9T8B0Rk8YxA7umuAzrb7Cf81aYG4PiV3uKTP4zQCIDw876bIcVsfWIO4Lx4qS7txMIkqDsnofhAfcIrAc9-T", "format": "250 - audio only (tiny)", "filesize": 1630086, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 61.494, "width": null}, {"fps": null, "abr": 129.51, "height": null, "format_id": "140", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=140&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3433514&dur=212.091&lmt=1628122153868652&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5532434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIb6WyFCUS1IO9DY2BvkCDbeQpYU54NUMD8wHVUv-CgoAiBBk9HxGnh0qQAJqGRNFHGTtqiNhjBxPQCfHWqDOmzMbg%3D%3D&sig=AOq0QJ8wRAIgUstXqxWkdk_oRE6snyI1OaunA8jmDtA5gFsO__xRSWgCIDN6rrueyDicOohCGgyy-VOLBEHuwtjxpTpEdFrdzLtd", "format": "140 - audio only (tiny)", "filesize": 3433514, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "mp4a.40.2", "quality": 0, "container": "m4a_dash", "ext": "m4a", "protocol": "https", "vcodec": "none", "tbr": 129.51, "width": null}, {"fps": null, "abr": 129.689, "height": null, "format_id": "251", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=251&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3437753&dur=212.061&lmt=1624945852795821&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAO1WGRPqP3fz7DeczBl9uDNWvypP_xmoQapWlTCG66d9AiEAvZrhvA9jWZGnwCDEhntzc9utiYJZq-_PdXBpKlfUKAY%3D&sig=AOq0QJ8wRQIgPP7v5vRzBQVhBUFexSLhOsqNNfttu2TFH4qIctUxqAsCIQDixqdmBoxi72zvNSXdw-VyXAKd6mQfO_GmsvapdAutvA==", "format": "251 - audio only (tiny)", "filesize": 3437753, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 129.689, "width": null}, {"fps": 25, "format": "394 - 256x144 (144p)", "height": 144, "format_id": "394", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=394&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1806317&dur=212.040&lmt=1624947805339431&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgMcmJsqnRfEbWlqbPt1EPKCpOF5UzkyaABbAi0SXEwHICIHVGwJ69zGvjLE7SfFLy7c-1L-psZ1M4cHbx0s_FlJEu&sig=AOq0QJ8wRQIgXnlbLnaTYCnHNGSv3NHchQ_uPCQKO-EuJ8le0QekHdsCIQDsHRE_83b11n_QLvDF0qhNgOtpfYgkhKU05RNt_DiwYg==", "vbr": 68.15, "filesize": 1806317, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 68.15, "width": 256}, {"fps": 25, "format": "160 - 256x144 (144p)", "height": 144, "format_id": "160", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=160&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1902470&dur=212.040&lmt=1628130952822277&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhANAbvnZihueHQl6DlS0KDCcmD612v91WicDPh0MMooE3AiEApFWRu4aPyDGym8F6QMLxc8yrVTWSSFBaUxjDWrx59FA%3D&sig=AOq0QJ8wRgIhAIKLvUYN8RN1LzNPHRN4Rb3fC0zDev9KlSdeCExTXPosAiEA_yY2AJ69va_G3eTdbkifrdePATiSrgb8PVDdMk-6hYw=", "vbr": 71.777, "filesize": 1902470, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d400c", "tbr": 71.777, "width": 256}, {"fps": 25, "format": "278 - 256x144 (144p)", "height": 144, "format_id": "278", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=2377337&dur=212.040&lmt=1628133100068252&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgYxpgVafit-zpha31Q8EtJBdHaBpRj1y65ew-cOr0644CIQD8SJ7dYuyflAm0T7T6ny03WB5jOjmHO87TDSwLeAPwZA%3D%3D&sig=AOq0QJ8wRQIgZP8HNivYFUpLZC2a5UHDX26raL9ekwrCP3fNwgST874CIQDuD4D2kg8lxP-4BC8J_x9cP8vGKfwD1w9HVad9TXIbjg==", "vbr": 89.693, "filesize": 2377337, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 89.693, "width": 256}, {"fps": 25, "format": "133 - 426x240 (240p)", "height": 240, "format_id": "133", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=133&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3107257&dur=212.040&lmt=1628130952261127&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgNlYpzWhXOUhMEpm6bv_NUP8flw8_gbDOPuh_BpF1NWkCIA7dMuvigM6xlyoiJa8HxjDx-zeZODadHPUQ7DSxuy-u&sig=AOq0QJ8wRQIgfZ33AlJlf8H6DyxSVCHeZvA7i3QC9giEfW2FL6iXqTACIQCYEK8Rqbt9EgjKbGEks_iWoxXtm6TFLPM1vmx7722hrg==", "vbr": 117.232, "filesize": 3107257, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d4015", "tbr": 117.232, "width": 426}, {"fps": 25, "format": "395 - 426x240 (240p)", "height": 240, "format_id": "395", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=395&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3563582&dur=212.040&lmt=1624947923168885&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhALb3kDbV5djjgibZrxg1kD6hfnxNHcgVWv0snt354vKHAiEA5UJIuEWmRqTsPtKGbHwcWducF6aUoEaFxKx1Tz5L008%3D&sig=AOq0QJ8wRQIgKib1QlEvGVYibzu3l1BDT63OFgt9Ttv4HCcqpCKebncCIQCGk-H3AdMNUzWU5I7015YbmU_X4g2Es44BBWCzLYUM6w==", "vbr": 134.449, "filesize": 3563582, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 134.449, "width": 426}, {"fps": 25, "format": "242 - 426x240 (240p)", "height": 240, "format_id": "242", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=242&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=4215000&dur=212.040&lmt=1628133101514133&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPDAPJegoPAAF6kQgTebJ5-GdTQHu-dnudbQ9wUfaIWKAiEA4kNlwtfnb1zuhOb7OlIlBInYYdOTFyoI9mE7-yxxbxM%3D&sig=AOq0QJ8wRgIhALxu_H89hpmniExLrH6A073CxYUCJVhiVe0KFK3Skz7gAiEAlnZsUIv_GSPJYDafWKjskYOJkbRY2tTqSVZO3tHiVPg=", "vbr": 159.026, "filesize": 4215000, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 159.026, "width": 426}, {"fps": 25, "format": "134 - 640x360 (360p)", "height": 360, "format_id": "134", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=134&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=5820414&dur=212.040&lmt=1628130952382425&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOtn2CoLBwcHCnbLpyhRugJMSvb5A3Mt7q0oc2GewlP5AiBSL9UpjE1pdqmlim_prX4T9hURk5K8YDHf24Gvlo29Sw%3D%3D&sig=AOq0QJ8wRAIgGt5L323eYDn6EDy6r2IYX0xGkzGzVMeH7NruficAzMECIGrivYII2PAGKL5Rv6lDc-l53z6PVid6W_8Jco5BYmFB", "vbr": 219.596, "filesize": 5820414, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 219.596, "width": 640}, {"fps": 25, "format": "396 - 640x360 (360p)", "height": 360, "format_id": "396", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=396&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=6957752&dur=212.040&lmt=1624947999257981&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgHlGjZ2Fo06YkUp_59h9RpX89UUj7yF86OMbElBaaDRQCIBIJuyfWeNSKFP3s6BkXIk8Cy3F2mHRO3PRoR5CuacA3&sig=AOq0QJ8wRQIhANp7jIO5PM8sEwGd4-EmADAfLNsIw-mWhZDI0XAmQ666AiAfEAjcDgczL2TMBWQm9xobP6cbCrDVxfVxR_3IbYIYXg==", "vbr": 262.507, "filesize": 6957752, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.01M.08", "tbr": 262.507, "width": 640}, {"fps": 25, "format": "243 - 640x360 (360p)", "height": 360, "format_id": "243", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=243&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=7257207&dur=212.040&lmt=1628133101141872&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgdk8qX0zqkEIlabAum60ghDNmMy2W1zWAsnvKpoef1igCIQCWvArsFhNndiLBBq7UEdk2qX9FvYej4tCuDFknrNyyDA%3D%3D&sig=AOq0QJ8wRgIhAN3hiLrHN-nYrc4xRIFk0mcVYxqR5FNRhzcEz8DJyLAuAiEAiIsaYG5R6ZcaTuWfwV4qp3iJqAYPBLX0QkDgNbXhGl4=", "vbr": 273.805, "filesize": 7257207, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 273.805, "width": 640}, {"fps": 25, "format": "135 - 854x480 (480p)", "height": 480, "format_id": "135", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=135&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=8935471&dur=212.040&lmt=1628130953383927&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgGK75aA2fI4WwFkPZV42bMbNbkOG6OtuIXjuFNqezr4MCIGst4mxew5OX2AYcbwTj9f0e3PBAS8QGTYs3yDeVbNdT&sig=AOq0QJ8wRgIhALIazj23a4uqcFohSavkQCmmByUR_7DxHo6ohKjOc5yiAiEAoleQpPWYZ8tO0O7gZsT_H4aUuGh_p9F2oNjrx5eLKqQ=", "vbr": 337.123, "filesize": 8935471, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 337.123, "width": 854}, {"fps": 25, "format": "244 - 854x480 (480p)", "height": 480, "format_id": "244", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=10532052&dur=212.040&lmt=1628133102160132&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAJKhoFYw7Q-a6k4sgJZO69oCR8yu-_86cfVvZDVnlxcrAiEA6ghEBhCbESj7wH3LcFmHp4dNFEVI_H3dazQKTWPxMnk%3D&sig=AOq0QJ8wRgIhAN3WW-w6rLDTOWF4r6kqvmbOlsgkp0wgxnvHeMJOPa8oAiEA4s9L5_hPFQ9pjUD9VWVjJrYKTT5pzeFfXCD2Cd7tR6s=", "vbr": 397.36, "filesize": 10532052, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 397.36, "width": 854}, {"fps": 25, "format": "397 - 854x480 (480p)", "height": 480, "format_id": "397", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=397&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=11930795&dur=212.040&lmt=1624948131494790&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcoFDjq9zIiJ_ofRzFyQjv_6wRL4EV6mbVDCkwBYN8t0CIFvyQbtU537nm7Iw9-t_e9Scxlcyt5SwbrhtWIiA4zt5&sig=AOq0QJ8wRgIhAPf62Xh3p8Sk1zf3iZTK1zaEoSJz6eft26JJ9VR8N2CPAiEAtZtW4sdAYDDmAqS524Qxy6ZD9BZgvdFZWkTyZwrbkyo=", "vbr": 450.133, "filesize": 11930795, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.04M.08", "tbr": 450.133, "width": 854}, {"fps": 25, "format": "136 - 1280x720 (720p)", "height": 720, "format_id": "136", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=136&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=17375531&dur=212.040&lmt=1628130952538181&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAN1ZFXb_ZOXOofsWiuyAlB_PEmFOXLMiMWlLzcrb33zgAiARNS1RT8FOIEst33KIGloOKR9Y6_fSg0o1s_cr8PrDTQ%3D%3D&sig=AOq0QJ8wRAIgeCl2ZWgWyfopoNoWUVV4Lijvm2aYyFZhH4KZsPLOWb8CICgDOyLogiCIwOIiNz4zamJTtkakt8VDaLhV__Z4b9An", "vbr": 655.556, "filesize": 17375531, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401f", "tbr": 655.556, "width": 1280}, {"fps": 25, "format": "247 - 1280x720 (720p)", "height": 720, "format_id": "247", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=247&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=18530394&dur=212.040&lmt=1628133100666546&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIEWZfOAPFeUw2-xI2l_IvQ2XJG92s_5Yd77n9pgCvISAiByI9uxsyN5xk_PtxDSFF4UG1Q-7OpXrYr3i6jBz880JQ%3D%3D&sig=AOq0QJ8wRgIhAL3l9xAE1mvJmZ5wEGtRO-f_vhHCRtts8Cj-jD1ZpcUqAiEAsKbVkjHRYLtXGbmwUT1qe6medMxHmIYGsLrPTftbuYI=", "vbr": 699.128, "filesize": 18530394, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 699.128, "width": 1280}, {"fps": 25, "format": "398 - 1280x720 (720p)", "height": 720, "format_id": "398", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=398&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=22755091&dur=212.040&lmt=1624947952304594&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPYMgegprlBtjtqtXJkbsbAeeXS6XNWySYoxae2IvrLKAiEApXXh7mr2C8UMrfXNGaIB--m-4kkSy91IN3muC3Z4t18%3D&sig=AOq0QJ8wRgIhAPm3dPdmeLw7e6muiJwhSDKe1nlkHoQ1WkXcmz6ngRkVAiEAqShfUbwRICZ7TI3pggP-3rWlFlpExlV1ebinn5JLc4k=", "vbr": 858.52, "filesize": 22755091, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.05M.08", "tbr": 858.52, "width": 1280}, {"fps": 25, "format": "399 - 1920x1080 (1080p)", "height": 1080, "format_id": "399", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=41772768&dur=212.040&lmt=1624948154710174&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcCja1-Lsriw-hfwc2KwX9G4VBYJ1a9p3OGBQYwa3pywCIFMEO6QGSXUQoQomqSYxqUu4HOZHqHnhVUFlaroP-l2h&sig=AOq0QJ8wRQIgIPISNyI_OU4-cpSkzZjvP6oF2w0izlJKe8DCwl9bH5QCIQDHydWqPWx7k9ctYkmtelvOV6Ao_hUwUzeJuMaaXqllkw==", "vbr": 1576.033, "filesize": 41772768, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.08M.08", "tbr": 1576.033, "width": 1920}, {"fps": 25, "format": "137 - 1920x1080 (1080p)", "height": 1080, "format_id": "137", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=137&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=93990963&dur=212.040&lmt=1628130818054956&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgfImvk-1wtFA9tIjgPP0B-zd95cwOlEHMhBvV3aE7zl0CIQCEf3d3oZfoThLk__WJL1AOe1URRgkj_SIcftgH8HG_jg%3D%3D&sig=AOq0QJ8wRgIhAJItHQu2MeVv3to1Z0luBDsircwDXjWzWeBmYRAKDW9rAiEA1iafsfDk5Yp-9zACBxgmxyL_pidNC3mqYV_TKjHcklY=", "vbr": 3546.159, "filesize": 93990963, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.640028", "tbr": 3546.159, "width": 1920}, {"fps": 25, "format": "18 - 640x360 (360p)", "height": 360, "format_id": "18", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=18&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=zMV9mnhHv3UnwW1w1ilGGmgG&gir=yes&clen=16724503&ratebypass=yes&dur=212.091&lmt=1624987724234745&mt=1631594013&fvip=4&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5530322&n=EFswOlbBGAoK1nv1&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANvKM6JozEQa97eFLe2GBuj7K6UqHz8r0ilGwRnrl5OBAiAHdOlZ3a0nr2sKPzU2cfBNdSgdtRYyYem2sOJCFRRdkg%3D%3D&sig=AOq0QJ8wRQIhAO27Mc8XHMtx364tjalsNLXk8X5zzE11s4ovWD-0cVMwAiB4giGZbFxOvmRb0Eo1OTuExAAWvFfl_IB8vrJXPHMAsQ==", "filesize": 16724503, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "format_note": "360p", "acodec": "mp4a.40.2", "quality": 2, "ext": "mp4", "protocol": "https", "vcodec": "avc1.42001E", "tbr": 630.842, "width": 640}], "id": "dQw4w9WgXcQ", "format_id": "137+251", "uploader": "Rick Astley", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "acodec": "opus", "thumbnails": [{"height": 94, "resolution": "168x94", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd2KtelLHaNSXrI9_5K-NvTscKNw", "width": 168, "id": "0"}, {"height": 110, "resolution": "196x110", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUpEOOWUXWkNyijQuZ4UPzp2BE-w", "width": 196, "id": "1"}, {"height": 138, "resolution": "246x138", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBCyhr8AqpJ1SxKVU6SyK5ODJ_IpA", "width": 246, "id": "2"}, {"height": 188, "resolution": "336x188", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB_p0PncTtkrhaNDZtntrE3gKkoYw", "width": 336, "id": "3"}, {"height": 1080, "resolution": "1920x1080", "url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "width": 1920, "id": "4"}], "extractor_key": "Youtube", "fulltitle": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "categories": ["Music"], "view_count": 1046140382, "format": "137 - 1920x1080 (1080p)+251 - audio only (tiny)", "is_live": null, "upload_date": "20091024", "track": "Never Gonna Give You Up (7\" Mix)", "extractor": "youtube", "artist": "Rick Astley", "abr": 129.689, "creator": "Rick Astley", "channel": "Rick Astley", "title": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "vcodec": "avc1.640028", "display_id": "dQw4w9WgXcQ", "width": 1920, "alt_title": "Never Gonna Give You Up (7\" Mix)", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "stretched_ratio": null, "uploader_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "like_count": 11756010, "playlist": null, "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics", "rick rolled", "the boys soundtrack", "the boys amazon prime", "Never gonna give you up the boys", "official", "Rick Roll", "music video", "Rick Astley album", "rick astley official", "together forever", "Whenever You Need Somebody", "rickrolled", "WRECK-IT RALPH 2", "Fortnite song", "Fortnite event", "Fortnite dance", "fortnite never gonna give you up", "rick astley never gonna give you up", "rick astley never gonna give you up lyrics"], "duration": 212, "uploader_url": "http://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "dislike_count": 318477, "playlist_index": null} \ No newline at end of file diff --git a/backend/test/tests.js b/backend/test/tests.js index 99b79b2..c52fa13 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -339,4 +339,14 @@ describe('Downloader', function() { const args = await downloader_api.generateArgs(url, 'video', sub_options, 'admin'); console.log(args); }); + + it('Generate kodi NFO file', async function() { + const nfo_file_path = './test/sample.nfo'; + if (fs.existsSync(nfo_file_path)) { + fs.unlinkSync(nfo_file_path); + } + const sample_json = fs.readJSONSync('./test/sample.info.json'); + downloader_api.generateNFOFile(sample_json, nfo_file_path); + assert(fs.existsSync(nfo_file_path), true); + }); }); diff --git a/backend/utils.js b/backend/utils.js index 9c07833..137274d 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -45,8 +45,7 @@ async function getDownloadedFilesByType(basePath, type, full_metadata = false) { files.push(jsonobj); continue; } - var upload_date = jsonobj.upload_date; - upload_date = upload_date ? `${upload_date.substring(0, 4)}-${upload_date.substring(4, 6)}-${upload_date.substring(6, 8)}` : null; + var upload_date = formatDateString(jsonobj.upload_date); var isaudio = type === 'audio'; var file_obj = new File(id, jsonobj.title, jsonobj.thumbnail, isaudio, jsonobj.duration, jsonobj.webpage_url, jsonobj.uploader, @@ -295,6 +294,10 @@ function removeFileExtension(filename) { return filename_parts.join('.'); } +function formatDateString(date_string) { + return date_string ? `${date_string.substring(0, 4)}-${date_string.substring(4, 6)}-${date_string.substring(6, 8)}` : 'N/A'; +} + function createEdgeNGrams(str) { if (str && str.length > 3) { const minGram = 3 @@ -389,6 +392,7 @@ module.exports = { getCurrentDownloader: getCurrentDownloader, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, + formatDateString: formatDateString, cropFile: cropFile, createEdgeNGrams: createEdgeNGrams, wait: wait, diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index e7e0223..74a57dd 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -1,12 +1,5 @@

Settings

- - - - - + @@ -272,9 +265,12 @@ Also known as a Client ID. Generating a key is easy!
-
+
Use SponsorBlock API
+
+ Generate NFO files +
@@ -423,52 +419,59 @@ - -
-
- Allow user registration + + +
+ Users
- - - - - Internal - - - LDAP - - - -
+ + +
- - - + Allow user registration
-
- - - -
-
- - - -
-
- - - -
-
- - - + + + + + Internal + + + LDAP + + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
- -
- + +
diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index 483c4db..7d8b4d3 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -12,6 +12,7 @@ import { ConfirmDialogComponent } from 'app/dialogs/confirm-dialog/confirm-dialo import { moveItemInArray, CdkDragDrop } from '@angular/cdk/drag-drop'; import { InputDialogComponent } from 'app/input-dialog/input-dialog.component'; import { EditCategoryDialogComponent } from 'app/dialogs/edit-category-dialog/edit-category-dialog.component'; +import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'app-settings', @@ -38,17 +39,28 @@ export class SettingsComponent implements OnInit { latestGithubRelease = null; CURRENT_VERSION = CURRENT_VERSION - get settingsAreTheSame() { + tabs = ['main', 'downloader', 'extra', 'database', 'advanced', 'users', 'logs']; + tabIndex = 0; + + INDEX_TO_TAB = Object.assign({}, this.tabs); + TAB_TO_INDEX = {}; + + usersTabDisabledTooltip = $localize`You must enable multi-user mode to access this tab.`; + + get settingsAreTheSame(): boolean { this._settingsSame = this.settingsSame() return this._settingsSame; } - set settingsAreTheSame(val) { + set settingsAreTheSame(val: boolean) { this._settingsSame = val; } constructor(public postsService: PostsService, private snackBar: MatSnackBar, private sanitizer: DomSanitizer, - private dialog: MatDialog) { } + private dialog: MatDialog, private router: Router, private route: ActivatedRoute) { + // invert index to tab + Object.keys(this.INDEX_TO_TAB).forEach(key => { this.TAB_TO_INDEX[this.INDEX_TO_TAB[key]] = key; }); + } ngOnInit() { if (this.postsService.initialized) { @@ -66,6 +78,9 @@ export class SettingsComponent implements OnInit { this.generated_bookmarklet_code = this.sanitizer.bypassSecurityTrustUrl(this.generateBookmarkletCode()); this.getLatestGithubRelease(); + + const tab = this.route.snapshot.paramMap.get('tab'); + this.tabIndex = tab && this.TAB_TO_INDEX[tab] ? this.TAB_TO_INDEX[tab] : 0; } getConfig() { @@ -98,6 +113,11 @@ export class SettingsComponent implements OnInit { this.new_config = JSON.parse(JSON.stringify(this.initial_config)); } + tabChanged(event) { + const index = event['index']; + this.router.navigate(['/settings', {tab: this.INDEX_TO_TAB[index]}]); + } + dropCategory(event: CdkDragDrop) { moveItemInArray(this.postsService.categories, event.previousIndex, event.currentIndex); this.postsService.updateCategories(this.postsService.categories).subscribe(res => { From db53a12635572e67f84c8de6947567b309878a6c Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 22 Sep 2021 21:29:15 -0600 Subject: [PATCH 033/212] Added Korean translations and updated source translations file --- src/app/settings/settings.component.ts | 2 +- src/assets/i18n/messages.en.xlf | 751 +++++-- src/assets/i18n/messages.ko.json | 261 +++ src/assets/i18n/messages.ko.xlf | 2634 ++++++++++++++++++++++++ 4 files changed, 3454 insertions(+), 194 deletions(-) create mode 100644 src/assets/i18n/messages.ko.json create mode 100644 src/assets/i18n/messages.ko.xlf diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index 7d8b4d3..c30d153 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -21,7 +21,7 @@ import { ActivatedRoute, Router } from '@angular/router'; }) export class SettingsComponent implements OnInit { all_locales = isoLangs; - supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'id', 'en-GB']; + supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'ko', 'id', 'en-GB']; initialLocale = localStorage.getItem('locale'); initial_config = null; diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index 99e0f16..da1b3d7 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -26,22 +26,10 @@ src/app/settings/settings.component.html - 75 + 67 Dark mode toggle label - - Settings - - src/app/app.component.html - 28 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - Home @@ -58,7 +46,7 @@ src/app/components/login/login.component.html - 15 + 34 src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html @@ -82,6 +70,25 @@ Navigation menu Downloads Page title + + Settings + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + + src/app/main/main.component.ts + 469 + + Only Audio @@ -122,13 +129,13 @@ YT search View button for searched video - - Multi-download Mode + + Autoplay src/app/main/main.component.html 70,71 - Multi-download Mode checkbox + Autoplay checkbox Cancel @@ -154,11 +161,19 @@ Use custom args checkbox + + Replace args + + src/app/main/main.component.html + 116,117 + + Replace args + Custom args src/app/main/main.component.html - 115 + 120 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -174,7 +189,7 @@ No need to include URL, just everything after. Args are delimited using two commas like so: ,, src/app/main/main.component.html - 118,119 + 123,124 Custom Args input hint @@ -182,7 +197,7 @@ Use custom output src/app/main/main.component.html - 126,127 + 131,132 Use custom output checkbox @@ -190,7 +205,7 @@ Custom output src/app/main/main.component.html - 130 + 135 Custom output placeholder @@ -198,7 +213,7 @@ Documentation src/app/main/main.component.html - 132 + 137 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -214,7 +229,7 @@ src/app/settings/settings.component.html - 125 + 117 Youtube-dl output template documentation link @@ -222,7 +237,7 @@ Path is relative to the config download path. Don't include extension. src/app/main/main.component.html - 133 + 138 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -242,26 +257,10 @@ Crop file src/app/main/main.component.html - 155,156 + 160,161 Crop video checkbox - - Crop from (seconds) - - src/app/main/main.component.html - 159 - - Crop from placeholder - - - Crop to (seconds) - - src/app/main/main.component.html - 164 - - Crop to placeholder - Simulated command: @@ -274,7 +273,7 @@ Use authentication src/app/main/main.component.html - 140,141 + 145,146 Use authentication checkbox @@ -282,7 +281,7 @@ Username src/app/main/main.component.html - 144 + 149 YT Username placeholder @@ -290,7 +289,7 @@ Password src/app/main/main.component.html - 149 + 154 src/app/dialogs/add-user-dialog/add-user-dialog.component.html @@ -302,6 +301,22 @@ YT Password placeholder + + Crop from (seconds) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + + src/app/main/main.component.html + 169 + + Crop to placeholder + Create a playlist @@ -386,7 +401,7 @@ src/app/settings/settings.component.html - 18 + 10 Subscription URL input placeholder @@ -492,6 +507,10 @@ src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 84 + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 66 @@ -500,6 +519,18 @@ src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 54 + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + src/app/components/modify-users/modify-users.component.html 61 @@ -586,7 +617,7 @@ src/app/dialogs/about-dialog/about-dialog.component.html - 59 + 70 src/app/dialogs/share-media-dialog/share-media-dialog.component.html @@ -638,7 +669,7 @@ src/app/subscriptions/subscriptions.component.html - 31 + 34 src/app/subscription/subscription/subscription.component.html @@ -802,7 +833,7 @@ src/app/components/login/login.component.html - 35 + 38 Register user button @@ -854,7 +885,7 @@ src/app/settings/settings.component.html - 464 + 487 src/app/components/modify-users/modify-users.component.html @@ -918,6 +949,38 @@ Files search placeholder + + File type + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + No videos found. @@ -982,7 +1045,7 @@ src/app/components/unified-file-card/unified-file-card.component.html - 37 + 43 Playlist edit button @@ -998,11 +1061,11 @@ src/app/components/unified-file-card/unified-file-card.component.html - 33 + 39 src/app/components/unified-file-card/unified-file-card.component.html - 39 + 45 Delete playlist @@ -1038,7 +1101,7 @@ src/app/components/unified-file-card/unified-file-card.component.html - 34 + 40 Delete and blacklist video button @@ -1046,7 +1109,7 @@ views src/app/player/player.component.html - 15 + 16 View count label @@ -1134,7 +1197,7 @@ Playlists src/app/subscriptions/subscriptions.component.html - 27 + 30 Subscriptions playlists title @@ -1150,7 +1213,7 @@ You have no channel subscriptions. src/app/subscriptions/subscriptions.component.html - 24 + 27 No channel subscriptions text @@ -1158,7 +1221,7 @@ Name not available. Playlist retrieval in progress. src/app/subscriptions/subscriptions.component.html - 33 + 36 Subscription playlist not available text @@ -1166,15 +1229,22 @@ You have no playlist subscriptions. src/app/subscriptions/subscriptions.component.html - 43 + 46 No playlist subscriptions text + + You must enable multi-user mode to access this tab. + + src/app/settings/settings.component.ts + 48 + + Main src/app/settings/settings.component.html - 12 + 4 Main settings label @@ -1182,7 +1252,7 @@ Downloader src/app/settings/settings.component.html - 102 + 94 Downloader settings label @@ -1190,7 +1260,7 @@ Extra src/app/settings/settings.component.html - 185 + 198 Extra settings label @@ -1198,7 +1268,7 @@ Database src/app/settings/settings.component.html - 284 + 303 Database settings label @@ -1206,47 +1276,27 @@ Advanced src/app/settings/settings.component.html - 320 + 339 Host settings label - - Users - - src/app/settings/settings.component.html - 403 - - - src/app/settings/settings.component.html - 403 - - Users settings label - Logs src/app/settings/settings.component.html - 451 + 476 src/app/settings/settings.component.html - 451 + 476 Logs settings label - - {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - - src/app/settings/settings.component.html - 467 - - Settings cancel and close button - URL this app will be accessed from, without the port. src/app/settings/settings.component.html - 19 + 11 URL setting input hint @@ -1254,7 +1304,7 @@ Port src/app/settings/settings.component.html - 24 + 16 Port input placeholder @@ -1262,7 +1312,7 @@ The desired port. Default is 17442. src/app/settings/settings.component.html - 25 + 17 Port setting input hint @@ -1270,7 +1320,7 @@ Multi-user mode src/app/settings/settings.component.html - 34 + 26 Multi user mode setting @@ -1278,7 +1328,7 @@ Users base path src/app/settings/settings.component.html - 38 + 30 Users base path placeholder @@ -1286,7 +1336,7 @@ Base path for users and their downloaded videos. src/app/settings/settings.component.html - 39 + 31 Users base path hint @@ -1294,7 +1344,7 @@ Allow subscriptions src/app/settings/settings.component.html - 48 + 40 Allow subscriptions setting @@ -1302,7 +1352,7 @@ Subscriptions base path src/app/settings/settings.component.html - 52 + 44 Subscriptions base path input setting placeholder @@ -1310,7 +1360,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 53 + 45 Subscriptions base path setting input hint @@ -1318,7 +1368,7 @@ Check interval src/app/settings/settings.component.html - 58 + 50 Check interval input setting placeholder @@ -1326,7 +1376,7 @@ Unit is seconds, only include numbers. src/app/settings/settings.component.html - 59 + 51 Check interval setting input hint @@ -1334,7 +1384,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. src/app/settings/settings.component.html - 63 + 55 Redownload fresh uploads tooltip @@ -1342,7 +1392,7 @@ Redownload fresh uploads src/app/settings/settings.component.html - 63 + 55 Redownload fresh uploads @@ -1350,7 +1400,7 @@ Theme src/app/settings/settings.component.html - 72 + 64 Theme select label @@ -1358,7 +1408,7 @@ Default src/app/settings/settings.component.html - 74 + 66 Default theme label @@ -1366,7 +1416,7 @@ Allow theme change src/app/settings/settings.component.html - 80 + 72 Allow theme change setting @@ -1374,7 +1424,7 @@ Language src/app/settings/settings.component.html - 89 + 81 Language select label @@ -1382,7 +1432,7 @@ Audio folder path src/app/settings/settings.component.html - 109 + 101 Audio folder path input placeholder @@ -1390,7 +1440,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 110 + 102 Aduio path setting input hint @@ -1398,7 +1448,7 @@ Video folder path src/app/settings/settings.component.html - 116 + 108 Video folder path input placeholder @@ -1406,7 +1456,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 117 + 109 Video path setting input hint @@ -1414,7 +1464,7 @@ Default file output src/app/settings/settings.component.html - 123 + 115 Default file output placeholder @@ -1422,7 +1472,7 @@ Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html - 126 + 118 Custom Output input hint @@ -1430,7 +1480,7 @@ Global custom args src/app/settings/settings.component.html - 133 + 125 Custom args input placeholder @@ -1438,7 +1488,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, src/app/settings/settings.component.html - 134 + 126 Custom args setting input hint @@ -1446,7 +1496,7 @@ Categories src/app/settings/settings.component.html - 144 + 136 Categories @@ -1454,7 +1504,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. src/app/settings/settings.component.html - 158 + 150 Allow playlist categorization setting tooltip @@ -1462,7 +1512,7 @@ Allow playlist categorization src/app/settings/settings.component.html - 158 + 150 Allow playlist categorization setting label @@ -1470,7 +1520,7 @@ Use youtube-dl archive src/app/settings/settings.component.html - 166 + 158 Use youtubedl archive setting @@ -1478,7 +1528,7 @@ Include thumbnail src/app/settings/settings.component.html - 170 + 162 Include thumbnail setting @@ -1486,15 +1536,47 @@ Include metadata src/app/settings/settings.component.html - 174 + 166 Include metadata setting + + Max concurrent downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + Kill all downloads src/app/settings/settings.component.html - 178 + 191 Kill all downloads button @@ -1502,7 +1584,7 @@ Top title src/app/settings/settings.component.html - 191 + 204 Top title input placeholder @@ -1510,7 +1592,7 @@ File manager enabled src/app/settings/settings.component.html - 196 + 209 File manager enabled setting @@ -1518,7 +1600,7 @@ Downloads manager enabled src/app/settings/settings.component.html - 199 + 212 Downloads manager enabled setting @@ -1526,7 +1608,7 @@ Allow quality select src/app/settings/settings.component.html - 202 + 215 Allow quality seelct setting @@ -1534,23 +1616,23 @@ Download only mode src/app/settings/settings.component.html - 205 + 218 Download only mode setting - - Allow multi-download mode + + Allow autoplay src/app/settings/settings.component.html - 208 + 221 - Allow multi-download mode setting + Allow autoplay setting Enable Public API src/app/settings/settings.component.html - 216 + 229 Enable Public API key setting @@ -1558,7 +1640,7 @@ Public API Key src/app/settings/settings.component.html - 221 + 234 Public API Key setting placeholder @@ -1566,7 +1648,7 @@ View documentation src/app/settings/settings.component.html - 222 + 235 View API docs setting hint @@ -1574,7 +1656,7 @@ This will delete your old API key! src/app/settings/settings.component.html - 226 + 239 delete api key tooltip @@ -1582,7 +1664,7 @@ Generate src/app/settings/settings.component.html - 226 + 239 Generate key button @@ -1590,7 +1672,7 @@ Use YouTube API src/app/settings/settings.component.html - 235 + 248 Use YouTube API setting @@ -1598,7 +1680,7 @@ Youtube API Key src/app/settings/settings.component.html - 239 + 252 Youtube API Key setting placeholder @@ -1606,11 +1688,11 @@ Generating a key is easy! src/app/settings/settings.component.html - 240 + 253 src/app/settings/settings.component.html - 252 + 265 Youtube API Key setting hint @@ -1618,7 +1700,7 @@ Use Twitch API src/app/settings/settings.component.html - 244 + 257 Use Twitch API setting @@ -1626,7 +1708,7 @@ Twitch API Key src/app/settings/settings.component.html - 251 + 264 Twitch API Key setting placeholder @@ -1634,15 +1716,47 @@ Also known as a Client ID. src/app/settings/settings.component.html - 252 + 265 Twitch API Key setting hint AKA preamble + + Enables a button to skip ads when viewing supported videos. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + Auto-download Twitch Chat src/app/settings/settings.component.html - 247 + 260 Auto download Twitch Chat setting @@ -1650,15 +1764,15 @@ Click here src/app/settings/settings.component.html - 262 + 281 src/app/settings/settings.component.html - 268 + 287 src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 Chrome ext click here @@ -1666,7 +1780,7 @@ to download the official YoutubeDL-Material Chrome extension manually. src/app/settings/settings.component.html - 262 + 281 Chrome click here suffix @@ -1674,7 +1788,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 263 + 282 Chrome setup suffix @@ -1682,7 +1796,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. src/app/settings/settings.component.html - 268 + 287 Firefox click here suffix @@ -1690,7 +1804,7 @@ Detailed setup instructions. src/app/settings/settings.component.html - 269 + 288 Firefox setup prefix link @@ -1698,7 +1812,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 269 + 288 Firefox setup suffix @@ -1706,7 +1820,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html - 274 + 293 Bookmarklet instructions @@ -1714,7 +1828,7 @@ Generate 'audio only' bookmarklet src/app/settings/settings.component.html - 275 + 294 Generate audio only bookmarklet checkbox @@ -1722,7 +1836,7 @@ Database location: src/app/settings/settings.component.html - 290 + 309 Database location label @@ -1730,7 +1844,7 @@ Records per table src/app/settings/settings.component.html - 291 + 310 Records per table label @@ -1738,7 +1852,7 @@ MongoDB Connection String src/app/settings/settings.component.html - 299 + 318 MongoDB Connection String @@ -1746,7 +1860,7 @@ Example: src/app/settings/settings.component.html - 300 + 319 MongoDB Connection String setting hint AKA preamble @@ -1754,7 +1868,7 @@ Test connection string src/app/settings/settings.component.html - 304 + 323 Test connection string button @@ -1762,7 +1876,7 @@ Transfer DB to src/app/settings/settings.component.html - 308 + 327 Transfer DB button @@ -1770,7 +1884,7 @@ Database information could not be retrieved. Check the server logs for more information. src/app/settings/settings.component.html - 312 + 331 Database info not retrieved error message @@ -1778,7 +1892,7 @@ Select a downloader src/app/settings/settings.component.html - 326 + 345 Default downloader select label @@ -1786,7 +1900,7 @@ Use default downloading agent src/app/settings/settings.component.html - 335 + 354 Use default downloading agent setting @@ -1794,7 +1908,7 @@ Select a download agent src/app/settings/settings.component.html - 339 + 358 Custom downloader select label @@ -1802,7 +1916,7 @@ Log Level src/app/settings/settings.component.html - 353 + 372 Log Level label @@ -1810,7 +1924,7 @@ Login expiration src/app/settings/settings.component.html - 365 + 384 Login expiration select label @@ -1818,7 +1932,7 @@ Allow advanced download src/app/settings/settings.component.html - 376 + 395 Allow advanced downloading setting @@ -1826,7 +1940,7 @@ Use Cookies src/app/settings/settings.component.html - 384 + 403 Use cookies setting @@ -1834,7 +1948,7 @@ Set Cookies src/app/settings/settings.component.html - 385 + 404 Set cookies button @@ -1842,15 +1956,23 @@ Restart server src/app/settings/settings.component.html - 397 + 416 Restart server button + + Users + + src/app/settings/settings.component.html + 425 + + Users settings label + Allow user registration src/app/settings/settings.component.html - 407 + 431 Allow registration setting @@ -1858,7 +1980,7 @@ Auth method src/app/settings/settings.component.html - 411 + 435 Auth method select @@ -1866,7 +1988,7 @@ Internal src/app/settings/settings.component.html - 413 + 437 Internal auth method @@ -1874,7 +1996,7 @@ LDAP src/app/settings/settings.component.html - 416 + 440 LDAP auth method @@ -1882,7 +2004,7 @@ LDAP URL src/app/settings/settings.component.html - 423 + 447 LDAP URL @@ -1890,7 +2012,7 @@ Bind DN src/app/settings/settings.component.html - 428 + 452 Bind DN @@ -1898,7 +2020,7 @@ Bind Credentials src/app/settings/settings.component.html - 433 + 457 Bind Credentials @@ -1906,7 +2028,7 @@ Search Base src/app/settings/settings.component.html - 438 + 462 Search Base @@ -1914,7 +2036,7 @@ Search Filter src/app/settings/settings.component.html - 443 + 467 Search Filter @@ -1950,11 +2072,35 @@ Version label + + Installation type: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + Found a bug or have a suggestion? src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 About bug prefix @@ -1962,7 +2108,7 @@ to create an issue! src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 About bug suffix @@ -1990,6 +2136,14 @@ Update through settings menu hint + + Docker tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + Select a version: @@ -2046,35 +2200,230 @@ Share video dialog title - - Session ID: + + Creating download - src/app/components/downloads/downloads.component.html - 5 + src/app/components/downloads/downloads.component.ts + 58 - Session ID - - Clear all downloads + + Getting info - src/app/components/downloads/downloads.component.html - 18 + src/app/components/downloads/downloads.component.ts + 59 - clear all downloads action button - - (current) + + Downloading file + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date src/app/components/downloads/downloads.component.html - 6 + 7 - Current session + Date + + + Title + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads No downloads available! src/app/components/downloads/downloads.component.html - 25 + 90 No downloads label @@ -2322,11 +2671,19 @@ Go to subscription menu item + + Add to playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + Delete and redownload src/app/components/unified-file-card/unified-file-card.component.html - 28 + 34 src/app/subscription/subscription-file-card/subscription-file-card.component.html @@ -2338,7 +2695,7 @@ Delete forever src/app/components/unified-file-card/unified-file-card.component.html - 31 + 37 src/app/subscription/subscription-file-card/subscription-file-card.component.html @@ -2362,6 +2719,14 @@ See less + + Skip ad + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + Length: diff --git a/src/assets/i18n/messages.ko.json b/src/assets/i18n/messages.ko.json new file mode 100644 index 0000000..1fea7ad --- /dev/null +++ b/src/assets/i18n/messages.ko.json @@ -0,0 +1,261 @@ +{ + "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "대하여", + "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "프로필", + "adb4562d2dbd3584370e44496969d58c511ecb63": "다크", + "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "설정", + "92eee6be6de0b11c924e3ab27db30257159c0a7c": "홈", + "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "로그인", + "357064ca9d9ac859eb618e28e8126fa32be049e2": "구독", + "822fab38216f64e8166d368b59fe756ca39d301b": "다운로드", + "4a9889d36910edc8323d7bab60858ab3da6d91df": "오디오만", + "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "다운로드", + "a38ae1082fec79ba1f379978337385a539a28e73": "품질", + "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL 이용", + "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "보기", + "96a01fafe135afc58b0f8071a4ab00234495ce18": "복수 다운로드 모드", + "6a3777f913cf3f288664f0632b9f24794fdcc24e": "취소", + "322ed150e02666fe2259c5b4614eac7066f4ffa0": "고급", + "4e4c721129466be9c3862294dc40241b64045998": "사용자 지정 인수 이용", + "ad2f8ac8b7de7945b80c8e424484da94e597125f": "사용자 지정 인수", + "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "URL을 포함할 필요가 없습니다. 이후의 모든 항목만 포함하면 됩니다. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,,", + "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "사용자 지정 출력 사용", + "d9c02face477f2f9cdaae318ccee5f89856851fb": "사용자 지정 출력", + "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "문서", + "19d1ae64d94d28a29b2c57ae8671aace906b5401": "경로는 설정된 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요.", + "4e1291cb1d579e7b7a1b802e6a8fd16ef7a557fa": "파일 자르기", + "44d007f6f8a2b19f12d85f9e49647b4ac02d7cbe": "자르기 시작지점 (초)", + "661206c3ab91fa81e9d8b40afb29f1866b78432f": "자르기 마무리지점 (초)", + "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "시뮬레이션된 명령:", + "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "인증 사용", + "08c74dc9762957593b91f6eb5d65efdfc975bf48": "아이디", + "c32ef07f8803a223a83ed17024b38e8d82292407": "비밀번호", + "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "재생목록 만들기", + "cff1428d10d59d14e45edec3c735a27b5482db59": "제목", + "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "종류", + "f0baeb8b69d120073b6d60d34785889b0c3232c8": "오디오", + "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "동영상", + "f47e2d56dd8a145b2e9599da9730c049d52962a2": "오디오 파일", + "a52dae09be10ca3a65da918533ced3d3f4992238": "동영상", + "a9806cf78ce00eb2613eeca11354a97e033377b8": "재생목록이나 채널 구독", + "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", + "93efc99ae087fc116de708ecd3ace86ca237cf30": "재생목록이나 채널 URL", + "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "사용자 지정 이름", + "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "모든 업로드 된 파일 다운로드", + "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "최고 화질", + "c76a955642714b8949ff3e4b4990864a2e2cac95": "오디오 전용 모드", + "408ca4911457e84a348cecf214f02c69289aa8f1": "스트리밍 전용 모드", + "f432e1a8d6adb12e612127978ce2e0ced933959c": "이것들은 일반적인 인수 뒤에 추가됩니다.", + "98b6ec9ec138186d663e64770267b67334353d63": "사용자 지정 파일 출력", + "d7b35c384aecd25a516200d6921836374613dfe7": "취소", + "d0336848b0c375a1c25ba369b3481ee383217a4f": "구독", + "28a678e9cabf86e44c32594c43fa0e890135c20f": "마지막으로 업로드된 동영상 다운로드", + "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "종류:", + "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", + "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "아이디:", + "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "닫기", + "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "아카이브 내보내기", + "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "구독 취소", + "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(일시정지)", + "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "아카이브:", + "616e206cb4f25bd5885fc35925365e43cf5fb929": "제목:", + "c6eb45d085384903e53ab001a3513d1de6a1dbac": "업로더:", + "109c6f4a5e46efb933612ededfaf52a13178b7e0": "파일 크기:", + "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "경로:", + "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "업로드 날짜:", + "0cc1dec590ecd74bef71a865fb364779bc42a749": "카테고리:", + "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Youtube-dl 인수 수정", + "7fc1946abe2b40f60059c6cd19975d677095fd19": "시뮬레이션된 새 인수", + "0b71824ae71972f236039bed43f8d2323e8fd570": "인수 추가", + "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "카테고리로 찾기", + "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "인수 값 이용", + "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "인수 추가", + "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "수정", + "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "인수 값", + "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "업데이터", + "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "사용자 등록", + "024886ca34a6f309e3e51c2ed849320592c3faaa": "아이디", + "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "등록", + "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "새 쿠키 업로드", + "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "참고: 새로운 쿠키를 추가하면 이전 쿠키를 덮어씁니다. 또한 쿠키는 사용자 개인이 아닌 전체에 적용됩니다.", + "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "드래그 앤 드롭", + "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "재생목록 수정", + "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "저장", + "cba36d610ddba59b6dd6fbec77199eabf0ff2de3": "재생할 때 재생목록 섞기", + "5caadefa4143cf6766a621b0f54f91f373a1f164": "콘텐츠 추가", + "33026f57ea65cd9c8a5d917a08083f71a718933a": "기본 순서", + "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "순서 거꾸로", + "d02888c485d3aeab6de628508f4a00312a722894": "내 동영상", + "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "검색", + "73423607944a694ce6f9e55cfee329681bb4d9f9": "동영상 없음.", + "3697f8583ea42868aa269489ad366103d94aece7": "수정중", + "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "일시정지됨", + "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "카테고리 수정중", + "2489eefea00931942b91f4a1ae109514b591e2e1": "규칙", + "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "새로운 규칙 추가", + "792dc6a57f28a1066db283f2e736484f066005fd": "트위치 채팅 다운로드", + "28f86ffd419b869711aa13f5e5ff54be6d70731c": "수정", + "826b25211922a1b46436589233cb6f1a163d89b7": "삭제", + "321e4419a943044e674beb55b8039f42a9761ca5": "정보", + "e684046d73bcee88e82f7ff01e2852789a05fc32": "동영상 수:", + "34504b488c24c27e68089be549f0eeae6ebaf30b": "삭제하고 블랙리스트 추가", + "dad95154dcef3509b8cc705046061fd24994bbb7": "조회수", + "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "성공적으로 다운로드 완료", + "348cc5d553b18e862eb1c1770e5636f6b05ba130": "에러 발생", + "4f8b2bb476981727ab34ed40fde1218361f92c45": "세부사항", + "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "에러 발생:", + "77b0c73840665945b25bd128709aa64c8f017e1c": "다운로드 시작:", + "08ff9375ec078065bcdd7637b7ea65fce2979266": "다운로드 끝:", + "ad127117f9471612f47d01eae09709da444a36a4": "파일 경로(들):", + "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "구독중", + "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "채널", + "47546e45bbb476baaaad38244db444c427ddc502": "재생목록", + "29b89f751593e1b347eef103891b7a1ff36ec03f": "이름이 유효하지 않음. 채널 검색중.", + "4636cd4a1379c50d471e98786098c4d39e1e82ad": "구독중인 채널이 없습니다.", + "2e0a410652cb07d069f576b61eab32586a18320d": "이름이 유효하지 않음. 플레이리스트 검색중.", + "587b57ced54965d8874c3fd0e9dfedb987e5df04": "구독중인 재생목록이 없습니다.", + "82421c3e46a0453a70c42900eab51d58d79e6599": "메인", + "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "다운로더", + "d5f69691f9f05711633128b5a3db696783266b58": "추가", + "fb324ec7da611c6283caa6fc6257c39a56d6aaf7": "데이터베이스", + "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "고급", + "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "사용자", + "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "로그", + "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {닫다} false {취소} other {기타}}", + "54c512cca1923ab72faf1a0bd98d3d172469629a": "포트를 제외한 이 앱에 접속할 URL.", + "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "포트", + "22e8f1d0423a3b784fe40fab187b92c06541b577": "포트 설정. 기본 포트는 17442 입니다.", + "d4477669a560750d2064051a510ef4d7679e2f3e": "복수 사용자 모드", + "2eb03565fcdce7a7a67abc277a936a32fcf51557": "사용자 기본 경로", + "a64505c41150663968e277ec9b3ddaa5f4838798": "사용자와 그들의 동영상 다운로드를 위한 기본 경로.", + "4e3120311801c4acd18de7146add2ee4a4417773": "구독 허용", + "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "구독 기본 경로", + "bc9892814ee2d119ae94378c905ea440a249b84a": "구독된 채널과 재생목록에서 나온 영상들을 위한 기본 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", + "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "확인 간격", + "0f56a7449b77630c114615395bbda4cab398efd8": "단위는 초이며, 숫자만 넣으세요.", + "13759b09a7f4074ceee8fa2f968f9815fdf63295": "가끔 새 동영상이 최고 화질 처리 전에 다운로드 될 때가 있습니다. 이 설정은 새 동영상이 더 높은 화질의 버전이 있는지 다음 날짜에 확인됨을 의미합니다.", + "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "높은 화질 재다운로드", + "27a56aad79d8b61269ed303f11664cc78bcc2522": "테마", + "ff7cee38a2259526c519f878e71b964f41db4348": "기본", + "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "테마 변경 허용", + "fe46ccaae902ce974e2441abe752399288298619": "언어", + "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "오디오 폴더 경로", + "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "오디오 전용 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", + "46826331da1949bd6fb74624447057099c9d20cd": "동영상 폴더 경로", + "17c92e6d47a213fa95b5aa344b3f258147123f93": "동영상 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", + "cfe829634b1144bc44b6d38cf5584ea65db9804f": "기본 파일 출력", + "1148fd45287ff09955b938756bc302042bcb29c7": "경로는 위의 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요.", + "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "전반적으로 적용될 사용자 지정 인수", + "6b995e7130b4d667eaab6c5f61b362ace486d26d": "홈페이지에서의 다운로드에 대해 전반적으로 적용될 사용자 지정 인수. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,,", + "04201f9d27abd7d6f58a4328ab98063ce1072006": "카테고리", + "1f6d3986a970af27f16f8a95ce0dc3033cc90a83": "이 설정을 사용하면, 하나의 동영상이 카테고리와 일치할 경우, 전체 재생목록에 해당 카테고리가 표시됩니다.", + "5da94ccb2301f586af26916e921bdad6d673ab58": "재생목록 카테고리화 허용", + "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Youtube-dl 아카이브 사용", + "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "썸네일 포함", + "384de8f8f112c9e6092eb2698706d391553f3e8d": "메타데이터 포함", + "fb35145bfb84521e21b6385363d59221f436a573": "모든 다운로드 종료", + "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "상위 제목", + "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "파일 매니저 설정됨", + "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "다운로드 매니저 설정됨", + "c33bd5392b39dbed36b8e5a1145163a15d45835f": "화질 선택 허용", + "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "다운로드 전용 모드", + "09d31c803a7252658694e1e3176b97f5655a3fe3": "복수 다운로드 모드 허용", + "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "오픈 API 허용", + "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "오픈 API 키", + "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "문서 보기", + "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "이것은 예전 API키를 지울 것입니다!", + "1b258b258b4cc475ceb2871305b61756b0134f4a": "생성", + "d5d7c61349f3b0859336066e6d453fc35d334fe5": "유튜브 API 사용", + "ce10d31febb3d9d60c160750570310f303a22c22": "유튜브 API 키", + "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "키를 만드는 것은 쉽습니다!", + "d162f9fcd6a7187b391e004f072ab3da8377c47d": "트위치 API 사용", + "8ae23bc4302a479f687f4b20a84c276182e2519c": "트위치 API 키", + "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "클라이언트 ID라고도 알려져 있음.", + "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "트위치 채팅 자동 다운로드", + "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "이곳을 누르세요", + "7f09776373995003161235c0c8d02b7f91dbc4df": "공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위해.", + "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "반드시 확장 프로그램을 수동으로 실행하고 확장 프로그램 설정을 수정하여 프론트엔드 URL을 설정해야 합니다.", + "9a2ec6da48771128384887525bdcac992632c863": "파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위해.", + "eb81be6b49e195e5307811d1d08a19259d411f37": "자세한 설정 지침.", + "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "프론트엔드 URL을 설정하기 위해 확장 프로그램 설정을 변경하는 것 외에는 필요한 것이 많지 않습니다.", + "61b81b11aad0b9d970ece2fce18405f07eac69c2": "아래 링크를 북마크에 끌어다 놓으시면 됩니다! 이제 그냥 다운로드하고자 하는 유튜브 비디오 페이지에서 북마크를 클릭하면 됩니다.", + "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "'오디오 전용' 북마크 생성", + "47955e2cc6986625528b4352034858180d675281": "데이터베이스 위치:", + "9f8de81d44ec2a9a58b97e589b9e3154b3966c60": "테이블당 레코드", + "3913164a51898aac444bf6c7150e46ad5a8a18ad": "몽고DB 연결 문자열", + "5473e36f5102e2ae22ce4c6620cacc40cc98da95": "예시:", + "d54142de169844b014ae913a4056c31495f4a305": "연결 문자열 테스트", + "98e94c9bdac1ca8beb29d73b2e6f7a9e5e035aec": "DB 전환", + "b1c08387975e6feada407c9b5f5f564261b8192b": "데이터베이스 정보를 검색할 수 없습니다. 자세한 내용은 서버 로그를 확인하세요.", + "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "다운로더 선택", + "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "기본 다운로드 에이전트 사용", + "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "다운로드 에이전트 선택", + "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "로그 레벨", + "db6c192032f4cab809aad35215f0aa4765761897": "로그인 만료", + "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "고급 다운로드 허용", + "431e5f3a0dde88768d1074baedd65266412b3f02": "쿠키 사용", + "80651a7ad1229ea6613557d3559f702cfa5aecf5": "쿠키 설정", + "635285fa5624d50a408feb7eb564c0db0d3f1ce1": "서버 재시작", + "37224420db54d4bc7696f157b779a7225f03ca9d": "사용자 등록 허용", + "fa548cee6ea11c160a416cac3e6bdec0363883dc": "인증 방법", + "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "내부", + "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", + "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", + "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", + "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", + "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "기본 검색", + "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "검색 필터", + "cec82c0a545f37420d55a9b6c45c20546e82f94e": "YoutubeDL-Material에 대하여", + "199c17e5d6a419313af3c325f06dcbb9645ca618": "은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신은 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 할 수도 있습니다.", + "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 모든 지원되는 기능을 확인해보세요.", + "a45e3b05f0529dc5246d70ef62304c94426d4c81": "설치된 버전:", + "b33536f59b94ec935a16bd6869d836895dc5300c": "버그를 찾았거나 제안하실 사항이 있으신가요?", + "e1f398f38ff1534303d4bb80bd6cece245f24016": "이슈를 생성하기 위해!", + "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "업데이트 확인중...", + "a16e92385b4fd9677bb830a4b796b8b79c113290": "업데이트 가능", + "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "설정 메뉴에서 업데이트를 할 수 있습니다.", + "1372e61c5bd06100844bd43b98b016aabc468f62": "선택된 버전:", + "1f6d14a780a37a97899dc611881e6bc971268285": "공유 허용", + "6580b6a950d952df847cb3d8e7176720a740adc8": "타임스탬프 사용", + "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "초", + "3a6e5a6aa78ca864f6542410c5dafb6334538106": "클립보드에 복사", + "a249a5ae13e0835383885aaf697d2890cc3e53e9": "재생목록 공유", + "94e2674467c7a08a291f9bd97ce694d4e47ffd62": "파일 공유", + "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "세션 아이디:", + "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "모든 다운로드된 항목 지우기", + "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(현재)", + "7117fc42f860e86d983bfccfcf2654e5750f3406": "다운로드된 항목 없음!", + "42ff677ec14f111e88bd6cdd30145378e994d1bf": "프로필", + "bb694b49d408265c91c62799c2b3a7e3151c824d": "로그아웃", + "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", + "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "생성됨:", + "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "로그인하지 않았습니다.", + "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "관리자 계정 생성", + "2d2adf3ca26a676bca2269295b7455a26fd26980": "기본 관리자 계정이 감지되지 않았습니다. 이것은 'admin'이라는 ID를 가진 관리자 계정을 만들고, 비밀번호를 설정할 것입니다.", + "70a67e04629f6d412db0a12d51820b480788d795": "생성", + "4d92a0395dd66778a931460118626c5794a3fc7a": "사용자 추가", + "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "역할 수정", + "746f64ddd9001ac456327cd9a3d5152203a4b93c": "ID", + "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "역할", + "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "액션", + "2bd201aea09e43fbfd3cd15ec0499b6755302329": "사용자 관리", + "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "사용자 삭제", + "632e8b20c98e8eec4059a605a4b011bb476137af": "사용자 수정", + "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "사용자 UID:", + "e70e209561583f360b1e9cefd2cbb1fe434b6229": "새 비밀번호", + "6498fa1b8f563988f769654a75411bb8060134b9": "새 비밀번호 설정", + "544e09cdc99a8978f48521d45f62db0da6dcf742": "기본 역할 사용", + "4f20f2d5a6882190892e58b85f6ccbedfa737952": "네", + "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "아니오", + "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "역할 관리", + "5009630cdf32ab4f1c78737b9617b8773512c05a": "줄:", + "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "로그 지우기", + "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "자동으로 생성됨", + "ccf5ea825526ac490974336cb5c24352886abc07": "파일 열기", + "5656a06f17c24b2d7eae9c221567b209743829a9": "새 탭에서 파일 열기", + "a0720c36ee1057e5c54a86591b722485c62d7b1a": "구독중으로 가기", + "94e01842dcee90531caa52e4147f70679bac87fe": "삭제하고 재다운로드", + "2031adb51e07a41844e8ba7704b054e98345c9c1": "영원히 삭제", + "ddc31f2885b1b33a7651963254b0c197f2a64086": "더 보기.", + "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "간략히 보기.", + "2054791b822475aeaea95c0119113de3200f5e1c": "길이:" +} \ No newline at end of file diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf new file mode 100644 index 0000000..3746351 --- /dev/null +++ b/src/assets/i18n/messages.ko.xlf @@ -0,0 +1,2634 @@ + + + + + + About + 대하여 + + src/app/app.component.html + 32 + + About menu label + + + Profile + 프로필 + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + 다크 + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + 설정 + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + 로그인 + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + 구독 + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + 다운로드 + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + 오디오만 + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + 다운로드 + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + 품질 + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + URL 이용 + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + 보기 + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + 복수 다운로드 모드 + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + 취소 + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + 고급 + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + 사용자 지정 인수 이용 + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + 사용자 지정 인수 + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + URL을 포함할 필요가 없습니다. 이후의 모든 항목만 포함하면 됩니다. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + 사용자 지정 출력 사용 + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + 사용자 지정 출력 + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + 문서 + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + 경로는 설정된 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + 파일 자르기 + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + 자르기 시작지점 (초) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + 자르기 마무리지점 (초) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + 시뮬레이션된 명령: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + 인증 사용 + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + 아이디 + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + 비밀번호 + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + 재생목록 만들기 + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + 제목 + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + 종류 + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + 오디오 + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + 동영상 + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + 오디오 파일 + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + 동영상 + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + 재생목록이나 채널 구독 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + 재생목록이나 채널 URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + 사용자 지정 이름 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + 모든 업로드 된 파일 다운로드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + 최고 화질 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + 오디오 전용 모드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + 스트리밍 전용 모드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + 이것들은 일반적인 인수 뒤에 추가됩니다. + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + 사용자 지정 파일 출력 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + 취소 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + 구독 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + 마지막으로 업로드된 동영상 다운로드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + 종류: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + URL: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + 아이디: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + 닫기 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + 아카이브 내보내기 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + 구독 취소 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (일시정지) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + 아카이브: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + 제목: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + 업로더: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + 파일 크기: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + 경로: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + 업로드 날짜: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + 카테고리: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + Youtube-dl 인수 수정 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + 시뮬레이션된 새 인수 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + 인수 추가 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + 카테고리로 찾기 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + 인수 값 이용 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + 인수 추가 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + 수정 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + 인수 값 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + 업데이터 + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + 사용자 등록 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + 아이디 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + 등록 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + 새 쿠키 업로드 + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + 참고: 새로운 쿠키를 추가하면 이전 쿠키를 덮어씁니다. 또한 쿠키는 사용자 개인이 아닌 전체에 적용됩니다. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + 드래그 앤 드롭 + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + 재생목록 수정 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + 저장 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + 재생할 때 재생목록 섞기 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + 콘텐츠 추가 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + 기본 순서 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + 순서 거꾸로 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + 내 동영상 + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + 검색 + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + 동영상 없음. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + 수정중 + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + 일시정지됨 + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + 카테고리 수정중 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + 규칙 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + 새로운 규칙 추가 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + 트위치 채팅 다운로드 + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + 수정 + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + 삭제 + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + 정보 + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + 동영상 수: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + 삭제하고 블랙리스트 추가 + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + 조회수 + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + 성공적으로 다운로드 완료 + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + 에러 발생 + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + 세부사항 + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + 에러 발생: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + 다운로드 시작: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + 다운로드 끝: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + 파일 경로(들): + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + 구독중 + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + 채널 + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + 재생목록 + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + 이름이 유효하지 않음. 채널 검색중. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + 구독중인 채널이 없습니다. + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + 이름이 유효하지 않음. 플레이리스트 검색중. + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + 구독중인 재생목록이 없습니다. + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + 메인 + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + 다운로더 + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + 추가 + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + 데이터베이스 + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + 고급 + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + 사용자 + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + 로그 + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + {VAR_SELECT, select, true {닫다} false {취소} other {기타}} + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + 포트를 제외한 이 앱에 접속할 URL. + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + 포트 + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + 포트 설정. 기본 포트는 17442 입니다. + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + 복수 사용자 모드 + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + 사용자 기본 경로 + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + 사용자와 그들의 동영상 다운로드를 위한 기본 경로. + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + 구독 허용 + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + 구독 기본 경로 + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + 구독된 채널과 재생목록에서 나온 영상들을 위한 기본 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + 확인 간격 + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + 단위는 초이며, 숫자만 넣으세요. + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + 가끔 새 동영상이 최고 화질 처리 전에 다운로드 될 때가 있습니다. 이 설정은 새 동영상이 더 높은 화질의 버전이 있는지 다음 날짜에 확인됨을 의미합니다. + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + 높은 화질 재다운로드 + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + 테마 + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + 기본 + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + 테마 변경 허용 + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + 언어 + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + 오디오 폴더 경로 + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + 오디오 전용 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + 동영상 폴더 경로 + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + 동영상 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + 기본 파일 출력 + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + 경로는 위의 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + 전반적으로 적용될 사용자 지정 인수 + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + 홈페이지에서의 다운로드에 대해 전반적으로 적용될 사용자 지정 인수. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + 카테고리 + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + 이 설정을 사용하면, 하나의 동영상이 카테고리와 일치할 경우, 전체 재생목록에 해당 카테고리가 표시됩니다. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + 재생목록 카테고리화 허용 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + Youtube-dl 아카이브 사용 + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + 썸네일 포함 + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + 메타데이터 포함 + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + 모든 다운로드 종료 + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + 상위 제목 + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + 파일 매니저 설정됨 + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + 다운로드 매니저 설정됨 + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + 화질 선택 허용 + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + 다운로드 전용 모드 + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + 복수 다운로드 모드 허용 + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + 오픈 API 허용 + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + 오픈 API 키 + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + 문서 보기 + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + 이것은 예전 API키를 지울 것입니다! + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + 생성 + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + 유튜브 API 사용 + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + 유튜브 API 키 + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + 키를 만드는 것은 쉽습니다! + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + 트위치 API 사용 + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + 트위치 API 키 + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + 클라이언트 ID라고도 알려져 있음. + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + 트위치 채팅 자동 다운로드 + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + 이곳을 누르세요 + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + 공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위해. + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + 반드시 확장 프로그램을 수동으로 실행하고 확장 프로그램 설정을 수정하여 프론트엔드 URL을 설정해야 합니다. + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + 파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위해. + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + 자세한 설정 지침. + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + 프론트엔드 URL을 설정하기 위해 확장 프로그램 설정을 변경하는 것 외에는 필요한 것이 많지 않습니다. + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + 아래 링크를 북마크에 끌어다 놓으시면 됩니다! 이제 그냥 다운로드하고자 하는 유튜브 비디오 페이지에서 북마크를 클릭하면 됩니다. + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + '오디오 전용' 북마크 생성 + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + 데이터베이스 위치: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + 테이블당 레코드 + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + 몽고DB 연결 문자열 + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + 예시: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + 연결 문자열 테스트 + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + DB 전환 + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + 데이터베이스 정보를 검색할 수 없습니다. 자세한 내용은 서버 로그를 확인하세요. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + 다운로더 선택 + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + 기본 다운로드 에이전트 사용 + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + 다운로드 에이전트 선택 + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + 로그 레벨 + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + 로그인 만료 + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + 고급 다운로드 허용 + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + 쿠키 사용 + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + 쿠키 설정 + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + 서버 재시작 + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + 사용자 등록 허용 + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + 인증 방법 + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + 내부 + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + LDAP URL + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + Bind DN + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + Bind Credentials + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + 기본 검색 + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + 검색 필터 + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + YoutubeDL-Material에 대하여 + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + 은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신은 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 할 수도 있습니다. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + 은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 모든 지원되는 기능을 확인해보세요. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + 설치된 버전: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + 버그를 찾았거나 제안하실 사항이 있으신가요? + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + 이슈를 생성하기 위해! + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + 업데이트 확인중... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + 업데이트 가능 + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + 설정 메뉴에서 업데이트를 할 수 있습니다. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + 선택된 버전: + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + 공유 허용 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + 타임스탬프 사용 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + 클립보드에 복사 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + 재생목록 공유 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + 파일 공유 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + 세션 아이디: + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + 모든 다운로드된 항목 지우기 + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + (현재) + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + 다운로드된 항목 없음! + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + 프로필 + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + 로그아웃 + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + 생성됨: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + 로그인하지 않았습니다. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + 관리자 계정 생성 + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + 기본 관리자 계정이 감지되지 않았습니다. 이것은 'admin'이라는 ID를 가진 관리자 계정을 만들고, 비밀번호를 설정할 것입니다. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + 생성 + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + 사용자 추가 + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + 역할 수정 + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + ID + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + 역할 + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + 액션 + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + 사용자 관리 + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + 사용자 삭제 + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + 사용자 수정 + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + 사용자 UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + 새 비밀번호 + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + 새 비밀번호 설정 + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + 기본 역할 사용 + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + 아니오 + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + 역할 관리 + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + 줄: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + 로그 지우기 + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + 자동으로 생성됨 + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + 파일 열기 + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + 새 탭에서 파일 열기 + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + 구독중으로 가기 + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + 삭제하고 재다운로드 + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + 영원히 삭제 + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + 더 보기. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + 간략히 보기. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + 길이: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From 898165708462dd39abb1bb6ba36032da07fcf775 Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Thu, 23 Sep 2021 04:52:52 +0000 Subject: [PATCH 034/212] Translated using Weblate (Spanish) Currently translated at 84.1% (254 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/es/ --- src/assets/i18n/messages.es.xlf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/assets/i18n/messages.es.xlf b/src/assets/i18n/messages.es.xlf index 65b531f..bcf54aa 100644 --- a/src/assets/i18n/messages.es.xlf +++ b/src/assets/i18n/messages.es.xlf @@ -1622,6 +1622,14 @@ Crop video checkbox + + Download for has been queued! + ¡La descarga de se ha puesto en cola! + + src/app/main/main.component.ts + 469 + + From d60af699dca716a3f01675aa2be59750ba980b6b Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Fri, 24 Sep 2021 12:45:26 +0000 Subject: [PATCH 035/212] Translated using Weblate (Dutch) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nl/ --- src/assets/i18n/messages.nl.xlf | 448 ++++++++++++++++++++++++++++++++ 1 file changed, 448 insertions(+) diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 73902fc..50b9369 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -2656,6 +2656,454 @@ Crop video checkbox + + Skip ad + Reclame overslaan + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Add to playlist + Toevoegen aan afspeellijst + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Clear finished downloads + Afgeronde downloads wissen + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Resume all downloads + Alle downloads hervatten + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + Alle downloads onderbreken + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + Herstarten + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Show error + Foutmelding + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Watch content + Inhoud bekijken + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Resume + Hervatten + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause + Onderbreken + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Clear + Wissen + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Actions + Acties + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Progress + Voortgang + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Stage + Fase + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Title + Naam + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Date + Datum + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Copied to clipboard! + Gekopieerd naar het klembord! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Close + Sluiten + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copy to clipboard + Kopiëren naar klembord + + src/app/components/downloads/downloads.component.ts + 240 + + + + Error for + Foutmelding bij + + src/app/components/downloads/downloads.component.ts + 238 + + + + Clear + Wissen + + src/app/components/downloads/downloads.component.ts + 131 + + + + Would you like to clear your finished downloads? + Weet je zeker dat je de afgeronde downloads wilt wissen? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear finished downloads + Afgeronde downloads wissen + + src/app/components/downloads/downloads.component.ts + 129 + + + + Complete + Voltooid + + src/app/components/downloads/downloads.component.ts + 61 + + + + Downloading file + Bezig met downloaden… + + src/app/components/downloads/downloads.component.ts + 60 + + + + Getting info + Bezig met ophalen van informatie… + + src/app/components/downloads/downloads.component.ts + 59 + + + + Creating download + Bezig met samenstellen… + + src/app/components/downloads/downloads.component.ts + 58 + + + + Docker tag: + Docker-tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Build date: + Bouwdatum: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Commit hash: + Commitsom: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Installation type: + Soort installatie: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Generate NFO files + NFO-bestanden genereren + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Genereert nfo-bestanden bij elke downloaden, die voornamelijk worden gebruikt door Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + SponsorBlock-api gebruiken + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + Toon een knop die reclame overslaat (alleen ondersteunde video's. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + Automatisch afspelen + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + Beperkt de downloadsnelheid tot het opgegeven aantal, bijv. 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + Downloadsnelheidslimiet + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Beperkt het aantal gelijktijdige downloads. Stel in op -1 om niet in te perken. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Max. aantal gelijktijdige downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + You must enable multi-user mode to access this tab. + Schakel de meerderegebruikersmodus in om dit tabblad te kunnen gebruiken. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + Alleen audio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + Alleen video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Beide + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Bestandstype + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Replace args + Opties vervangen + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Automatisch afspelen + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + staat in de wachtrij! + + src/app/main/main.component.ts + 469 + + From 40cd4ead1b76b9bc1d625d0bb97bd140d8aa7da4 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 24 Sep 2021 16:42:03 +0000 Subject: [PATCH 036/212] Translated using Weblate (Korean) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ko/ --- src/assets/i18n/messages.ko.xlf | 464 +++++++++++++++++++++++++++++++- 1 file changed, 456 insertions(+), 8 deletions(-) diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf index 3746351..05a2534 100644 --- a/src/assets/i18n/messages.ko.xlf +++ b/src/assets/i18n/messages.ko.xlf @@ -4,7 +4,7 @@ About - 대하여 + 정보 src/app/app.component.html 32 @@ -22,7 +22,7 @@ Dark - 다크 + 다크 모드 src/app/app.component.html 23 @@ -1837,7 +1837,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - 공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위해. + 공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위하여. src/app/settings/settings.component.html 262 @@ -1855,7 +1855,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - 파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위해. + 파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위하여. src/app/settings/settings.component.html 268 @@ -1945,7 +1945,7 @@ Transfer DB to - DB 전환 + DB 전환 : src/app/settings/settings.component.html 308 @@ -2134,7 +2134,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - 은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신은 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 할 수도 있습니다. + 은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 받아볼 수도 있습니다. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2143,7 +2143,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - 은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 모든 지원되는 기능을 확인해보세요. + 은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 지원되는 모든 기능을 확인해보세요. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2170,7 +2170,7 @@ to create an issue! - 이슈를 생성하기 위해! + 이슈를 생성하기 위하여! src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2629,6 +2629,454 @@ Video duration label + + Both + 전체 + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Skip ad + 광고 스킵 + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Add to playlist + 재생목록에 추가 + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Clear finished downloads + 완료된 다운로드 기록 삭제 + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Resume all downloads + 모든 다운로드 재개 + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + 모든 다운로드 일시정지 + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + 재시작 + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Show error + 에러 보기 + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Watch content + 콘텐츠 재생 + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Resume + 재개 + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause + 일시정지 + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Clear + 삭제 + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Actions + 액션 + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Progress + 진행 + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Stage + 스테이지 + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Subscription + 구독 + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Title + 제목 + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Date + 날짜 + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Copied to clipboard! + 클립보드에 복사됨! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Close + 닫기 + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copy to clipboard + 클립보드에 복사 + + src/app/components/downloads/downloads.component.ts + 240 + + + + Error for + 에 대한 에러 + + src/app/components/downloads/downloads.component.ts + 238 + + + + Clear + 삭제 + + src/app/components/downloads/downloads.component.ts + 131 + + + + Would you like to clear your finished downloads? + 완료된 다운로드 기록을 삭제하고 싶으신가요? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear finished downloads + 완료된 다운로드 기록 삭제 + + src/app/components/downloads/downloads.component.ts + 129 + + + + Complete + 완료 + + src/app/components/downloads/downloads.component.ts + 61 + + + + Downloading file + 다운로드중인 파일 + + src/app/components/downloads/downloads.component.ts + 60 + + + + Getting info + 정보 가져오는 중 + + src/app/components/downloads/downloads.component.ts + 59 + + + + Creating download + 다운로드 생성 중 + + src/app/components/downloads/downloads.component.ts + 58 + + + + Docker tag: + 도커 태그: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Build date: + 빌드 날짜: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Commit hash: + 커밋 해시: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Installation type: + 설치 타입: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Generate NFO files + NFO 파일 생성 + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Kodi에 의해 주로 사용되는 NFO 파일을 모든 다운로드에 대해 생성합니다. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + SponsorBlock API 사용 + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + 동영상을 시청할 때 광고 스킵 버튼을 활성화합니다. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + 자동 재생 허용 + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + 다운로드 속도를 지정된 값으로 제한합니다. 예시: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + 다운로드 속도 제한 + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + 동시에 다운로드할 수 있는 다운로드 양을 제한합니다. 제한하지 않으려면 -1을 쓰세요. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + 최대 동시 다운로드수 + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + You must enable multi-user mode to access this tab. + 이 페이지에 들어오려면 복수 사용자 모드를 활성화해야 합니다. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + 오디오만 + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + 동영상만 + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + File type + 파일 종류 + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Replace args + 인수 교체 + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + 자동 재생 + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + 에 대한 다운로드가 대기열에 추가되었습니다! + + src/app/main/main.component.ts + 469 + + From 5dd48035fbfac1752aa0d577194b49cfbddbb41a Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sat, 25 Sep 2021 22:33:22 -0600 Subject: [PATCH 037/212] Improved archive management for subscription downloads Downloads that fail due to existing in the archive now appears as an error in the manager Fixed issue where redownloading sub videos wouldn't occur if it was not cleared from the download manager --- backend/downloader.js | 34 ++++++++++++++++++++-------------- backend/subscriptions.js | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/backend/downloader.js b/backend/downloader.js index 86e6f5e..f1ada44 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -279,7 +279,9 @@ async function downloadQueuedFile(download_uid) { } else if (output) { if (output.length === 0 || output[0].length === 0) { // ERROR! - logger.warn(`No output received for video download, check if it exists in your archive.`) + const error_message = `No output received for video download, check if it exists in your archive.`; + await handleDownloadError(download_uid, error_message); + logger.warn(error_message); resolve(false); return; } @@ -344,9 +346,10 @@ async function downloadQueuedFile(download_uid) { } if (options.merged_string !== null && options.merged_string !== undefined) { - let current_merged_archive = fs.readFileSync(path.join(fileFolderPath, `merged_${type}.txt`), 'utf8'); - let diff = current_merged_archive.replace(options.merged_string, ''); - const archive_path = download['user_uid'] ? path.join(fileFolderPath, 'archives', `archive_${type}.txt`) : path.join(archivePath, `archive_${type}.txt`); + const archive_folder = getArchiveFolder(fileFolderPath, options, download['user_uid']); + const current_merged_archive = fs.readFileSync(path.join(archive_folder, `merged_${type}.txt`), 'utf8'); + const diff = current_merged_archive.replace(options.merged_string, ''); + const archive_path = path.join(archive_folder, `archive_${type}.txt`); fs.appendFileSync(archive_path, diff); } @@ -455,23 +458,16 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { - let archive_folder = null; - if (options.customArchivePath) { - archive_folder = path.join(options.customArchivePath); - } else if (user_uid) { - archive_folder = path.join(fileFolderPath, 'archives'); - } else { - archive_folder = path.join(archivePath); - } + const archive_folder = getArchiveFolder(fileFolderPath, options, user_uid); const archive_path = path.join(archive_folder, `archive_${type}.txt`); await fs.ensureDir(archive_folder); await fs.ensureFile(archive_path); - let blacklist_path = path.join(archive_folder, `blacklist_${type}.txt`); + const blacklist_path = path.join(archive_folder, `blacklist_${type}.txt`); await fs.ensureFile(blacklist_path); - let merged_path = path.join(fileFolderPath, `merged_${type}.txt`); + const merged_path = path.join(archive_folder, `merged_${type}.txt`); await fs.ensureFile(merged_path); // merges blacklist and regular archive let inputPathList = [archive_path, blacklist_path]; @@ -623,4 +619,14 @@ exports.generateNFOFile = (info, output_path) => { const doc = create(nfo_obj); const xml = doc.end({ prettyPrint: true }); fs.writeFileSync(output_path, xml); +} + +function getArchiveFolder(fileFolderPath, options, user_uid) { + if (options.customArchivePath) { + return path.join(options.customArchivePath); + } else if (user_uid) { + return path.join(fileFolderPath, 'archives'); + } else { + return path.join(archivePath); + } } \ No newline at end of file diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 90b6873..2659e40 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -431,7 +431,7 @@ async function getFilesToDownload(sub, output_jsons) { const files_to_download = []; for (let i = 0; i < output_jsons.length; i++) { const output_json = output_jsons[i]; - const file_missing = !(await db_api.getRecord('files', {sub_id: sub.id, url: output_json['webpage_url']})) && !(await db_api.getRecord('download_queue', {sub_id: sub.id, url: output_json['webpage_url'], error: null})); + const file_missing = !(await db_api.getRecord('files', {sub_id: sub.id, url: output_json['webpage_url']})) && !(await db_api.getRecord('download_queue', {sub_id: sub.id, url: output_json['webpage_url'], error: null, finished: false})); if (file_missing) { const file_with_path_exists = await db_api.getRecord('files', {sub_id: sub.id, path: output_json['_filename']}); if (file_with_path_exists) { From 46087f622eae6514a90c8f69d7801d7b38157315 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 26 Sep 2021 02:40:05 -0600 Subject: [PATCH 038/212] Switched forever.js to pm2 Updated winston --- Dockerfile | 5 +- backend/ecosystem.config.js | 8 +++ backend/entrypoint.sh | 2 +- backend/package-lock.json | 137 +++++++++++++++--------------------- backend/package.json | 2 +- 5 files changed, 69 insertions(+), 85 deletions(-) create mode 100644 backend/ecosystem.config.js diff --git a/Dockerfile b/Dockerfile index d2b9d75..8324e3c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,6 @@ ENV UID=1000 \ USER=youtube ENV NO_UPDATE_NOTIFIER=true -ENV FOREVER_ROOT=/app/.forever RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID @@ -37,7 +36,7 @@ RUN apk add --no-cache \ WORKDIR /app COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install forever -g +RUN npm install pm2 -g RUN npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] @@ -45,4 +44,4 @@ COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "forever", "app.js" ] +CMD [ "pm2-runtime", "ecosystem.config.js" ] diff --git a/backend/ecosystem.config.js b/backend/ecosystem.config.js new file mode 100644 index 0000000..70b6e9d --- /dev/null +++ b/backend/ecosystem.config.js @@ -0,0 +1,8 @@ +module.exports = { + apps : [{ + name : "YoutubeDL-Material", + script : "./app.js", + watch : "placeholder", + watch_delay: 5000 + }] +} diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 611bcc8..c4c0edc 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/sh set -eu -CMD="forever app.js" +CMD="pm2-runtime ecosystem.config.js" # if the first arg starts with "-" pass it to program if [ "${1#-}" != "$1" ]; then diff --git a/backend/package-lock.json b/backend/package-lock.json index 3093a80..6554427 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -4,6 +4,16 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@oozcitak/dom": { "version": "1.15.10", "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", @@ -725,11 +735,6 @@ "simple-swizzle": "^0.2.2" } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" - }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -983,16 +988,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -1104,12 +1099,9 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "encodeurl": { "version": "1.0.2", @@ -1124,11 +1116,6 @@ "once": "^1.4.0" } }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1238,15 +1225,10 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, "fill-range": { "version": "7.0.1", @@ -1303,6 +1285,11 @@ } } }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", @@ -1821,12 +1808,9 @@ } }, "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "latest-version": { "version": "5.1.0", @@ -2032,21 +2016,21 @@ } }, "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", + "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", "requires": { "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", + "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", "triple-beam": "^1.3.0" }, "dependencies": { "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -2510,9 +2494,12 @@ } }, "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } }, "onetime": { "version": "5.1.0", @@ -2934,6 +2921,11 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3529,42 +3521,27 @@ } }, "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } + "winston-transport": "^4.4.0" } }, "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", "requires": { - "readable-stream": "^2.3.6", + "readable-stream": "^2.3.7", "triple-beam": "^1.2.0" }, "dependencies": { diff --git a/backend/package.json b/backend/package.json index 234ab9c..ef5d119 100644 --- a/backend/package.json +++ b/backend/package.json @@ -65,7 +65,7 @@ "shortid": "^2.2.15", "unzipper": "^0.10.10", "uuidv4": "^6.0.6", - "winston": "^3.2.1", + "winston": "^3.3.3", "xmlbuilder2": "^3.0.2", "youtube-dl": "^3.0.2" } From 17e8861c401f517b25b02305bd29365a486afaf6 Mon Sep 17 00:00:00 2001 From: min Date: Sun, 26 Sep 2021 03:56:02 +0000 Subject: [PATCH 039/212] Translated using Weblate (Korean) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ko/ --- src/assets/i18n/messages.ko.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf index 05a2534..363a2f7 100644 --- a/src/assets/i18n/messages.ko.xlf +++ b/src/assets/i18n/messages.ko.xlf @@ -92,7 +92,7 @@ Only Audio - 오디오만 + 오디오만 다운로드 src/app/main/main.component.html 65,66 @@ -2777,7 +2777,7 @@ Stage - 스테이지 + 상태 src/app/components/downloads/downloads.component.html 36 From dbeeb32d48e16407c426b0b056457f39d0fe2bdc Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Mon, 27 Sep 2021 18:11:38 -0600 Subject: [PATCH 040/212] Updated Dockerfile and entrypoint to use pm2 instead of forever --- Dockerfile | 2 +- backend/entrypoint.sh | 2 +- backend/pm2.config.js | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 backend/pm2.config.js diff --git a/Dockerfile b/Dockerfile index 8324e3c..4a2d3b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,4 +44,4 @@ COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "pm2-runtime", "ecosystem.config.js" ] +CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index c4c0edc..5074353 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/sh set -eu -CMD="pm2-runtime ecosystem.config.js" +CMD="pm2-runtime pm2.config.js" # if the first arg starts with "-" pass it to program if [ "${1#-}" != "$1" ]; then diff --git a/backend/pm2.config.js b/backend/pm2.config.js new file mode 100644 index 0000000..42e78c5 --- /dev/null +++ b/backend/pm2.config.js @@ -0,0 +1,7 @@ +module.exports = { + apps : [{ + name : "YoutubeDL-Material", + script : "./app.js", + watch : "placeholder" + }] +} \ No newline at end of file From 5fee3fd281813c5fc1cce85c122b59be4a1b01cb Mon Sep 17 00:00:00 2001 From: dejan995 Date: Tue, 28 Sep 2021 13:48:58 +0200 Subject: [PATCH 041/212] Added translation using Weblate (Macedonian) --- src/assets/i18n/messages.mk.xlf | 3040 +++++++++++++++++++++++++++++++ 1 file changed, 3040 insertions(+) create mode 100644 src/assets/i18n/messages.mk.xlf diff --git a/src/assets/i18n/messages.mk.xlf b/src/assets/i18n/messages.mk.xlf new file mode 100644 index 0000000..54ed7d6 --- /dev/null +++ b/src/assets/i18n/messages.mk.xlf @@ -0,0 +1,3040 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 67 + + Dark mode toggle label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 34 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Settings + + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + + + src/app/main/main.component.ts + 469 + + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Autoplay + + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Replace args + + + src/app/main/main.component.html + 116,117 + + Replace args + + + Custom args + + + src/app/main/main.component.html + 120 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 123,124 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 131,132 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 135 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 137 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 117 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 138 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 145,146 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 149 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 154 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Crop from (seconds) + + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 10 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 38 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 487 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + File type + + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 16 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 46 + + No playlist subscriptions text + + + You must enable multi-user mode to access this tab. + + + src/app/settings/settings.component.ts + 48 + + + + Main + + + src/app/settings/settings.component.html + 4 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 94 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 198 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 339 + + Host settings label + + + Logs + + + src/app/settings/settings.component.html + 476 + + + src/app/settings/settings.component.html + 476 + + Logs settings label + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 11 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 16 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 17 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 26 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 30 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 31 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 40 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 44 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 45 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 50 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 51 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 64 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 66 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 72 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 81 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 101 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 102 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 108 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 109 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 115 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 118 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 125 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 126 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 136 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 158 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 162 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 166 + + Include metadata setting + + + Max concurrent downloads + + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Kill all downloads + + + src/app/settings/settings.component.html + 191 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 204 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 209 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 212 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 215 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 218 + + Download only mode setting + + + Allow autoplay + + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enable Public API + + + src/app/settings/settings.component.html + 229 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 234 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 235 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 239 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 239 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 248 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 253 + + + src/app/settings/settings.component.html + 265 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 257 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 264 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 265 + + Twitch API Key setting hint AKA preamble + + + Enables a button to skip ads when viewing supported videos. + + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 260 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 281 + + + src/app/settings/settings.component.html + 287 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 281 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 282 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 287 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 288 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 288 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 293 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 294 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 345 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 354 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 358 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 372 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 384 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 395 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 403 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 404 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Users + + + src/app/settings/settings.component.html + 425 + + Users settings label + + + Allow user registration + + + src/app/settings/settings.component.html + 431 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 435 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 437 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 440 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 447 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 452 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 457 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 462 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 467 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Installation type: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Docker tag: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Skip ad + + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From 90dd39b9eb1b66c506327d6de92d93c149684661 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 28 Sep 2021 09:00:34 +0000 Subject: [PATCH 042/212] Translated using Weblate (Korean) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ko/ --- src/assets/i18n/messages.ko.xlf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf index 363a2f7..aaac8b5 100644 --- a/src/assets/i18n/messages.ko.xlf +++ b/src/assets/i18n/messages.ko.xlf @@ -272,7 +272,7 @@ Crop from (seconds) - 자르기 시작지점 (초) + 자르기 시작 지점 (초) src/app/main/main.component.html 159 @@ -281,7 +281,7 @@ Crop to (seconds) - 자르기 마무리지점 (초) + 자르기 끝 지점 (초) src/app/main/main.component.html 164 @@ -409,7 +409,7 @@ Subscribe to playlist or channel - 재생목록이나 채널 구독 + 채널 혹은 재생목록 구독 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -431,7 +431,7 @@ The playlist or channel URL - 재생목록이나 채널 URL + 채널 혹은 재생목록 URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -440,7 +440,7 @@ Custom name - 사용자 지정 이름 + 표시될 이름 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -449,7 +449,7 @@ Download all uploads - 모든 업로드 된 파일 다운로드 + 업로드 된 모든 파일 다운로드 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -945,7 +945,7 @@ Randomize order when playing - 재생할 때 재생목록 섞기 + 재생시 랜덤 재생 src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -963,7 +963,7 @@ Normal order - 기본 순서 + 순서 일반 src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -1016,7 +1016,7 @@ Editing - 수정중 + 수정 : src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1025,7 +1025,7 @@ Paused - 일시정지됨 + 구독 일시정지 src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -2877,7 +2877,7 @@ Downloading file - 다운로드중인 파일 + 파일 다운로드 중 src/app/components/downloads/downloads.component.ts 60 @@ -3053,7 +3053,7 @@ Replace args - 인수 교체 + 전체 인수 교체 src/app/main/main.component.html 116,117 From 90120e821d30ca153cb5531baa31b59f99e03abd Mon Sep 17 00:00:00 2001 From: MeblIkea Date: Tue, 28 Sep 2021 12:33:53 +0000 Subject: [PATCH 043/212] Translated using Weblate (French) Currently translated at 88.4% (267 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/fr/ --- src/assets/i18n/messages.fr.xlf | 268 ++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) diff --git a/src/assets/i18n/messages.fr.xlf b/src/assets/i18n/messages.fr.xlf index 86dc228..13c79f1 100644 --- a/src/assets/i18n/messages.fr.xlf +++ b/src/assets/i18n/messages.fr.xlf @@ -2573,6 +2573,274 @@ Max quality placeholder + + Transfer DB to + Transférer la base de donnés à + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Test connection string + Tester la chaîne de connexion + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Example: + Exemple : + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Chaîne de connexion MongoDB + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Records per table + Enregistrements par table + + src/app/settings/settings.component.html + 310 + + Records per table label + + + Database location: + Emplacement de la base de donné : + + src/app/settings/settings.component.html + 309 + + Database location label + + + Generate NFO files + Générer des fichiers NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Générer des fichiers NFO à chaque téléchargement, principalement utilisés par Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + Utiliser SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + Activer un bouton pour ignorer les annonces lors du visionnage des vidéos prises en charge. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + Autoriser l'autoplay + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + Le taux limite vos téléchargements à la quantité spécifiée. Ex : 200 000 + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + Limite de téléchargements simultanés + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitez le nombre de téléchargements qui peuvent être effectués simultanément. Utilisez -1 pour aucune limite. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Téléchargements simultanés maximum + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Allow playlist categorization + Autoriser la catégorisation de la playlist + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Quand ces paramètres ce paramètre est activé, si une vidéo entre dans une catégorie, toute la playlist va recevoir cette catégorie. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Database + Base de donnés + + src/app/settings/settings.component.html + 303 + + Database settings label + + + You must enable multi-user mode to access this tab. + Vous devez activer le mode multi-utilisateurs pour accéder à cet onglet. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + Audio seulement + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + Vidéos seulement + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Mêmes + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Type de fichier + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Randomize order when playing + Ordre aléatoire quand joué + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Rajuster à (secondes) + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Crop from (seconds) + Rajuster de (secondes) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop file + Rajuster le fichier + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Replace args + Remplacer les arguments + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Autoplay + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + Le téléchargement à était ajouté à la queue! + + src/app/main/main.component.ts + 469 + + From 9b88150555f377ff5a81e879ca812dedb3bb4bd7 Mon Sep 17 00:00:00 2001 From: dejan995 Date: Tue, 28 Sep 2021 19:08:45 +0000 Subject: [PATCH 044/212] Translated using Weblate (Macedonian) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/mk/ --- src/assets/i18n/messages.mk.xlf | 648 ++++++++++++++++---------------- 1 file changed, 324 insertions(+), 324 deletions(-) diff --git a/src/assets/i18n/messages.mk.xlf b/src/assets/i18n/messages.mk.xlf index 54ed7d6..66cfc31 100644 --- a/src/assets/i18n/messages.mk.xlf +++ b/src/assets/i18n/messages.mk.xlf @@ -4,7 +4,7 @@ About - + За апликацијата src/app/app.component.html 32 @@ -13,7 +13,7 @@ Profile - + Профил src/app/app.component.html 19 @@ -22,7 +22,7 @@ Dark - + Темна Тема src/app/app.component.html 23 @@ -35,7 +35,7 @@ Home - + Почетна src/app/app.component.html 43 @@ -44,7 +44,7 @@ Login - + Најавување src/app/app.component.html 44 @@ -61,7 +61,7 @@ Subscriptions - + Претплати src/app/app.component.html 45 @@ -70,7 +70,7 @@ Downloads - + Превземања src/app/app.component.html 46 @@ -79,7 +79,7 @@ Settings - + Подесувања src/app/app.component.html 49 @@ -92,15 +92,15 @@ Download for has been queued! - + Превземањето за е ставено во редицата за чекање! src/app/main/main.component.ts 469 - Only Audio - + Only Audio + Само Аудио src/app/main/main.component.html 65,66 @@ -108,8 +108,8 @@ Only Audio checkbox - Download - + Download + Превземи src/app/main/main.component.html 79,80 @@ -117,8 +117,8 @@ Main download button - Quality - + Quality + Квалитет src/app/main/main.component.html 19,20 @@ -127,7 +127,7 @@ Use URL - + Користи URL src/app/main/main.component.html 51 @@ -135,8 +135,8 @@ YT search Use URL button for searched video - View - + View + Прегледај src/app/main/main.component.html 55,56 @@ -144,8 +144,8 @@ YT search View button for searched video - Autoplay - + Autoplay + Автоматска репродукција src/app/main/main.component.html 70,71 @@ -153,8 +153,8 @@ Autoplay checkbox - Cancel - + Cancel + Откажи src/app/main/main.component.html 84,85 @@ -162,8 +162,8 @@ Cancel download button - Advanced - + Advanced + Напредно src/app/main/main.component.html 96,97 @@ -171,8 +171,8 @@ Advanced download mode panel - Use custom args - + Use custom args + Користи персонализирани аргументи src/app/main/main.component.html 110,111 @@ -180,8 +180,8 @@ Use custom args checkbox - Replace args - + Replace args + Замени аргументи src/app/main/main.component.html 116,117 @@ -190,7 +190,7 @@ Custom args - + Персонализирани аргументи src/app/main/main.component.html 120 @@ -206,8 +206,8 @@ Custom args placeholder - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Нема потреба од URL, само се после него. Аргументите се раздалечени со две запирки: ,, src/app/main/main.component.html 123,124 @@ -215,8 +215,8 @@ Custom Args input hint - Use custom output - + Use custom output + Користи персонализиран output src/app/main/main.component.html 131,132 @@ -225,7 +225,7 @@ Custom output - + Персонализиран output src/app/main/main.component.html 135 @@ -234,7 +234,7 @@ Documentation - + Документација src/app/main/main.component.html 137 @@ -259,7 +259,7 @@ Path is relative to the config download path. Don't include extension. - + Патеката е релативна на патеката за превземања. Не користете екстензија. src/app/main/main.component.html 138 @@ -279,8 +279,8 @@ Custom Output input hint - Crop file - + Crop file + Исечи го видеото src/app/main/main.component.html 160,161 @@ -288,8 +288,8 @@ Crop video checkbox - Simulated command: - + Simulated command: + Симулирана команда: src/app/main/main.component.html 102,103 @@ -297,8 +297,8 @@ Simulated command label - Use authentication - + Use authentication + Користи автентикација src/app/main/main.component.html 145,146 @@ -307,7 +307,7 @@ Username - + Корисничко име src/app/main/main.component.html 149 @@ -316,7 +316,7 @@ Password - + Лозинка src/app/main/main.component.html 154 @@ -333,7 +333,7 @@ Crop from (seconds) - + Сечи од (секунди) src/app/main/main.component.html 164 @@ -342,7 +342,7 @@ Crop to (seconds) - + Сечи до (секунди) src/app/main/main.component.html 169 @@ -351,7 +351,7 @@ Create a playlist - + Креирај плејлиста src/app/create-playlist/create-playlist.component.html 1 @@ -360,7 +360,7 @@ Name - + Име src/app/create-playlist/create-playlist.component.html 6 @@ -377,7 +377,7 @@ Type - + Вид src/app/create-playlist/create-playlist.component.html 11 @@ -386,7 +386,7 @@ Audio - + Аудио src/app/create-playlist/create-playlist.component.html 12 @@ -395,7 +395,7 @@ Video - + Видео src/app/create-playlist/create-playlist.component.html 13 @@ -404,7 +404,7 @@ Audio files - + Аудио фајлови src/app/create-playlist/create-playlist.component.html 19 @@ -413,7 +413,7 @@ Videos - + Видео фајлови src/app/create-playlist/create-playlist.component.html 20 @@ -426,7 +426,7 @@ Subscribe to playlist or channel - + Претплати се на плејлиста или канал src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -435,7 +435,7 @@ URL - + URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 8 @@ -448,7 +448,7 @@ The playlist or channel URL - + URL од плејлиста или канал src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -457,7 +457,7 @@ Custom name - + Персонализирано име src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -466,7 +466,7 @@ Download all uploads - + Превземи ја цела содржина src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -479,7 +479,7 @@ Max quality - + MAX Квалитет src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 40 @@ -492,7 +492,7 @@ Audio-only mode - + Режим само за Аудио src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -505,7 +505,7 @@ Streaming-only mode - + Режим само за стриминг src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -518,7 +518,7 @@ These are added after the standard args. - + Овие се додаваат после стандардните аргументи. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -531,7 +531,7 @@ Custom file output - + Персонализиран output src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -548,7 +548,7 @@ Cancel - + Откажи src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -589,7 +589,7 @@ Subscribe - + Претплати се src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -598,7 +598,7 @@ Download videos uploaded in the last - + Превземи ги само најновите видеа src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -611,7 +611,7 @@ Type: - + Вид: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 5 @@ -620,7 +620,7 @@ URL: - + URL: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 9 @@ -633,7 +633,7 @@ ID: - + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -650,7 +650,7 @@ Close - + Затвори src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -695,7 +695,7 @@ Export Archive - + Експортирај Архива src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -704,7 +704,7 @@ Unsubscribe - + Отпишете се src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -713,7 +713,7 @@ (Paused) - + (Паузирано) src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -738,7 +738,7 @@ Archive: - + Архива: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -747,7 +747,7 @@ Name: - + Име: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 5 @@ -760,7 +760,7 @@ Uploader: - + Уплоадер: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 13 @@ -769,7 +769,7 @@ File size: - + Големина на фајлот: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 17 @@ -778,7 +778,7 @@ Path: - + Патека: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 21 @@ -787,7 +787,7 @@ Upload Date: - + Дата на прикачување: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 25 @@ -796,7 +796,7 @@ Category: - + Категорија: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 29 @@ -805,7 +805,7 @@ Modify youtube-dl args - + Измени ги аргументите за youtube-dl src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -814,7 +814,7 @@ Simulated new args - + Симулирани нови аргументи src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -823,7 +823,7 @@ Add an arg - + Додади аргумент src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -832,7 +832,7 @@ Search by category - + Пребарај по категорија src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -841,7 +841,7 @@ Use arg value - + Користи ја вредноста на аргументот src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -850,7 +850,7 @@ Add arg - + Додади аргумент src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -859,7 +859,7 @@ Modify - + Измени src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -868,7 +868,7 @@ Arg value - + Вредност на аргумент src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -877,7 +877,7 @@ Updater - + Ажурирач src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 @@ -886,7 +886,7 @@ Register a user - + Регистрирај корисник src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -895,7 +895,7 @@ User name - + Корисничко име src/app/dialogs/add-user-dialog/add-user-dialog.component.html 6 @@ -904,7 +904,7 @@ Register - + Регистрирај src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -917,7 +917,7 @@ Upload new cookies - + Прикачи нови колачиња src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -926,7 +926,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - + ЗАБЕЛЕШКА: Со прикачување на нови колачиња, ќе ги изгубете старите. Исто така, колачињата се глобални, а не по корисник. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -935,7 +935,7 @@ Drag and Drop - + Повлечи и Пушти src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 11 @@ -944,7 +944,7 @@ Modify playlist - + Измени плејлиста src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -953,7 +953,7 @@ Save - + Зачувај src/app/dialogs/modify-playlist/modify-playlist.component.html 43 @@ -978,7 +978,7 @@ Randomize order when playing - + Рандом редослед src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -987,7 +987,7 @@ Add content - + Додади содржини src/app/dialogs/modify-playlist/modify-playlist.component.html 24 @@ -995,8 +995,8 @@ Add content - Normal order  - + Normal order + Нормален редослед src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -1004,8 +1004,8 @@ Normal order - Reverse order  - + Reverse order + Обратен редослед src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -1014,7 +1014,7 @@ My videos - + Мој Видеа src/app/components/recent-videos/recent-videos.component.html 20 @@ -1023,7 +1023,7 @@ Search - + Пребарај src/app/components/recent-videos/recent-videos.component.html 24 @@ -1040,7 +1040,7 @@ File type - + Вид на фајл src/app/components/recent-videos/recent-videos.component.html 52 @@ -1049,7 +1049,7 @@ Both - + Заедно src/app/components/recent-videos/recent-videos.component.html 54 @@ -1058,7 +1058,7 @@ Video only - + Само видео src/app/components/recent-videos/recent-videos.component.html 55 @@ -1067,7 +1067,7 @@ Audio only - + Само аудио src/app/components/recent-videos/recent-videos.component.html 56 @@ -1076,7 +1076,7 @@ No videos found. - + Не се пронајдени видеа. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1085,7 +1085,7 @@ Editing - + Уредување src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1094,7 +1094,7 @@ Paused - + Паузирано src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1103,7 +1103,7 @@ Editing category - + Уредување на категорија src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1112,7 +1112,7 @@ Rules - + Правила src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 10 @@ -1121,7 +1121,7 @@ Add new rule - + Додади ново правило src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1130,7 +1130,7 @@ Download Twitch Chat - + Превземи Twitch Chat src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1139,7 +1139,7 @@ Edit - + Измени src/app/file-card/file-card.component.html 19 @@ -1152,7 +1152,7 @@ Delete - + Избриши src/app/file-card/file-card.component.html 20 @@ -1173,7 +1173,7 @@ Info - + Инфо src/app/file-card/file-card.component.html 24 @@ -1190,7 +1190,7 @@ Count: - + Број: src/app/file-card/file-card.component.html 8 @@ -1199,7 +1199,7 @@ Delete and blacklist - + Избриши и додади на црна листа src/app/file-card/file-card.component.html 26 @@ -1212,7 +1212,7 @@ views - + прегледи src/app/player/player.component.html 16 @@ -1221,7 +1221,7 @@ The download was successful - + Превземањето е успешно src/app/download-item/download-item.component.html 8 @@ -1234,7 +1234,7 @@ An error has occurred - + Настана грешка src/app/download-item/download-item.component.html 9 @@ -1247,7 +1247,7 @@ Details - + Детали src/app/download-item/download-item.component.html 18 @@ -1256,7 +1256,7 @@ An error has occurred: - + Настана грешка: src/app/download-item/download-item.component.html 27 @@ -1265,7 +1265,7 @@ Download start: - + Почеток на превземање: src/app/download-item/download-item.component.html 32 @@ -1274,7 +1274,7 @@ Download end: - + Завршеток на превземање: src/app/download-item/download-item.component.html 35 @@ -1283,7 +1283,7 @@ File path(s): - + Патека(и) за фајлови: src/app/download-item/download-item.component.html 38 @@ -1292,7 +1292,7 @@ Your subscriptions - + Вашите претплати src/app/subscriptions/subscriptions.component.html 3 @@ -1301,7 +1301,7 @@ Channels - + Канали src/app/subscriptions/subscriptions.component.html 8 @@ -1310,7 +1310,7 @@ Playlists - + Плејлисти src/app/subscriptions/subscriptions.component.html 30 @@ -1319,7 +1319,7 @@ Name not available. Channel retrieval in progress. - + Името не е достапно. Вчитувањето на каналот е во тек. src/app/subscriptions/subscriptions.component.html 14 @@ -1328,7 +1328,7 @@ You have no channel subscriptions. - + Немате претплати за канали. src/app/subscriptions/subscriptions.component.html 27 @@ -1337,7 +1337,7 @@ Name not available. Playlist retrieval in progress. - + Името не е достапно. Вчитувањето на плејлистата е во тек. src/app/subscriptions/subscriptions.component.html 36 @@ -1346,7 +1346,7 @@ You have no playlist subscriptions. - + Немате претплати за плејлисти. src/app/subscriptions/subscriptions.component.html 46 @@ -1355,7 +1355,7 @@ You must enable multi-user mode to access this tab. - + Мора да го вклучето мулти-корисничкиот режим за да имате пристап до овој таб. src/app/settings/settings.component.ts 48 @@ -1363,7 +1363,7 @@ Main - + Главно src/app/settings/settings.component.html 4 @@ -1372,7 +1372,7 @@ Downloader - + Превземач src/app/settings/settings.component.html 94 @@ -1381,7 +1381,7 @@ Extra - + Дополнително src/app/settings/settings.component.html 198 @@ -1390,7 +1390,7 @@ Database - + База со податоци src/app/settings/settings.component.html 303 @@ -1399,7 +1399,7 @@ Advanced - + Напредно src/app/settings/settings.component.html 339 @@ -1408,7 +1408,7 @@ Logs - + Логови src/app/settings/settings.component.html 476 @@ -1421,7 +1421,7 @@ URL this app will be accessed from, without the port. - + URL за пристап до апликацијата, без port број. src/app/settings/settings.component.html 11 @@ -1430,7 +1430,7 @@ Port - + Port број src/app/settings/settings.component.html 16 @@ -1439,7 +1439,7 @@ The desired port. Default is 17442. - + Посакуваниот port број. Стандардно е 17442. src/app/settings/settings.component.html 17 @@ -1448,7 +1448,7 @@ Multi-user mode - + Мулти-Корисничи режим src/app/settings/settings.component.html 26 @@ -1457,7 +1457,7 @@ Users base path - + Основна патека за корисниците src/app/settings/settings.component.html 30 @@ -1466,7 +1466,7 @@ Base path for users and their downloaded videos. - + Основна патека за корисниците и нивните превземања. src/app/settings/settings.component.html 31 @@ -1475,7 +1475,7 @@ Allow subscriptions - + Овозможете претплати src/app/settings/settings.component.html 40 @@ -1484,7 +1484,7 @@ Subscriptions base path - + Основна патека за претплати src/app/settings/settings.component.html 44 @@ -1493,7 +1493,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - + Основна патека за видеа од вашите претплатени канали и плејлисти. Релативна е на главниот фолдер за YTDL-Material. src/app/settings/settings.component.html 45 @@ -1502,7 +1502,7 @@ Check interval - + Интервал за проверка src/app/settings/settings.component.html 50 @@ -1511,7 +1511,7 @@ Unit is seconds, only include numbers. - + Единицата е секунди, внесете само броеви. src/app/settings/settings.component.html 51 @@ -1520,7 +1520,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - + Понекогаш новите видеа се превземани пред да бидат целосно процесирани. Оваа опција, доколку е активна, наредниот ден ке провери дали има верзија од видеото со повисок квалитет. src/app/settings/settings.component.html 55 @@ -1529,7 +1529,7 @@ Redownload fresh uploads - + Повторно превземање на најновите прикачувања src/app/settings/settings.component.html 55 @@ -1538,7 +1538,7 @@ Theme - + Тема src/app/settings/settings.component.html 64 @@ -1547,7 +1547,7 @@ Default - + Стандардно src/app/settings/settings.component.html 66 @@ -1556,7 +1556,7 @@ Allow theme change - + Дозволете промена на тема src/app/settings/settings.component.html 72 @@ -1565,7 +1565,7 @@ Language - + Јазик src/app/settings/settings.component.html 81 @@ -1574,7 +1574,7 @@ Audio folder path - + Патека за аудио фајловите src/app/settings/settings.component.html 101 @@ -1583,7 +1583,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - + Патека за превземањата само со аудио. Релативна е на главната патека за YTDL-Material. src/app/settings/settings.component.html 102 @@ -1592,7 +1592,7 @@ Video folder path - + Патека за видео фајловите src/app/settings/settings.component.html 108 @@ -1601,7 +1601,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - + Патека за превземените видеа. Релативна е на главната патека за YTDL-Material. src/app/settings/settings.component.html 109 @@ -1610,7 +1610,7 @@ Default file output - + Стандарден фајл output src/app/settings/settings.component.html 115 @@ -1619,7 +1619,7 @@ Path is relative to the above download paths. Don't include extension. - + Патеката е релативна на патеките за превземања од опциите погоре. Не внесувајте екстензија. src/app/settings/settings.component.html 118 @@ -1628,7 +1628,7 @@ Global custom args - + Глобални персонализирани аргументи src/app/settings/settings.component.html 125 @@ -1637,7 +1637,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - + Глобални персонализирани аргументи за превземања на почетната страна. Аргументите се раздалечени со две запирки: ,, src/app/settings/settings.component.html 126 @@ -1646,7 +1646,7 @@ Categories - + Категории src/app/settings/settings.component.html 136 @@ -1655,7 +1655,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - + Со оваа опција активна, ако едно видео спадне во одредена категорија, целата плејлиста ќе биде додадена во истата категорија. src/app/settings/settings.component.html 150 @@ -1664,7 +1664,7 @@ Allow playlist categorization - + Дозволете категоризација на плејлисти src/app/settings/settings.component.html 150 @@ -1673,7 +1673,7 @@ Use youtube-dl archive - + Користи ја опцијата за архивирање на youtube-dl src/app/settings/settings.component.html 158 @@ -1682,7 +1682,7 @@ Include thumbnail - + Вклучи превземање на мини-слика src/app/settings/settings.component.html 162 @@ -1691,7 +1691,7 @@ Include metadata - + Вклучи превземата на метадата src/app/settings/settings.component.html 166 @@ -1700,7 +1700,7 @@ Max concurrent downloads - + Максимален број на истовремени превземања src/app/settings/settings.component.html 175 @@ -1709,7 +1709,7 @@ Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. - + Го лимитира бројот на истовремени превземања. Внесете -1 за да го тргнете лимитот. src/app/settings/settings.component.html 176 @@ -1718,7 +1718,7 @@ Download rate limit - + Ограничување на брзината за превземање src/app/settings/settings.component.html 181 @@ -1727,7 +1727,7 @@ Rate limits your downloads to the specified amount. Ex: 200K - + Ја лимитира брзината за превземање. Пр. 200К src/app/settings/settings.component.html 182 @@ -1736,7 +1736,7 @@ Kill all downloads - + Запри ги сите превземања src/app/settings/settings.component.html 191 @@ -1745,7 +1745,7 @@ Top title - + Наслов за почетната страна src/app/settings/settings.component.html 204 @@ -1754,7 +1754,7 @@ File manager enabled - + Вклучете го менаџерот за фајлови src/app/settings/settings.component.html 209 @@ -1763,7 +1763,7 @@ Downloads manager enabled - + Вклучете го менаџерот за превземања src/app/settings/settings.component.html 212 @@ -1772,7 +1772,7 @@ Allow quality select - + Дозволете избор на квалитет src/app/settings/settings.component.html 215 @@ -1781,7 +1781,7 @@ Download only mode - + Режим само за превземање src/app/settings/settings.component.html 218 @@ -1790,7 +1790,7 @@ Allow autoplay - + Дозволете автоматска репродукција src/app/settings/settings.component.html 221 @@ -1799,7 +1799,7 @@ Enable Public API - + Вклучете го јавниот API src/app/settings/settings.component.html 229 @@ -1808,7 +1808,7 @@ Public API Key - + Јавен API клуч src/app/settings/settings.component.html 234 @@ -1817,7 +1817,7 @@ View documentation - + Прегледај ја документацијата src/app/settings/settings.component.html 235 @@ -1826,7 +1826,7 @@ This will delete your old API key! - + Ова ќе го избрише вашиот стар API клуч! src/app/settings/settings.component.html 239 @@ -1835,7 +1835,7 @@ Generate - + Генерирај src/app/settings/settings.component.html 239 @@ -1844,7 +1844,7 @@ Use YouTube API - + Користете го API на YouTube src/app/settings/settings.component.html 248 @@ -1853,7 +1853,7 @@ Youtube API Key - + YouTube API клуч src/app/settings/settings.component.html 252 @@ -1862,7 +1862,7 @@ Generating a key is easy! - + Генерирањето на клуч е лесно! src/app/settings/settings.component.html 253 @@ -1875,7 +1875,7 @@ Use Twitch API - + Користете го API на Twitch src/app/settings/settings.component.html 257 @@ -1884,7 +1884,7 @@ Twitch API Key - + Twitch API клуч src/app/settings/settings.component.html 264 @@ -1893,7 +1893,7 @@ Also known as a Client ID. - + Клучот може да биде прикажан како Client ID. src/app/settings/settings.component.html 265 @@ -1902,7 +1902,7 @@ Enables a button to skip ads when viewing supported videos. - + Овозможете опција за прескокнување на реклами, доклоку видеото е подржано. src/app/settings/settings.component.html 269 @@ -1911,7 +1911,7 @@ Use SponsorBlock API - + Користете го API на SponsorBlock src/app/settings/settings.component.html 269 @@ -1920,7 +1920,7 @@ Generates NFO files with every download, primarily used by Kodi. - + Генерирај NFO фајлови за секое превземање, во главно се користат од Kodi. src/app/settings/settings.component.html 272 @@ -1929,7 +1929,7 @@ Generate NFO files - + Генерирај NFO фајлови src/app/settings/settings.component.html 272 @@ -1938,7 +1938,7 @@ Auto-download Twitch Chat - + Автоматско превземање на Twitch Chat src/app/settings/settings.component.html 260 @@ -1947,7 +1947,7 @@ Click here - + Кликнете овде src/app/settings/settings.component.html 281 @@ -1964,7 +1964,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - + за да ја превземете официјалната YoutubeDL-Material екстензија за Chrome. src/app/settings/settings.component.html 281 @@ -1973,7 +1973,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - + Екстензијата мора да се инсталира мануелно и да се изменат поставките за да се постави URL-линкот до апликацијата. src/app/settings/settings.component.html 282 @@ -1982,7 +1982,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - + за да ја инсталирате официјалната YoutubeDL-Material екстензија за Firefox, директно од страницата за екстензии на Firefox. src/app/settings/settings.component.html 287 @@ -1991,7 +1991,7 @@ Detailed setup instructions. - + Детални упатства за инсталирање. src/app/settings/settings.component.html 288 @@ -2000,7 +2000,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - + Треба само да се изменат подесувањата за URL-линкот до апликацијата. src/app/settings/settings.component.html 288 @@ -2009,7 +2009,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - + Само повлечето го линкот подоле во вашите обележувачи! Само одете до видеото на YouTube што сакате да го превземете и кликнете на обележувачот. src/app/settings/settings.component.html 293 @@ -2018,7 +2018,7 @@ Generate 'audio only' bookmarklet - + Генерирај обележувач за превземање само на аудио src/app/settings/settings.component.html 294 @@ -2027,7 +2027,7 @@ Database location: - + Локација на базата со податоци: src/app/settings/settings.component.html 309 @@ -2036,7 +2036,7 @@ Records per table - + Податоци по табела src/app/settings/settings.component.html 310 @@ -2045,7 +2045,7 @@ MongoDB Connection String - + Линк за поврзување со MongoDB src/app/settings/settings.component.html 318 @@ -2054,7 +2054,7 @@ Example: - + Пример: src/app/settings/settings.component.html 319 @@ -2063,7 +2063,7 @@ Test connection string - + Тестирај го линкот за конекцијата src/app/settings/settings.component.html 323 @@ -2071,8 +2071,8 @@ Test connection string button - Transfer DB to - + Transfer DB to + Префрли ја базата со податоци во src/app/settings/settings.component.html 327 @@ -2081,7 +2081,7 @@ Database information could not be retrieved. Check the server logs for more information. - + Информациите за базата со податоци не може да се превземат. Проверете ги логовите на серверот за повеќе информации. src/app/settings/settings.component.html 331 @@ -2090,7 +2090,7 @@ Select a downloader - + Изберете превземач src/app/settings/settings.component.html 345 @@ -2099,7 +2099,7 @@ Use default downloading agent - + Користете го стандардниот агент за превземање src/app/settings/settings.component.html 354 @@ -2108,7 +2108,7 @@ Select a download agent - + Селектирај агент за превземање src/app/settings/settings.component.html 358 @@ -2117,7 +2117,7 @@ Log Level - + Ниво за снимање на логови src/app/settings/settings.component.html 372 @@ -2126,7 +2126,7 @@ Login expiration - + Истекување на најавената сесија src/app/settings/settings.component.html 384 @@ -2135,7 +2135,7 @@ Allow advanced download - + Овозможи напредни превземања src/app/settings/settings.component.html 395 @@ -2144,7 +2144,7 @@ Use Cookies - + Користи колачиња src/app/settings/settings.component.html 403 @@ -2153,7 +2153,7 @@ Set Cookies - + Постави колачиња src/app/settings/settings.component.html 404 @@ -2162,7 +2162,7 @@ Restart server - + Рестарт на серверот src/app/settings/settings.component.html 416 @@ -2171,7 +2171,7 @@ Users - + Корисници src/app/settings/settings.component.html 425 @@ -2180,7 +2180,7 @@ Allow user registration - + Овозможи регистрација на корисници src/app/settings/settings.component.html 431 @@ -2189,7 +2189,7 @@ Auth method - + Метод за автентикација src/app/settings/settings.component.html 435 @@ -2198,7 +2198,7 @@ Internal - + Внатрешен src/app/settings/settings.component.html 437 @@ -2207,7 +2207,7 @@ LDAP - + LDAP src/app/settings/settings.component.html 440 @@ -2216,7 +2216,7 @@ LDAP URL - + LDAP URL src/app/settings/settings.component.html 447 @@ -2225,7 +2225,7 @@ Bind DN - + Bind DN src/app/settings/settings.component.html 452 @@ -2234,7 +2234,7 @@ Bind Credentials - + Bind Credentials src/app/settings/settings.component.html 457 @@ -2243,7 +2243,7 @@ Search Base - + Search Base src/app/settings/settings.component.html 462 @@ -2252,7 +2252,7 @@ Search Filter - + Филтер за пребарување src/app/settings/settings.component.html 467 @@ -2261,7 +2261,7 @@ About YoutubeDL-Material - + За YoutubeDL-Material src/app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2270,7 +2270,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - + е превземач за YouTube со отворен код изграден според спецификациите на Google за материјалн дизајн. Можете без проблем да ги превземате вашите омилени видеа, како видео или аудио фајлови, па дури и да се претплатите на вашите омилени канали и плејлисти за да бидете во тек со нивните нови видеа. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2279,7 +2279,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - + има вклучено неколку одлични карактеристики! Одличен API, поддршка за Docker и поддршка за локализација (превод). Прочитајте ги сите поддржани карактеристики со кликнување на иконата GitHub погоре. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2288,7 +2288,7 @@ Installed version: - + Инсталирана верзија: src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2297,7 +2297,7 @@ Installation type: - + Вид на инсталација: src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2306,7 +2306,7 @@ Commit hash: - + Commit hash: src/app/dialogs/about-dialog/about-dialog.component.html 31 @@ -2315,7 +2315,7 @@ Build date: - + Датум на градење: src/app/dialogs/about-dialog/about-dialog.component.html 33 @@ -2324,7 +2324,7 @@ Found a bug or have a suggestion? - + Пронајдовте проблем или имате предлог? src/app/dialogs/about-dialog/about-dialog.component.html 36 @@ -2333,7 +2333,7 @@ to create an issue! - + за да креирате тикет! src/app/dialogs/about-dialog/about-dialog.component.html 36 @@ -2342,7 +2342,7 @@ Checking for updates... - + Се проверува за ажурирања ... src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2351,7 +2351,7 @@ Update available - + Достапно ажурирање src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2360,7 +2360,7 @@ You can update from the settings menu. - + Може да ажурирате од менито за поставки. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2369,7 +2369,7 @@ Docker tag: - + Docker ознака: src/app/dialogs/about-dialog/about-dialog.component.html 28 @@ -2378,7 +2378,7 @@ Select a version: - + Селектирај верзија: src/app/updater/updater.component.html 3 @@ -2387,7 +2387,7 @@ Enable sharing - + Овозможи споделување src/app/dialogs/share-media-dialog/share-media-dialog.component.html 9 @@ -2396,7 +2396,7 @@ Use timestamp - + Користи временски печат src/app/dialogs/share-media-dialog/share-media-dialog.component.html 12 @@ -2405,7 +2405,7 @@ Seconds - + Секунди src/app/dialogs/share-media-dialog/share-media-dialog.component.html 14 @@ -2414,7 +2414,7 @@ Copy to clipboard - + Копирај во clipboard src/app/dialogs/share-media-dialog/share-media-dialog.component.html 23 @@ -2423,7 +2423,7 @@ Share playlist - + Сподели плејлиста src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2432,7 +2432,7 @@ Share file - + Сподели видео src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2441,7 +2441,7 @@ Creating download - + Создавање на превземање src/app/components/downloads/downloads.component.ts 58 @@ -2449,7 +2449,7 @@ Getting info - + Добивање информации src/app/components/downloads/downloads.component.ts 59 @@ -2457,7 +2457,7 @@ Downloading file - + Превземање на фајл src/app/components/downloads/downloads.component.ts 60 @@ -2465,7 +2465,7 @@ Complete - + Завршено src/app/components/downloads/downloads.component.ts 61 @@ -2473,7 +2473,7 @@ Clear finished downloads - + Исчисти ги завршените превземања src/app/components/downloads/downloads.component.ts 129 @@ -2481,7 +2481,7 @@ Would you like to clear your finished downloads? - + Дали сакате да ги исчистите завршените превземања? src/app/components/downloads/downloads.component.ts 130 @@ -2489,7 +2489,7 @@ Clear - + Исчисти src/app/components/downloads/downloads.component.ts 131 @@ -2497,7 +2497,7 @@ Error for - + Грешка за src/app/components/downloads/downloads.component.ts 238 @@ -2505,7 +2505,7 @@ Copy to clipboard - + Копирај во clipboard src/app/components/downloads/downloads.component.ts 240 @@ -2513,7 +2513,7 @@ Close - + Затвори src/app/components/downloads/downloads.component.ts 241 @@ -2521,7 +2521,7 @@ Copied to clipboard! - + Копирано во clipboard! src/app/components/downloads/downloads.component.ts 249 @@ -2529,7 +2529,7 @@ Date - + Дата src/app/components/downloads/downloads.component.html 7 @@ -2538,7 +2538,7 @@ Title - + Наслов src/app/components/downloads/downloads.component.html 13 @@ -2547,7 +2547,7 @@ Subscription - + Претплата src/app/components/downloads/downloads.component.html 23 @@ -2556,7 +2556,7 @@ Stage - + Фаза src/app/components/downloads/downloads.component.html 36 @@ -2565,7 +2565,7 @@ Progress - + Прогрес src/app/components/downloads/downloads.component.html 42 @@ -2574,7 +2574,7 @@ Actions - + Акции src/app/components/downloads/downloads.component.html 55 @@ -2583,7 +2583,7 @@ Clear - + Исчисти src/app/components/downloads/downloads.component.html 68 @@ -2596,7 +2596,7 @@ Pause - + Пауза src/app/components/downloads/downloads.component.html 59 @@ -2609,7 +2609,7 @@ Resume - + Продолжи src/app/components/downloads/downloads.component.html 60 @@ -2622,7 +2622,7 @@ Watch content - + Репродукција на содржина src/app/components/downloads/downloads.component.html 64 @@ -2635,7 +2635,7 @@ Show error - + Прикажи грешка src/app/components/downloads/downloads.component.html 65 @@ -2648,7 +2648,7 @@ Restart - + Рестарт src/app/components/downloads/downloads.component.html 66 @@ -2657,7 +2657,7 @@ Pause all downloads - + Паузирај ги сите превземања src/app/components/downloads/downloads.component.html 83 @@ -2666,7 +2666,7 @@ Resume all downloads - + Продолжи ги сите превземања src/app/components/downloads/downloads.component.html 84 @@ -2675,7 +2675,7 @@ Clear finished downloads - + Исчисти ги завршените превземања src/app/components/downloads/downloads.component.html 85 @@ -2684,7 +2684,7 @@ No downloads available! - + Нема достапни превземања! src/app/components/downloads/downloads.component.html 90 @@ -2693,7 +2693,7 @@ Your Profile - + Вашиот профил src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2702,7 +2702,7 @@ Logout - + Одјави се src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2711,7 +2711,7 @@ UID: - + UID: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 9 @@ -2720,7 +2720,7 @@ Created: - + Креирано: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 12 @@ -2729,7 +2729,7 @@ You are not logged in. - + Не сте најавени. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2738,7 +2738,7 @@ Create admin account - + Креирај профил за администратор src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2747,7 +2747,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - + Не е откриен стандарден администраторски профил. Ова ќе создаде администраторски профил со ID 'admin' и ќе постави лозинка. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2756,7 +2756,7 @@ Create - + Креирај src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2765,7 +2765,7 @@ Add Users - + Додади корисници src/app/components/modify-users/modify-users.component.html 90 @@ -2774,7 +2774,7 @@ Edit Role - + Измени ги улогите src/app/components/modify-users/modify-users.component.html 95 @@ -2782,8 +2782,8 @@ Edit role - User name - + User name + Корисничко име src/app/components/modify-users/modify-users.component.html 17 @@ -2791,8 +2791,8 @@ Username users table header - Role - + Role + Улога src/app/components/modify-users/modify-users.component.html 35 @@ -2800,8 +2800,8 @@ Role users table header - Actions - + Actions + Акции src/app/components/modify-users/modify-users.component.html 55 @@ -2810,7 +2810,7 @@ Manage user - + Управување со корисници src/app/components/modify-users/modify-users.component.html 70 @@ -2823,7 +2823,7 @@ Delete user - + Избриши корисник src/app/components/modify-users/modify-users.component.html 73 @@ -2832,7 +2832,7 @@ Edit user - + Измени корисник src/app/components/modify-users/modify-users.component.html 66 @@ -2841,7 +2841,7 @@ User UID: - + UID на корисник: src/app/components/manage-user/manage-user.component.html 4 @@ -2850,7 +2850,7 @@ New password - + Нова лозинка src/app/components/manage-user/manage-user.component.html 8 @@ -2859,7 +2859,7 @@ Set new password - + Постави нова лозинка src/app/components/manage-user/manage-user.component.html 10 @@ -2868,7 +2868,7 @@ Use role default - + Користи стандардни улоги src/app/components/manage-user/manage-user.component.html 19 @@ -2877,7 +2877,7 @@ Yes - + Да src/app/components/manage-user/manage-user.component.html 20 @@ -2890,7 +2890,7 @@ No - + Не src/app/components/manage-user/manage-user.component.html 21 @@ -2903,7 +2903,7 @@ Manage role - + Управување со улоги src/app/components/manage-role/manage-role.component.html 1 @@ -2912,7 +2912,7 @@ Lines: - + Линии: src/app/components/logs-viewer/logs-viewer.component.html 22 @@ -2921,7 +2921,7 @@ Clear logs - + Исчисти ги логовите src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2930,7 +2930,7 @@ Auto-generated - + Автоматски генериран src/app/components/unified-file-card/unified-file-card.component.html 5 @@ -2939,7 +2939,7 @@ Open file - + Отвори фајл src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2948,7 +2948,7 @@ Open file in new tab - + Отвори фајл во нов таб src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2957,7 +2957,7 @@ Go to subscription - + Одете во Претплата src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2966,7 +2966,7 @@ Add to playlist - + Додади во плејлиста src/app/components/unified-file-card/unified-file-card.component.html 26 @@ -2975,7 +2975,7 @@ Delete and redownload - + Избриши и повторно превземи src/app/components/unified-file-card/unified-file-card.component.html 34 @@ -2988,7 +2988,7 @@ Delete forever - + Избриши засекогаш src/app/components/unified-file-card/unified-file-card.component.html 37 @@ -3000,8 +3000,8 @@ Delete forever subscription video button - See more. - + See more. + Види повеќе. src/app/components/see-more/see-more.component.html 5,6 @@ -3009,8 +3009,8 @@ See more - See less. - + See less. + Види помалку. src/app/components/see-more/see-more.component.html 8,9 @@ -3019,7 +3019,7 @@ Skip ad - + Прескокни реклама src/app/components/skip-ad-button/skip-ad-button.component.html 1 @@ -3028,7 +3028,7 @@ Length: - + Времетраење: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 From 84187b94742d53b7e806cfdcef79fd04d673fa87 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 28 Sep 2021 20:14:57 -0600 Subject: [PATCH 045/212] Fixed issue where selecting video quality would Main component cleanup Removed deprecated file card component --- backend/downloader.js | 2 +- src/app/app.module.ts | 2 - src/app/file-card/file-card.component.css | 68 ------ src/app/file-card/file-card.component.html | 29 --- src/app/file-card/file-card.component.spec.ts | 25 --- src/app/file-card/file-card.component.ts | 120 ---------- src/app/main/main.component.html | 10 +- src/app/main/main.component.ts | 209 +++++------------- 8 files changed, 62 insertions(+), 403 deletions(-) delete mode 100644 src/app/file-card/file-card.component.css delete mode 100644 src/app/file-card/file-card.component.html delete mode 100644 src/app/file-card/file-card.component.spec.ts delete mode 100644 src/app/file-card/file-card.component.ts diff --git a/backend/downloader.js b/backend/downloader.js index f1ada44..e151f87 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -417,7 +417,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f downloadConfig = customArgs.split(',,'); } else { if (customQualityConfiguration) { - qualityPath = ['-f', customQualityConfiguration]; + qualityPath = ['-f', customQualityConfiguration, '--merge-output-format', 'mp4']; } else if (selectedHeight && selectedHeight !== '' && !is_audio) { qualityPath = ['-f', `'(mp4)[height=${selectedHeight}'`]; } else if (is_audio) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dcaa9ec..410a412 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -34,7 +34,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { PostsService } from 'app/posts.services'; -import { FileCardComponent } from './file-card/file-card.component'; import { RouterModule } from '@angular/router'; import { AppRoutingModule } from './app-routing.module'; import { MainComponent } from './main/main.component'; @@ -98,7 +97,6 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible @NgModule({ declarations: [ AppComponent, - FileCardComponent, MainComponent, PlayerComponent, InputDialogComponent, diff --git a/src/app/file-card/file-card.component.css b/src/app/file-card/file-card.component.css deleted file mode 100644 index a581bca..0000000 --- a/src/app/file-card/file-card.component.css +++ /dev/null @@ -1,68 +0,0 @@ -.example-card { - width: 150px; - height: 125px; - padding: 0px; -} - -.deleteButton { - top:-5px; - right:-5px; - position:absolute; -} - -/* Coerce the icon container away from display:inline */ -.mat-icon-button .mat-button-wrapper { - display: flex; - justify-content: center; -} - -.image { - width: 100%; -} - -.example-full-width-height { - width: 100%; - height: 100% -} - -.centered { - margin: 0 auto; - top: 50%; - left: 50%; -} - -.img-div { - height: 60px; - padding: 0px; - margin: 8px 0px 0px -5px; - width: calc(100% + 5px + 5px); - overflow: hidden; - border-radius: 0px 0px 4px 4px; -} - -.max-two-lines { - display: -webkit-box; - display: -moz-box; - max-height: 2.4em; - line-height: 1.2em; - overflow: hidden; - text-overflow: ellipsis; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.file-link { - width: 80%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; -} - -@media (max-width: 576px){ - - .example-card { - width: 125px !important; - } - -} \ No newline at end of file diff --git a/src/app/file-card/file-card.component.html b/src/app/file-card/file-card.component.html deleted file mode 100644 index f3c7ffe..0000000 --- a/src/app/file-card/file-card.component.html +++ /dev/null @@ -1,29 +0,0 @@ - -
-
-
- {{title}} -
- ID: {{name}} -
Count: {{count}}
-
-
- Thumbnail - - - -
-
- - - - - - - - - - - - -
diff --git a/src/app/file-card/file-card.component.spec.ts b/src/app/file-card/file-card.component.spec.ts deleted file mode 100644 index 0e940d9..0000000 --- a/src/app/file-card/file-card.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { FileCardComponent } from './file-card.component'; - -describe('FileCardComponent', () => { - let component: FileCardComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ FileCardComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FileCardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/file-card/file-card.component.ts b/src/app/file-card/file-card.component.ts deleted file mode 100644 index 5596eec..0000000 --- a/src/app/file-card/file-card.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Component, OnInit, Input, Output } from '@angular/core'; -import {PostsService} from '../posts.services'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import {EventEmitter} from '@angular/core'; -import { MainComponent } from 'app/main/main.component'; -import { Subject, Observable } from 'rxjs'; -import 'rxjs/add/observable/merge'; -import { MatDialog } from '@angular/material/dialog'; -import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; -import { ModifyPlaylistComponent } from '../dialogs/modify-playlist/modify-playlist.component'; - -@Component({ - selector: 'app-file-card', - templateUrl: './file-card.component.html', - styleUrls: ['./file-card.component.css'] -}) -export class FileCardComponent implements OnInit { - @Input() file: any; - @Input() title: string; - @Input() length: string; - @Input() name: string; - @Input() uid: string; - @Input() thumbnailURL: string; - @Input() isAudio = true; - @Output() removeFile: EventEmitter = new EventEmitter(); - @Input() playlist = null; - @Input() count = null; - @Input() use_youtubedl_archive = false; - type; - image_loaded = false; - image_errored = false; - - scrollSubject; - scrollAndLoad; - - constructor(private postsService: PostsService, public snackBar: MatSnackBar, public mainComponent: MainComponent, - private dialog: MatDialog) { - - this.scrollSubject = new Subject(); - this.scrollAndLoad = Observable.merge( - Observable.fromEvent(window, 'scroll'), - this.scrollSubject - ); - } - - ngOnInit() { - this.type = this.isAudio ? 'audio' : 'video'; - - if (this.file && this.file.url && this.file.url.includes('youtu')) { - const string_id = (this.playlist ? '?list=' : '?v=') - const index_offset = (this.playlist ? 6 : 3); - const end_index = this.file.url.indexOf(string_id) + index_offset; - this.name = this.file.url.substring(end_index, this.file.url.length); - } - } - - deleteFile(blacklistMode = false) { - if (!this.playlist) { - this.postsService.deleteFile(this.uid, blacklistMode).subscribe(result => { - if (result) { - this.openSnackBar('Delete success!', 'OK.'); - this.removeFile.emit(this.name); - } else { - this.openSnackBar('Delete failed!', 'OK.'); - } - }, err => { - this.openSnackBar('Delete failed!', 'OK.'); - }); - } else { - this.removeFile.emit(this.name); - } - - } - - openVideoInfoDialog() { - const dialogRef = this.dialog.open(VideoInfoDialogComponent, { - data: { - file: this.file, - }, - minWidth: '50vw' - }); - } - - editPlaylistDialog() { - const dialogRef = this.dialog.open(ModifyPlaylistComponent, { - data: { - playlist_id: this.playlist.id, - width: '65vw' - } - }); - - dialogRef.afterClosed().subscribe(res => { - // updates playlist in file manager if it changed - if (dialogRef.componentInstance.playlist_updated) { - this.playlist = dialogRef.componentInstance.original_playlist; - this.title = this.playlist.name; - this.count = this.playlist.fileNames.length; - } - }); - } - - onImgError(event) { - this.image_errored = true; - } - - onHoverResponse() { - this.scrollSubject.next(); - } - - imageLoaded(loaded) { - this.image_loaded = true; - } - - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - -} diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index cba6565..18a4ea9 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -19,7 +19,7 @@ Quality - + Max @@ -117,7 +117,7 @@ - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, @@ -132,7 +132,7 @@ - + Documentation. Path is relative to the config download path. Don't include extension. @@ -146,12 +146,12 @@ - +
- +
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 00e1c61..93a8d53 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList } from '@angular/core'; import {PostsService} from '../posts.services'; -import {FileCardComponent} from '../file-card/file-card.component'; import { Observable, Subject } from 'rxjs'; import {FormControl, Validators} from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -90,7 +89,6 @@ export class MainComponent implements OnInit { mp3s: any[] = []; mp4s: any[] = []; - files_cols = null; playlists = {'audio': [], 'video': []}; playlist_thumbnails = {}; downloading_content = {'audio': {}, 'video': {}}; @@ -197,8 +195,6 @@ export class MainComponent implements OnInit { @ViewChild('urlinput', { read: ElementRef }) urlInput: ElementRef; @ViewChild('recentVideos') recentVideos: RecentVideosComponent; - @ViewChildren('audiofilecard') audioFileCards: QueryList; - @ViewChildren('videofilecard') videoFileCards: QueryList; last_valid_url = ''; last_url_check = 0; @@ -220,14 +216,14 @@ export class MainComponent implements OnInit { this.audioOnly = false; } - async configLoad() { + async configLoad(): Promise { await this.loadConfig(); if (this.autoStartDownload) { this.downloadClicked(); } } - async loadConfig() { + async loadConfig(): Promise { // loading config this.fileManagerEnabled = this.postsService.config['Extra']['file_manager_enabled'] && this.postsService.hasPermission('filemanager'); @@ -289,7 +285,7 @@ export class MainComponent implements OnInit { } // app initialization. - ngOnInit() { + ngOnInit(): void { if (this.postsService.initialized) { this.configLoad(); } else { @@ -331,62 +327,17 @@ export class MainComponent implements OnInit { .subscribe((should_simulate) => { if (should_simulate) this.getSimulatedOutput(); }); - - this.setCols(); } - ngAfterViewInit() { + ngAfterViewInit(): void { if (this.youtubeSearchEnabled && this.youtubeAPIKey) { this.youtubeSearch.initializeAPI(this.youtubeAPIKey); this.attachToInput(); } } - public setCols() { - if (window.innerWidth <= 350) { - this.files_cols = 1; - } else if (window.innerWidth <= 500) { - this.files_cols = 2; - } else if (window.innerWidth <= 750) { - this.files_cols = 3 - } else { - this.files_cols = 4; - } - } - - public goToFile(container, isAudio, uid) { - this.downloadHelper(container, isAudio ? 'audio' : 'video', false, false, true); - } - - public goToPlaylist(playlistID, type) { - const playlist = this.getPlaylistObjectByID(playlistID, type); - if (playlist) { - if (this.downloadOnlyMode) { - this.downloading_content[type][playlistID] = true; - this.downloadPlaylist(playlist); - } else { - localStorage.setItem('player_navigator', this.router.url); - const fileNames = playlist.fileNames; - this.router.navigate(['/player', {fileNames: fileNames.join('|nvr|'), type: type, id: playlistID, uid: playlistID}]); - } - } else { - // playlist not found - console.error(`Playlist with ID ${playlistID} not found!`); - } - } - - getPlaylistObjectByID(playlistID, type) { - for (let i = 0; i < this.playlists[type].length; i++) { - const playlist = this.playlists[type][i]; - if (playlist.id === playlistID) { - return playlist; - } - } - return null; - } - // download helpers - downloadHelper(container, type, is_playlist = false, force_view = false, navigate_mode = false) { + downloadHelper(container, type: string, is_playlist = false, force_view = false, navigate_mode = false): void { this.downloadingfile = false; if (!this.autoplay && !this.downloadOnlyMode && !navigate_mode) { // do nothing @@ -412,7 +363,7 @@ export class MainComponent implements OnInit { } // download click handler - downloadClicked() { + downloadClicked(): void { if (!this.ValidURL(this.url)) { this.urlError = true; return; @@ -453,16 +404,19 @@ export class MainComponent implements OnInit { } } + const selected_quality = this.selectedQuality; + this.selectedQuality = ''; + this.downloadingfile = true; - this.postsService.downloadFile(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), + this.postsService.downloadFile(this.url, type, (selected_quality === '' ? null : selected_quality), customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { this.current_download = res['download']; this.downloads.push(res['download']); this.download_uids.push(res['download']['uid']); - }, error => { // can't access server + }, () => { // can't access server this.downloadingfile = false; this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); + this.postsService.openSnackBar('Download failed!', 'OK.'); }); if (!this.autoplay) { @@ -474,7 +428,7 @@ export class MainComponent implements OnInit { } // download canceled handler - cancelDownload(download_to_cancel = null) { + cancelDownload(download_to_cancel = null): void { // if one is provided, cancel that one. otherwise, remove the current one if (download_to_cancel) { this.removeDownloadFromCurrentDownloads(download_to_cancel) @@ -485,33 +439,32 @@ export class MainComponent implements OnInit { this.current_download = null; } - getSelectedAudioFormat() { + getSelectedAudioFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormatsExists) { - const audio_formats = this.cachedAvailableFormats[this.url]['formats']['audio']; return this.selectedQuality['format_id']; } else { return null; } } - getSelectedVideoFormat() { + getSelectedVideoFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormats = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormats) { - const video_formats = cachedFormats['video']; if (this.selectedQuality) { let selected_video_format = this.selectedQuality['format_id']; // add in audio format if necessary - if (!this.selectedQuality['acodec'] && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; + const audio_missing = !this.selectedQuality['acodec'] || this.selectedQuality['acodec'] === 'none'; + if (audio_missing && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; return selected_video_format; } } return null; } - getDownloadByUID(uid) { + getDownloadByUID(uid: string) { const index = this.downloads.findIndex(download => download.uid === uid); if (index !== -1) { return this.downloads[index]; @@ -520,7 +473,7 @@ export class MainComponent implements OnInit { } } - removeDownloadFromCurrentDownloads(download_to_remove) { + removeDownloadFromCurrentDownloads(download_to_remove): boolean { if (this.current_download === download_to_remove) { this.current_download = null; } @@ -533,7 +486,7 @@ export class MainComponent implements OnInit { } } - downloadFileFromServer(file, type) { + downloadFileFromServer(file, type: string): void { const ext = type === 'audio' ? 'mp3' : 'mp4' this.downloading_content[type][file.id] = true; this.postsService.downloadFileFromServer(file.uid).subscribe(res => { @@ -543,13 +496,12 @@ export class MainComponent implements OnInit { if (!this.fileManagerEnabled) { // tell server to delete the file once downloaded - this.postsService.deleteFile(file.uid).subscribe(delRes => { - }); + this.postsService.deleteFile(file.uid).subscribe(() => {}); } }); } - downloadPlaylist(playlist) { + downloadPlaylist(playlist): void { this.postsService.downloadPlaylistFromServer(playlist.id).subscribe(res => { if (playlist.id) { this.downloading_content[playlist.type][playlist.id] = false }; const blob: Blob = res; @@ -558,25 +510,25 @@ export class MainComponent implements OnInit { } - clearInput() { + clearInput(): void { this.url = ''; this.results_showing = false; } - onInputBlur() { + onInputBlur(): void { this.results_showing = false; } - visitURL(url) { + visitURL(url: string): void { window.open(url); } - useURL(url) { + useURL(url: string): void { this.results_showing = false; this.url = url; } - inputChanged(new_val) { + inputChanged(new_val: string): void { if (new_val === '' || !new_val) { this.results_showing = false; } else { @@ -587,7 +539,7 @@ export class MainComponent implements OnInit { } // checks if url is a valid URL - ValidURL(str) { + ValidURL(str: string): boolean { // tslint:disable-next-line: max-line-length const strRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/; const re = new RegExp(strRegex); @@ -603,21 +555,14 @@ export class MainComponent implements OnInit { if (str !== this.last_valid_url && this.allowQualitySelect) { // get info this.getURLInfo(str); - this.argsChangedSubject.next(true); + this.argsChanged(); } this.last_valid_url = str; } return valid; } - // snackbar helper - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - - getURLInfo(url) { + getURLInfo(url: string): void { // if url is a youtube playlist, skip getting url info if (url.includes('playlist')) { return; @@ -635,18 +580,14 @@ export class MainComponent implements OnInit { return; } this.cachedAvailableFormats[url]['formats'] = this.getAudioAndVideoFormats(infos.formats); - }, err => { + }, () => { this.errorFormats(url); }); } } - argChanged(): void { - this.argsChangedSubject.next(true); - } - getSimulatedOutput(): void { - // this function should be very similar to downloadFile() + // this function should be very similar to downloadClicked() const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); const customOutput = (this.customOutputEnabled ? this.customOutput : null); @@ -681,12 +622,12 @@ export class MainComponent implements OnInit { }); } - errorFormats(url) { + errorFormats(url: string): void { this.cachedAvailableFormats[url]['formats_loading'] = false; console.error('Could not load formats for url ' + url); } - attachToInput() { + attachToInput(): void { Observable.fromEvent(this.urlInput.nativeElement, 'keyup') .map((e: any) => e.target.value) // extract the value of input .filter((text: string) => text.length > 1) // filter out if empty @@ -715,41 +656,41 @@ export class MainComponent implements OnInit { ); } - onResize(event) { - this.setCols(); - } - - videoModeChanged(new_val) { - this.selectedQuality = ''; - localStorage.setItem('audioOnly', new_val.checked.toString()); + argsChanged(): void { this.argsChangedSubject.next(true); } - autoplayChanged(new_val) { + videoModeChanged(new_val): void { + this.selectedQuality = ''; + localStorage.setItem('audioOnly', new_val.checked.toString()); + this.argsChanged(); + } + + autoplayChanged(new_val): void { localStorage.setItem('autoplay', new_val.checked.toString()); } - customArgsEnabledChanged(new_val) { + customArgsEnabledChanged(new_val): void { localStorage.setItem('customArgsEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - replaceArgsChanged(new_val) { + replaceArgsChanged(new_val): void { localStorage.setItem('replaceArgs', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - customOutputEnabledChanged(new_val) { + customOutputEnabledChanged(new_val): void { localStorage.setItem('customOutputEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - youtubeAuthEnabledChanged(new_val) { + youtubeAuthEnabledChanged(new_val): void { localStorage.setItem('youtubeAuthEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - getAudioAndVideoFormats(formats) { + getAudioAndVideoFormats(formats): void { const audio_formats: any = {}; const video_formats: any = {}; @@ -808,7 +749,7 @@ export class MainComponent implements OnInit { return parsed_formats; } - getBestAudioFormatForMp4(audio_formats) { + getBestAudioFormatForMp4(audio_formats): void { let best_audio_format_for_mp4 = null; let best_audio_format_bitrate = 0; const available_audio_format_keys = Object.keys(audio_formats); @@ -824,46 +765,8 @@ export class MainComponent implements OnInit { return best_audio_format_for_mp4; } - accordionEntered(type) { - if (type === 'audio') { - audioFilesMouseHovering = true; - this.audioFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } else if (type === 'video') { - videoFilesMouseHovering = true; - this.videoFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } - } - - accordionLeft(type) { - if (type === 'audio') { - audioFilesMouseHovering = false; - } else if (type === 'video') { - videoFilesMouseHovering = false; - } - } - - accordionOpened(type) { - if (type === 'audio') { - audioFilesOpened = true; - } else if (type === 'video') { - videoFilesOpened = true; - } - } - - accordionClosed(type) { - if (type === 'audio') { - audioFilesOpened = false; - } else if (type === 'video') { - videoFilesOpened = false; - } - } - // modify custom args - openArgsModifierDialog() { + openArgsModifierDialog(): void { const dialogRef = this.dialog.open(ArgModifierDialogComponent, { data: { initial_args: this.customArgs @@ -876,7 +779,7 @@ export class MainComponent implements OnInit { }); } - getCurrentDownload() { + getCurrentDownload(): void { if (!this.current_download) { return; } @@ -893,7 +796,7 @@ export class MainComponent implements OnInit { } else if (this.current_download['finished'] && this.current_download['error']) { this.downloadingfile = false; this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); + this.postsService.openSnackBar('Download failed!', 'OK.'); } } else { // console.log('failed to get new download'); @@ -901,7 +804,7 @@ export class MainComponent implements OnInit { }); } - reloadRecentVideos() { + reloadRecentVideos(): void { this.postsService.files_changed.next(true); } } From 84fa425a993577ccbe6c3b05c8187500d87a7ef8 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 28 Sep 2021 20:27:01 -0600 Subject: [PATCH 046/212] Fixed issue where selecting video quality would Main component cleanup Removed deprecated file card component --- backend/downloader.js | 2 +- src/app/app.module.ts | 2 - src/app/file-card/file-card.component.css | 68 ------ src/app/file-card/file-card.component.html | 29 --- src/app/file-card/file-card.component.spec.ts | 25 --- src/app/file-card/file-card.component.ts | 120 ---------- src/app/main/main.component.html | 10 +- src/app/main/main.component.ts | 209 +++++------------- 8 files changed, 62 insertions(+), 403 deletions(-) delete mode 100644 src/app/file-card/file-card.component.css delete mode 100644 src/app/file-card/file-card.component.html delete mode 100644 src/app/file-card/file-card.component.spec.ts delete mode 100644 src/app/file-card/file-card.component.ts diff --git a/backend/downloader.js b/backend/downloader.js index f1ada44..e151f87 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -417,7 +417,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f downloadConfig = customArgs.split(',,'); } else { if (customQualityConfiguration) { - qualityPath = ['-f', customQualityConfiguration]; + qualityPath = ['-f', customQualityConfiguration, '--merge-output-format', 'mp4']; } else if (selectedHeight && selectedHeight !== '' && !is_audio) { qualityPath = ['-f', `'(mp4)[height=${selectedHeight}'`]; } else if (is_audio) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dcaa9ec..410a412 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -34,7 +34,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { PostsService } from 'app/posts.services'; -import { FileCardComponent } from './file-card/file-card.component'; import { RouterModule } from '@angular/router'; import { AppRoutingModule } from './app-routing.module'; import { MainComponent } from './main/main.component'; @@ -98,7 +97,6 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible @NgModule({ declarations: [ AppComponent, - FileCardComponent, MainComponent, PlayerComponent, InputDialogComponent, diff --git a/src/app/file-card/file-card.component.css b/src/app/file-card/file-card.component.css deleted file mode 100644 index a581bca..0000000 --- a/src/app/file-card/file-card.component.css +++ /dev/null @@ -1,68 +0,0 @@ -.example-card { - width: 150px; - height: 125px; - padding: 0px; -} - -.deleteButton { - top:-5px; - right:-5px; - position:absolute; -} - -/* Coerce the icon container away from display:inline */ -.mat-icon-button .mat-button-wrapper { - display: flex; - justify-content: center; -} - -.image { - width: 100%; -} - -.example-full-width-height { - width: 100%; - height: 100% -} - -.centered { - margin: 0 auto; - top: 50%; - left: 50%; -} - -.img-div { - height: 60px; - padding: 0px; - margin: 8px 0px 0px -5px; - width: calc(100% + 5px + 5px); - overflow: hidden; - border-radius: 0px 0px 4px 4px; -} - -.max-two-lines { - display: -webkit-box; - display: -moz-box; - max-height: 2.4em; - line-height: 1.2em; - overflow: hidden; - text-overflow: ellipsis; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.file-link { - width: 80%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; -} - -@media (max-width: 576px){ - - .example-card { - width: 125px !important; - } - -} \ No newline at end of file diff --git a/src/app/file-card/file-card.component.html b/src/app/file-card/file-card.component.html deleted file mode 100644 index f3c7ffe..0000000 --- a/src/app/file-card/file-card.component.html +++ /dev/null @@ -1,29 +0,0 @@ - -
-
-
- {{title}} -
- ID: {{name}} -
Count: {{count}}
-
-
- Thumbnail - - - -
-
- - - - - - - - - - - - -
diff --git a/src/app/file-card/file-card.component.spec.ts b/src/app/file-card/file-card.component.spec.ts deleted file mode 100644 index 0e940d9..0000000 --- a/src/app/file-card/file-card.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { FileCardComponent } from './file-card.component'; - -describe('FileCardComponent', () => { - let component: FileCardComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ FileCardComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FileCardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/file-card/file-card.component.ts b/src/app/file-card/file-card.component.ts deleted file mode 100644 index 5596eec..0000000 --- a/src/app/file-card/file-card.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Component, OnInit, Input, Output } from '@angular/core'; -import {PostsService} from '../posts.services'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import {EventEmitter} from '@angular/core'; -import { MainComponent } from 'app/main/main.component'; -import { Subject, Observable } from 'rxjs'; -import 'rxjs/add/observable/merge'; -import { MatDialog } from '@angular/material/dialog'; -import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; -import { ModifyPlaylistComponent } from '../dialogs/modify-playlist/modify-playlist.component'; - -@Component({ - selector: 'app-file-card', - templateUrl: './file-card.component.html', - styleUrls: ['./file-card.component.css'] -}) -export class FileCardComponent implements OnInit { - @Input() file: any; - @Input() title: string; - @Input() length: string; - @Input() name: string; - @Input() uid: string; - @Input() thumbnailURL: string; - @Input() isAudio = true; - @Output() removeFile: EventEmitter = new EventEmitter(); - @Input() playlist = null; - @Input() count = null; - @Input() use_youtubedl_archive = false; - type; - image_loaded = false; - image_errored = false; - - scrollSubject; - scrollAndLoad; - - constructor(private postsService: PostsService, public snackBar: MatSnackBar, public mainComponent: MainComponent, - private dialog: MatDialog) { - - this.scrollSubject = new Subject(); - this.scrollAndLoad = Observable.merge( - Observable.fromEvent(window, 'scroll'), - this.scrollSubject - ); - } - - ngOnInit() { - this.type = this.isAudio ? 'audio' : 'video'; - - if (this.file && this.file.url && this.file.url.includes('youtu')) { - const string_id = (this.playlist ? '?list=' : '?v=') - const index_offset = (this.playlist ? 6 : 3); - const end_index = this.file.url.indexOf(string_id) + index_offset; - this.name = this.file.url.substring(end_index, this.file.url.length); - } - } - - deleteFile(blacklistMode = false) { - if (!this.playlist) { - this.postsService.deleteFile(this.uid, blacklistMode).subscribe(result => { - if (result) { - this.openSnackBar('Delete success!', 'OK.'); - this.removeFile.emit(this.name); - } else { - this.openSnackBar('Delete failed!', 'OK.'); - } - }, err => { - this.openSnackBar('Delete failed!', 'OK.'); - }); - } else { - this.removeFile.emit(this.name); - } - - } - - openVideoInfoDialog() { - const dialogRef = this.dialog.open(VideoInfoDialogComponent, { - data: { - file: this.file, - }, - minWidth: '50vw' - }); - } - - editPlaylistDialog() { - const dialogRef = this.dialog.open(ModifyPlaylistComponent, { - data: { - playlist_id: this.playlist.id, - width: '65vw' - } - }); - - dialogRef.afterClosed().subscribe(res => { - // updates playlist in file manager if it changed - if (dialogRef.componentInstance.playlist_updated) { - this.playlist = dialogRef.componentInstance.original_playlist; - this.title = this.playlist.name; - this.count = this.playlist.fileNames.length; - } - }); - } - - onImgError(event) { - this.image_errored = true; - } - - onHoverResponse() { - this.scrollSubject.next(); - } - - imageLoaded(loaded) { - this.image_loaded = true; - } - - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - -} diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index cba6565..18a4ea9 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -19,7 +19,7 @@ Quality - + Max @@ -117,7 +117,7 @@ - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, @@ -132,7 +132,7 @@ - + Documentation. Path is relative to the config download path. Don't include extension. @@ -146,12 +146,12 @@ - +
- +
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 00e1c61..93a8d53 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList } from '@angular/core'; import {PostsService} from '../posts.services'; -import {FileCardComponent} from '../file-card/file-card.component'; import { Observable, Subject } from 'rxjs'; import {FormControl, Validators} from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -90,7 +89,6 @@ export class MainComponent implements OnInit { mp3s: any[] = []; mp4s: any[] = []; - files_cols = null; playlists = {'audio': [], 'video': []}; playlist_thumbnails = {}; downloading_content = {'audio': {}, 'video': {}}; @@ -197,8 +195,6 @@ export class MainComponent implements OnInit { @ViewChild('urlinput', { read: ElementRef }) urlInput: ElementRef; @ViewChild('recentVideos') recentVideos: RecentVideosComponent; - @ViewChildren('audiofilecard') audioFileCards: QueryList; - @ViewChildren('videofilecard') videoFileCards: QueryList; last_valid_url = ''; last_url_check = 0; @@ -220,14 +216,14 @@ export class MainComponent implements OnInit { this.audioOnly = false; } - async configLoad() { + async configLoad(): Promise { await this.loadConfig(); if (this.autoStartDownload) { this.downloadClicked(); } } - async loadConfig() { + async loadConfig(): Promise { // loading config this.fileManagerEnabled = this.postsService.config['Extra']['file_manager_enabled'] && this.postsService.hasPermission('filemanager'); @@ -289,7 +285,7 @@ export class MainComponent implements OnInit { } // app initialization. - ngOnInit() { + ngOnInit(): void { if (this.postsService.initialized) { this.configLoad(); } else { @@ -331,62 +327,17 @@ export class MainComponent implements OnInit { .subscribe((should_simulate) => { if (should_simulate) this.getSimulatedOutput(); }); - - this.setCols(); } - ngAfterViewInit() { + ngAfterViewInit(): void { if (this.youtubeSearchEnabled && this.youtubeAPIKey) { this.youtubeSearch.initializeAPI(this.youtubeAPIKey); this.attachToInput(); } } - public setCols() { - if (window.innerWidth <= 350) { - this.files_cols = 1; - } else if (window.innerWidth <= 500) { - this.files_cols = 2; - } else if (window.innerWidth <= 750) { - this.files_cols = 3 - } else { - this.files_cols = 4; - } - } - - public goToFile(container, isAudio, uid) { - this.downloadHelper(container, isAudio ? 'audio' : 'video', false, false, true); - } - - public goToPlaylist(playlistID, type) { - const playlist = this.getPlaylistObjectByID(playlistID, type); - if (playlist) { - if (this.downloadOnlyMode) { - this.downloading_content[type][playlistID] = true; - this.downloadPlaylist(playlist); - } else { - localStorage.setItem('player_navigator', this.router.url); - const fileNames = playlist.fileNames; - this.router.navigate(['/player', {fileNames: fileNames.join('|nvr|'), type: type, id: playlistID, uid: playlistID}]); - } - } else { - // playlist not found - console.error(`Playlist with ID ${playlistID} not found!`); - } - } - - getPlaylistObjectByID(playlistID, type) { - for (let i = 0; i < this.playlists[type].length; i++) { - const playlist = this.playlists[type][i]; - if (playlist.id === playlistID) { - return playlist; - } - } - return null; - } - // download helpers - downloadHelper(container, type, is_playlist = false, force_view = false, navigate_mode = false) { + downloadHelper(container, type: string, is_playlist = false, force_view = false, navigate_mode = false): void { this.downloadingfile = false; if (!this.autoplay && !this.downloadOnlyMode && !navigate_mode) { // do nothing @@ -412,7 +363,7 @@ export class MainComponent implements OnInit { } // download click handler - downloadClicked() { + downloadClicked(): void { if (!this.ValidURL(this.url)) { this.urlError = true; return; @@ -453,16 +404,19 @@ export class MainComponent implements OnInit { } } + const selected_quality = this.selectedQuality; + this.selectedQuality = ''; + this.downloadingfile = true; - this.postsService.downloadFile(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), + this.postsService.downloadFile(this.url, type, (selected_quality === '' ? null : selected_quality), customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { this.current_download = res['download']; this.downloads.push(res['download']); this.download_uids.push(res['download']['uid']); - }, error => { // can't access server + }, () => { // can't access server this.downloadingfile = false; this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); + this.postsService.openSnackBar('Download failed!', 'OK.'); }); if (!this.autoplay) { @@ -474,7 +428,7 @@ export class MainComponent implements OnInit { } // download canceled handler - cancelDownload(download_to_cancel = null) { + cancelDownload(download_to_cancel = null): void { // if one is provided, cancel that one. otherwise, remove the current one if (download_to_cancel) { this.removeDownloadFromCurrentDownloads(download_to_cancel) @@ -485,33 +439,32 @@ export class MainComponent implements OnInit { this.current_download = null; } - getSelectedAudioFormat() { + getSelectedAudioFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormatsExists) { - const audio_formats = this.cachedAvailableFormats[this.url]['formats']['audio']; return this.selectedQuality['format_id']; } else { return null; } } - getSelectedVideoFormat() { + getSelectedVideoFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormats = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormats) { - const video_formats = cachedFormats['video']; if (this.selectedQuality) { let selected_video_format = this.selectedQuality['format_id']; // add in audio format if necessary - if (!this.selectedQuality['acodec'] && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; + const audio_missing = !this.selectedQuality['acodec'] || this.selectedQuality['acodec'] === 'none'; + if (audio_missing && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; return selected_video_format; } } return null; } - getDownloadByUID(uid) { + getDownloadByUID(uid: string) { const index = this.downloads.findIndex(download => download.uid === uid); if (index !== -1) { return this.downloads[index]; @@ -520,7 +473,7 @@ export class MainComponent implements OnInit { } } - removeDownloadFromCurrentDownloads(download_to_remove) { + removeDownloadFromCurrentDownloads(download_to_remove): boolean { if (this.current_download === download_to_remove) { this.current_download = null; } @@ -533,7 +486,7 @@ export class MainComponent implements OnInit { } } - downloadFileFromServer(file, type) { + downloadFileFromServer(file, type: string): void { const ext = type === 'audio' ? 'mp3' : 'mp4' this.downloading_content[type][file.id] = true; this.postsService.downloadFileFromServer(file.uid).subscribe(res => { @@ -543,13 +496,12 @@ export class MainComponent implements OnInit { if (!this.fileManagerEnabled) { // tell server to delete the file once downloaded - this.postsService.deleteFile(file.uid).subscribe(delRes => { - }); + this.postsService.deleteFile(file.uid).subscribe(() => {}); } }); } - downloadPlaylist(playlist) { + downloadPlaylist(playlist): void { this.postsService.downloadPlaylistFromServer(playlist.id).subscribe(res => { if (playlist.id) { this.downloading_content[playlist.type][playlist.id] = false }; const blob: Blob = res; @@ -558,25 +510,25 @@ export class MainComponent implements OnInit { } - clearInput() { + clearInput(): void { this.url = ''; this.results_showing = false; } - onInputBlur() { + onInputBlur(): void { this.results_showing = false; } - visitURL(url) { + visitURL(url: string): void { window.open(url); } - useURL(url) { + useURL(url: string): void { this.results_showing = false; this.url = url; } - inputChanged(new_val) { + inputChanged(new_val: string): void { if (new_val === '' || !new_val) { this.results_showing = false; } else { @@ -587,7 +539,7 @@ export class MainComponent implements OnInit { } // checks if url is a valid URL - ValidURL(str) { + ValidURL(str: string): boolean { // tslint:disable-next-line: max-line-length const strRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/; const re = new RegExp(strRegex); @@ -603,21 +555,14 @@ export class MainComponent implements OnInit { if (str !== this.last_valid_url && this.allowQualitySelect) { // get info this.getURLInfo(str); - this.argsChangedSubject.next(true); + this.argsChanged(); } this.last_valid_url = str; } return valid; } - // snackbar helper - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - - getURLInfo(url) { + getURLInfo(url: string): void { // if url is a youtube playlist, skip getting url info if (url.includes('playlist')) { return; @@ -635,18 +580,14 @@ export class MainComponent implements OnInit { return; } this.cachedAvailableFormats[url]['formats'] = this.getAudioAndVideoFormats(infos.formats); - }, err => { + }, () => { this.errorFormats(url); }); } } - argChanged(): void { - this.argsChangedSubject.next(true); - } - getSimulatedOutput(): void { - // this function should be very similar to downloadFile() + // this function should be very similar to downloadClicked() const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); const customOutput = (this.customOutputEnabled ? this.customOutput : null); @@ -681,12 +622,12 @@ export class MainComponent implements OnInit { }); } - errorFormats(url) { + errorFormats(url: string): void { this.cachedAvailableFormats[url]['formats_loading'] = false; console.error('Could not load formats for url ' + url); } - attachToInput() { + attachToInput(): void { Observable.fromEvent(this.urlInput.nativeElement, 'keyup') .map((e: any) => e.target.value) // extract the value of input .filter((text: string) => text.length > 1) // filter out if empty @@ -715,41 +656,41 @@ export class MainComponent implements OnInit { ); } - onResize(event) { - this.setCols(); - } - - videoModeChanged(new_val) { - this.selectedQuality = ''; - localStorage.setItem('audioOnly', new_val.checked.toString()); + argsChanged(): void { this.argsChangedSubject.next(true); } - autoplayChanged(new_val) { + videoModeChanged(new_val): void { + this.selectedQuality = ''; + localStorage.setItem('audioOnly', new_val.checked.toString()); + this.argsChanged(); + } + + autoplayChanged(new_val): void { localStorage.setItem('autoplay', new_val.checked.toString()); } - customArgsEnabledChanged(new_val) { + customArgsEnabledChanged(new_val): void { localStorage.setItem('customArgsEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - replaceArgsChanged(new_val) { + replaceArgsChanged(new_val): void { localStorage.setItem('replaceArgs', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - customOutputEnabledChanged(new_val) { + customOutputEnabledChanged(new_val): void { localStorage.setItem('customOutputEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - youtubeAuthEnabledChanged(new_val) { + youtubeAuthEnabledChanged(new_val): void { localStorage.setItem('youtubeAuthEnabled', new_val.checked.toString()); - this.argsChangedSubject.next(true); + this.argsChanged(); } - getAudioAndVideoFormats(formats) { + getAudioAndVideoFormats(formats): void { const audio_formats: any = {}; const video_formats: any = {}; @@ -808,7 +749,7 @@ export class MainComponent implements OnInit { return parsed_formats; } - getBestAudioFormatForMp4(audio_formats) { + getBestAudioFormatForMp4(audio_formats): void { let best_audio_format_for_mp4 = null; let best_audio_format_bitrate = 0; const available_audio_format_keys = Object.keys(audio_formats); @@ -824,46 +765,8 @@ export class MainComponent implements OnInit { return best_audio_format_for_mp4; } - accordionEntered(type) { - if (type === 'audio') { - audioFilesMouseHovering = true; - this.audioFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } else if (type === 'video') { - videoFilesMouseHovering = true; - this.videoFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } - } - - accordionLeft(type) { - if (type === 'audio') { - audioFilesMouseHovering = false; - } else if (type === 'video') { - videoFilesMouseHovering = false; - } - } - - accordionOpened(type) { - if (type === 'audio') { - audioFilesOpened = true; - } else if (type === 'video') { - videoFilesOpened = true; - } - } - - accordionClosed(type) { - if (type === 'audio') { - audioFilesOpened = false; - } else if (type === 'video') { - videoFilesOpened = false; - } - } - // modify custom args - openArgsModifierDialog() { + openArgsModifierDialog(): void { const dialogRef = this.dialog.open(ArgModifierDialogComponent, { data: { initial_args: this.customArgs @@ -876,7 +779,7 @@ export class MainComponent implements OnInit { }); } - getCurrentDownload() { + getCurrentDownload(): void { if (!this.current_download) { return; } @@ -893,7 +796,7 @@ export class MainComponent implements OnInit { } else if (this.current_download['finished'] && this.current_download['error']) { this.downloadingfile = false; this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); + this.postsService.openSnackBar('Download failed!', 'OK.'); } } else { // console.log('failed to get new download'); @@ -901,7 +804,7 @@ export class MainComponent implements OnInit { }); } - reloadRecentVideos() { + reloadRecentVideos(): void { this.postsService.files_changed.next(true); } } From c5f7cd1874b12e35b7731fb712f7926299f180c6 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 28 Sep 2021 21:36:36 -0600 Subject: [PATCH 047/212] Converted input on the home page to textarea, maintaining same style but allowing an arbitrary number of urls to be entered --- src/app/app.module.ts | 2 ++ src/app/main/main.component.css | 9 ++++++ src/app/main/main.component.html | 6 ++-- src/app/main/main.component.ts | 50 ++++++++++++++++++++++---------- 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 410a412..9277a4f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -30,6 +30,7 @@ import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { ClipboardModule } from '@angular/cdk/clipboard'; +import { TextFieldModule } from '@angular/cdk/text-field'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; @@ -175,6 +176,7 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible MatChipsModule, DragDropModule, ClipboardModule, + TextFieldModule, NgxFileDropModule, AvatarModule, ContentLoaderModule, diff --git a/src/app/main/main.component.css b/src/app/main/main.component.css index 5a712ae..0242439 100644 --- a/src/app/main/main.component.css +++ b/src/app/main/main.component.css @@ -151,4 +151,13 @@ mat-form-field.mat-form-field { .download-progress-bar { width: 125px; } +} + +.url-input { + padding-right: 25px; + overflow-y: hidden; +} + +.url-input::-webkit-scrollbar { + display: none; } \ No newline at end of file diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index 18a4ea9..e8d14a8 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -8,9 +8,9 @@
- + - +
@@ -65,7 +65,7 @@ Only Audio - + Autoplay diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 93a8d53..6d57250 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -406,24 +406,28 @@ export class MainComponent implements OnInit { const selected_quality = this.selectedQuality; this.selectedQuality = ''; - this.downloadingfile = true; - this.postsService.downloadFile(this.url, type, (selected_quality === '' ? null : selected_quality), - customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { - this.current_download = res['download']; - this.downloads.push(res['download']); - this.download_uids.push(res['download']['uid']); - }, () => { // can't access server - this.downloadingfile = false; - this.current_download = null; - this.postsService.openSnackBar('Download failed!', 'OK.'); - }); - if (!this.autoplay) { - const download_queued_message = $localize`Download for ${this.url}:url: has been queued!`; - this.postsService.openSnackBar(download_queued_message); - this.url = ''; + const urls = this.getURLArray(this.url); + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; + this.postsService.downloadFile(url, type, (selected_quality === '' ? null : selected_quality), + customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { + this.current_download = res['download']; + this.downloads.push(res['download']); + this.download_uids.push(res['download']['uid']); + }, () => { // can't access server this.downloadingfile = false; + this.current_download = null; + this.postsService.openSnackBar('Download failed!', 'OK.'); + }); + + if (!this.autoplay && urls.length === 1) { + const download_queued_message = $localize`Download for ${url}:url: has been queued!`; + this.postsService.openSnackBar(download_queued_message); + this.url = ''; + this.downloadingfile = false; + } } } @@ -540,6 +544,13 @@ export class MainComponent implements OnInit { // checks if url is a valid URL ValidURL(str: string): boolean { + // mark multiple urls as valid but don't get additional info + const urls = this.getURLArray(str); + if (urls.length > 1) { + this.autoplay = false; + return true; + } + // tslint:disable-next-line: max-line-length const strRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/; const re = new RegExp(strRegex); @@ -587,6 +598,9 @@ export class MainComponent implements OnInit { } getSimulatedOutput(): void { + const urls = this.getURLArray(this.url); + if (urls.length > 1) return; + // this function should be very similar to downloadClicked() const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); @@ -807,4 +821,10 @@ export class MainComponent implements OnInit { reloadRecentVideos(): void { this.postsService.files_changed.next(true); } + + getURLArray(url_str: string): Array { + let lines = url_str.split('\n'); + lines = lines.filter(line => line); + return lines; + } } From f0c3837ee588c7661d02d89e6e117b0466d10b2f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 29 Sep 2021 00:36:56 -0600 Subject: [PATCH 048/212] Translation JSONs are now generated at build time, removing the necessity to manually run xliff-to-json - added postbuild.mjs to facilitate this - all ng build --prod's have been replaced with npm run build --- .github/workflows/build.yml | 6 +- .github/workflows/docker-release.yml | 4 - .github/workflows/docker.yml | 4 - .gitignore | 3 +- Dockerfile | 2 +- README.md | 2 +- package-lock.json | 70 ++++++- package.json | 5 +- src/app/posts.services.ts | 4 + src/app/settings/settings.component.ts | 7 + src/assets/i18n/messages.ca.json | 248 ---------------------- src/assets/i18n/messages.cs.json | 248 ---------------------- src/assets/i18n/messages.de.json | 270 ------------------------ src/assets/i18n/messages.es.json | 271 ------------------------- src/assets/i18n/messages.fr.json | 269 ------------------------ src/assets/i18n/messages.id.json | 248 ---------------------- src/assets/i18n/messages.it.json | 249 ----------------------- src/assets/i18n/messages.ko.json | 261 ------------------------ src/assets/i18n/messages.nl.json | 248 ---------------------- src/assets/i18n/messages.pt.json | 248 ---------------------- src/assets/i18n/messages.ru.json | 268 ------------------------ src/assets/i18n/messages.zh.json | 269 ------------------------ src/postbuild.mjs | 43 ++++ 23 files changed, 122 insertions(+), 3125 deletions(-) delete mode 100644 src/assets/i18n/messages.ca.json delete mode 100644 src/assets/i18n/messages.cs.json delete mode 100644 src/assets/i18n/messages.de.json delete mode 100644 src/assets/i18n/messages.es.json delete mode 100644 src/assets/i18n/messages.fr.json delete mode 100644 src/assets/i18n/messages.id.json delete mode 100644 src/assets/i18n/messages.it.json delete mode 100644 src/assets/i18n/messages.ko.json delete mode 100644 src/assets/i18n/messages.nl.json delete mode 100644 src/assets/i18n/messages.pt.json delete mode 100644 src/assets/i18n/messages.ru.json delete mode 100644 src/assets/i18n/messages.zh.json create mode 100644 src/postbuild.mjs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54b21d0..50f4eb5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,10 +25,6 @@ jobs: cd backend npm install sudo npm install -g @angular/cli - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" @@ -43,7 +39,7 @@ jobs: json: '{"type": "autobuild", "tag": "N/A", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: build - run: ng build --prod + run: npm run build - name: prepare artifact upload shell: pwsh run: | diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index aae7fb3..3063a97 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -13,10 +13,6 @@ jobs: steps: - name: checkout code uses: actions/checkout@v2 - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9e0049b..3fd4ab2 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -10,10 +10,6 @@ jobs: steps: - name: checkout code uses: actions/checkout@v2 - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" diff --git a/.gitignore b/.gitignore index 9d2ac87..c68b0f6 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,5 @@ backend/appdata/logs/error.log backend/appdata/users.json backend/users/* backend/appdata/cookies.txt -backend/public \ No newline at end of file +backend/public +src/assets/i18n/*.json \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 4a2d3b0..7b7d6cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN npm install COPY [ "angular.json", "tsconfig.json", "/build/" ] COPY [ "src/", "/build/src/" ] -RUN ng build --prod +RUN npm run build #--------------# diff --git a/README.md b/README.md index b452bec..a081a6e 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ If you'd like to install YoutubeDL-Material, go to the Installation section. If To deploy, simply clone the repository, and go into the `youtubedl-material` directory. Type `npm install` and all the dependencies will install. Then type `cd backend` and again type `npm install` to install the dependencies for the backend. -Once you do that, you're almost up and running. All you need to do is edit the configuration in `youtubedl-material/appdata`, go back into the `youtubedl-material` directory, and type `ng build --prod`. This will build the app, and put the output files in the `youtubedl-material/backend/public` folder. +Once you do that, you're almost up and running. All you need to do is edit the configuration in `youtubedl-material/appdata`, go back into the `youtubedl-material` directory, and type `npm build`. This will build the app, and put the output files in the `youtubedl-material/backend/public` folder. The frontend is now complete. The backend is much easier. Just go into the `backend` folder, and type `npm start`. diff --git a/package-lock.json b/package-lock.json index cad23bd..eb800a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,6 +437,17 @@ } } }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -6153,14 +6164,29 @@ } }, "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } } }, "fs-minipass": { @@ -6380,8 +6406,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { "version": "2.0.1", @@ -11887,8 +11912,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "2.7.1", @@ -15269,6 +15293,30 @@ "async-limiter": "~1.0.0" } }, + "xliff": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/xliff/-/xliff-4.4.0.tgz", + "integrity": "sha512-SVzjB3hTHJ/CbsIJtbQg2BAxhvVJqbZ3OluMS7u6JnCbf0/twuj2KASghYHiKHz2sJqZo42dGjydp0URKmWWoA==", + "requires": { + "xml-js": "1.6.11" + } + }, + "xliff-to-json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/xliff-to-json/-/xliff-to-json-1.0.4.tgz", + "integrity": "sha512-shxNrU2ZzFbyvRxVIff0KxYyU0nNP8/AZsLCEW4Pb+p7Ei11FIr8hFmmbk3EqXzBgbNrVHVB9FPUNpLQ3ADakw==", + "requires": { + "xliff": "^4.4.0" + } + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", diff --git a/package.json b/package.json index 57b692e..d53043b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", + "build": "ng build --prod", + "prebuild": "node src/postbuild.mjs", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", @@ -37,6 +38,7 @@ "file-saver": "^2.0.2", "filesize": "^6.1.0", "fingerprintjs2": "^2.1.0", + "fs-extra": "^10.0.0", "material-icons": "^0.5.4", "nan": "^2.14.1", "ng-lazyload-image": "^7.0.1", @@ -47,6 +49,7 @@ "tslib": "^2.0.0", "typescript": "~4.0.5", "web-animations-js": "^2.3.2", + "xliff-to-json": "^1.0.4", "zone.js": "~0.10.2" }, "devDependencies": { diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index bee6500..046db8e 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -233,6 +233,10 @@ export class PostsService implements CanActivate { return this.http.get(`./assets/${name}`); } + getSupportedLocales() { + return this.http.get('./assets/i18n/supported_locales.json'); + } + setConfig(config) { return this.http.post(this.path + 'setConfig', {new_config_file: config}, this.httpOptions); } diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index c30d153..81854c9 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -81,6 +81,13 @@ export class SettingsComponent implements OnInit { const tab = this.route.snapshot.paramMap.get('tab'); this.tabIndex = tab && this.TAB_TO_INDEX[tab] ? this.TAB_TO_INDEX[tab] : 0; + + this.postsService.getSupportedLocales().subscribe(res => { + if (res && res['supported_locales']) { + this.supported_locales = ['en', 'en-GB']; // required + this.supported_locales = this.supported_locales.concat(res['supported_locales']); + } + }); } getConfig() { diff --git a/src/assets/i18n/messages.ca.json b/src/assets/i18n/messages.ca.json deleted file mode 100644 index 72e473c..0000000 --- a/src/assets/i18n/messages.ca.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Quant a", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Fosc", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Paràmetres", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Inici", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Inicia la sessió", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Subscripcions", - "822fab38216f64e8166d368b59fe756ca39d301b": "Baixades", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Només àudio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Baixa", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualitat", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utilitza un URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Visualitza", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Mode de baixades múltiples", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancel·la", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avançat", - "4e4c721129466be9c3862294dc40241b64045998": "Utilitza arguments personalitzats", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arguments personalitzats", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "No cal incloure l’URL, només tot el que hi ha després. Separeu els arguments amb dues comes: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Utilitza una sortida personalitzada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Sortida personalitzada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentació", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "El camí és relatiu al camí de baixada de la configuració. No hi inclogueu l’extensió.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Ordre simulada:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Utilitza autenticació", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nom d’usuari", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Contrasenya", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una llista de reproducció", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nom", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipus", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Àudio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Fitxers d’àudio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vídeos", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Subscriviu-vos a la llista o al canal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "L’URL de la llista o el canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nom personalitzat", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Baixa totes les pujades", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualitat màxima", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Mode només d’àudio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Mode només de transmissió", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Aquestes s’afegeixen després dels arguments estàndards.", - "98b6ec9ec138186d663e64770267b67334353d63": "Sortida de fitxer personalitzada", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancel·la", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Subscriviu-vos", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Baixeu els vídeos penjats a la darrera", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipus:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "Id.:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Tanca", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exporta l’arxiu", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Cancel·la la subscripció", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(En pausa)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arxiu:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nom:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Carregador:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Mida del fitxer:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Camí:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data de pujada:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifica arguments del youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Arguments nous simulats", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Afegeix un argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cerca per categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Utilitza el valor de l’argument", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Afegeix un argument", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifica", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor de l’argument", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Actualitzador", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registra un usuari", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nom d’usuari", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registra", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Puja galetes noves", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Tingueu en compte també que les galetes són de tota la instància i no per usuari.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrossegar i deixar anar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifica la llista de reproducció", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Afegeix contingut", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Desa", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordre normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordre invers", - "d02888c485d3aeab6de628508f4a00312a722894": "Els meus vídeos", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cerca", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "No s’ha trobat cap vídeo.", - "3697f8583ea42868aa269489ad366103d94aece7": "Editant", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausat", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editant la categoria", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regles", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Afegeix una regla nova", - "792dc6a57f28a1066db283f2e736484f066005fd": "Baixa el xat del Twitch", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Edita", - "826b25211922a1b46436589233cb6f1a163d89b7": "Suprimeix", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informació", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Recompte:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Suprimeix i afegeix a la llista negra", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualitzacions", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Desa els canvis", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "La descàrrega ha estat correcta", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "S'ha produït un error", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalls", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "S’ha produït un error:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inici de la baixada:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Final de la baixada:", - "ad127117f9471612f47d01eae09709da444a36a4": "Camins de fitxers:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Les vostres subscripcions", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canals", - "47546e45bbb476baaaad38244db444c427ddc502": "Llistes de reproducció", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "El nom no està disponible. S’està recuperant el canal.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "No tens cap subscripció al canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "El nom no està disponible. Recuperant la llista de reproducció.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "No tens cap subscripció a la llista de reproducció.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Descarregador", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avançat", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuaris", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registres", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL des d’on s’accedirà a aquesta aplicació, sense el port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "El port desitjat. Per defecte és 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Mode multiusuari", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Ruta base dels usuaris", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Ruta base per als usuaris i els seus vídeos descarregats.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permet les subscripcions", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Ruta base de subscripcions", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Ruta base per als vídeos dels vostres canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval de comprovació", - "0f56a7449b77630c114615395bbda4cab398efd8": "La unitat és de segons, només inclou números.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "De vegades, es descarreguen vídeos nous abans de processar-los completament. Aquesta configuració fa que, pels vídeos nous, es comprovi si hi ha una versió de més qualitat l'endemà.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Torneu a descarregar les càrregues noves", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Per defecte", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permet canviar el tema", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Camí a la carpeta d’àudio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Ruta de descàrregues de només d'àudio. És relatiu a la carpeta arrel de YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Ruta de la carpeta de vídeo", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Ruta de descàrregues de vídeo. És relatiu a la carpeta arrel de YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Sortida de fitxer per defecte", - "1148fd45287ff09955b938756bc302042bcb29c7": "La ruta és relativa a les rutes de descàrrega anteriors. No inclogueu l'extensió.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Arguments personalitzats globals", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Arguments personalitzats globals per a descàrregues a la pàgina inicial. Els arguments es delimiten amb dues comes, així: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categories", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Utilitzeu l'arxiu youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inclou la miniatura", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inclou-hi metadades", - "fb35145bfb84521e21b6385363d59221f436a573": "Mata totes les descàrregues", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Títol superior", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Gestor de fitxers habilitat", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Gestor de descàrregues habilitat", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permet seleccionar la qualitat", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Mode de només baixades", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permet el mode de descàrrega múltiple", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilita l'API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clau API pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Mostra la documentació", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Això suprimirà la vostra clau de l’API anterior!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genera", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utilitza l’API del YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clau de l’API del YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "És senzill generar una clau!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Utilitza l’API del Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clau de l’API del Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "També coneguda com a identificador de client.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Baixa automàticament el xat del Twitch", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Feu clic aquí", - "7f09776373995003161235c0c8d02b7f91dbc4df": "per a baixar manualment l’extensió YouTubeDL-Material per al Chrome.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Heu de carregar manualment l'extensió i modificar la seva configuració per configurar l'URL de la interfície.", - "9a2ec6da48771128384887525bdcac992632c863": "per instal·lar l'extensió oficial de YoutubeDL-Material per a Firefox directament des de la pàgina d'extensions de Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruccions detallades de configuració.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "No cal gaire cosa, a part de canviar la configuració de l'extensió per establir l'URL de la interfície.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arrossegueu l’enllaç següent als vostres adreces d'interès i ja podreu començar! Només cal que aneu al vídeo de YouTube que vulgueu baixar i feu clic al marcador.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genereu el marcador 'només àudio'", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleccioneu un baixador", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Utilitzeu l'agent de descàrrega predeterminat", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleccioneu un agent de descàrrega", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nivell de registre", - "db6c192032f4cab809aad35215f0aa4765761897": "Caducitat de l'inici de sessió", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permet la descàrrega avançada", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Utilitza les galetes", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Defineix les galetes", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permetre el registre d’usuari", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Mètode d’autenticació", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "DN de vinculació", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Credencials de vinculació", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Base de Cerca", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtre de cerca", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Quant al YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "és un descarregador de YouTube de codi obert construït segons les especificacions de Material Design de Google. Podeu descarregar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per estar al dia amb els nous vídeos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "té algunes funcions increïbles incloses. Una àmplia API, assistència de Docker i suport de localització (traducció). Feu clic a la icona de GitHub de més amunt per llegir totes les funcions compatibles.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versió instal·lada:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Heu trobat un error o teniu un suggeriment?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "per crear un report de problema!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "S’està comprovant si hi ha actualitzacions…", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Hi ha una actualització disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Podeu actualitzar des del menú de paràmetres.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleccioneu una versió:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Activa la compartició", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usa la marca de temps", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segons", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copia al porta-retalls", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Comparteix la llista", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Comparteix el vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Comparteix l’àudio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Id. de la sessió:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Neteja totes les baixades", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "No hi ha cap descàrrega disponible!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "El teu perfil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Tancar sessió", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creat:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "No heu iniciat la sessió.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crea un compte d'administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "No s'ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d'un compte d'administrador amb el nom d'usuari 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Crea", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Afegeix usuaris", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Edita el rol", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nom d’usuari", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rol", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Accions", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gestiona l'usuari", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Suprimeix l'usuari", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Edita l'usuari", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID d'usuari:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nova contrasenya", - "6498fa1b8f563988f769654a75411bb8060134b9": "Establir una contrasenya nova", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Utilitzeu el rol per defecte", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sí", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestiona el rol", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Línies:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Esborra els registres", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Generat automàticament", - "ccf5ea825526ac490974336cb5c24352886abc07": "Obrir fitxer", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Obre el fitxer en una pestanya nova", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Anar a la subscripció", - "94e01842dcee90531caa52e4147f70679bac87fe": "Suprimeix i torna a descarregar", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Esborra per sempre", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Veure més.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Veure menys.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Llargada:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.cs.json b/src/assets/i18n/messages.cs.json deleted file mode 100644 index f3a2ab1..0000000 --- a/src/assets/i18n/messages.cs.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "O aplikaci", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Účet", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Tmavý vzhled", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Nastavení", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Domů", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Přihlásit se", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Odběry", - "822fab38216f64e8166d368b59fe756ca39d301b": "Stažené", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Pouze Zvuk", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Stáhnout", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalita", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Použijte URL adresu", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Zobrazit", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Stahovat více zároveň", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Zrušit", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Pokročilé nastavení", - "4e4c721129466be9c3862294dc40241b64045998": "Použít vlastní argumenty", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Vlastní argumenty", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Není třeba vkládat URL adresu, jen to co je za ní. Argumenty se oddělují pomocí dvou čárek za sebou takto: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Použít vlastní výstup", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Vlastní výstup", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentace", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Cesta je relativní ke nakonfigurované cestě pro stahování. Nezahrnujte koncovky souborů.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulovaný příkaz:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Použit autentifikaci", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Uživatelské jméno", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Heslo", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Vytvořit playlist", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Název", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Typ", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audio soubory", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videa", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Odebírat playlist nebo kanál", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL adresa", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL adresa playlistu nebo kanálu", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Vlastní název", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Stáhnout všechny nahrávky", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Nejvyšší kvalita", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Stahovat pouze audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Režim pouze pro streamování", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Toto je přidáno za standartní argumenty.", - "98b6ec9ec138186d663e64770267b67334353d63": "Vlastní výstup souboru", - "d7b35c384aecd25a516200d6921836374613dfe7": "Zrušit odběr", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Odebírat", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Stahovat videa nahraná naposled v", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Typ:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Zavřít", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportovat Archiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Zrušit odběr", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pozastaveno)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archiv:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Název:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Autor:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Velikost souboru:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Cesta:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Datum Nahrání:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategorie:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Upravid youtube-dl argumenty", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Nové simulované argumenty", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Přidat argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Hledat podle kategorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Použít hodnotu argumentu", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Přidat argument", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Upravit", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Hodnota argumentu", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aktualizace", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrovat uživatele", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Uživatelské jméno", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrovat", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Nahrání nových cookies", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "POZNÁMKA: Nahráním nových cookies přepíšete vaše předchozí cookie. Vezměte na vědomí, že cookies jsou společné pro celou instanci, nikoliv rozdělené podle uživatelů.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Přetáhněte sem", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Upravit playlist", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Přidat obsah", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Uložit", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normální řazení", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Opačné řazení", - "d02888c485d3aeab6de628508f4a00312a722894": "Moje videa", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Vyhledávání", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nebyla nalezena žádná videa.", - "3697f8583ea42868aa269489ad366103d94aece7": "Úprava", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pozastaveno", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Úprava kategorie", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Pravidla", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Přidat nové pravidlo", - "792dc6a57f28a1066db283f2e736484f066005fd": "Stáhnout Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Upravit", - "826b25211922a1b46436589233cb6f1a163d89b7": "Odstranit", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informace", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Počet:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Odstranit a zablokovat", - "dad95154dcef3509b8cc705046061fd24994bbb7": "zhlédnutí", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Uložit změny", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Stažení proběhlo úspěšně", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Došlo k chybě", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Podrobnosti", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Došlo k chybě:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Zahájení stahování:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Konec stahování:", - "ad127117f9471612f47d01eae09709da444a36a4": "Cesta k souboru:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Vaše odběry", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanály", - "47546e45bbb476baaaad38244db444c427ddc502": "Playlisty", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Název není dostupný. Probíhá vyhledávání kanálu.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Nemáte žádné odběry.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Název není dostupný. Probíhá vyhledávání playlistu.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Nemáte žádné odběry playlistů.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Obecné", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Stahování", - "d5f69691f9f05711633128b5a3db696783266b58": "Ostatní", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Pokročilé", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Uživatelé", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Záznamy", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Zavřít} false {Zrušit} other {Ostatní}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL adresa této aplikace, bez čísla portu.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Číslo portu", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Momentálně nastavený port. Výchozí je 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Režim více uživatelů", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Cesta pro uživatele", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Základní cesta pro uživatele a jejich stažená videa.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Povolit odběry", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Základní cesta pro odběry", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Základní cesta k videím z odebíraných kanálů a playlistů. Cesta je relativní k hlavní složce YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval kontroly", - "0f56a7449b77630c114615395bbda4cab398efd8": "Hodnota ve vteřinách, použijte pouze číslice.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Někdy jsou nová videa stažena dříve než mohou být plně zpracována. Toto nastavení znamená, že nová videa budou zkontrolována následující den pro zjištění, zda existují verze ve vyšší kvalitě.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Znovu stáhnout čersvé nahrávky", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Vzhled", - "ff7cee38a2259526c519f878e71b964f41db4348": "Výchozí", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Povolit změnu vzhledu", - "fe46ccaae902ce974e2441abe752399288298619": "Jazyk", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Cesta pro složku s audio soubory", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Cesta pro složku se zvukovými soubory. Cesta je relativní k hlavní složce YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Cesta pro složku s video soubory", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Cesta pro složku s video soubory. Cesta je relativní k hlavní složce YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Výchozí výstup souboru", - "1148fd45287ff09955b938756bc302042bcb29c7": "Cesta je relativní k cestám pro stažení výše. Nezahrnujte koncovky souborů.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Globální vlastní argumenty", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Globální vlastní argumenty pro stahování na hlavní stránce. Argumenty se oddělují pomocí dvou čárek za sebou takto: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategorie", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Použít archiv youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Zahrnout náhledový obrázek", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Zahrnout metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Zrušit všechna stahování", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Hlavní název", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Povolit správce souborů", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Povolit správce stahování", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Povolit výběr kvality", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Režim pouze stahování", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Povolit režim více stahování zároveň", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Povolit Veřejné API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Veřejný API Klíč", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Zobrazit dokumentaci", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Tímto odstraníte svůj starý API klíč!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Vygenerovat", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Použít YouTube API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube API Klíč", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Vygenerovat klič je snadné!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Použít Twitch API", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch API Klíč", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Také známý jako ID Klienta.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Automaticky stahovat Twitch Chat", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikněte zde", - "7f09776373995003161235c0c8d02b7f91dbc4df": "pro ruční stažení oficiálního Chrome doplňku YoutubeDL-Material.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Musíte ručně nahrát rozšíření a upravit jeho nastavení tak, aby odkazovalo na URL adresu vaší domény.", - "9a2ec6da48771128384887525bdcac992632c863": "pro instalaci oficiálního doplňku YouTubeDL-Material přímo z obchodu Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Podrobné instrukce k nastavení.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Není toho potřeba mnoho, stačí v nastavení rozšíření změnit odkaz na URL adresu Vaší domény.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Přetáhněte odkaz níže do svých záložek a je to! Poté si najděte na YouTube video, které byste chtěli stáhnout a klikněte na uloženou záložku.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Vygenerovat záložku pro 'pouze zvuk'", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Vybrat službu pro stahování", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Použít výchozího agenta pro stahování", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Vybrat agenta pro stahování", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Úroveň Záznamů", - "db6c192032f4cab809aad35215f0aa4765761897": "Vypršení přihlášení", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Povolit pokročilé nastavení stahování", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Použít Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Nastavit Cookies", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Povolit registraci uživatelů", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentifikační metoda", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interní", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL adresa LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Přihlašovací údaje pro Bind", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Vyhledávací Základna", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Vyhledávací Filtr", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "O YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "je open-source projekt pro stahování z YouTube postavený na specifikaci Material Designu od Google. Můžete pohodlně a bez problémů stahovat Vaše oblíbená videa jako video soubory nebo pouze zvukové soubory a dokonce odebírat Vaše oblíbené kanály a playlisty, aby Vám neunikla ta nejnovější videa.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "má spoustu skvělých funkcí! Rozšířitelné API, podporu Dockeru, překladů a lokalizace. Pro více informací o všech funkcích klikněte na GitHub ikonu výše.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Nainstalovaná verze:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Našli jste chybu nebo máte připomínku?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "pro vytvoření Problému na GitHubu!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Probíhá kontrola aktualizací...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Dostupná aktualizace", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Můžete aktualizovat pomocí menu nastavení.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Vyberte verzi:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Povolit sdílení", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Použít časové razítko", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Vteřin", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Zkopírovat do schránky", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Sdílet playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Sdílet video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Sdílet audio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID Relace:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Vymazat všechna stahování", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(momentální)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Nejsou dostupná žádná stahování!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Váš Profil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Odhlásit se", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Vytvořeno:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Nejste přihlášen.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Vytvořit administrátorský účet", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Nebyl zjištěn žádný administrátorský účet. Tímto se vytvoří administrátorský účet 'admin' a bude mu vytvořeno heslo.", - "70a67e04629f6d412db0a12d51820b480788d795": "Vytvořit", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Přidat Uživatele", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Upravit Roli", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Uživatelské jméno", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Role", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Akce", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Spravovat uživatele", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Odstranit uživatele", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Upravit uživatele", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID Uživatele:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nové heslo", - "6498fa1b8f563988f769654a75411bb8060134b9": "Nastavit nové heslo", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Použít výchozí nastavení role", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ano", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Ne", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Spravovat roli", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Řádky:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Vyčistit záznamy", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Vytvořeno automaticky", - "ccf5ea825526ac490974336cb5c24352886abc07": "Otevřít soubor", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Otevřít soubor na nové kartě", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Jít do odběrů", - "94e01842dcee90531caa52e4147f70679bac87fe": "Odstranit a stáhnout znovu", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Odstranit navždy", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Zobrazit více.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Zobrazit méně.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Délka:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.de.json b/src/assets/i18n/messages.de.json deleted file mode 100644 index fa321dd..0000000 --- a/src/assets/i18n/messages.de.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Wiedergabeliste erstellen", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Name", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audiodateien", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videos", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Youtube-dl Argumente ändern", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulierte neue Argumente", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Argument hinzufügen", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Nach Kategorie filtern", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Argument-Wert verwenden", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-Wert", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Argument hinzufügen", - "d7b35c384aecd25a516200d6921836374613dfe7": "Abbrechen", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Ändern", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "YouTube Downloader", - "6d2ec8898344c8955542b0542c942038ef28bb80": "Bitte geben Sie eine gültige URL ein.", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualität", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL verwenden", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Ansehen", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Nur Audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-Herunteraden-Modus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Herunterladen", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Abbrechen", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Erweitert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulierter Befehl:", - "4e4c721129466be9c3862294dc40241b64045998": "Benutzerdefinierte Argumente verwenden", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Benutzerdefinierte Argumente", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Die URL muss nicht angegeben werden, sondern nur der Teil danach. Argumente werden mit zwei Kommata getrennt: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Benutzerdefinierte Ausgabe verwenden", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Benutzerdefinierte Ausgabe", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentation", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Der Pfad ist relativ zum Konfigurations-Download-Pfad. Dateiendung auslassen.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Authentifizierung verwenden", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Benutzername", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passwort", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Ihre Audiodateien befinden sich hier", - "47546e45bbb476baaaad38244db444c427ddc502": "Wiedergabelisten", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "Keine Wiedergabelisten verfügbar. Erstellen Sie eine aus Ihren heruntergeladenen Audiodateien, indem Sie auf das blaue Pluszeichen klicken.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Video", - "960582a8b9d7942716866ecfb7718309728f2916": "Ihre Videodateien befinden sich hier", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "Keine Playlisten verfügbar. Erstellen Sie eine aus heruntergeladenen Audiodateien, indem Sie auf das blaue Pluszeichen klicken.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Name:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Kanal:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Dateigröße:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Pfad:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Hochgeladen am:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Schließen", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Anzahl:", - "321e4419a943044e674beb55b8039f42a9761ca5": "Infos", - "826b25211922a1b46436589233cb6f1a163d89b7": "Löschen", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Löschen und zur schwarzen Liste hinzufügen", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Einstellungen", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL, über die auf diese Applikation zugegriffen wird, ohne Port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Der gewünschte Port. Standard ist 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-User Modus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Benutzer Basispfad", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basispfad für Benutzer und deren heruntergeladene Videos.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Verschlüsselung verwenden", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Dateipfad zum Zertifikat", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Dateipfad zum Zertifikatsschlüssel", - "4e3120311801c4acd18de7146add2ee4a4417773": "Abonnements erlauben", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements Basispfad", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basispfad für Videos von abonnierten Kanälen und Wiedergabelisten. Dieser ist relativ zum Stammordner von YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Prüfintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "Einheit ist Sekunden, nur Zahlen sind erlaubt.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Youtube-DL Archiv verwenden", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Mit der Archivfunktion", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "werden Informationen über Videos, welche durch ein Abonnement heruntergeladen wurden, in einem Textdokument festgehalten. Diese befinden sich in dem Archiv Unterverzeichnis vom Abonnementsordner.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Dadurch können Videos permanent gelöscht werden, ohne das Abonnement beenden zu müssen. Außerdem kann dadurch aufgezeichnet werden, welche Videos heruntergeladen wurden. Z. B. im Falle eines Datenverlusts.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Design", - "ff7cee38a2259526c519f878e71b964f41db4348": "Standard", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Dunkel", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Designänderung erlauben", - "fe46ccaae902ce974e2441abe752399288298619": "Sprache", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Allgemein", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Audio Basispfad", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Dateipfad für Audio-Downloads. Dieser ist relativ zum Stammordner von YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Video Basispfad", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Dateipfad für Video-Downloads. Dieser ist relativ zum Stammordner von YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Globale benutzerdefinierte Argumente für Downloads auf der Startseite. Argumente werden durch zwei Kommata voneinander getrennt: ,,", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Herunterlader", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Titel der Kopfzeile", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Dateimanager aktivieren", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Download-Manager aktivieren", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Qualitätsauswahl erlauben", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Nur-Herunterladen-Modus", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Multi-Herunterladen-Modus erlauben", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Einstellungen durch PIN schützen", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Neuen PIN festlegen", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Öffentliche API aktivieren", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Öffentlicher API-Schlüssel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Dokumentation ansehen", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generieren", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "YouTube API verwenden", - "ce10d31febb3d9d60c160750570310f303a22c22": "Youtube API-Schlüssel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Schlüsselgeneration ist einfach!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Hier klicken", - "7f09776373995003161235c0c8d02b7f91dbc4df": "um die offizielle YoutubeDL-Material Chrome-Erweiterung manuell herunterzuladen.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Die Erweiterung muss manuell installiert werden und in den Einstellungen der Erweiterung muss die Frontend-URL eingetragen werden.", - "9a2ec6da48771128384887525bdcac992632c863": "um die offizielle YoutubeDL-Material Firefox-Erweiterung direkt aus dem Firefox-Addon-Store zu installieren.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaillierte Anleitung.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Die Frontend-URL muss in den Einstellungen der Erweiterung eingetragen werden.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Der untenstehende Link muss nur in die Lesezeichenleiste gezogen werden. Auf einer unterstützten Webseite können Sie danach einfach auf das Lesezeichen klicken, um das Video herunterzuladen.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "'Nur Audio' Lesezeichen generieren", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Standard Download-Agent verwenden", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Downloader auswählen", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Erweiterte Download-Optionen aktivieren", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Erweitert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Benutzerregistrierung zulassen", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Benutzer", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Speichern", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Schließen} false {Abbrechen} other {Andere}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Über YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "ist ein quelloffener YouTube-Downloader, der nach den Material-Design-Richtlinien von Google erstellt wurde. Sie können Ihre Lieblingsvideos reibungslos als Video- oder Audiodateien herunterladen und sogar Ihre Lieblingskanäle und Wiedergabelisten abonnieren, um auf dem Laufenden zu bleiben.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "beinhaltet viele tolle Funktionen! API, Docker und Lokalisierung werden unter anderem unterstützt. Informieren Sie sich über alle unterstützten Funktionen auf Github.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installierte Version:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Suche nach Aktualisierungen …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Aktualisierung verfügbar", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Sie können über das Einstellungsmenü aktualisieren.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Haben Sie einen Fehler gefunden oder einen Vorschlag?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "um ein Ticket zu öffnen!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Ihr Profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Erstellt:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Sie sind nicht angemeldet.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Anmelden", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Abmelden", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Admin-Konto erstellen", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Es wurde kein Standard-Administratorkonto erkannt. Ein Administratorkonto mit dem Benutzernamen \"admin\" wird erstellt und ein Passwort wird festgelegt.", - "70a67e04629f6d412db0a12d51820b480788d795": "Erstellen", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Über", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Startseite", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnements", - "822fab38216f64e8166d368b59fe756ca39d301b": "Heruntergeladene", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Wiedergabeliste teilen", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Video teilen", - "1d540dcd271b316545d070f9d182c372d923aadd": "Audio teilen", - "1f6d14a780a37a97899dc611881e6bc971268285": "Freigabe aktivieren", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Zeitstempel verwenden", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunden", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "In die Zwischenablage kopieren", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Änderungen speichern", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Details", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Ein Fehler ist aufgetreten:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Start des Herunterladen:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Ende des Herunterladen:", - "ad127117f9471612f47d01eae09709da444a36a4": "Dateipfad(e):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonnieren Sie eine Wiedergabeliste oder einen Kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL der Wiedergabeliste oder des Kanales", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Benutzerdefinierter Name", - "f3f62aa84d59f3a8b900cc9a7eec3ef279a7b4e7": "Dies ist optional", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Alle hochgeladene Videos herunterladen", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Videos herunterladen aus den letzten", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Nur-Streaming-Modus", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonnieren", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Typ:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Archiv exportieren", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Deabonnieren", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Ihre Abonnements", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanäle", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Name nicht verfügbar. Kanal wird abgerufen...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Sie haben keine Kanäle abonniert.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Name nicht verfügbar. Wiedergabeliste wird abgerufen.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Sie haben keine Wiedergabeliste abonniert.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Suchen", - "2054791b822475aeaea95c0119113de3200f5e1c": "Länge:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Löschen und erneut herunterladen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Permanent löschen", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aktualisierungsprogramm", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Wählen Sie eine Version:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrieren", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Sitzungs-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(aktuell)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Zurzeit sind keine Downloads verfügbar!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Nutzer registrieren", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Benutzername", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Benutzer verwalten", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Benutzer-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Neues Passwort", - "6498fa1b8f563988f769654a75411bb8060134b9": "Neues Passwort festlegen", - "40da072004086c9ec00d125165da91eaade7f541": "Standard verwenden", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nein", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Rolle verwalten", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Benutzername", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Aktionen", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Benutzer hinzufügen", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rolle bearbeiten", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Zeilen:", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "Logs erscheinen hier", - "98b6ec9ec138186d663e64770267b67334353d63": "Benutzerdefinierte Dateiausgabe", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Diese werden nach den Standardargumenten hinzugefügt.", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Nur-Audio-Modus", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Protokolle", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Cookies setzen", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Cookies verwenden", - "d01715b75228878a773ae6d059acc639d4898a03": "Safe download aufheben", - "85e0725c870b28458fd3bbba905397d890f00a69": "Beachte: Neu hochgeladene Cookies überschreiben die vorherigen. Cookies sind global und gelten nicht auf einer Pro-Benutzer-Basis.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Ziehen-und-Ablegen", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Neue Cookies hochladen", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Bearbeiten", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Wiedergabeliste bearbeiten", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Suchfilter", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "db6c192032f4cab809aad35215f0aa4765761897": "Ablauf der Anmeldung", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Protokollebene", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dadurch wird Ihr alter API-Schlüssel gelöscht!", - "fb35145bfb84521e21b6385363d59221f436a573": "Alle Herunterladen-Ereignisse abbrechen", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Metadaten einschließen", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Miniaturansicht einschließen", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "HINWEIS: Durch das Hochladen neuer Cookies werden Ihre vorherigen Cookies überschrieben. Beachten Sie auch, dass Cookies instanzweit und nicht pro Benutzer sind.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Weitere Inhalte hinzufügen", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Typ", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "d02888c485d3aeab6de628508f4a00312a722894": "Meine Videos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Zu den Abonnements gehen", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Datei in einer neuen Registerkarte öffnen", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Herunterladen-Liste leeren", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Rollenstandard verwenden", - "ccf5ea825526ac490974336cb5c24352886abc07": "Datei öffnen", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Protokolldatei löschen", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Benutzer löschen", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Benutzer bearbeiten", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Authentifizierungsmethode", - "3697f8583ea42868aa269489ad366103d94aece7": "Bearbeiten", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Ein Fehler ist aufgetreten", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Der Download war erfolgreich", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Twitch-Chat automatisch herunterladen", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Wird auch als Client-ID bezeichnet.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch-API-Schlüssel", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Twitch-API verwenden", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategorien", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Neue Uploads erneut herunterladen", - "792dc6a57f28a1066db283f2e736484f066005fd": "Twitch-Chat herunterladen", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Neue Regel hinzufügen", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regeln", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Kategorie bearbeiten", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausiert", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Keine Videos gefunden.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Umgekehrte Reihenfolge", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normale Reihenfolge", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Inhalt hinzufügen", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategorie:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausiert)", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Weniger sehen.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Mehr sehen.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Automatisch generiert", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Wähle einen Download-Agenten", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Globale benutzerdefinierte Argumente", - "1148fd45287ff09955b938756bc302042bcb29c7": "Der Pfad ist relativ zu den darüberliegenden Downloadpfaden. Erweiterung auslassen.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Standard-Dateiausgabe", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Manchmal werden neue Videos heruntergeladen bevor diese von der Videoplattform vollständig verarbeitet wurden. Diese Einstellung bewirkt, dass am Folgetag neue Videos auf eine höhere Auflösung überprüft werden.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "Aufrufe", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Maximale Qualität" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.es.json b/src/assets/i18n/messages.es.json deleted file mode 100644 index c7e3277..0000000 --- a/src/assets/i18n/messages.es.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "ccc7e92cbdd35e901acf9ad80941abee07bd8f60": "No es necesario incluir URL, solo todo después ", - "f41145afc02fd47ef0576ac79acd2c47ebbf4901": "Argumentos personalizados globales para descargas en la página de inicio.", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una lista de reproducción", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nombre", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Archivos de sonido", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Archivos de video", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modificar args de youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Args nuevos simulados", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Añadir un arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Busqueda por categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usar valor de arg", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor de arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Añadir arg", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancelar", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modificar", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Descargador de Youtube", - "6d2ec8898344c8955542b0542c942038ef28bb80": "Por favor entre una URL válida", - "a38ae1082fec79ba1f379978337385a539a28e73": " Calidad ", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Usa URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": " Ver ", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Solo audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Descarga múltiple", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Descarga", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancelar", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avanzado", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Commando simulado:", - "4e4c721129466be9c3862294dc40241b64045998": "Usar argumentos personalizados", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Argumentos personalizados", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "No es necesario incluir URL, solo todo después. Los argumentos se delimitan usando dos comas así: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usar salida personalizada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Salida personalizada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentación", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "La ruta es relativa a la ruta de descarga de la config. No incluya el extensión.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Usa autenticación", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nombre de usuario", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Contraseña", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Tus archivos de audio están aquí", - "47546e45bbb476baaaad38244db444c427ddc502": "Listas de reproducción", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "No hay listas de reproducción disponibles. Cree uno de tus archivos de audio haciendo clic en el botón azul más.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Vídeo", - "960582a8b9d7942716866ecfb7718309728f2916": "Tus archivos de video son aquí", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "No hay listas de reproducción disponibles. Cree uno de tus archivos de video haciendo clic en el botón azul más.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nombre:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Cargador:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Tamaño del archivo:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Ruta:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Subido:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Cerca", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Cuenta:", - "321e4419a943044e674beb55b8039f42a9761ca5": "Información", - "826b25211922a1b46436589233cb6f1a163d89b7": "Eliminar", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Eliminar y pones en la lista negra", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Configuraciones", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL desde la que se accederá a esta aplicación, sin el puerto.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Puerto", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Puerto deseado. El valor predeterminado es 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modo multiusuario", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Ruta base de usuarios", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Ruta base para los usuarios y sus videos descargados.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Usa cifrado", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Ruta del archivo de certificado", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Ruta de archivo de clave", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permitir suscripciones", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Ruta base de suscripciones", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Ruta base para videos de sus canales y listas de reproducción suscritos. Es relativo a la carpeta raíz de YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervalo de comprobación", - "0f56a7449b77630c114615395bbda4cab398efd8": "La unidad es segundos, solo incluye números.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Usa el archivo de youtube-dl", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Con la función de archivo de youtube-dl,", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "los videos descargados de sus suscripciones se graban en un archivo de texto en el subdirectorio del archivo de suscripciones.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Esto permite eliminar videos de sus suscripciones de forma permanente sin darse de baja y le permite grabar los videos que descargó en caso de pérdida de datos.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Defecto", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Oscura", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permitir cambio de tema", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Ruta de la carpeta de audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Ruta para descargas de solo audio. Es relativo a la carpeta raíz de YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Ruta de la carpeta de video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Ruta de descarga de videos. Es relativo a la carpeta raíz de YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Argumentos personalizados globales para descargas en la página de inicio. Los argumentos se delimitan usando dos comas así: ,,", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Descargador", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Título superior", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Administrador de archivos habilitado", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Administrador de descargas habilitado", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permitir selección de calidad", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modo de solo descarga", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permitir el modo de descarga múltiple", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Requiere pin para la configuración", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Establecer nuevo pin", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilitar API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clave API pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Ver documentación", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generar", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utilizar la API de YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clave API de YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "¡Generar una clave es fácil!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "¡Haga clic aquí", - "7f09776373995003161235c0c8d02b7f91dbc4df": "para descargar la extensión Chrome oficial de YoutubeDL-Material manualmente.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Debe cargar manualmente la extensión y modificar la configuración de la extensión para establecer la URL de la interfaz.", - "9a2ec6da48771128384887525bdcac992632c863": "para instalar la extensión Firefox oficial de YoutubeDL-Material directamente desde la página de extensiones de Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instrucciones detalladas de configuración.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "No se requiere mucho más que cambiar la configuración de la extensión para establecer la URL de la interfaz.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arrastra el enlace de abajo a tus marcadores, ¡y listo! Simplemente navegue hasta el video de YouTube que desea descargar y haga clic en el marcador.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Generar bookmarklet solo de audio", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usar agente de descarga predeterminado", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleccione un descargador", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permitir descarga avanzada", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avanzado", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permitir registro de usuario", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuarios", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salvar", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Cerrar} false {Cancelar} other {Otro} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "es un descargador de código abierto de YouTube creado bajo las especificaciones de \"Material Design\" de Google. Puede descargar sin problemas sus videos favoritos como archivos de video o audio, e incluso suscribirse a sus canales favoritos y listas de reproducción para mantenerse actualizado con sus nuevos videos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "tiene algunas características increíbles incluidas! Una amplia API, soporte de Docker y soporte de localización (traducción). Lea todas las funciones compatibles haciendo clic en el icono de GitHub que se encuentra arriba.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versión instalada:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Comprobando actualizaciones...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Actualización disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Puede actualizar desde el menú de configuración.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "¿Encontró un error o tiene una sugerencia?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "para crear una cuestión!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Tu perfil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creado:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Usted no se ha identificado.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Identificarse", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Salir", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crear cuenta de administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "No se detectó una cuenta de administrador predeterminada. Esto creará y establecerá la contraseña para una cuenta de administrador con el nombre de usuario como 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Crear", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Sobre", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Inicio", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Suscripciones", - "822fab38216f64e8166d368b59fe756ca39d301b": "Descargas", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Compartir lista de reproducción", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Compartir vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Compartir audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Habilitar compartir", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usar marca de tiempo", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segundos", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copiar al Portapapeles", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Guardar cambios", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalles", - "383000ab16bf415d5a1d61d7eb7b5959c72a9515": "Se ha producido un error:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inicio de descarga:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Fin de descarga:", - "ad127117f9471612f47d01eae09709da444a36a4": "Ruta(s) del archivo:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Suscríbase a la lista de reproducción o al canal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "La lista de reproducción o la URL del canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nombre personalizado", - "f3f62aa84d59f3a8b900cc9a7eec3ef279a7b4e7": "Esto es opcional", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Descargar todas las cargas", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Descargar videos subidos en el último", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modo de solo transmisión", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Subscribe", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archivo:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportar el archivo", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Darse de baja", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Sus suscripciones", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canales", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nombre no disponible. Recuperación de canales en progreso.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "No tienes suscripciones de canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nombre no disponible. Recuperación de listas de reproducción en progreso.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "No tienes suscripciones a listas de reproducción.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Buscar", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duración:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Eliminar y volver a descargar", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Borrar para siempre", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Updater", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleccione una versión:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrarse", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID de sesión:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "¡No hay descargas disponibles!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrar un usuario", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nombre de usuario", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Administrar usuario", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID de usuario:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nueva contraseña", - "6498fa1b8f563988f769654a75411bb8060134b9": "Establecer nueva contraseña", - "40da072004086c9ec00d125165da91eaade7f541": "Uso por defecto", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Si", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestionar rol", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": " Nombre de usuario ", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": " Rol ", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": " Acciones ", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Agregar Usuarios", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Editar Rol", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registros", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Search Filter", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Método de autenticación", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Configurar Cookies", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usar Cookies", - "db6c192032f4cab809aad35215f0aa4765761897": "Caducidad de inicio de sesión", - "00e274c496b094a019f0679c3fab3945793f3335": "Seleccione un nivel de registrador", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "¡Esto eliminará su vieja clave API!", - "fb35145bfb84521e21b6385363d59221f436a573": "Mata todas las descargas", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Incluir metadatos", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Incluir miniatura", - "85e0725c870b28458fd3bbba905397d890f00a69": "NOTA: La carga de cookies nuevas anulará las cookies anteriores y las cookies son para toda la instancia, no por usuario.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrastrar y soltar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Subir nuevas cookies", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Editar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modificar lista de reproducción", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "d02888c485d3aeab6de628508f4a00312a722894": "Mis videos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ir a suscripción", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Abrir archivo en nueva pestaña", - "ccf5ea825526ac490974336cb5c24352886abc07": "Abrir archivo", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Borrar registros", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Líneas:", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Eliminar usuario", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Editar usuario", - "98b6ec9ec138186d663e64770267b67334353d63": "Salida de archivo personalizado", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Estos se agregan después de los argumentos estándar.", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modo de solo audio", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Un error ha ocurrido:", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Un error ha ocurrido", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "La descarga era exitosa", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usar rol predeterminado", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Claro todas las descargas", - "3697f8583ea42868aa269489ad366103d94aece7": "Editando", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nivel de registro", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: La carga de cookies nuevas anulará las cookies anteriores y las cookies son para toda la instancia, no por usuario.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Agregar más contenido", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Ver menos.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Ver más.", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleccione un agente de descarga", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Descarga automática de Twitch Chat", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "También conocido como ID de cliente.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clave de API de Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usar la API de Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorías", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Args personalizados globales", - "1148fd45287ff09955b938756bc302042bcb29c7": "La ruta es relativa a las rutas de descarga anteriores. No incluya la extensión.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Salida de archivo predeterminada", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Volver a descargar nuevas cargas", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "A veces, los videos nuevos se descargan antes de procesarse por completo. Esta configuración significará que los nuevos videos se verificarán para una versión de mayor calidad al día siguiente.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "vistas", - "792dc6a57f28a1066db283f2e736484f066005fd": "Descargar Twitch Chat", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Añadir nueva regla", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Reglas", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editando la categoría", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausado", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "No se encontraron vídeos.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Orden inverso", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Orden normal", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Añadir contenido", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoría:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausado)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Calidad máxima" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.fr.json b/src/assets/i18n/messages.fr.json deleted file mode 100644 index 5b6066b..0000000 --- a/src/assets/i18n/messages.fr.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Créer une liste de lecture", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nom", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Fichiers audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vidéos", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifier les args de téléchargement", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Nouveaux args simulés", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Ajouter un arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Rechercher par catégorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Utiliser la valeur arg", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valeur arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Ajouter", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annuler", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifier", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Youtube Downloader", - "a38ae1082fec79ba1f379978337385a539a28e73": "Résolution", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utiliser l'URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Voir", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Audio seulement", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Activer le téléchargement simultané", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Télécharger", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Annuler", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Système", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Prévisualisation des arguments :", - "4e4c721129466be9c3862294dc40241b64045998": "Utiliser des arguments personnalisés", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arguments personnalisés", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Pas besoin d'inclure l'URL, seulement ce qui suit. Les arguments sont délimités par deux virgules comme suit ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Modifier le chemin de sortie", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Sortie personnalisée", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentation", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Le chemin est relatif au chemin de téléchargement de la config. Ne pas inclure l'extension.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "S'authentifier", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nom d'utilisateur", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Mot de passe", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Vos fichiers audio sont ici", - "47546e45bbb476baaaad38244db444c427ddc502": "Listes de lecture", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "Aucune liste de lecture disponible. Créez-en une à l'aide du bouton \\\"+\\\" bleu de votre fichier audio.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Vídéos", - "960582a8b9d7942716866ecfb7718309728f2916": "Vos fichiers vidéos sont ici", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "Aucune liste de lecture disponible. Créez-en une à l'aide du bouton \\\"+\\\" bleu de votre fichier vidéo.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nom :", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL :", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Chaîne :", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Taille du fichier :", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Chemin :", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Mise en ligne :", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Fermer", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifier la liste de lecture", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID :", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Compteur :", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Modifier", - "826b25211922a1b46436589233cb6f1a163d89b7": "Effacer", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informations", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Supprimer et bannir", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Téléverser de nouveaux cookies", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Glisser-déposer", - "85e0725c870b28458fd3bbba905397d890f00a69": "NOTE : le téléversement de nouveaux cookies remplacera vos cookies précédents. Notez également que les cookies sont par instance, et non par utilisateur.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Paramètres", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL à partir de laquelle cette application sera accessible, sans le port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Port souhaité. La valeur par défault est 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Activer Multi-Utilisateurs", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Chemin d'enregistrement des utilisateurs", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Chemin racine pour les utilisateurs et leurs vidéos téléchargées.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Activer le cryptage des données", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Chemin du fichier de certificat", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Chemin d'accès au fichier clé", - "4e3120311801c4acd18de7146add2ee4a4417773": "Autoriser les abonnements", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Chemin d'enregistrement des abonnements", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Chemin racine pour les vidéos des chaînes et des listes de lecture auxquelles vous êtes abonné.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval de vérification des abonnements", - "0f56a7449b77630c114615395bbda4cab398efd8": "L'unité est la seconde, écricre uniquement un nombre entier.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Utiliser youtube-dl archive", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Avec youtube-dl's archive", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "les vidéos téléchargées à partir de vos abonnements sont enregistrées dans un fichier texte dans le sous-répertoire du fichier d'abonnement.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Cela vous permet de supprimer définitivement des vidéos de vos abonnements sans vous désabonner et vous permet d'enregistrer les vidéos que vous avez téléchargées en cas de perte de données.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Thème", - "ff7cee38a2259526c519f878e71b964f41db4348": "Par défaut", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Sombre", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Autoriser le changement du thème", - "fe46ccaae902ce974e2441abe752399288298619": "Choix de la langue", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Chemin du dossier audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Chemin racine pour les téléchargements audio uniquement.", - "46826331da1949bd6fb74624447057099c9d20cd": "Chemin d'accès au dossier vidéo", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Chemin racine de téléchargement des vidéos.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Arguments personnalisés globaux pour les téléchargements sur la page d'accueil. Les arguments sont délimités par deux virgules comme suit ,,", - "d01715b75228878a773ae6d059acc639d4898a03": "Désactiver le téléchargement sécurisé", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Téléchargements", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Nom de l'application", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Gestionnaire de fichiers activé", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Gestionnaire de téléchargement activé", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permettre la sélection de la résolution", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Empêcher le téléchargement local", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Autoriser les téléchargements simultanés", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Utiliser un code PIN", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Définir le code PIN", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Activer l'API publique", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clé API publique", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Voir documentation", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Générer", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utiliser l'API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clé API YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Générer un mot de passe !", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Cliquez ici", - "7f09776373995003161235c0c8d02b7f91dbc4df": "pour télécharger manuellement l'extension officielle YoutubeDL-Material Chrome.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Vous devez charger manuellement l'extension et modifier les paramètres de l'extension pour définir l'URL de l'interface.", - "9a2ec6da48771128384887525bdcac992632c863": "pour installer l'extension officielle YoutubeDL-Material Firefox directement depuis la page des extensions Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Installation détaillé ici.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Il suffit de modifier les paramètres de l'extension pour définir l'URL de l'interface.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Faites glisser le lien ci-dessous vers vos favoris, et le tour est joué ! Il suffit de naviguer vers la vidéo YouTube que vous souhaitez télécharger et de cliquer sur le signet.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Générer un signet audio uniquement", - "d5f69691f9f05711633128b5a3db696783266b58": "Avancés", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Utiliser l'agent de téléchargement par défault", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Sélectionner une méthode de téléchargement", - "00e274c496b094a019f0679c3fab3945793f3335": "Niveau des logs", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Autoriser le téléchargement avancé", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Utiliser les cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Gérer les cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avancé", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Autoriser l'enregistrement des utilisateurs", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Utilisateurs", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Journaux", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Sauvegarder", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Fermer} false {Annuler}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "est un téléchargeur YouTube open source créé selon le graphique \\\"Material Design\\\" de Google. Vous pouvez facilement télécharger vos vidéos préférées sous forme de fichiers vidéo ou audio, et même vous abonner à vos chaînes et listes de lecture préférées pour vous tenir au courant de vos nouvelles vidéos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "comporte des caractéristiques étonnantes ! Une API étendue, un support Docker et un support de localisation (traduction). Pour en savoir plus sur toutes les fonctionnalités prises en charge, cliquez sur l'icône GitHub ci-dessus.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Version installée :", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Vérification des mises à jours ...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Mise à jour disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Vous pouvez mettre à jour à partir du menu de configuration.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Avez-vous trouvé une erreur ou avez-vous une suggestion ?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "pour signaler un problème !", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Votre profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID :", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Créé le :", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Vous n'êtes pas identifié.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Se connecter", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Se déconnecter", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Créer un compte administrateur", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Aucun compte administrateur détecté. Veuillez définir le mot de passe du compte adminstrateur \\\"admin\\\".", - "70a67e04629f6d412db0a12d51820b480788d795": "Créer", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "À propos", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Accueil", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnements", - "822fab38216f64e8166d368b59fe756ca39d301b": "Téléchargements", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Partager une liste de lecture", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Partager une vidéo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Partager un audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Activer le partage", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Utiliser l'horodatage", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Secondes", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copier dans le presse-papiers", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Sauvegarder", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Détails", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Une erreur s'est produite :", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Début du téléchargement :", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Fin du téléchargement :", - "ad127117f9471612f47d01eae09709da444a36a4": "Chemin(s) de fichier :", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "S'abonner à la liste de lecture ou à la chaîne", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "L'URL de la liste de lecture ou de la chaîne", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nom personnalisé", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Télécharger tous les fichiers téléversés", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Télécharger les dernières vidéos téléversées", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Extraire le son", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Streaming uniquement", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Ceux-ci sont ajoutés après les arguments standard.", - "98b6ec9ec138186d663e64770267b67334353d63": "Sortie de fichier personnalisé", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "S'abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type :", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archive :", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exporter l'archive", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Se désabonner", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Vos abonnements", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Chaînes", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nom non disponible. Le rétablissement des canaux est en cours...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Vous n'êtes abonné à aucune châine.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Ce nom n'est pas disponible. Recherche de chaînes en cours.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Vous n'êtes abonné·e à aucune liste de lectures.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Chercher", - "2054791b822475aeaea95c0119113de3200f5e1c": "Durée :", - "94e01842dcee90531caa52e4147f70679bac87fe": "Effacer et re-télécharger", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Supprimer définitivement", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Mettre à jour", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Sélectionnez une version :", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Créer un compte", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID de la session :", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Pas de téléchargements !", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Ajouter un utilisateur", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nom d'utilisateur", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gérer l'utilisateur", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Identifiant de l'utilisateur :", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nouveau mot de passe", - "6498fa1b8f563988f769654a75411bb8060134b9": "Enregistrer le nouveau mot de passe", - "40da072004086c9ec00d125165da91eaade7f541": "Utilisation par défault", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Oui", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Non", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gérer le groupe", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Identifiant", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Groupe", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Gérer", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Ajouter", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Gérer les groupes", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "Les enregistrements apparaîtront ici", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Lignes :", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Une erreur s'est produite", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Le téléchargement a réussi", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Méthode d'authentification", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtre de recherche", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interne", - "db6c192032f4cab809aad35215f0aa4765761897": "Expiration de la connexion", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Niveau de journal", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Ceci supprimera votre ancienne clé API !", - "fb35145bfb84521e21b6385363d59221f436a573": "Supprimer tous les téléchargements", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inclure les métadonnées", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inclure une miniature", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "REMARQUE : le téléversement de nouveaux cookies remplacera vos cookies précédents. Notez également que les cookies sont à l'échelle de l'instance et non par utilisateur.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Ajouter plus de contenu", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vidéo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "3697f8583ea42868aa269489ad366103d94aece7": "Édition", - "d02888c485d3aeab6de628508f4a00312a722894": "Mes vidéos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Aller aux abonnements", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Ouvrir le fichier dans un nouvel onglet", - "ccf5ea825526ac490974336cb5c24352886abc07": "Ouvrir le fichier", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Effacer les journaux", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Supprimer l'utilisateur", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Utiliser le groupe par défaut", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Modifier l'utilisateur", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Effacer tous les téléchargements", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Voir moins.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Voir plus.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Généré automatiquement", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Sélectionnez un agent de téléchargement", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Télécharger automatiquement la discussion Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Aussi connu sous le nom d'identifiant client.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clé API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Utiliser l'API de Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Catégories", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Arguments personnalisés globaux", - "1148fd45287ff09955b938756bc302042bcb29c7": "Le chemin est relatif aux chemins de téléchargement ci-dessus. Ne pas inclure l'extension.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Sortie de fichier par défaut", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Retélécharger les nouvelles mises en ligne", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Il arrive que de nouvelles vidéos soient téléchargées avant d'être entièrement traitées. Grâce à ce paramètre, les nouvelles vidéos seront vérifiées pour obtenir une version de meilleure qualité le jour suivant.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "vues", - "792dc6a57f28a1066db283f2e736484f066005fd": "Télécharger la discussion Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Ajouter une nouvelle règle", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Règles", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Modification de la catégorie", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "En pause", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Aucune vidéo trouvée.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordre inverse", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordre normal", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Ajouter du contenu", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Catégorie :", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(En pause)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualité maximale" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.id.json b/src/assets/i18n/messages.id.json deleted file mode 100644 index 1fd4e2c..0000000 --- a/src/assets/i18n/messages.id.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Tentang", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Gelap", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Pengaturan", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Beranda", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Masuk", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Langganan", - "822fab38216f64e8166d368b59fe756ca39d301b": "Unduhan", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Hanya Audio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Unduhan", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kualitas", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Gunakan Alamat URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Tampilkan", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Mode Multi-unduh", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Batal", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Khusus", - "4e4c721129466be9c3862294dc40241b64045998": "Gunakan arg kustom", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arg kustom", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Tidak perlu mencantumkan alamat URL, hanya bagian setelahnya saja. Arg dibatasi menggunakan dua koma seperti ini: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Gunakan output kustom", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Output kustom", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasi", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Path adalah relatif kepada path unduh konfigurasi. Jangan mencantumkan ektensi.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Perintah yang disimulasi:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Gunakan otentikasi", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nama Pengguna", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Kata Sandi", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Buat sebuah playlist", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nama", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Jenis", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Berkas audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Langganan ke playlist atau saluran/channel", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Alamat URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Playlist atau alamat URL saluran/channel", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nama kustom", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Unduh semua unggahan", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Kualitas maksimal", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Mode hanya-audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Mode hanya-streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Ini ditambahkan setelah argumen standar.", - "98b6ec9ec138186d663e64770267b67334353d63": "Output berkas kustom", - "d7b35c384aecd25a516200d6921836374613dfe7": "Batal", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Langganan", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Unduh video yang diunggah terakhir", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Jenis:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Alamat URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Tutup", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Ekspor Arsip", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Batal Langganan", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Dijeda)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arsip:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nama:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Pengunggah:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Ukuran berkas:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Jalur/path:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Tanggal Unggah:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategori:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifikasi arg youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulasikan arg baru", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Tambah sebuah arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cari berdasarkan kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Gunakan nilai arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Tambah arg", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifikasi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Nilai arg", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Pembaruan", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Daftarkan pengguna", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nama pengguna", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Daftar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Unggah cookie baru", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "CATATAN: Mengunggah cookie baru akan menimpa cookie Anda sebelumnya. Juga ingat bahwa cookie termasuk dalam pengguna-banyak, bukan per-pengguna.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Tarik dan Jatuhkan", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifikasi playlist", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Tambah konten", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Simpan", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Urutan normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Urutan terbalik", - "d02888c485d3aeab6de628508f4a00312a722894": "Video saya", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cari", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Tidak ada video ditemukan.", - "3697f8583ea42868aa269489ad366103d94aece7": "Menyunting", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Dijeda", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Kategori suntingan", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Aturan", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Tambah aturan baru", - "792dc6a57f28a1066db283f2e736484f066005fd": "Unduh Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Sunting", - "826b25211922a1b46436589233cb6f1a163d89b7": "Hapus", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informasi", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Hitung:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Hapus dan jadikan daftarhitam", - "dad95154dcef3509b8cc705046061fd24994bbb7": "dilihat", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Simpan perubahan", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Unduhan telah berhasil", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Sebuah kesalahan telah terjadi", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Rincian", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Sebuah kesalahan telah terjadi:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Unduhan dimulai:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Unduhan berakhir:", - "ad127117f9471612f47d01eae09709da444a36a4": "Jalur file:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Langganan anda", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Saluran", - "47546e45bbb476baaaad38244db444c427ddc502": "Daftar putar", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nama tidak tersedia. Pengambilan saluran sedang berlangsung.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Anda tidak memiliki saluran langganan.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nama tidak tersedia. Pengambilan daftar-putar sedang berlangsung.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Anda tidak memiliki langganan daftar putar.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Utama", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Pengunduh", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Lanjutan", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Pengguna", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Log", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Tutup} false {Batal} other {lainnya}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL aplikasi ini akan diakses dari, tanpa port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Port yang diinginkan. Default-nya adalah 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Mode multi-pengguna", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Path basis pengguna", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Path basis untuk pengguna dan unduhan video mereka.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Izinkan langganan", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Langganan Pangkros Base", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Jalur dasar untuk video dari saluran dan daftar putar Anda yang berlangganan. Itu relatif terhadap folder root ytdl-material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Periksa interval", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unit adalah detik, hanya termasuk angka.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Kadang-kadang video baru diunduh sebelum diproses sepenuhnya. Pengaturan ini akan berarti video baru akan diperiksa untuk versi berkualitas lebih tinggi pada hari berikutnya.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Redownload unggahan segar", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Default", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Izinkan perubahan tema", - "fe46ccaae902ce974e2441abe752399288298619": "Bahasa", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Jalur folder audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Jalur untuk unduhan hanya audio. Ini relatif terhadap folder root ytdl-material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Jalur folder video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Jalur untuk unduhan video. Ini relatif terhadap folder root YTDL-material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Output file default", - "1148fd45287ff09955b938756bc302042bcb29c7": "Jalur relatif terhadap jalur unduhan di atas. Jangan sertakan ekstensi.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Args kustom global", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Args kustom global untuk unduhan di beranda. Args dibatasi menggunakan dua koma seperti itu: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategori", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Gunakan YouTube-DL Archive", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Sertakan thumbnail", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Sertakan metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Bunuh semua unduhan", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Top judul", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Manajer file diaktifkan", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Unduhan Manager diaktifkan", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Izinkan kualitas pilih", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Unduh Only Mode", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Izinkan Mode Multi-Unduh", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Aktifkan API publik", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Kunci API Publik", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Lihat dokumentasi", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Ini akan menghapus kunci API lama Anda!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Menghasilkan", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Gunakan API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube API Key", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Menghasilkan kunci itu mudah!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Gunakan Twitch API", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Kunci Twitch API", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Juga dikenal sebagai ID Klien.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Obrolan Download Otomatis", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klik disini", - "7f09776373995003161235c0c8d02b7f91dbc4df": "Untuk mengunduh ekstensi Chrome Bahan YouTubedl resmi secara manual.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Anda harus secara manual memuat ekstensi dan memodifikasi pengaturan ekstensi untuk mengatur URL frontend.", - "9a2ec6da48771128384887525bdcac992632c863": "Untuk menginstal ekstensi Firefox Bahan YouTubedl resmi langsung dari halaman ekstensi Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruksi pengaturan terperinci.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Tidak banyak yang diperlukan selain mengubah pengaturan ekstensi untuk mengatur URL frontend.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Seret tautan di bawah ke bookmark Anda, dan Anda baik-baik saja! Cukup navigasikan ke video YouTube yang ingin Anda unduh, dan klik bookmark.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Buat 'audio hanya' Bookmarklet", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Pilih pengunduh", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Gunakan agen pengunduhan default", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Pilih agen unduhan", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Layar log", - "db6c192032f4cab809aad35215f0aa4765761897": "Login kedaluwarsa", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Izinkan unduhan lanjutan", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Gunakan cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Atur Cookie", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Izinkan pendaftaran pengguna", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Metode Auth", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Gabung DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Mengikat kredensial", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Basis pencarian", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Cari Filter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Tentang YouTubedl-material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "Adalah pengunduh YouTube open-source yang dibangun di bawah spesifikasi desain bahan Google. Anda dapat mengunduh video favorit Anda dengan mulus sebagai file video atau audio, dan bahkan berlangganan saluran dan daftar putar favorit Anda untuk terus diperbarui dengan video baru mereka.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "Memiliki beberapa fitur yang luar biasa termasuk! API yang luas, dukungan Docker, dan dukungan pelokalan (terjemahan). Baca pada semua fitur yang didukung dengan mengklik ikon GitHub di atas.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versi yang diinstal:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Menemukan bug atau punya saran?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "Untuk menciptakan masalah!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Memeriksa pembaruan ...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Pembaruan tersedia", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Anda dapat memperbarui dari menu Pengaturan.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Pilih versi:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Aktifkan berbagi", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Gunakan Timestamp", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Detik", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Menyalin ke clipboard", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Bagikan Daftar Putar", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Berbagi video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Bagikan audio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID Sesi:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Hapus semua unduhan", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(arus)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Tidak ada unduhan yang tersedia!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Profil kamu", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Keluar", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Diciptakan:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Kamu tidak masuk.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Buat Akun Admin", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Tidak ada akun admin default yang terdeteksi. Ini akan membuat dan mengatur kata sandi untuk akun admin dengan nama pengguna sebagai 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Buat", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Tambahkan pengguna", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Edit peran", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nama pengguna", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Peran", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Tindakan", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Kelola pengguna", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Hapus pengguna", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Edit Pengguna", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID pengguna:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Kata sandi baru", - "6498fa1b8f563988f769654a75411bb8060134b9": "Atur kata sandi baru", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Gunakan default peran", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ya", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Tidak", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Kelola peran", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Baris:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Hapus log", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Dihasilkan otomatis", - "ccf5ea825526ac490974336cb5c24352886abc07": "Buka Berkas", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Buka berkas di tab baru", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Menuju ke langganan", - "94e01842dcee90531caa52e4147f70679bac87fe": "Hapus dan unduh ulang", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Hapus selamanya", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Lihat lebih banyak.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Lihat lebih sedikit.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Panjang:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.it.json b/src/assets/i18n/messages.it.json deleted file mode 100644 index 8a79d82..0000000 --- a/src/assets/i18n/messages.it.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una scaletta", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nome", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "File audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifica i parametri di youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simula i nuovi parametri", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Aggiungi un'impostazione", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cerca per categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usa valore impostato", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valore impostato", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Aggiungi impostazione", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annulla", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifica", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualità", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utilizza URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Visualizza", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Solo audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Modalità download multiplo", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Scarica", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Annulla", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avanzato", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Comando simulato:", - "4e4c721129466be9c3862294dc40241b64045998": "Usa parametri personalizzati", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Parametri personalizzati", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Non è necessario includere l'URL, solo ciò che viene dopo. I parametri sono delimitati da due vigole: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usa output personalizzato", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Output personalizzata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentazione", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Il percorso è relativo al percorso di download configurato. Non includere l'estensione.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Utilizza l'autenticazione", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nome utente", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Password", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nome:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Caricato da:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Dimensioni file:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Percorso:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data di caricamento:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Chiudi", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifica playlist", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Aggiungi più contenuto", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salva", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Conteggio:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Modifica", - "826b25211922a1b46436589233cb6f1a163d89b7": "Elimina", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informazioni", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Elimina e aggiungi alla lista nera", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Carica nuovi cookie", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Trascina e rilascia", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: il caricamento di nuovi cookie sovrascriverà i cookie precedenti. Inoltre tieni presente che i cookie sono a livello di processo, non per utente.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Impostazioni", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL con cui si accederà a questa applicazione, senza porta.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Porta", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Porta personalizzata. La predefinita è 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modalità multiutente", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Percorso profili utente", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Percorso per profili utente e per video scaricati da ognuno.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Consenti iscrizioni", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Percorso salvataggio playlist sottoscritte", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Percorso salvataggio per i video dei canali e delle playlist sottoscritte. È relativo alla cartella principale di YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervallo di verifica", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unità in secondi, inserire solo numeri.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Predefinito", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Scuro", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Consenti variazione tema", - "fe46ccaae902ce974e2441abe752399288298619": "Lingua", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principale", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Percorso della cartella audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Percorso per download solo audio. È relativo alla cartella principale di YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Percorso cartella Video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Percorso per il download di video. È relativo alla cartella principale di YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Parametri personalizzati generali per i download sulla home page. I parametri sono delimitati da due virgole: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Usa l'archivio youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Includi anteprima", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Includi metadati", - "fb35145bfb84521e21b6385363d59221f436a573": "Interrompi tutti i download", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Scaricato da", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Titolo della barra superiore", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Abilita il file manager", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Abilita il download manager", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Consenti la selezione della qualità", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modalità solo download", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Consenti la modalità di download multiplo", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Abilita l'API Pubblica", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Chiave API Pubblica", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Visualizza la documentazione", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genera", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Cancellerai la tua chiave API precedente!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Usa l'API di YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Chiave API YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Generare una chiave è facile!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Premi qui", - "7f09776373995003161235c0c8d02b7f91dbc4df": "per scaricare manualmente l'estensione ufficiale per Chrome di YoutubeDL-Material.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "È necessario installare manualmente l'estensione e modificarne le impostazioni inserendo l'URL della pagina principale.", - "9a2ec6da48771128384887525bdcac992632c863": "per installare l'estensione ufficiale YoutubeDL-Material per Firefox direttamente dalla pagina delle estensioni di Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Istruzioni dettagliate per la configurazione.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Viene richiesto semplicemente di modificare le impostazioni dell'estensione, inserendo l'URL della pagina principale.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Trascina il link qui sotto tra tuoi preferiti e sei a posto! Vai al video YouTube che desideri scaricare e fai clic sul preferito.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genera un preferito \"solo audio\"", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usa agente di download predefinito", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleziona un metodo di download", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Livello di Log", - "db6c192032f4cab809aad35215f0aa4765761897": "Scadenza accesso", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Consenti download avanzato", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usa i cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Imposta i cookie", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avanzate", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Consenti registrazione utente", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Metodo di autenticazione", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Associa DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Associa credenziali", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Base di ricerca", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtro di ricerca", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Utenti", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registri", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, seleziona, vero {Close} falso {Cancel} altro {otha}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Informazioni su YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "è un downloader di YouTube open source costruito secondo le specifiche Material Design di Google. Puoi scaricare agevolmente i tuoi video preferiti come file video o solo audio e persino iscriverti ai tuoi canali e playlist preferiti per tenerti aggiornato con i nuovi video pubblicati.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "ha alcune fantastiche funzionalità incluse! Una solida API, supporto Docker e supporto per la localizzazione (traduzione). Leggi tutte le funzionalità supportate cliccando sull'icona GitHub in alto.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versione installata:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Verifica aggiornamenti in corso...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Aggiornamento disponibile", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "È possibile eseguire l'aggiornamento dal menù impostazioni.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Hai trovato un errore o hai un suggerimento?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "per segnalare un problema!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Il tuo profilo", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creato:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Non hai eseguito l'accesso.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Accedi", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Esci", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crea un account amministratore", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Nessun account amministratore predefinito rilevato. Verrà creato e impostata la password per un account amministratore con il nome utente \"admin\".", - "70a67e04629f6d412db0a12d51820b480788d795": "Crea", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profilo", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Informazioni", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Pagina principale", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Iscrizioni", - "822fab38216f64e8166d368b59fe756ca39d301b": "Download", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Condividi playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Condividi il video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Condividi l'audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Abilita la condivisione", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usa data e ora", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Secondi", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copia negli appunti", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Salva le modifiche", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Il download è riuscito", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Si è verificato un errore", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Dettagli", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Si è verificato un errore:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inizio download:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Termine download:", - "ad127117f9471612f47d01eae09709da444a36a4": "Percorso(i) file:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Iscriviti alla playlist o al canale", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL della playlist o del canale", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nome personalizzato", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Scarica tutti i file caricati", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Scarica i video caricati negli ultimi", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modalità solo audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modalità solo streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Questi vengono aggiunti dopo ai parametri standard.", - "98b6ec9ec138186d663e64770267b67334353d63": "File di uscita personalizzato", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Iscriviti", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archivio:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Esporta archivio", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Annulla l'iscrizione", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "I tuoi abbonamenti", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canali", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nome non disponibile. Recupero del canale in corso.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Non sei iscritto a nessun canale.", - "47546e45bbb476baaaad38244db444c427ddc502": "Scalette", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nome non disponibile. Recupero playlist in corso.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Non sei iscritto a nessuna playlist.", - "3697f8583ea42868aa269489ad366103d94aece7": "Modifica", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cerca", - "2054791b822475aeaea95c0119113de3200f5e1c": "Durata:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Elimina e scarica di nuovo", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Elimina definitivamente", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aggiornato da", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleziona una versione:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrati", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID sessione:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(attuale)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Cancella tutti i download", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Nessun download disponibile!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registra un utente", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nome utente", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gestisci utente", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID utente:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nuova password", - "6498fa1b8f563988f769654a75411bb8060134b9": "Imposta nuova password", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usa il ruolo predefinito", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sì", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestisci ruolo", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nome utente", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Ruolo", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Azioni", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Modifica utente", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Elimina utente", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Aggiungi utenti", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Modifica ruolo", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linee:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Cancella i registri", - "ccf5ea825526ac490974336cb5c24352886abc07": "Apri il file", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Apri il file in una nuova scheda", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Vai alle iscrizioni", - "d02888c485d3aeab6de628508f4a00312a722894": "I miei video", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Parametri personalizzati generali", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Nascondi.", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Conosciuto anche come Client ID.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "File output predefinito", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Riscarica i nuovi contenuti", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "A volte i nuovi video vengono scaricati prima di essere completamente elaborati. Questa impostazione significa che per i nuovi video verrà effettuata una verifica il giorno successivo per la ricerca di versioni di qualità superiore.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Vedi altro.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Generato automaticamente", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleziona un agente di download", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Scarica automaticamente le Chat Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Chiave dell'API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usa l'API Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorie", - "1148fd45287ff09955b938756bc302042bcb29c7": "Il percorso è riferito ai percorsi di download sopra. Non includere l'estensione.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualizzazioni", - "792dc6a57f28a1066db283f2e736484f066005fd": "Scarica Chat Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Aggiungi nuova regola", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regole", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Categoria in modifica", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "In pausa", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nessun video trovato.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordine inverso", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordine normale", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Aggiungi contenuto", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(In pausa)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualità massima" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.ko.json b/src/assets/i18n/messages.ko.json deleted file mode 100644 index 1fea7ad..0000000 --- a/src/assets/i18n/messages.ko.json +++ /dev/null @@ -1,261 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "대하여", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "프로필", - "adb4562d2dbd3584370e44496969d58c511ecb63": "다크", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "설정", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "홈", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "로그인", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "구독", - "822fab38216f64e8166d368b59fe756ca39d301b": "다운로드", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "오디오만", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "다운로드", - "a38ae1082fec79ba1f379978337385a539a28e73": "품질", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL 이용", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "보기", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "복수 다운로드 모드", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "취소", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "고급", - "4e4c721129466be9c3862294dc40241b64045998": "사용자 지정 인수 이용", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "사용자 지정 인수", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "URL을 포함할 필요가 없습니다. 이후의 모든 항목만 포함하면 됩니다. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "사용자 지정 출력 사용", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "사용자 지정 출력", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "문서", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "경로는 설정된 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요.", - "4e1291cb1d579e7b7a1b802e6a8fd16ef7a557fa": "파일 자르기", - "44d007f6f8a2b19f12d85f9e49647b4ac02d7cbe": "자르기 시작지점 (초)", - "661206c3ab91fa81e9d8b40afb29f1866b78432f": "자르기 마무리지점 (초)", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "시뮬레이션된 명령:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "인증 사용", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "아이디", - "c32ef07f8803a223a83ed17024b38e8d82292407": "비밀번호", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "재생목록 만들기", - "cff1428d10d59d14e45edec3c735a27b5482db59": "제목", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "종류", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "오디오", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "동영상", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "오디오 파일", - "a52dae09be10ca3a65da918533ced3d3f4992238": "동영상", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "재생목록이나 채널 구독", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "재생목록이나 채널 URL", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "사용자 지정 이름", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "모든 업로드 된 파일 다운로드", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "최고 화질", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "오디오 전용 모드", - "408ca4911457e84a348cecf214f02c69289aa8f1": "스트리밍 전용 모드", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "이것들은 일반적인 인수 뒤에 추가됩니다.", - "98b6ec9ec138186d663e64770267b67334353d63": "사용자 지정 파일 출력", - "d7b35c384aecd25a516200d6921836374613dfe7": "취소", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "구독", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "마지막으로 업로드된 동영상 다운로드", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "종류:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "아이디:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "닫기", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "아카이브 내보내기", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "구독 취소", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(일시정지)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "아카이브:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "제목:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "업로더:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "파일 크기:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "경로:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "업로드 날짜:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "카테고리:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Youtube-dl 인수 수정", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "시뮬레이션된 새 인수", - "0b71824ae71972f236039bed43f8d2323e8fd570": "인수 추가", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "카테고리로 찾기", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "인수 값 이용", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "인수 추가", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "수정", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "인수 값", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "업데이터", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "사용자 등록", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "아이디", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "등록", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "새 쿠키 업로드", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "참고: 새로운 쿠키를 추가하면 이전 쿠키를 덮어씁니다. 또한 쿠키는 사용자 개인이 아닌 전체에 적용됩니다.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "드래그 앤 드롭", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "재생목록 수정", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "저장", - "cba36d610ddba59b6dd6fbec77199eabf0ff2de3": "재생할 때 재생목록 섞기", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "콘텐츠 추가", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "기본 순서", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "순서 거꾸로", - "d02888c485d3aeab6de628508f4a00312a722894": "내 동영상", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "검색", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "동영상 없음.", - "3697f8583ea42868aa269489ad366103d94aece7": "수정중", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "일시정지됨", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "카테고리 수정중", - "2489eefea00931942b91f4a1ae109514b591e2e1": "규칙", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "새로운 규칙 추가", - "792dc6a57f28a1066db283f2e736484f066005fd": "트위치 채팅 다운로드", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "수정", - "826b25211922a1b46436589233cb6f1a163d89b7": "삭제", - "321e4419a943044e674beb55b8039f42a9761ca5": "정보", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "동영상 수:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "삭제하고 블랙리스트 추가", - "dad95154dcef3509b8cc705046061fd24994bbb7": "조회수", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "성공적으로 다운로드 완료", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "에러 발생", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "세부사항", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "에러 발생:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "다운로드 시작:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "다운로드 끝:", - "ad127117f9471612f47d01eae09709da444a36a4": "파일 경로(들):", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "구독중", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "채널", - "47546e45bbb476baaaad38244db444c427ddc502": "재생목록", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "이름이 유효하지 않음. 채널 검색중.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "구독중인 채널이 없습니다.", - "2e0a410652cb07d069f576b61eab32586a18320d": "이름이 유효하지 않음. 플레이리스트 검색중.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "구독중인 재생목록이 없습니다.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "메인", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "다운로더", - "d5f69691f9f05711633128b5a3db696783266b58": "추가", - "fb324ec7da611c6283caa6fc6257c39a56d6aaf7": "데이터베이스", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "고급", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "사용자", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "로그", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {닫다} false {취소} other {기타}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "포트를 제외한 이 앱에 접속할 URL.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "포트", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "포트 설정. 기본 포트는 17442 입니다.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "복수 사용자 모드", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "사용자 기본 경로", - "a64505c41150663968e277ec9b3ddaa5f4838798": "사용자와 그들의 동영상 다운로드를 위한 기본 경로.", - "4e3120311801c4acd18de7146add2ee4a4417773": "구독 허용", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "구독 기본 경로", - "bc9892814ee2d119ae94378c905ea440a249b84a": "구독된 채널과 재생목록에서 나온 영상들을 위한 기본 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "확인 간격", - "0f56a7449b77630c114615395bbda4cab398efd8": "단위는 초이며, 숫자만 넣으세요.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "가끔 새 동영상이 최고 화질 처리 전에 다운로드 될 때가 있습니다. 이 설정은 새 동영상이 더 높은 화질의 버전이 있는지 다음 날짜에 확인됨을 의미합니다.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "높은 화질 재다운로드", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "테마", - "ff7cee38a2259526c519f878e71b964f41db4348": "기본", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "테마 변경 허용", - "fe46ccaae902ce974e2441abe752399288298619": "언어", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "오디오 폴더 경로", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "오디오 전용 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", - "46826331da1949bd6fb74624447057099c9d20cd": "동영상 폴더 경로", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "동영상 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "기본 파일 출력", - "1148fd45287ff09955b938756bc302042bcb29c7": "경로는 위의 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "전반적으로 적용될 사용자 지정 인수", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "홈페이지에서의 다운로드에 대해 전반적으로 적용될 사용자 지정 인수. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "카테고리", - "1f6d3986a970af27f16f8a95ce0dc3033cc90a83": "이 설정을 사용하면, 하나의 동영상이 카테고리와 일치할 경우, 전체 재생목록에 해당 카테고리가 표시됩니다.", - "5da94ccb2301f586af26916e921bdad6d673ab58": "재생목록 카테고리화 허용", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Youtube-dl 아카이브 사용", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "썸네일 포함", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "메타데이터 포함", - "fb35145bfb84521e21b6385363d59221f436a573": "모든 다운로드 종료", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "상위 제목", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "파일 매니저 설정됨", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "다운로드 매니저 설정됨", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "화질 선택 허용", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "다운로드 전용 모드", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "복수 다운로드 모드 허용", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "오픈 API 허용", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "오픈 API 키", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "문서 보기", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "이것은 예전 API키를 지울 것입니다!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "생성", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "유튜브 API 사용", - "ce10d31febb3d9d60c160750570310f303a22c22": "유튜브 API 키", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "키를 만드는 것은 쉽습니다!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "트위치 API 사용", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "트위치 API 키", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "클라이언트 ID라고도 알려져 있음.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "트위치 채팅 자동 다운로드", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "이곳을 누르세요", - "7f09776373995003161235c0c8d02b7f91dbc4df": "공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위해.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "반드시 확장 프로그램을 수동으로 실행하고 확장 프로그램 설정을 수정하여 프론트엔드 URL을 설정해야 합니다.", - "9a2ec6da48771128384887525bdcac992632c863": "파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위해.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "자세한 설정 지침.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "프론트엔드 URL을 설정하기 위해 확장 프로그램 설정을 변경하는 것 외에는 필요한 것이 많지 않습니다.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "아래 링크를 북마크에 끌어다 놓으시면 됩니다! 이제 그냥 다운로드하고자 하는 유튜브 비디오 페이지에서 북마크를 클릭하면 됩니다.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "'오디오 전용' 북마크 생성", - "47955e2cc6986625528b4352034858180d675281": "데이터베이스 위치:", - "9f8de81d44ec2a9a58b97e589b9e3154b3966c60": "테이블당 레코드", - "3913164a51898aac444bf6c7150e46ad5a8a18ad": "몽고DB 연결 문자열", - "5473e36f5102e2ae22ce4c6620cacc40cc98da95": "예시:", - "d54142de169844b014ae913a4056c31495f4a305": "연결 문자열 테스트", - "98e94c9bdac1ca8beb29d73b2e6f7a9e5e035aec": "DB 전환", - "b1c08387975e6feada407c9b5f5f564261b8192b": "데이터베이스 정보를 검색할 수 없습니다. 자세한 내용은 서버 로그를 확인하세요.", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "다운로더 선택", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "기본 다운로드 에이전트 사용", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "다운로드 에이전트 선택", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "로그 레벨", - "db6c192032f4cab809aad35215f0aa4765761897": "로그인 만료", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "고급 다운로드 허용", - "431e5f3a0dde88768d1074baedd65266412b3f02": "쿠키 사용", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "쿠키 설정", - "635285fa5624d50a408feb7eb564c0db0d3f1ce1": "서버 재시작", - "37224420db54d4bc7696f157b779a7225f03ca9d": "사용자 등록 허용", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "인증 방법", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "내부", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "기본 검색", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "검색 필터", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "YoutubeDL-Material에 대하여", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신은 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 할 수도 있습니다.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 모든 지원되는 기능을 확인해보세요.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "설치된 버전:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "버그를 찾았거나 제안하실 사항이 있으신가요?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "이슈를 생성하기 위해!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "업데이트 확인중...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "업데이트 가능", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "설정 메뉴에서 업데이트를 할 수 있습니다.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "선택된 버전:", - "1f6d14a780a37a97899dc611881e6bc971268285": "공유 허용", - "6580b6a950d952df847cb3d8e7176720a740adc8": "타임스탬프 사용", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "초", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "클립보드에 복사", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "재생목록 공유", - "94e2674467c7a08a291f9bd97ce694d4e47ffd62": "파일 공유", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "세션 아이디:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "모든 다운로드된 항목 지우기", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(현재)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "다운로드된 항목 없음!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "프로필", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "로그아웃", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "생성됨:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "로그인하지 않았습니다.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "관리자 계정 생성", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "기본 관리자 계정이 감지되지 않았습니다. 이것은 'admin'이라는 ID를 가진 관리자 계정을 만들고, 비밀번호를 설정할 것입니다.", - "70a67e04629f6d412db0a12d51820b480788d795": "생성", - "4d92a0395dd66778a931460118626c5794a3fc7a": "사용자 추가", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "역할 수정", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "ID", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "역할", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "액션", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "사용자 관리", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "사용자 삭제", - "632e8b20c98e8eec4059a605a4b011bb476137af": "사용자 수정", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "사용자 UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "새 비밀번호", - "6498fa1b8f563988f769654a75411bb8060134b9": "새 비밀번호 설정", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "기본 역할 사용", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "네", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "아니오", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "역할 관리", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "줄:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "로그 지우기", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "자동으로 생성됨", - "ccf5ea825526ac490974336cb5c24352886abc07": "파일 열기", - "5656a06f17c24b2d7eae9c221567b209743829a9": "새 탭에서 파일 열기", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "구독중으로 가기", - "94e01842dcee90531caa52e4147f70679bac87fe": "삭제하고 재다운로드", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "영원히 삭제", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "더 보기.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "간략히 보기.", - "2054791b822475aeaea95c0119113de3200f5e1c": "길이:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.nl.json b/src/assets/i18n/messages.nl.json deleted file mode 100644 index 79226a8..0000000 --- a/src/assets/i18n/messages.nl.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Over", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profiel", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Donker", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Instellingen", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Overzicht", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Inloggen", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementen", - "822fab38216f64e8166d368b59fe756ca39d301b": "Downloads", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Alleen audio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Downloaden", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kwaliteit", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL gebruiken", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Bekijken", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Meerdere video's downloaden", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Afbreken", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Geavanceerd", - "4e4c721129466be9c3862294dc40241b64045998": "Aanvullende opties toekennen", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Aanvullende opties", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Je hoeft alleen de aanvullende opties op te geven, dus niet de url. Je kunt de opties scheiden met twee komma's: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Aangepaste uitvoer gebruiken", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Aangepaste uitvoer", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentatie", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Het pad is relatief aan het ingestelde downloadpad. Laat de extensie achterwege.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Geteste opdracht:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Authenticatie gebruiken", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Gebruikersnaam", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Wachtwoord", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Afspeellijst maken", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Naam", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Soort", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audiobestanden", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video's", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonneren op afspeellijst of kanaal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "De url van de afspeellijst of het kanaal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Aangepaste naam", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Alle uploads downloaden", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Maximumkwaliteit", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Audiomodus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Streamingmodus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Deze worden toegevoegd ná de standaardopties.", - "98b6ec9ec138186d663e64770267b67334353d63": "Aangepaste bestandsuitvoer", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annuleren", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonneren", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Video's downloaden die geüpload zijn in de afgelopen", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Soort:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Sluiten", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Archief exporteren", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "De-abonneren", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(onderbroken)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archief:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Naam:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Uploader:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Bestandsgrootte:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Pad:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Uploaddatum:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categorie:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "youtube-dl-opties aanpassen", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Geteste nieuwe aanvullende opties", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Optie toevoegen", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Zoeken op categorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Optiewaarde gebruiken", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Optie toevoegen", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Aanpassen", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Optiewaarde", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Updater", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Gebruikersregistratie", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Gebruikersnaam", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registreren", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Nieuwe cookies uploaden", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Let op: de nieuwe cookies overschrijven de oude. Daarnaast zijn de cookies procesgebonden en niet gebruikersgebonden.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Slepen-en-neerzetten", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Afspeellijst aanpassen", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Inhoud toevoegen", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Opslaan", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normale volgorde", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Omgekeerde volgorde", - "d02888c485d3aeab6de628508f4a00312a722894": "Mijn video's", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Zoeken", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Geen video's gevonden.", - "3697f8583ea42868aa269489ad366103d94aece7": "Bewerken", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Onderbroken", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Categorie bewerken", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regels", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Regel toevoegen", - "792dc6a57f28a1066db283f2e736484f066005fd": "Twitch-chatgesprek downloaden", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Aanpassen", - "826b25211922a1b46436589233cb6f1a163d89b7": "Verwijderen", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informatie", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Aantal:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Verwijderen en op zwarte lijst plaatsen", - "dad95154dcef3509b8cc705046061fd24994bbb7": "weergaven", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Aanpassingen opslaan", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Het downloaden is voltooid", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Er is een fout opgetreden", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Details", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Er is een fout opgetreden:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Gestart om:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Afgerond om:", - "ad127117f9471612f47d01eae09709da444a36a4": "Bestandspad(en):", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Mijn abonnementen", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanalen", - "47546e45bbb476baaaad38244db444c427ddc502": "Afspeellijsten", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "De naam is niet beschikbaar omdat het kanaal nog wordt opgehaald.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Je hebt geen abonnementen.", - "2e0a410652cb07d069f576b61eab32586a18320d": "De naam is niet beschikbaar omdat de afspeellijst nog wordt opgehaald.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Je hebt geen abonnementen.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Algemeen", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Downloader", - "d5f69691f9f05711633128b5a3db696783266b58": "Diversen", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Geavanceerd", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Gebruikers", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logboeken", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "De url waarvan deze app wordt geladen, zonder het poortnummer.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Poort", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Het gewenste poortnummer (standaard: 17442).", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Meerdere gebruikers", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Gebruikersbasispad", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Het basispad voor gebruikers en hun gedownloade video's.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Abonnementen toestaan", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnementenbasispad", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Het basispad voor video's van afspeellijsten en kanalen uit je abonnementen. Dit is relatief aan YTDL-Material's hoofdmap.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Controletussenpoos", - "0f56a7449b77630c114615395bbda4cab398efd8": "In seconden (alleen cijfers).", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Soms worden nieuwe video's gedownload voordat ze volledig verwerkt zijn. Met deze instelling wordt de volgende dag gecontroleerd of er een hogere kwaliteit beschikbaar is.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Nieuwe uploads opnieuw downloaden", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Thema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Standaard", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Themawijziging toestaan", - "fe46ccaae902ce974e2441abe752399288298619": "Taal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Audiopad", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Het pad voor audiodownloads. Dit is relatief aan YTDL-Material's hoofdmap.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomap", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Het pad voor videodownloads. Dit is relatief aan YTDL-Material's hoofdmap.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Standaard bestandsuitvoer", - "1148fd45287ff09955b938756bc302042bcb29c7": "Dit pad is relatief aan bovenstaande downloadpaden. Laat de extensie achterwege.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Algemene aanvullende opties", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorieën", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "youtube-dl-archief gebruiken", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Miniatuurvoorbeeld opslaan", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Metagegevens opslaan", - "fb35145bfb84521e21b6385363d59221f436a573": "Alle downloads afbreken", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Boventitel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Bestandsbeheer ingeschakeld", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Downloadbeheer ingeschakeld", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Kwaliteitskeuze toestaan", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Downloadmodus", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Meerdere downloads toestaan", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Openbare api gebruiken", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Openbare api-sleutel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Documentatie bekijken", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Let op: hiermee verwijder je je oude api-sleutel!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genereren", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "YouTube-api gebruiken", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-api-sleutel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Het genereren van een sleutel is eenvoudig.", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Twitch-api gebruiken", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch-api-sleutel", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Ook wel de client-id.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Twitch-chatgesprekken automatisch downloaden", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klik hier", - "7f09776373995003161235c0c8d02b7f91dbc4df": "om de officiële Chrome-extensie van YouTubeDL-Material te downloaden.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Hiervoor dien je de extensie handmatig te laden en de frontend-url op te geven in de instellingen.", - "9a2ec6da48771128384887525bdcac992632c863": "om de officiële Firefox-extensie van YouTubeDL-Material te installeren.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Uitgebreide installatiehandleiding.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Je hoeft alleen de frontend-url op te geven in de instellingen.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Sleep de link naar je bladwijzers en klaar is Kees! Ga vervolgens naar een YouTube-video en klik op de bladwijzer.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Audio-bookmarklet genereren", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Kies een downloader", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Standaard downloadagent gebruiken", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Kies een downloadagent", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Logniveau", - "db6c192032f4cab809aad35215f0aa4765761897": "Inlogverloopdatum", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Geavanceerd downloaden toestaan", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Cookies gebruiken", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Cookies instellen", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Gebruikersregistratie toestaan", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Authenticatiemethode", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-url", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind-inloggegevens", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Zoekdatabank", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Zoekfilter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Over YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "is een opensource YouTube-downloader, gebouwd volgens Google's Material Design-specificaties. Je kunt naadloos je favoriete video's downloaden als audio- of videobestanden of abonneren op je favoriete kanalen of afspeellijsten om altijd de nieuwste video's binnen te halen.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "bevat een aantal handige functies, zoals een uitgebreide api, Docker-ondersteuning en is volledig vertaalbaar. Meer functies zijn te vinden op onze GitHub-pagina (klik op het GitHub-pictogram).", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Geïnstalleerde versie:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Heb je een bug aangetroffen of een idee?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "om een 'issue' te openen!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Bezig met controleren op updates...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Update beschikbaar", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Je kunt de update installeren via het instellingenmenu.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Kies een versie:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Delen toestaan", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Tijdstempel gebruiken", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "seconden", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopiëren naar klembord", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Afspeellijst delen", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Video delen", - "1d540dcd271b316545d070f9d182c372d923aadd": "Audio delen", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Sessie-id:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Alle downloads wissen", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(huidig)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Geen downloads beschikbaar!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Mijn profiel", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Uitloggen", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Aangemaakt:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Je bent niet ingelogd.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Beheerdersaccount aanmaken", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Er zijn geen beheerdersaccounts aangetroffen. Hiermee maak je een beheerdersaccount met wachtwoord aan - de gebruikersnaam is 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Aanmaken", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Gebruikers toevoegen", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rol aanpassen", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Gebruikersnaam", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rol", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Acties", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gebruiker beheren", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Gebruiker verwijderen", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Gebruiker bewerken", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Gebruikers-uid:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nieuw wachtwoord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Nieuw wachtwoord instellen", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Standaardrol gebruiken", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nee", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Rol beheren", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Aantal regels:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Logboeken wissen", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Automatisch gegenereerd", - "ccf5ea825526ac490974336cb5c24352886abc07": "Bestand openen", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Bestand openen op nieuw tabblad", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ga naar abonnement", - "94e01842dcee90531caa52e4147f70679bac87fe": "Verwijderen en opnieuw downloaden", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Permanent verwijderen", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Meer tonen.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Minder tonen.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duur:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.pt.json b/src/assets/i18n/messages.pt.json deleted file mode 100644 index 9f7abbd..0000000 --- a/src/assets/i18n/messages.pt.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Sobre", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Escuro", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Configurações", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Início", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Entrar", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Inscrições", - "822fab38216f64e8166d368b59fe756ca39d301b": "Baixados", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Apenas áudio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Baixar", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualidade", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Usar URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Ver", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Modo baixar-múltiplos", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancelar", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avançado", - "4e4c721129466be9c3862294dc40241b64045998": "Usar argumentos personalizados", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Argumentos personalizados", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Não é necessário incluir URL, apenas tudo depois. Argumentos são delimitados usando duas vírgulas assim: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usar saída personalizada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Saída personalizada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentação", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Caminho é relativo a configuração do caminho de download. Não inclua a extensão.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Comando simulado:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Usar autenticação", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nome de usuário", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Senha", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Criar lista de reprodução", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nome", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Áudio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Arquivos de áudio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vídeos", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Inscreva-se numa lista de reprodução ou canal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "A URL da lista de reprodução ou canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nome personalizado", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Baixar todos uploads", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualidade máxima", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modo apenas-áudio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modo somente streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Eles são adicionados após os argumentos padrão.", - "98b6ec9ec138186d663e64770267b67334353d63": "Saída de arquivo personalizado", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancelar", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Inscreva-se", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Baixe vídeos enviados no último", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Fechar", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportar Arquivos", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Cancelar inscrição", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausado)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arquivos:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nome:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Quem subiu:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Tamanho do arquivo:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Caminho:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data de upload:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modificar argumentos do youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Novos argumentos simulados", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Adicionar um argumento", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Buscar por categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usar valor do argumento", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Adicionar argumento", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modificar", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor do argumento", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Atualizador", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrar usuário", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nome de usuário", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Fazer upload de novos cookies", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: O upload de novos cookies substituirá os cookies anteriores. Observe também que os cookies abrangem toda a instância, não por usuário.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrastar e soltar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modificar lista de reprodução", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Adicionar conteúdo", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salvar", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordem normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordem reversa", - "d02888c485d3aeab6de628508f4a00312a722894": "Meus vídeos", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Buscar", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nenhum vídeo encontrado.", - "3697f8583ea42868aa269489ad366103d94aece7": "Editando", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Em pausa", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editando categoria", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regras", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Adicionar nova regra", - "792dc6a57f28a1066db283f2e736484f066005fd": "Baixar Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Editar", - "826b25211922a1b46436589233cb6f1a163d89b7": "Excluir", - "321e4419a943044e674beb55b8039f42a9761ca5": "Detalhes", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Total:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Excluir e bloquear", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualizações", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Salvar alterações", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Download finalizado com sucesso", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Ocorreu um erro", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalhes", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Ocorreu um erro:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Download iniciado:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Download finalizado:", - "ad127117f9471612f47d01eae09709da444a36a4": "Destino do arquivo:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Suas inscrições", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canais", - "47546e45bbb476baaaad38244db444c427ddc502": "Playlists", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nome não disponível. Carregamento do canal em andamento.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Você não está inscrito em um canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nome não disponível. Carregamento da playlist em andamento.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Você não está inscrito em uma playlist.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Geral", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Downloader", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avançado", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuários", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logs", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Fechar} false {Cancelar} other {Outro}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL para acesso ao app, sem porta.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Porta", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Porta desejada. (Padrão 17442).", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modo multi-usuário", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Diretório base de usuários", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Diretório base para usuários e seus vídeos baixados.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permitir inscrições", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Diretório base para Inscrições", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Diretório base para vídeos das inscrições em canais e playlists. Relativo ao diretório raiz do YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervalo de checagem", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unidade em segundos, inclua apenas números.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Algumas vezes vídeos são baixados antes de serem totalmente processados. Esta configuração faz com que vídeos novos sejam verificados por uma qualidade mais alta no dia seguinte.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Baixar novamente uploads recentes", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Aparência", - "ff7cee38a2259526c519f878e71b964f41db4348": "Padrão", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permitir alteração da aparência", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Diretório para áudio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Diretório para downloads de 'áudio apenas'. Relativo ao diretório raiz do YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Diretório de Vídeos", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Diretório para download de vídeos. Relativo ao diretório raiz do YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Arquivo de destino padrão", - "1148fd45287ff09955b938756bc302042bcb29c7": "O caminho é relativo ao diretório de download acima. Não inclua extensão.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Parâmetro global personalizado", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Parâmetro global personalizado para downloads na home page. Parâmetros são delimitados utilizando duas vírgulas. Ex: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorias", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Armazenar youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Incluir miniatura", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Incluir metadados", - "fb35145bfb84521e21b6385363d59221f436a573": "Parar todos os downloads", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Título", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Habilitar gerenciador de arquivos", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Habilitar gerenciador de downloads", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permitir seleção de qualidade", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modo Apenas Download", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permitir modo múltiplos downloads", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilitar API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Chave da API Pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Ver documentação", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Isso irá excluir sua chave API anterior!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Gerar", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Usar API do YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Chave da API do YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Gerar uma chave é fácil!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usar API do Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Chave da API do Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Também chamado de ID do Cliente (Client ID).", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Baixar Twitch Chat automaticamente", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Clique aqui", - "7f09776373995003161235c0c8d02b7f91dbc4df": "para baixar a extensão do YoutubeDL-Material para o Chrome manualmente.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Você deve carregar a extensão manualmente e alterar as configurações para a URL inicial.", - "9a2ec6da48771128384887525bdcac992632c863": "para instalar a extensão oficial do YoutubeDL-Material para o Firefox diretamente da página de extensões.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruções de instalação detalhadas.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Nada além de alterar a configuração da extensão para a URL inicial é necessário.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arraste o link abaixo para seus Favoritos, e pronto! Navegue para o vídeo do Youtube que deseja baixar e clique no link favoritado.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Gerar favorito 'apenas áudio' interativo", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Selecione um downloader", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usar agente de download padrão", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Selecionar um agente de download", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nível do Log", - "db6c192032f4cab809aad35215f0aa4765761897": "Expiração do login", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permitir Download avançado", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usar Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Configurar Cookies", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permitir cadastro de usuário", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Método de autenticação", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL do LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Search Filter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre o YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "é um downloader open-source para o Youtube feito nas especificações do Mateerial Design da Google. Você pode baixar seus vídeos favoritos como arquivos de vídeo ou áudio, e até se inscrever nos seus canais ou playlists favoritos para ficar atualizado com os novos vídeos publicados.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "tem algumas funcionalidades incríveis inclusas! Uma API extensa, suporte ao Docker, suporte à tradução. Leia sobre todas as funcionalidades suportadas clicando no ícone do GitHub acima.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versão instalada:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Achou m bug ou tem uma sugestão?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "para criar uma ocorrência!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Buscando por atualizações...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Atualização disponível", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Você pode atualizar pelo Menu de Configuração.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Selecionar uma versão:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Habilitar compartilhamento", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usar timestamp", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segundos", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copiar para a Área de transferência", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Compartilhar playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Compartilhar Vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Compartilhar Áudio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID da sessão:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Limpar todos os downloads", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(atual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Não há downloads disponíveis!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Seu Perfil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Sair", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Criado:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Você não está logado.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Criar conta de Administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Conta padrão de Administrador não detectada. Isto irá criar e configurar uma senha para a conta de administrador com o usuário 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Criar", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Adicionar Usuários", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Editar função", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nome de usuário", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Função", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Ações", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gerenciar usuário", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Excluir usuário", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Editar usuário", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID do usuário:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nova senha", - "6498fa1b8f563988f769654a75411bb8060134b9": "Aplicar nova senha", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usar função padrão", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sim", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Não", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gerenciar função", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linhas:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Limpar logs", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Auto-gerado", - "ccf5ea825526ac490974336cb5c24352886abc07": "Abrir arquivo", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Abrir arquivo em uma nova aba", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ir para Inscrições", - "94e01842dcee90531caa52e4147f70679bac87fe": "Excluir e baixar novamente", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Excluir para sempre", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Ver mais.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Ver menos.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duração:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.ru.json b/src/assets/i18n/messages.ru.json deleted file mode 100644 index 3c64599..0000000 --- a/src/assets/i18n/messages.ru.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Создайте список воспроизведения", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Имя", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Аудиофайлы", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Видео", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Изменение аргументов youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Моделирование новых аргументов", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Добавить аргумент", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Поиск по категориям", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Использовать значение аргумента", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Значение аргумента", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Добавить аргумент", - "d7b35c384aecd25a516200d6921836374613dfe7": "Отмена", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Модифицировать", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "", - "a38ae1082fec79ba1f379978337385a539a28e73": "Качество", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Использовать URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Вид", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Только аудио", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Режим мультизагрузки", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Загрузка", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Отмена", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Расширенный", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Имитация команды:", - "4e4c721129466be9c3862294dc40241b64045998": "Используйте пользовательские аргументы", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Пользовательские аргументы", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Нет необходимости включать URL, просто все, что после. Аргументы разграничиваются двумя запятыми следующим образом: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Использование пользовательского вывода", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Пользовательский вывод", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Документация", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Путь является относительным к пути загрузки конфигурации. Не включайте расширение.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Используйте аутентификацию", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Имя пользователя", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Пароль", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "", - "9779715ac05308973d8f1c8658b29b986e92450f": "", - "47546e45bbb476baaaad38244db444c427ddc502": "Плейлисты", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "", - "960582a8b9d7942716866ecfb7718309728f2916": "", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Имя:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL-адрес:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Загрузчик:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Размер файла:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Путь:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Дата загрузки:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Закрыть", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Изменить список воспроизведения", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Подсчет:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Редактировать", - "826b25211922a1b46436589233cb6f1a163d89b7": "Удалить", - "321e4419a943044e674beb55b8039f42a9761ca5": "Информация", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Удаление и черный список", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Загрузка новых файлов cookie", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Перетаскивание", - "85e0725c870b28458fd3bbba905397d890f00a69": "", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Настройки", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL-адрес", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL, с которого будет осуществляться доступ к этому приложению, без указания порта.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Порт", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Желаемый порт. По умолчанию - 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Многопользовательский режим", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Базовый путь пользователей", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Базовый путь для пользователей и их загруженных видео.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "", - "4e3120311801c4acd18de7146add2ee4a4417773": "Разрешить подписки", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Базовый путь подписки", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Базовый путь для видео из подписанных вами каналов и плейлистов. Он является относительным к корневой папке YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Контрольный интервал", - "0f56a7449b77630c114615395bbda4cab398efd8": "Единица измерения - секунды, включайте только цифры.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Используйте архив youtube-dl", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Тема", - "ff7cee38a2259526c519f878e71b964f41db4348": "По умолчанию", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Тёмный", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Разрешить смену темы", - "fe46ccaae902ce974e2441abe752399288298619": "Язык", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Главная", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Путь к папке аудио", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Путь для загрузки только аудиофайлов. Он является относительным к корневой папке YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Путь к папке с видео", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Путь для загрузки видео. Относится к корневой папке YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Глобальные пользовательские аргументы для загрузок на главной странице. Аргументы разграничиваются с помощью двух запятых следующим образом: ,,", - "d01715b75228878a773ae6d059acc639d4898a03": "", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Загрузчик", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Верхний заголовок", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Включен файловый менеджер", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Включен менеджер загрузок", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Разрешить выбор качества", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Режим только загрузки", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Разрешить режим мультизагрузки", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Включить публичный API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Открытый ключ API", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Просмотр документации", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Создать", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Используйте API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Ключ API Youtube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Сгенерировать ключ очень просто!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Нажмите здесь", - "7f09776373995003161235c0c8d02b7f91dbc4df": "чтобы загрузить официальное расширение YoutubeDL-Material Chrome вручную.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Вы должны вручную загрузить расширение и изменить его настройки, чтобы установить URL-адрес фронтенда.", - "9a2ec6da48771128384887525bdcac992632c863": "чтобы установить официальное расширение YoutubeDL-Material Firefox прямо со страницы расширений Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Подробные инструкции по настройке.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Не требуется ничего особенного, кроме изменения настроек расширения для установки внешнего URL.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Перетащите приведенную ниже ссылку в закладки, и все готово! Просто перейдите к видео YouTube, которое вы хотите загрузить, и нажмите на закладку.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Создать букмарклет \"только аудио\"", - "d5f69691f9f05711633128b5a3db696783266b58": "Дополнительно", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Использовать агент загрузки по умолчанию", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Выберите программу загрузки", - "00e274c496b094a019f0679c3fab3945793f3335": "", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Разрешить расширенную загрузку", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Использование файлов cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Установить Cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Продвинутый", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Разрешить регистрацию пользователей", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Пользователи", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Журналы", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Сохранить", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "О YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе их новых видео.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "включает в себя несколько потрясающих функций! Обширный API, поддержка Docker и поддержка локализации (перевода). Ознакомьтесь со всеми поддерживаемыми функциями, нажав на значок GitHub выше.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Установленная версия:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Проверяем обновления...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Доступно обновление", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Обновление можно выполнить в меню настроек.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Нашли ошибку или у вас есть предложение?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "чтобы создать проблему!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Ваш профиль", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Создан:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Вы не вошли в систему.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Логин", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Выход из системы", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Создайте учетную запись администратора", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Создать", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Профиль", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "О", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Дом", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Подписки", - "822fab38216f64e8166d368b59fe756ca39d301b": "Загрузки", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Поделиться плейлистом", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Поделиться видео", - "1d540dcd271b316545d070f9d182c372d923aadd": "Поделиться аудиозаписью", - "1f6d14a780a37a97899dc611881e6bc971268285": "Включить совместное использование", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Используйте метку времени", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Секунды", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Копировать в буфер обмена", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Сохранить изменения", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Подробности", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Произошла ошибка:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Начало загрузки:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Конец загрузки:", - "ad127117f9471612f47d01eae09709da444a36a4": "Путь(и) к файлам:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Подписаться на плейлист или канал", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL-адрес списка воспроизведения или канала", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Пользовательское имя", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Загрузить все загруженные файлы", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Скачать видео, загруженное за последние время", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Только аудио режим", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Режим только для потокового вещания", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Они добавляются после стандартных аргументов.", - "98b6ec9ec138186d663e64770267b67334353d63": "Пользовательский вывод файлов", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Подписаться", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Тип:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Архив:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Экспорт архива", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Отписаться от рассылки", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Ваши подписки", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Каналы", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Имя недоступно. Идет поиск канала.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "У вас нет подписок на каналы.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Имя недоступно. Идет поиск списка воспроизведения.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "У вас нет подписок на плейлисты.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Поиск", - "2054791b822475aeaea95c0119113de3200f5e1c": "Длина:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Удаление и повторная загрузка", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Удалить навсегда", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Обновление", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Выберите версию:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Зарегистрироваться", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Идентификатор сессии:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(текущий)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Загрузка недоступна!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Зарегистрировать пользователя", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Имя пользователя", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Управление пользователями", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Идентификатор пользователя:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Новый пароль", - "6498fa1b8f563988f769654a75411bb8060134b9": "Установите новый пароль", - "40da072004086c9ec00d125165da91eaade7f541": "", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Да", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Нет", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Управлять ролью", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Имя пользователя", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Роль", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Действия", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Добавить пользователей", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Редактировать роль", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Линии:", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Смотреть меньше.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "См. подробнее.", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Перейти к подписке", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Открыть файл в новой вкладке", - "ccf5ea825526ac490974336cb5c24352886abc07": "Открыть файл", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Автогенерируемый", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Очистить журналы", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Использовать роль по умолчанию", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Редактировать пользователя", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Удалить пользователя", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Очистить все загрузки", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Фильтр поиска", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "База поиска", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Связать учетные данные", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Привязать DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL-адрес LDAP", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Внутренний", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Метод авторизации", - "db6c192032f4cab809aad35215f0aa4765761897": "Истечение срока действия логина", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Уровень журнала", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Выберите агент загрузки", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Автоматическая загрузка чата Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Также известен как идентификатор клиента.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Ключ API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Используйте API Twitch", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Это удалит ваш старый ключ API!", - "fb35145bfb84521e21b6385363d59221f436a573": "Убить все загрузки", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Включить метаданные", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Включить уменьшенное изображение", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Категории", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Глобальные пользовательские аргументы", - "1148fd45287ff09955b938756bc302042bcb29c7": "Путь является относительным по отношению к вышеуказанным путям загрузки. Не включайте расширение.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Вывод файлов по умолчанию", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Повторная загрузка свежих загрузок", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Иногда новые видео загружаются до полной обработки. Эта настройка означает, что новые видео будут проверяться на наличие версии более высокого качества на следующий день.", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Произошла ошибка", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Загрузка прошла успешно", - "dad95154dcef3509b8cc705046061fd24994bbb7": "просмотры", - "792dc6a57f28a1066db283f2e736484f066005fd": "Скачать Чат Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Добавить новое правило", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Правила", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Категория редактирования", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Приостановлено", - "3697f8583ea42868aa269489ad366103d94aece7": "Редактирование", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Видео не найдено.", - "d02888c485d3aeab6de628508f4a00312a722894": "Мои видео", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Обратный порядок", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Обычный порядок", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Добавить содержание", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "ПРИМЕЧАНИЕ: Загрузка новых файлов cookie отменяет предыдущие файлы cookie. Также обратите внимание, что файлы cookie используются в масштабах всего экземпляра, а не каждого пользователя.", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Категория:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Пауза)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Максимальное качество", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Видео", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Аудио", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Тип" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.zh.json b/src/assets/i18n/messages.zh.json deleted file mode 100644 index 683f6b9..0000000 --- a/src/assets/i18n/messages.zh.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "创建播放列表", - "cff1428d10d59d14e45edec3c735a27b5482db59": "名称", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "音频文件", - "a52dae09be10ca3a65da918533ced3d3f4992238": "视频文件", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "修改youtube-dl参数", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "模拟新参数", - "0b71824ae71972f236039bed43f8d2323e8fd570": "添加参数", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "按类别搜索", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "使用参数值", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "参数值", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "添加参数", - "d7b35c384aecd25a516200d6921836374613dfe7": "取消", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "修改", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Youtube下载器", - "a38ae1082fec79ba1f379978337385a539a28e73": "质量", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "使用URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "查看", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "仅音频", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "多下载模式", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "下载", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "取消", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "高级", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "模拟命令:", - "4e4c721129466be9c3862294dc40241b64045998": "使用自定义参数", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "自定义参数", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "不必指定URL,仅需指定其后的部分。参数用两个逗号分隔:,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "使用自定义输出", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "自定义输出", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "文档", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "该路径是相对于配置下载路径的,省略文件扩展名", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "使用身份验证", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "用户名", - "c32ef07f8803a223a83ed17024b38e8d82292407": "密码", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "音频", - "9779715ac05308973d8f1c8658b29b986e92450f": "您的音频文件在这里", - "47546e45bbb476baaaad38244db444c427ddc502": "播放列表", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "没有可用的播放列表。 通过单击蓝色加号按钮从您下载的音频文件创建一个。", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "视频", - "960582a8b9d7942716866ecfb7718309728f2916": "您的视频文件在这里", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "没有可用的播放列表。 通过单击蓝色加号按钮,从下载的视频文件中创建一个。", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "名称:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "上传者:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "文件大小:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "路径:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "上传日期:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "关闭", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "修改播放列表", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "数量:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "编辑", - "826b25211922a1b46436589233cb6f1a163d89b7": "删除", - "321e4419a943044e674beb55b8039f42a9761ca5": "详情", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "删除并拉黑", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "上传新Cookies", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "拖放", - "85e0725c870b28458fd3bbba905397d890f00a69": "注意:加载新的Cookies将覆盖您以前的Cookie。并且Cookies的范围是整个实例,而不是每个用户单独分开的。", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "设置", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "设置访问URL,无需端口。", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "端口", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "设置目标端口。默认为17442。", - "d4477669a560750d2064051a510ef4d7679e2f3e": "多用户模式", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "用户文件路径", - "a64505c41150663968e277ec9b3ddaa5f4838798": "用户及其下载视频的文件路径。", - "cbe16a57be414e84b6a68309d08fad894df797d6": "使用加密(SSL)", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "证书文件路径", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "密钥文件路径", - "4e3120311801c4acd18de7146add2ee4a4417773": "允许订阅", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "订阅文件路径", - "bc9892814ee2d119ae94378c905ea440a249b84a": "订阅频道和播放列表中视频的文件路径(相对于根文件夹而言)。", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "检查间隔", - "0f56a7449b77630c114615395bbda4cab398efd8": "单位是秒,只包含数字。", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "使用youtube-dl存档", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "根据youtube-dl的存档功能", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "从您的订阅下载的视频会记录在订阅存档子目录中的文本文件中。", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "这样一来,您无需取消订阅便可以从订阅中永久删除视频。并且它还可以在数据丢失的情况下记录已经下载了哪些视频。", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "主题", - "ff7cee38a2259526c519f878e71b964f41db4348": "默认", - "adb4562d2dbd3584370e44496969d58c511ecb63": "暗黑", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "允许更改主题", - "fe46ccaae902ce974e2441abe752399288298619": "语言", - "82421c3e46a0453a70c42900eab51d58d79e6599": "常规", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "音频文件夹路径", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "音频下载的文件路径。相对于YTDL-Material的根文件夹。", - "46826331da1949bd6fb74624447057099c9d20cd": "视频文件夹路径", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "视频下载的文件路径。相对于YTDL-Material的根文件夹。", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,,", - "d01715b75228878a773ae6d059acc639d4898a03": "安全下载覆盖", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "下载程序", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "首页标题", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "启用文件管理", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "启用下载管理", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "允许选择下载质量", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "仅下载模式", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "开启多下载模式", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "使用PIN码保护设置", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "设置新PIN码", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "启用公共API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "公共API密钥", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "查看文档", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "生成", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "使用YouTube API", - "ce10d31febb3d9d60c160750570310f303a22c22": "Youtube API密钥", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "生成密钥很简单!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "点击这里", - "7f09776373995003161235c0c8d02b7f91dbc4df": "来手动下载官方的YoutubeDL-Material Chrome扩展程序。", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "您必须手动安装扩展,并且在扩展的设置中输入下载器URL。", - "9a2ec6da48771128384887525bdcac992632c863": "直接从Firefox扩展商店安装官方的YoutubeDL-Material Firefox扩展程序。", - "eb81be6b49e195e5307811d1d08a19259d411f37": "详细的扩展说明。", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "只需在扩展的设置中输入前端URL。", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "只需将下面的链接拖放到书签栏中。在YouTube页面上您只需单击书签即可下载视频。", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "生成“仅音频”书签", - "d5f69691f9f05711633128b5a3db696783266b58": "额外", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "使用默认下载程序", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "选择下载器", - "00e274c496b094a019f0679c3fab3945793f3335": "选择日志级别", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "开启高级下载选项", - "431e5f3a0dde88768d1074baedd65266412b3f02": "使用Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "设置Cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "高级", - "37224420db54d4bc7696f157b779a7225f03ca9d": "允许用户注册", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "用户", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "日志", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "保存", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {关} false {取消} other {其他} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "关于 YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "是根据Google的Material Design规范构建的开源YouTube下载器。您可以将喜欢的视频下载为视频或音频文件,并且可以订阅喜欢的频道和播放列表,以便及时下载他们的新视频。", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "包含很多很棒的功能!支持API,Docker和本地化。在Github上查找所有受支持的功能。", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "安装版本:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "检查更新...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "更新可用", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "您可以从设置菜单进行更新。", - "b33536f59b94ec935a16bd6869d836895dc5300c": "发现了一个错误或有一些建议?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "创建新issue!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "您的个人资料", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "创建日期:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "您尚未登录。", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "登录", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "注销", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "创建管理员帐户", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "未检测到默认管理员帐户。即将创建一个名为admin的管理员帐户并设置密码。", - "70a67e04629f6d412db0a12d51820b480788d795": "创建", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "个人资料", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "关于", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "首 页", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "订 阅", - "822fab38216f64e8166d368b59fe756ca39d301b": "下 载", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "分享播放列表", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "分享视频", - "1d540dcd271b316545d070f9d182c372d923aadd": "分享音频", - "1f6d14a780a37a97899dc611881e6bc971268285": "启用共享", - "6580b6a950d952df847cb3d8e7176720a740adc8": "使用时间戳", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "秒", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "复制到剪贴板", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "保存更改", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "详细", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "发生错误:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "下载开始:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "下载结束:", - "ad127117f9471612f47d01eae09709da444a36a4": "文件路径:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "订阅播放列表或频道", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "播放列表或频道URL", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "自定义名称", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "下载所有音视频", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "下载最近多久的视频", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "仅音频模式", - "408ca4911457e84a348cecf214f02c69289aa8f1": "仅视频模式", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "这些是在标准参数之后添加的。", - "98b6ec9ec138186d663e64770267b67334353d63": "自定义文件输出", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "订阅", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "类型:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "存档:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "导出存档", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "取消订阅", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "您的订阅", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "频道", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "名称不可用。正在检索频道...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "您尚未订阅任何频道。", - "2e0a410652cb07d069f576b61eab32586a18320d": "名称不可用。正在检索播放列表...", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "您尚未订阅任何播放列表。", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "搜索", - "2054791b822475aeaea95c0119113de3200f5e1c": "长度:", - "94e01842dcee90531caa52e4147f70679bac87fe": "删除并重新下载", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "永久删除", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "更新程序", - "1372e61c5bd06100844bd43b98b016aabc468f62": "选择版本:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "注册", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "会话ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(当前)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "没有下载可用!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "注册用户", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "用户名", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "管理用户", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "用户UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "新密码", - "6498fa1b8f563988f769654a75411bb8060134b9": "设置新密码", - "40da072004086c9ec00d125165da91eaade7f541": "使用默认值", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "是", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "否", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "管理用户", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "用户名", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "身份", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "动作", - "4d92a0395dd66778a931460118626c5794a3fc7a": "添加用户", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "编辑用户", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "日志将出现在这里", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "行:", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "包括缩略图", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "类型", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "视频", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "音频", - "ccf5ea825526ac490974336cb5c24352886abc07": "打开文件", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "清空日志", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "删除用户", - "632e8b20c98e8eec4059a605a4b011bb476137af": "编辑用户", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "清空所有下载", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "绑定凭证", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "绑定DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP链接", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "认证方式", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP认证", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "内部身份验证", - "db6c192032f4cab809aad35215f0aa4765761897": "登录到期", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "日志等级", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "这将删除您的旧API密钥!", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "包含元数据", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "注意:加载新的Cookies将覆盖您以前的Cookie。并且Cookies的范围是整个实例,而不是每个用户单独分开的。", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "添加更多内容", - "d02888c485d3aeab6de628508f4a00312a722894": "我的视频", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "前往订阅", - "5656a06f17c24b2d7eae9c221567b209743829a9": "在新标签页打开文件", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "出现错误", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "下载成功", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "搜索过滤器", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "搜索起点", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "使用角色预设", - "3697f8583ea42868aa269489ad366103d94aece7": "编辑中", - "fb35145bfb84521e21b6385363d59221f436a573": "取消所有下载", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "查看更少", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "选择一个下载程序", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "最高画质", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "查看更多...", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "自动下载Twitch弹幕", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "也称为客户ID", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch API 密钥", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "使用Twitch API", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "分类", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "全局自定义变量", - "1148fd45287ff09955b938756bc302042bcb29c7": "路径相对于上述下载路径,不包括扩展名。", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "默认输出文件夹", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "重新下载新上传的内容", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "有时新视频会在完全处理前下载。这项设置指新视频会在第二天检查视频是否有更高画质。", - "dad95154dcef3509b8cc705046061fd24994bbb7": "浏览", - "792dc6a57f28a1066db283f2e736484f066005fd": "下载Twitch弹幕", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "添加新规则", - "2489eefea00931942b91f4a1ae109514b591e2e1": "规则", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "编辑类别", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "暂停", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "找不到视频", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "倒序", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "正序", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "添加内容", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "类别:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(暂停)", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "自动生成的" -} \ No newline at end of file diff --git a/src/postbuild.mjs b/src/postbuild.mjs new file mode 100644 index 0000000..233b3e3 --- /dev/null +++ b/src/postbuild.mjs @@ -0,0 +1,43 @@ +import fs from 'fs-extra'; +import path from 'path'; +import xliffToJSON from 'xliff-to-json'; + +async function recFindByExt(base,ext,files,result) +{ + files = files || (await fs.readdir(base)) + result = result || [] + + for (const file of files) { + var newbase = path.join(base,file) + if ( (await fs.stat(newbase)).isDirectory() ) + { + result = await recFindByExt(newbase,ext,await fs.readdir(newbase),result) + } + else + { + if ( file.substr(-1*(ext.length+1)) == '.' + ext ) + { + result.push(newbase) + } + } + } + return result +} + +// outputs array of supported locales +async function createLocalizationJSON() { + const files = await recFindByExt(path.join('src', 'assets', 'i18n'), 'json'); + const locales = []; + + for (let i = 0; i < files.length; i++) { + const file = path.basename(files[i]); + const file_parts = file.split('.'); + locales.push(file_parts[1]); + } + + xliffToJSON.convert('src/assets/i18n'); + fs.unlinkSync('src/assets/i18n/messages.en.json'); + fs.writeJSONSync('src/assets/i18n/supported_locales.json', {supported_locales: locales}); +} + +createLocalizationJSON(); \ No newline at end of file From a7f1f1eb8ecce1e0f145c9a6353b1f9c6d622428 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 29 Sep 2021 23:29:26 -0600 Subject: [PATCH 049/212] Fixed issue where language file generation occured after supported_locales.json was created --- src/postbuild.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/postbuild.mjs b/src/postbuild.mjs index 233b3e3..ff20b87 100644 --- a/src/postbuild.mjs +++ b/src/postbuild.mjs @@ -26,6 +26,7 @@ async function recFindByExt(base,ext,files,result) // outputs array of supported locales async function createLocalizationJSON() { + xliffToJSON.convert('src/assets/i18n'); const files = await recFindByExt(path.join('src', 'assets', 'i18n'), 'json'); const locales = []; @@ -35,7 +36,6 @@ async function createLocalizationJSON() { locales.push(file_parts[1]); } - xliffToJSON.convert('src/assets/i18n'); fs.unlinkSync('src/assets/i18n/messages.en.json'); fs.writeJSONSync('src/assets/i18n/supported_locales.json', {supported_locales: locales}); } From b2d8c4ef55219512206aad49a097129917d52f4b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 08:42:20 -0600 Subject: [PATCH 050/212] Disabled PM2 logging to $HOME/.pm2 --- backend/pm2.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/pm2.config.js b/backend/pm2.config.js index 42e78c5..af9fea2 100644 --- a/backend/pm2.config.js +++ b/backend/pm2.config.js @@ -2,6 +2,8 @@ module.exports = { apps : [{ name : "YoutubeDL-Material", script : "./app.js", - watch : "placeholder" + watch : "placeholder", + out_file: "/dev/null", + error_file: "/dev/null" }] } \ No newline at end of file From 45be270b6f3d85c75b52f30ea6c7f0cee068c4f8 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 08:55:38 -0600 Subject: [PATCH 051/212] Dockerfile forces PM2_HOME to be in /app directory --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 7b7d6cd..ead755e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,6 +36,7 @@ RUN apk add --no-cache \ WORKDIR /app COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] +ENV PM2_HOME=/app/pm2 RUN npm install pm2 -g RUN npm install && chown -R $UID:$GID ./ From 94006ef7945ff1a9c4c3a38026b555455f4b8a76 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 19:37:21 -0600 Subject: [PATCH 052/212] Updated API Removed unused component --- Public API v1.yaml | 298 ++++++------------ backend/app.js | 4 +- src/api-types/index.ts | 13 +- .../models/BaseChangePermissionsRequest.ts | 2 +- src/api-types/models/BaseDownloadRequest.ts | 29 -- src/api-types/models/BaseDownloadResponse.ts | 9 - .../models/ChangeRolePermissionsRequest.ts | 2 +- .../models/ChangeUserPermissionsRequest.ts | 2 +- src/api-types/models/Config.ts | 2 +- src/api-types/models/ConfigResponse.ts | 2 +- src/api-types/models/CreatePlaylistRequest.ts | 5 +- .../models/CreatePlaylistResponse.ts | 2 +- src/api-types/models/CropFileSettings.ts | 9 + src/api-types/models/DatabaseFile.ts | 2 +- src/api-types/models/DeleteFileRequest.ts | 10 - src/api-types/models/DeleteMp3Mp4Request.ts | 2 +- src/api-types/models/DeletePlaylistRequest.ts | 4 +- .../models/DeleteSubscriptionFileRequest.ts | 2 +- src/api-types/models/DeleteUserRequest.ts | 2 +- src/api-types/models/Download.ts | 21 +- .../models/DownloadArchiveRequest.ts | 6 +- src/api-types/models/DownloadFileRequest.ts | 18 +- src/api-types/models/DownloadRequest.ts | 44 +++ src/api-types/models/DownloadResponse.ts | 9 + .../DownloadVideosForSubscriptionRequest.ts | 2 +- src/api-types/models/File.ts | 2 +- .../models/GenerateNewApiKeyResponse.ts | 2 +- .../models/GetAllDownloadsResponse.ts | 8 +- src/api-types/models/GetAllFilesResponse.ts | 2 +- .../models/GetAllSubscriptionsResponse.ts | 2 +- src/api-types/models/GetDownloadRequest.ts | 5 +- src/api-types/models/GetDownloadResponse.ts | 2 +- src/api-types/models/GetFileRequest.ts | 2 +- src/api-types/models/GetFileResponse.ts | 2 +- src/api-types/models/GetMp3sResponse.ts | 2 +- src/api-types/models/GetMp4sResponse.ts | 2 +- src/api-types/models/GetPlaylistRequest.ts | 5 +- src/api-types/models/GetPlaylistResponse.ts | 2 +- src/api-types/models/GetPlaylistsRequest.ts | 8 + src/api-types/models/GetPlaylistsResponse.ts | 9 + src/api-types/models/GetRolesResponse.ts | 16 +- .../models/GetSubscriptionRequest.ts | 6 +- .../models/GetSubscriptionResponse.ts | 2 +- src/api-types/models/GetUsersResponse.ts | 2 +- src/api-types/models/LoginRequest.ts | 2 +- src/api-types/models/LoginResponse.ts | 2 +- src/api-types/models/Mp3DownloadRequest.ts | 12 - src/api-types/models/Mp3DownloadResponse.ts | 9 - src/api-types/models/Mp4DownloadRequest.ts | 12 - src/api-types/models/Mp4DownloadResponse.ts | 9 - src/api-types/models/Playlist.ts | 5 +- src/api-types/models/RegisterRequest.ts | 2 +- src/api-types/models/RegisterResponse.ts | 2 +- src/api-types/models/SetConfigRequest.ts | 2 +- src/api-types/models/SharingToggle.ts | 4 +- src/api-types/models/SubscribeRequest.ts | 4 +- src/api-types/models/SubscribeResponse.ts | 2 +- src/api-types/models/Subscription.ts | 2 +- .../models/SubscriptionRequestData.ts | 2 +- src/api-types/models/SuccessObject.ts | 2 +- src/api-types/models/UnsubscribeRequest.ts | 2 +- src/api-types/models/UnsubscribeResponse.ts | 2 +- .../models/UpdatePlaylistFilesRequest.ts | 11 - src/api-types/models/UpdatePlaylistRequest.ts | 2 +- src/api-types/models/UpdateServerRequest.ts | 2 +- src/api-types/models/UpdateUserRequest.ts | 10 +- src/api-types/models/UpdaterStatus.ts | 2 +- src/api-types/models/User.ts | 14 +- src/api-types/models/body_19.ts | 2 +- src/api-types/models/body_20.ts | 2 +- .../models/inline_response_200_15.ts | 2 +- src/app/app.module.ts | 2 - .../subscribe-dialog.component.ts | 2 +- .../download-item.component.html | 41 --- .../download-item.component.scss | 16 - .../download-item.component.spec.ts | 25 -- .../download-item/download-item.component.ts | 45 --- src/app/main/main.component.ts | 28 +- src/app/player/player.component.ts | 2 +- src/app/posts.services.ts | 21 +- 80 files changed, 300 insertions(+), 588 deletions(-) delete mode 100644 src/api-types/models/BaseDownloadRequest.ts delete mode 100644 src/api-types/models/BaseDownloadResponse.ts create mode 100644 src/api-types/models/CropFileSettings.ts delete mode 100644 src/api-types/models/DeleteFileRequest.ts create mode 100644 src/api-types/models/DownloadRequest.ts create mode 100644 src/api-types/models/DownloadResponse.ts create mode 100644 src/api-types/models/GetPlaylistsRequest.ts create mode 100644 src/api-types/models/GetPlaylistsResponse.ts delete mode 100644 src/api-types/models/Mp3DownloadRequest.ts delete mode 100644 src/api-types/models/Mp3DownloadResponse.ts delete mode 100644 src/api-types/models/Mp4DownloadRequest.ts delete mode 100644 src/api-types/models/Mp4DownloadResponse.ts delete mode 100644 src/api-types/models/UpdatePlaylistFilesRequest.ts delete mode 100644 src/app/download-item/download-item.component.html delete mode 100644 src/app/download-item/download-item.component.scss delete mode 100644 src/app/download-item/download-item.component.spec.ts delete mode 100644 src/app/download-item/download-item.component.ts diff --git a/Public API v1.yaml b/Public API v1.yaml index 5ebe9f3..01cdfcd 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -6,34 +6,7 @@ info: servers: - url: 'http://localhost:17442' paths: - /api/tomp3: - post: - tags: - - downloader - summary: Download audio file - description: |- - Downloads an audio file with the given URL. Will include global args if they exist. - - - HTTP requests will return once the audio file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status. - operationId: post-tomp3 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Mp3DownloadRequest' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/Mp3DownloadResponse' - '500': - description: Server download error - security: - - Auth query parameter: [] - /api/tomp4: + /api/downloadFile: post: tags: - downloader @@ -48,14 +21,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Mp4DownloadRequest' + $ref: '#/components/schemas/DownloadRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/Mp4DownloadResponse' + $ref: '#/components/schemas/DownloadResponse' '500': description: Server download error security: @@ -365,27 +338,6 @@ paths: $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] - /api/updatePlaylistFiles: - post: - tags: - - playlists - summary: Update playlist files - description: Updates the list of filenames in the playlist object - operationId: post-api-updatePlaylistFiles - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UpdatePlaylistFilesRequest' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessObject' - security: - - Auth query parameter: [] /api/deletePlaylist: post: tags: @@ -429,7 +381,7 @@ paths: description: Whether the operation succeeded security: - Auth query parameter: [] - /api/downloadFile: + /api/downloadFileFromServer: post: tags: - files @@ -451,13 +403,13 @@ paths: post: tags: - files - summary: Delete downloaded file (unused) + summary: Delete downloaded file operationId: post-api-deleteFile requestBody: content: application/json: schema: - $ref: '#/components/schemas/DeleteFileRequest' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK @@ -861,6 +813,16 @@ components: enum: - audio - video + CropFileSettings: + type: object + required: + - cropFileStart + - cropFileEnd + properties: + cropFileStart: + type: number + cropFileEnd: + type: number Config: required: - YoutubeDLMaterial @@ -868,7 +830,7 @@ components: properties: YoutubeDLMaterial: type: object - BaseDownloadRequest: + DownloadRequest: required: - url type: object @@ -881,7 +843,10 @@ components: example: '251' customArgs: type: string - description: Custom command-line arguments for youtubedl. Overrides all other options, except url. + description: Custom command-line arguments for youtube-dl. Overrides all other options, except url. + additionalArgs: + type: string + description: Additional command-line arguments for youtube-dl. Added to whatever args would normally be used. customOutput: type: string description: Custom output filename template. @@ -891,67 +856,31 @@ components: youtubePassword: type: string description: Account password - ui_uid: + selectedHeight: type: string - nullable: true - Mp3DownloadRequest: - allOf: - - $ref: '#/components/schemas/BaseDownloadRequest' - - type: object - properties: - maxBitrate: - type: string - description: Specify ffmpeg/avconv audio quality - example: '160' - Mp4DownloadRequest: - allOf: - - $ref: '#/components/schemas/BaseDownloadRequest' - - type: object - properties: - selectedHeight: - type: string - description: Height of the video, if known - example: '1080' - BaseDownloadResponse: - required: - - uid + description: Height of the video, if known + example: '1080' + maxBitrate: + type: string + description: Specify ffmpeg/avconv audio quality + example: '160' + type: + $ref: '#/components/schemas/FileType' + cropFileSettings: + $ref: '#/components/schemas/CropFileSettings' + DownloadResponse: type: object properties: - uid: - type: string - file_names: + download: + $ref: '#/components/schemas/Download' nullable: true - type: array - items: - type: string - Mp3DownloadResponse: - allOf: - - $ref: '#/components/schemas/BaseDownloadResponse' - - type: object - required: - - audiopathEncoded - properties: - audiopathEncoded: - type: string - Mp4DownloadResponse: - allOf: - - $ref: '#/components/schemas/BaseDownloadResponse' - - type: object - required: - - videopathEncoded - properties: - videopathEncoded: - type: string GetDownloadRequest: type: object properties: - session_id: - type: string - download_id: + download_uid: type: string required: - - session_id - - download_id + - download_uid GetDownloadResponse: type: object properties: @@ -962,13 +891,9 @@ components: type: object properties: downloads: - type: object - description: Map of Session ID to inner map - additionalProperties: - type: object - description: Map of Download UID to downoad - additionalProperties: - $ref: '#/components/schemas/Download' + type: array + items: + $ref: '#/components/schemas/Download' GetMp3sResponse: required: - mp3s @@ -1038,14 +963,11 @@ components: $ref: '#/components/schemas/DatabaseFile' SharingToggle: required: - - type - uid type: object properties: uid: type: string - type: - $ref: '#/components/schemas/FileType' is_playlist: type: boolean SubscribeRequest: @@ -1061,14 +983,14 @@ components: type: string timerange: type: string - streamingOnly: - type: boolean audioOnly: type: boolean customArgs: type: string customFileOutput: type: string + maxQuality: + type: string SubscribeResponse: required: - new_sub @@ -1120,6 +1042,9 @@ components: id: type: string description: Subscription ID + name: + type: string + description: Subscription name GetSubscriptionResponse: required: - files @@ -1150,16 +1075,15 @@ components: $ref: '#/components/schemas/Subscription' CreatePlaylistRequest: required: - - fileNames + - uids - playlistName - thumbnailURL - type - - duration type: object properties: playlistName: type: string - fileNames: + uids: type: array items: type: string @@ -1167,8 +1091,6 @@ components: $ref: '#/components/schemas/FileType' thumbnailURL: type: string - duration: - type: number CreatePlaylistResponse: required: - new_playlist @@ -1181,15 +1103,17 @@ components: type: boolean GetPlaylistRequest: required: - - playlistID + - playlist_id type: object properties: - playlistID: + playlist_id: type: string type: $ref: '#/components/schemas/FileType' uuid: type: string + include_file_metadata: + type: boolean GetPlaylistResponse: required: - playlist @@ -1203,6 +1127,20 @@ components: $ref: '#/components/schemas/FileType' success: type: boolean + GetPlaylistsRequest: + type: object + properties: + include_categories: + type: boolean + GetPlaylistsResponse: + required: + - playlists + type: object + properties: + playlists: + type: array + items: + $ref: '#/components/schemas/Playlist' UpdatePlaylistRequest: required: - playlist @@ -1210,74 +1148,30 @@ components: properties: playlist: $ref: '#/components/schemas/Playlist' - UpdatePlaylistFilesRequest: - required: - - fileNames - - playlistID - - type - type: object - properties: - playlistID: - type: string - fileNames: - type: array - items: - type: string - type: - $ref: '#/components/schemas/FileType' DeletePlaylistRequest: required: - - playlistID + - playlist_id - type type: object properties: - playlistID: + playlist_id: type: string type: $ref: '#/components/schemas/FileType' DownloadFileRequest: required: - - fileNames - - type + - uid type: object properties: - fileNames: - oneOf: - - type: string - - type: array - description: Array of 1 or more files to download - items: - type: string - zip_mode: - type: boolean - type: - $ref: '#/components/schemas/FileType' - outputName: - type: string - fullPathProvided: - type: boolean - uuid: - type: string uid: type: string - id: + uuid: type: string - subscriptionName: + sub_id: type: string - description: Only used for subscriptions - subPlaylist: + is_playlist: type: boolean description: Only used for subscriptions - DeleteFileRequest: - required: - - fileName - - type - type: object - properties: - fileName: - type: string - type: - $ref: '#/components/schemas/FileType' DownloadArchiveRequest: required: - sub @@ -1406,7 +1300,7 @@ components: type: boolean Playlist: required: - - fileNames + - uids - id - name - thumbnailURL @@ -1417,7 +1311,7 @@ components: properties: name: type: string - fileNames: + uids: type: array items: type: string @@ -1431,16 +1325,22 @@ components: type: number duration: type: number + user_uid: + type: string Download: required: - - uid - - ui_uid - - downloading - - complete - url - type + - title + - type + - options + - uid + - step_index + - paused + - running + - finished_step - percent_complete - - is_playlist + - finished - timestamp_start type: object properties: @@ -1448,32 +1348,36 @@ components: type: string ui_uid: type: string - downloading: + running: type: boolean - complete: + finished: + type: boolean + paused: + type: boolean + finished_step: type: boolean url: type: string type: type: string + title: + type: string + step_index: + type: number percent_complete: type: number - is_playlist: - type: boolean timestamp_start: type: number - timestamp_end: - type: number - filesize: - type: number - nullable: true error: type: string description: Error text, set if download fails. - fileNames: - type: array - items: - type: string + nullable: true + user_uid: + type: string + sub_id: + type: string + sub_name: + type: string SubscriptionRequestData: required: - id diff --git a/backend/app.js b/backend/app.js index 97a29df..6b2ca95 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1348,7 +1348,6 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => { let url = req.body.url; let maxQuality = req.body.maxQuality; let timerange = req.body.timerange; - let streamingOnly = req.body.streamingOnly; let audioOnly = req.body.audioOnly; let customArgs = req.body.customArgs; let customOutput = req.body.customFileOutput; @@ -1358,7 +1357,6 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => { url: url, maxQuality: maxQuality, id: uuid(), - streamingOnly: streamingOnly, user_uid: user_uid, type: audioOnly ? 'audio' : 'video' }; @@ -1554,7 +1552,7 @@ app.post('/api/getPlaylists', optionalJwt, async (req, res) => { const uuid = req.isAuthenticated() ? req.user.uid : null; const include_categories = req.body.include_categories; - const playlists = await db_api.getRecords('playlists', {user_uid: uuid}); + let playlists = await db_api.getRecords('playlists', {user_uid: uuid}); if (include_categories) { const categories = await categories_api.getCategoriesAsPlaylists(files); if (categories) { diff --git a/src/api-types/index.ts b/src/api-types/index.ts index 5a0b927..83c73a8 100644 --- a/src/api-types/index.ts +++ b/src/api-types/index.ts @@ -3,8 +3,6 @@ /* eslint-disable */ export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; -export type { BaseDownloadRequest } from './models/BaseDownloadRequest'; -export type { BaseDownloadResponse } from './models/BaseDownloadResponse'; export type { body_19 } from './models/body_19'; export type { body_20 } from './models/body_20'; export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermissionsRequest'; @@ -13,8 +11,8 @@ export type { Config } from './models/Config'; export type { ConfigResponse } from './models/ConfigResponse'; export type { CreatePlaylistRequest } from './models/CreatePlaylistRequest'; export type { CreatePlaylistResponse } from './models/CreatePlaylistResponse'; +export type { CropFileSettings } from './models/CropFileSettings'; export type { DatabaseFile } from './models/DatabaseFile'; -export type { DeleteFileRequest } from './models/DeleteFileRequest'; export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; export type { DeleteSubscriptionFileRequest } from './models/DeleteSubscriptionFileRequest'; @@ -22,6 +20,8 @@ export type { DeleteUserRequest } from './models/DeleteUserRequest'; export type { Download } from './models/Download'; export type { DownloadArchiveRequest } from './models/DownloadArchiveRequest'; export type { DownloadFileRequest } from './models/DownloadFileRequest'; +export type { DownloadRequest } from './models/DownloadRequest'; +export type { DownloadResponse } from './models/DownloadResponse'; export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; export type { File } from './models/File'; export { FileType } from './models/FileType'; @@ -37,6 +37,8 @@ export type { GetMp3sResponse } from './models/GetMp3sResponse'; export type { GetMp4sResponse } from './models/GetMp4sResponse'; export type { GetPlaylistRequest } from './models/GetPlaylistRequest'; export type { GetPlaylistResponse } from './models/GetPlaylistResponse'; +export type { GetPlaylistsRequest } from './models/GetPlaylistsRequest'; +export type { GetPlaylistsResponse } from './models/GetPlaylistsResponse'; export type { GetRolesResponse } from './models/GetRolesResponse'; export type { GetSubscriptionRequest } from './models/GetSubscriptionRequest'; export type { GetSubscriptionResponse } from './models/GetSubscriptionResponse'; @@ -44,10 +46,6 @@ export type { GetUsersResponse } from './models/GetUsersResponse'; export type { inline_response_200_15 } from './models/inline_response_200_15'; export type { LoginRequest } from './models/LoginRequest'; export type { LoginResponse } from './models/LoginResponse'; -export type { Mp3DownloadRequest } from './models/Mp3DownloadRequest'; -export type { Mp3DownloadResponse } from './models/Mp3DownloadResponse'; -export type { Mp4DownloadRequest } from './models/Mp4DownloadRequest'; -export type { Mp4DownloadResponse } from './models/Mp4DownloadResponse'; export type { Playlist } from './models/Playlist'; export type { RegisterRequest } from './models/RegisterRequest'; export type { RegisterResponse } from './models/RegisterResponse'; @@ -60,7 +58,6 @@ export type { SubscriptionRequestData } from './models/SubscriptionRequestData'; export type { SuccessObject } from './models/SuccessObject'; export type { UnsubscribeRequest } from './models/UnsubscribeRequest'; export type { UnsubscribeResponse } from './models/UnsubscribeResponse'; -export type { UpdatePlaylistFilesRequest } from './models/UpdatePlaylistFilesRequest'; export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdateServerRequest } from './models/UpdateServerRequest'; diff --git a/src/api-types/models/BaseChangePermissionsRequest.ts b/src/api-types/models/BaseChangePermissionsRequest.ts index 6551d46..d548225 100644 --- a/src/api-types/models/BaseChangePermissionsRequest.ts +++ b/src/api-types/models/BaseChangePermissionsRequest.ts @@ -8,4 +8,4 @@ import { YesNo } from './YesNo'; export interface BaseChangePermissionsRequest { permission: UserPermission; new_value: YesNo; -} +} \ No newline at end of file diff --git a/src/api-types/models/BaseDownloadRequest.ts b/src/api-types/models/BaseDownloadRequest.ts deleted file mode 100644 index b6cf3fb..0000000 --- a/src/api-types/models/BaseDownloadRequest.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - - -export interface BaseDownloadRequest { - url: string; - /** - * Video format code. Overrides other quality options. - */ - customQualityConfiguration?: string; - /** - * Custom command-line arguments for youtubedl. Overrides all other options, except url. - */ - customArgs?: string; - /** - * Custom output filename template. - */ - customOutput?: string; - /** - * Login with this account ID - */ - youtubeUsername?: string; - /** - * Account password - */ - youtubePassword?: string; - ui_uid?: string | null; -} diff --git a/src/api-types/models/BaseDownloadResponse.ts b/src/api-types/models/BaseDownloadResponse.ts deleted file mode 100644 index 83d848f..0000000 --- a/src/api-types/models/BaseDownloadResponse.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - - -export interface BaseDownloadResponse { - uid: string; - file_names?: Array | null; -} diff --git a/src/api-types/models/ChangeRolePermissionsRequest.ts b/src/api-types/models/ChangeRolePermissionsRequest.ts index a6f6ed9..417c8ef 100644 --- a/src/api-types/models/ChangeRolePermissionsRequest.ts +++ b/src/api-types/models/ChangeRolePermissionsRequest.ts @@ -6,4 +6,4 @@ import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; export interface ChangeRolePermissionsRequest extends BaseChangePermissionsRequest { role: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/ChangeUserPermissionsRequest.ts b/src/api-types/models/ChangeUserPermissionsRequest.ts index e6f044a..c74dc09 100644 --- a/src/api-types/models/ChangeUserPermissionsRequest.ts +++ b/src/api-types/models/ChangeUserPermissionsRequest.ts @@ -6,4 +6,4 @@ import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; export interface ChangeUserPermissionsRequest extends BaseChangePermissionsRequest { user_uid: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/Config.ts b/src/api-types/models/Config.ts index 509c42f..855217a 100644 --- a/src/api-types/models/Config.ts +++ b/src/api-types/models/Config.ts @@ -5,4 +5,4 @@ export interface Config { YoutubeDLMaterial: any; -} +} \ No newline at end of file diff --git a/src/api-types/models/ConfigResponse.ts b/src/api-types/models/ConfigResponse.ts index b493361..d3ff49a 100644 --- a/src/api-types/models/ConfigResponse.ts +++ b/src/api-types/models/ConfigResponse.ts @@ -7,4 +7,4 @@ import { Config } from './Config'; export interface ConfigResponse { config_file: Config; success: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistRequest.ts b/src/api-types/models/CreatePlaylistRequest.ts index e497dff..2fef41b 100644 --- a/src/api-types/models/CreatePlaylistRequest.ts +++ b/src/api-types/models/CreatePlaylistRequest.ts @@ -6,8 +6,7 @@ import { FileType } from './FileType'; export interface CreatePlaylistRequest { playlistName: string; - fileNames: Array; + uids: Array; type: FileType; thumbnailURL: string; - duration: number; -} +} \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistResponse.ts b/src/api-types/models/CreatePlaylistResponse.ts index 7d5a98c..4cac9cf 100644 --- a/src/api-types/models/CreatePlaylistResponse.ts +++ b/src/api-types/models/CreatePlaylistResponse.ts @@ -7,4 +7,4 @@ import { Playlist } from './Playlist'; export interface CreatePlaylistResponse { new_playlist: Playlist; success: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/CropFileSettings.ts b/src/api-types/models/CropFileSettings.ts new file mode 100644 index 0000000..ec8edec --- /dev/null +++ b/src/api-types/models/CropFileSettings.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CropFileSettings { + cropFileStart: number; + cropFileEnd: number; +} \ No newline at end of file diff --git a/src/api-types/models/DatabaseFile.ts b/src/api-types/models/DatabaseFile.ts index d6009b2..b1a17c0 100644 --- a/src/api-types/models/DatabaseFile.ts +++ b/src/api-types/models/DatabaseFile.ts @@ -19,4 +19,4 @@ export interface DatabaseFile { upload_date: string; uid: string; sharingEnabled?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/DeleteFileRequest.ts b/src/api-types/models/DeleteFileRequest.ts deleted file mode 100644 index c64af6c..0000000 --- a/src/api-types/models/DeleteFileRequest.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { FileType } from './FileType'; - -export interface DeleteFileRequest { - fileName: string; - type: FileType; -} diff --git a/src/api-types/models/DeleteMp3Mp4Request.ts b/src/api-types/models/DeleteMp3Mp4Request.ts index f6d65d6..3202c4f 100644 --- a/src/api-types/models/DeleteMp3Mp4Request.ts +++ b/src/api-types/models/DeleteMp3Mp4Request.ts @@ -6,4 +6,4 @@ export interface DeleteMp3Mp4Request { uid: string; blacklistMode?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/DeletePlaylistRequest.ts b/src/api-types/models/DeletePlaylistRequest.ts index 25830bb..76f2f81 100644 --- a/src/api-types/models/DeletePlaylistRequest.ts +++ b/src/api-types/models/DeletePlaylistRequest.ts @@ -5,6 +5,6 @@ import { FileType } from './FileType'; export interface DeletePlaylistRequest { - playlistID: string; + playlist_id: string; type: FileType; -} +} \ No newline at end of file diff --git a/src/api-types/models/DeleteSubscriptionFileRequest.ts b/src/api-types/models/DeleteSubscriptionFileRequest.ts index aebe91b..7a166a9 100644 --- a/src/api-types/models/DeleteSubscriptionFileRequest.ts +++ b/src/api-types/models/DeleteSubscriptionFileRequest.ts @@ -12,4 +12,4 @@ export interface DeleteSubscriptionFileRequest { * If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings. */ deleteForever?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/DeleteUserRequest.ts b/src/api-types/models/DeleteUserRequest.ts index a994369..15a1d09 100644 --- a/src/api-types/models/DeleteUserRequest.ts +++ b/src/api-types/models/DeleteUserRequest.ts @@ -5,4 +5,4 @@ export interface DeleteUserRequest { uid: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/Download.ts b/src/api-types/models/Download.ts index b4d91d9..d91dd00 100644 --- a/src/api-types/models/Download.ts +++ b/src/api-types/models/Download.ts @@ -5,19 +5,22 @@ export interface Download { uid: string; - ui_uid: string; - downloading: boolean; - complete: boolean; + ui_uid?: string; + running: boolean; + finished: boolean; + paused: boolean; + finished_step: boolean; url: string; type: string; + title: string; + step_index: number; percent_complete: number; - is_playlist: boolean; timestamp_start: number; - timestamp_end?: number; - filesize?: number | null; /** * Error text, set if download fails. */ - error?: string; - fileNames?: Array; -} + error?: string | null; + user_uid?: string; + sub_id?: string; + sub_name?: string; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadArchiveRequest.ts b/src/api-types/models/DownloadArchiveRequest.ts index 46c5c45..857910c 100644 --- a/src/api-types/models/DownloadArchiveRequest.ts +++ b/src/api-types/models/DownloadArchiveRequest.ts @@ -5,6 +5,6 @@ export interface DownloadArchiveRequest { sub: { - archive_dir: string, - }; -} +archive_dir: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index 61816c9..0bee9d2 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -2,23 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; export interface DownloadFileRequest { - fileNames: ; - zip_mode?: boolean; - type: FileType; - outputName?: string; - fullPathProvided?: boolean; + uid: string; uuid?: string; - uid?: string; - id?: string; + sub_id?: string; /** * Only used for subscriptions */ - subscriptionName?: string; - /** - * Only used for subscriptions - */ - subPlaylist?: boolean; -} + is_playlist?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadRequest.ts b/src/api-types/models/DownloadRequest.ts new file mode 100644 index 0000000..5c6da09 --- /dev/null +++ b/src/api-types/models/DownloadRequest.ts @@ -0,0 +1,44 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { CropFileSettings } from './CropFileSettings'; +import { FileType } from './FileType'; + +export interface DownloadRequest { + url: string; + /** + * Video format code. Overrides other quality options. + */ + customQualityConfiguration?: string; + /** + * Custom command-line arguments for youtube-dl. Overrides all other options, except url. + */ + customArgs?: string; + /** + * Additional command-line arguments for youtube-dl. Added to whatever args would normally be used. + */ + additionalArgs?: string; + /** + * Custom output filename template. + */ + customOutput?: string; + /** + * Login with this account ID + */ + youtubeUsername?: string; + /** + * Account password + */ + youtubePassword?: string; + /** + * Height of the video, if known + */ + selectedHeight?: string; + /** + * Specify ffmpeg/avconv audio quality + */ + maxBitrate?: string; + type?: FileType; + cropFileSettings?: CropFileSettings; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadResponse.ts b/src/api-types/models/DownloadResponse.ts new file mode 100644 index 0000000..5450cfd --- /dev/null +++ b/src/api-types/models/DownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Download } from './Download'; + +export interface DownloadResponse { + download?: Download | null; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts index 4b64af3..31d0c6d 100644 --- a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts +++ b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts @@ -5,4 +5,4 @@ export interface DownloadVideosForSubscriptionRequest { subID: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/File.ts b/src/api-types/models/File.ts index 2e81613..5114e53 100644 --- a/src/api-types/models/File.ts +++ b/src/api-types/models/File.ts @@ -5,4 +5,4 @@ export interface File { id?: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/GenerateNewApiKeyResponse.ts b/src/api-types/models/GenerateNewApiKeyResponse.ts index d96a464..378a642 100644 --- a/src/api-types/models/GenerateNewApiKeyResponse.ts +++ b/src/api-types/models/GenerateNewApiKeyResponse.ts @@ -5,4 +5,4 @@ export interface GenerateNewApiKeyResponse { new_api_key: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsResponse.ts b/src/api-types/models/GetAllDownloadsResponse.ts index 1f99a85..5367f56 100644 --- a/src/api-types/models/GetAllDownloadsResponse.ts +++ b/src/api-types/models/GetAllDownloadsResponse.ts @@ -2,12 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Dictionary } from './Dictionary'; import { Download } from './Download'; export interface GetAllDownloadsResponse { - /** - * Map of Session ID to inner map - */ - downloads?: Dictionary>; -} + downloads?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllFilesResponse.ts b/src/api-types/models/GetAllFilesResponse.ts index 79f7fc6..d067555 100644 --- a/src/api-types/models/GetAllFilesResponse.ts +++ b/src/api-types/models/GetAllFilesResponse.ts @@ -11,4 +11,4 @@ export interface GetAllFilesResponse { * All video playlists */ playlists: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetAllSubscriptionsResponse.ts b/src/api-types/models/GetAllSubscriptionsResponse.ts index fafb6f5..485d0cd 100644 --- a/src/api-types/models/GetAllSubscriptionsResponse.ts +++ b/src/api-types/models/GetAllSubscriptionsResponse.ts @@ -6,4 +6,4 @@ import { Subscription } from './Subscription'; export interface GetAllSubscriptionsResponse { subscriptions: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetDownloadRequest.ts b/src/api-types/models/GetDownloadRequest.ts index 9ad5fdf..49f102a 100644 --- a/src/api-types/models/GetDownloadRequest.ts +++ b/src/api-types/models/GetDownloadRequest.ts @@ -4,6 +4,5 @@ export interface GetDownloadRequest { - session_id: string; - download_id: string; -} + download_uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetDownloadResponse.ts b/src/api-types/models/GetDownloadResponse.ts index b027cbf..029e21f 100644 --- a/src/api-types/models/GetDownloadResponse.ts +++ b/src/api-types/models/GetDownloadResponse.ts @@ -6,4 +6,4 @@ import { Download } from './Download'; export interface GetDownloadResponse { download?: Download | null; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetFileRequest.ts b/src/api-types/models/GetFileRequest.ts index 0d85afb..3bb14b1 100644 --- a/src/api-types/models/GetFileRequest.ts +++ b/src/api-types/models/GetFileRequest.ts @@ -14,4 +14,4 @@ export interface GetFileRequest { * User UID */ uuid?: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetFileResponse.ts b/src/api-types/models/GetFileResponse.ts index 71b3563..df78e28 100644 --- a/src/api-types/models/GetFileResponse.ts +++ b/src/api-types/models/GetFileResponse.ts @@ -7,4 +7,4 @@ import { DatabaseFile } from './DatabaseFile'; export interface GetFileResponse { success: boolean; file?: DatabaseFile; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetMp3sResponse.ts b/src/api-types/models/GetMp3sResponse.ts index 13f03dc..23a80d7 100644 --- a/src/api-types/models/GetMp3sResponse.ts +++ b/src/api-types/models/GetMp3sResponse.ts @@ -11,4 +11,4 @@ export interface GetMp3sResponse { * All audio playlists */ playlists: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetMp4sResponse.ts b/src/api-types/models/GetMp4sResponse.ts index 9ef2c1f..06e1f98 100644 --- a/src/api-types/models/GetMp4sResponse.ts +++ b/src/api-types/models/GetMp4sResponse.ts @@ -11,4 +11,4 @@ export interface GetMp4sResponse { * All video playlists */ playlists: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistRequest.ts b/src/api-types/models/GetPlaylistRequest.ts index ca86a2d..9a48a9b 100644 --- a/src/api-types/models/GetPlaylistRequest.ts +++ b/src/api-types/models/GetPlaylistRequest.ts @@ -5,7 +5,8 @@ import { FileType } from './FileType'; export interface GetPlaylistRequest { - playlistID: string; + playlist_id: string; type?: FileType; uuid?: string; -} + include_file_metadata?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistResponse.ts b/src/api-types/models/GetPlaylistResponse.ts index c3bf7c9..afe4184 100644 --- a/src/api-types/models/GetPlaylistResponse.ts +++ b/src/api-types/models/GetPlaylistResponse.ts @@ -9,4 +9,4 @@ export interface GetPlaylistResponse { playlist: Playlist; type: FileType; success: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsRequest.ts b/src/api-types/models/GetPlaylistsRequest.ts new file mode 100644 index 0000000..2693d19 --- /dev/null +++ b/src/api-types/models/GetPlaylistsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetPlaylistsRequest { + include_categories?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsResponse.ts b/src/api-types/models/GetPlaylistsResponse.ts new file mode 100644 index 0000000..e01f586 --- /dev/null +++ b/src/api-types/models/GetPlaylistsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface GetPlaylistsResponse { + playlists: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetRolesResponse.ts b/src/api-types/models/GetRolesResponse.ts index ce5e696..2209ec4 100644 --- a/src/api-types/models/GetRolesResponse.ts +++ b/src/api-types/models/GetRolesResponse.ts @@ -6,11 +6,11 @@ import { UserPermission } from './UserPermission'; export interface GetRolesResponse { roles: { - admin?: { - permissions?: Array, - }, - user?: { - permissions?: Array, - }, - }; -} +admin?: { +permissions?: Array, +}, +user?: { +permissions?: Array, +}, +}; +} \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionRequest.ts b/src/api-types/models/GetSubscriptionRequest.ts index 99ee221..c11c5fa 100644 --- a/src/api-types/models/GetSubscriptionRequest.ts +++ b/src/api-types/models/GetSubscriptionRequest.ts @@ -8,4 +8,8 @@ export interface GetSubscriptionRequest { * Subscription ID */ id: string; -} + /** + * Subscription name + */ + name?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionResponse.ts b/src/api-types/models/GetSubscriptionResponse.ts index 9d2209a..0efb102 100644 --- a/src/api-types/models/GetSubscriptionResponse.ts +++ b/src/api-types/models/GetSubscriptionResponse.ts @@ -7,4 +7,4 @@ import { Subscription } from './Subscription'; export interface GetSubscriptionResponse { subscription: Subscription; files: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/GetUsersResponse.ts b/src/api-types/models/GetUsersResponse.ts index f5f9eb0..2f17953 100644 --- a/src/api-types/models/GetUsersResponse.ts +++ b/src/api-types/models/GetUsersResponse.ts @@ -6,4 +6,4 @@ import { User } from './User'; export interface GetUsersResponse { users: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/LoginRequest.ts b/src/api-types/models/LoginRequest.ts index a06327f..2e99447 100644 --- a/src/api-types/models/LoginRequest.ts +++ b/src/api-types/models/LoginRequest.ts @@ -6,4 +6,4 @@ export interface LoginRequest { username: string; password: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/LoginResponse.ts b/src/api-types/models/LoginResponse.ts index c94f444..7f5c42d 100644 --- a/src/api-types/models/LoginResponse.ts +++ b/src/api-types/models/LoginResponse.ts @@ -10,4 +10,4 @@ export interface LoginResponse { token?: string; permissions?: Array; available_permissions?: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/Mp3DownloadRequest.ts b/src/api-types/models/Mp3DownloadRequest.ts deleted file mode 100644 index b4b4f8f..0000000 --- a/src/api-types/models/Mp3DownloadRequest.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { BaseDownloadRequest } from './BaseDownloadRequest'; - -export interface Mp3DownloadRequest extends BaseDownloadRequest { - /** - * Specify ffmpeg/avconv audio quality - */ - maxBitrate?: string; -} diff --git a/src/api-types/models/Mp3DownloadResponse.ts b/src/api-types/models/Mp3DownloadResponse.ts deleted file mode 100644 index 32924a6..0000000 --- a/src/api-types/models/Mp3DownloadResponse.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { BaseDownloadResponse } from './BaseDownloadResponse'; - -export interface Mp3DownloadResponse extends BaseDownloadResponse { - audiopathEncoded: string; -} diff --git a/src/api-types/models/Mp4DownloadRequest.ts b/src/api-types/models/Mp4DownloadRequest.ts deleted file mode 100644 index faeb6ab..0000000 --- a/src/api-types/models/Mp4DownloadRequest.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { BaseDownloadRequest } from './BaseDownloadRequest'; - -export interface Mp4DownloadRequest extends BaseDownloadRequest { - /** - * Height of the video, if known - */ - selectedHeight?: string; -} diff --git a/src/api-types/models/Mp4DownloadResponse.ts b/src/api-types/models/Mp4DownloadResponse.ts deleted file mode 100644 index 0763c07..0000000 --- a/src/api-types/models/Mp4DownloadResponse.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { BaseDownloadResponse } from './BaseDownloadResponse'; - -export interface Mp4DownloadResponse extends BaseDownloadResponse { - videopathEncoded: string; -} diff --git a/src/api-types/models/Playlist.ts b/src/api-types/models/Playlist.ts index 1afe993..7741f41 100644 --- a/src/api-types/models/Playlist.ts +++ b/src/api-types/models/Playlist.ts @@ -6,10 +6,11 @@ import { FileType } from './FileType'; export interface Playlist { name: string; - fileNames: Array; + uids: Array; id: string; thumbnailURL: string; type: FileType; registered: number; duration: number; -} + user_uid?: string; +} \ No newline at end of file diff --git a/src/api-types/models/RegisterRequest.ts b/src/api-types/models/RegisterRequest.ts index 73bee22..87b7f0f 100644 --- a/src/api-types/models/RegisterRequest.ts +++ b/src/api-types/models/RegisterRequest.ts @@ -7,4 +7,4 @@ export interface RegisterRequest { userid: string; username: string; password: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/RegisterResponse.ts b/src/api-types/models/RegisterResponse.ts index 4e45b65..5aaa76a 100644 --- a/src/api-types/models/RegisterResponse.ts +++ b/src/api-types/models/RegisterResponse.ts @@ -6,4 +6,4 @@ import { User } from './User'; export interface RegisterResponse { user?: User; -} +} \ No newline at end of file diff --git a/src/api-types/models/SetConfigRequest.ts b/src/api-types/models/SetConfigRequest.ts index 41ef52a..f307009 100644 --- a/src/api-types/models/SetConfigRequest.ts +++ b/src/api-types/models/SetConfigRequest.ts @@ -6,4 +6,4 @@ import { Config } from './Config'; export interface SetConfigRequest { new_config_file: Config; -} +} \ No newline at end of file diff --git a/src/api-types/models/SharingToggle.ts b/src/api-types/models/SharingToggle.ts index 2de90fc..5acba30 100644 --- a/src/api-types/models/SharingToggle.ts +++ b/src/api-types/models/SharingToggle.ts @@ -2,10 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; export interface SharingToggle { uid: string; - type: FileType; is_playlist?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/SubscribeRequest.ts b/src/api-types/models/SubscribeRequest.ts index d475cb9..2cca0df 100644 --- a/src/api-types/models/SubscribeRequest.ts +++ b/src/api-types/models/SubscribeRequest.ts @@ -7,8 +7,8 @@ export interface SubscribeRequest { name: string; url: string; timerange?: string; - streamingOnly: boolean; audioOnly?: boolean; customArgs?: string; customFileOutput?: string; -} + maxQuality?: string; +} \ No newline at end of file diff --git a/src/api-types/models/SubscribeResponse.ts b/src/api-types/models/SubscribeResponse.ts index fa4c235..a1f1331 100644 --- a/src/api-types/models/SubscribeResponse.ts +++ b/src/api-types/models/SubscribeResponse.ts @@ -7,4 +7,4 @@ import { Subscription } from './Subscription'; export interface SubscribeResponse { new_sub: Subscription; error?: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/Subscription.ts b/src/api-types/models/Subscription.ts index 8cd369e..1184827 100644 --- a/src/api-types/models/Subscription.ts +++ b/src/api-types/models/Subscription.ts @@ -17,4 +17,4 @@ export interface Subscription { custom_args?: string; custom_output?: string; videos: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/SubscriptionRequestData.ts b/src/api-types/models/SubscriptionRequestData.ts index 6c99499..056ff28 100644 --- a/src/api-types/models/SubscriptionRequestData.ts +++ b/src/api-types/models/SubscriptionRequestData.ts @@ -10,4 +10,4 @@ export interface SubscriptionRequestData { type?: FileType; isPlaylist?: boolean; archive?: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/SuccessObject.ts b/src/api-types/models/SuccessObject.ts index cd0a11e..f59e3fa 100644 --- a/src/api-types/models/SuccessObject.ts +++ b/src/api-types/models/SuccessObject.ts @@ -5,4 +5,4 @@ export interface SuccessObject { success: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeRequest.ts b/src/api-types/models/UnsubscribeRequest.ts index 598faee..1ee72e3 100644 --- a/src/api-types/models/UnsubscribeRequest.ts +++ b/src/api-types/models/UnsubscribeRequest.ts @@ -10,4 +10,4 @@ export interface UnsubscribeRequest { * Defaults to false */ deleteMode?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeResponse.ts b/src/api-types/models/UnsubscribeResponse.ts index 0f0d991..1d43b7b 100644 --- a/src/api-types/models/UnsubscribeResponse.ts +++ b/src/api-types/models/UnsubscribeResponse.ts @@ -6,4 +6,4 @@ export interface UnsubscribeResponse { success: boolean; error?: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/UpdatePlaylistFilesRequest.ts b/src/api-types/models/UpdatePlaylistFilesRequest.ts deleted file mode 100644 index 3fa95c2..0000000 --- a/src/api-types/models/UpdatePlaylistFilesRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import { FileType } from './FileType'; - -export interface UpdatePlaylistFilesRequest { - playlistID: string; - fileNames: Array; - type: FileType; -} diff --git a/src/api-types/models/UpdatePlaylistRequest.ts b/src/api-types/models/UpdatePlaylistRequest.ts index 1eaee52..38f98ac 100644 --- a/src/api-types/models/UpdatePlaylistRequest.ts +++ b/src/api-types/models/UpdatePlaylistRequest.ts @@ -6,4 +6,4 @@ import { Playlist } from './Playlist'; export interface UpdatePlaylistRequest { playlist: Playlist; -} +} \ No newline at end of file diff --git a/src/api-types/models/UpdateServerRequest.ts b/src/api-types/models/UpdateServerRequest.ts index 95db6e4..8c616f6 100644 --- a/src/api-types/models/UpdateServerRequest.ts +++ b/src/api-types/models/UpdateServerRequest.ts @@ -5,4 +5,4 @@ export interface UpdateServerRequest { tag: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/UpdateUserRequest.ts b/src/api-types/models/UpdateUserRequest.ts index c6e2f05..19e32c8 100644 --- a/src/api-types/models/UpdateUserRequest.ts +++ b/src/api-types/models/UpdateUserRequest.ts @@ -5,8 +5,8 @@ export interface UpdateUserRequest { change_object: { - uid: string, - name?: string, - role?: string, - }; -} +uid: string, +name?: string, +role?: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/UpdaterStatus.ts b/src/api-types/models/UpdaterStatus.ts index 19e513c..8db6a17 100644 --- a/src/api-types/models/UpdaterStatus.ts +++ b/src/api-types/models/UpdaterStatus.ts @@ -7,4 +7,4 @@ export interface UpdaterStatus { updating: boolean; details: string; error?: boolean; -} +} \ No newline at end of file diff --git a/src/api-types/models/User.ts b/src/api-types/models/User.ts index 8a49d3c..0568e06 100644 --- a/src/api-types/models/User.ts +++ b/src/api-types/models/User.ts @@ -10,16 +10,16 @@ export interface User { name?: string; passhash?: string; files?: { - audio?: Array, - video?: Array, - }; +audio?: Array, +video?: Array, +}; playlists?: { - audio?: Array, - video?: Array, - }; +audio?: Array, +video?: Array, +}; subscriptions?: Array; created?: number; role?: string; permissions?: Array; permission_overrides?: Array; -} +} \ No newline at end of file diff --git a/src/api-types/models/body_19.ts b/src/api-types/models/body_19.ts index b0ce9cb..c7f8fb8 100644 --- a/src/api-types/models/body_19.ts +++ b/src/api-types/models/body_19.ts @@ -5,4 +5,4 @@ export interface body_19 { input_pin: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/body_20.ts b/src/api-types/models/body_20.ts index 84a7b47..559ea14 100644 --- a/src/api-types/models/body_20.ts +++ b/src/api-types/models/body_20.ts @@ -5,4 +5,4 @@ export interface body_20 { unhashed_pin: string; -} +} \ No newline at end of file diff --git a/src/api-types/models/inline_response_200_15.ts b/src/api-types/models/inline_response_200_15.ts index bb98ac6..7147a1e 100644 --- a/src/api-types/models/inline_response_200_15.ts +++ b/src/api-types/models/inline_response_200_15.ts @@ -5,4 +5,4 @@ export interface inline_response_200_15 { is_set: boolean; -} +} \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9277a4f..7b26e63 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -47,7 +47,6 @@ import { InputDialogComponent } from './input-dialog/input-dialog.component'; import { LazyLoadImageModule, IsVisibleProps } from 'ng-lazyload-image'; import { audioFilesMouseHovering, videoFilesMouseHovering, audioFilesOpened, videoFilesOpened } from './main/main.component'; import { CreatePlaylistComponent } from './create-playlist/create-playlist.component'; -import { DownloadItemComponent } from './download-item/download-item.component'; import { SubscriptionsComponent } from './subscriptions/subscriptions.component'; import { SubscribeDialogComponent } from './dialogs/subscribe-dialog/subscribe-dialog.component'; import { SubscriptionComponent } from './subscription//subscription/subscription.component'; @@ -102,7 +101,6 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible PlayerComponent, InputDialogComponent, CreatePlaylistComponent, - DownloadItemComponent, SubscriptionsComponent, SubscribeDialogComponent, SubscriptionComponent, diff --git a/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts b/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts index 0d3ab68..916b5f9 100644 --- a/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts +++ b/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts @@ -90,7 +90,7 @@ export class SubscribeDialogComponent implements OnInit { if (!this.download_all) { timerange = 'now-' + this.timerange_amount.toString() + this.timerange_unit; } - this.postsService.createSubscription(this.url, this.name, timerange, this.streamingOnlyMode, this.maxQuality, + this.postsService.createSubscription(this.url, this.name, timerange, this.maxQuality, this.audioOnlyMode, this.customArgs, this.customFileOutput).subscribe(res => { this.subscribing = false; if (res['new_sub']) { diff --git a/src/app/download-item/download-item.component.html b/src/app/download-item/download-item.component.html deleted file mode 100644 index 07d4310..0000000 --- a/src/app/download-item/download-item.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
- - -
ID: {{url_id ? url_id : download.uid}}
-
- - - done - error - - - - -
- - -
- Details -
-
-
- {{download.timestamp_start | date:'medium'}} -
-
-
-
- An error has occurred: -
- {{download.error}} -
-
- Download start: {{download.timestamp_start | date:'medium'}} -
-
- Download end: {{download.timestamp_end | date:'medium'}} -
-
- File path(s): {{download.fileNames.join(', ')}} -
-
-
\ No newline at end of file diff --git a/src/app/download-item/download-item.component.scss b/src/app/download-item/download-item.component.scss deleted file mode 100644 index f28a49f..0000000 --- a/src/app/download-item/download-item.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.shorten { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; -} - -.mat-expansion-panel:not([class*='mat-elevation-z']) { - box-shadow: none; -} - -.ignore-margin { - margin-left: -15px; - margin-right: -15px; - margin-bottom: -15px; -} diff --git a/src/app/download-item/download-item.component.spec.ts b/src/app/download-item/download-item.component.spec.ts deleted file mode 100644 index 7baea1e..0000000 --- a/src/app/download-item/download-item.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { DownloadItemComponent } from './download-item.component'; - -describe('DownloadItemComponent', () => { - let component: DownloadItemComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ DownloadItemComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DownloadItemComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/download-item/download-item.component.ts b/src/app/download-item/download-item.component.ts deleted file mode 100644 index 5803afd..0000000 --- a/src/app/download-item/download-item.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core'; -import { Download } from 'app/main/main.component'; - - -@Component({ - selector: 'app-download-item', - templateUrl: './download-item.component.html', - styleUrls: ['./download-item.component.scss'] -}) -export class DownloadItemComponent implements OnInit { - - @Input() download: Download = { - uid: null, - type: 'audio', - percent_complete: 0, - complete: false, - url: 'http://youtube.com/watch?v=17848rufj', - downloading: true, - timestamp_start: null, - timestamp_end: null, - is_playlist: false, - error: false - }; - @Output() cancelDownload = new EventEmitter(); - - @Input() queueNumber = null; - - url_id = null; - - constructor() { } - - ngOnInit() { - if (this.download && this.download.url && this.download.url.includes('youtu')) { - const string_id = (this.download.is_playlist ? '?list=' : '?v=') - const index_offset = (this.download.is_playlist ? 6 : 3); - const end_index = this.download.url.indexOf(string_id) + index_offset; - this.url_id = this.download.url.substring(end_index, this.download.url.length); - } - } - - cancelTheDownload() { - this.cancelDownload.emit(this.download); - } - -} diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index de787ca..08906bd 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -10,26 +10,13 @@ import { Router, ActivatedRoute } from '@angular/router'; import { Platform } from '@angular/cdk/platform'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; import { RecentVideosComponent } from 'app/components/recent-videos/recent-videos.component'; +import { Download, FileType } from 'api-types'; export let audioFilesMouseHovering = false; export let videoFilesMouseHovering = false; export let audioFilesOpened = false; export let videoFilesOpened = false; -export interface Download { - uid: string; - type: string; - url: string; - percent_complete: number; - downloading: boolean; - is_playlist: boolean; - error?: boolean | string; - fileNames?: string[]; - complete?: boolean; - timestamp_start?: number; - timestamp_end?: number; -} - @Component({ selector: 'app-root', templateUrl: './main.component.html', @@ -198,16 +185,6 @@ export class MainComponent implements OnInit { last_valid_url = ''; last_url_check = 0; - test_download: Download = { - uid: null, - type: 'audio', - percent_complete: 0, - url: 'http://youtube.com/watch?v=17848rufj', - downloading: true, - is_playlist: false, - error: false - }; - argsChangedSubject: Subject = new Subject(); simulatedOutput = ''; @@ -411,7 +388,7 @@ export class MainComponent implements OnInit { const urls = this.getURLArray(this.url); for (let i = 0; i < urls.length; i++) { const url = urls[i]; - this.postsService.downloadFile(url, type, (selected_quality === '' ? null : selected_quality), + this.postsService.downloadFile(url, type as FileType, (selected_quality === '' ? null : selected_quality), customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { this.current_download = res['download']; this.downloads.push(res['download']); @@ -439,7 +416,6 @@ export class MainComponent implements OnInit { return; } this.downloadingfile = false; - this.current_download.downloading = false; this.current_download = null; } diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index d87c858..fb40ed1 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -157,7 +157,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { }); // regular video/audio file (not playlist) this.uids = [this.db_file['uid']]; - this.type = this.db_file['isAudio'] ? 'audio' : 'video' as FileType; + this.type = this.db_file['isAudio'] ? 'audio' as FileType : 'video' as FileType; this.parseFileNames(); }); } diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index fd81f73..56cc403 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -16,6 +16,7 @@ import { ConfigResponse, CreatePlaylistRequest, CreatePlaylistResponse, + CropFileSettings, DeleteMp3Mp4Request, DeletePlaylistRequest, DeleteSubscriptionFileRequest, @@ -41,10 +42,8 @@ import { GetUsersResponse, LoginRequest, LoginResponse, - Mp3DownloadRequest, - Mp3DownloadResponse, - Mp4DownloadRequest, - Mp4DownloadResponse, + DownloadRequest, + DownloadResponse, Playlist, RegisterRequest, RegisterResponse, @@ -57,7 +56,6 @@ import { UpdaterStatus, UnsubscribeRequest, UnsubscribeResponse, - UpdatePlaylistFilesRequest, UpdatePlaylistRequest, UpdateServerRequest, UpdateUserRequest, @@ -231,7 +229,7 @@ export class PostsService implements CanActivate { // tslint:disable-next-line: max-line-length // tslint:disable-next-line: max-line-length - downloadFile(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings: CropFileSettings = null) { + downloadFile(url: string, type: FileType, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings: CropFileSettings = null) { const body: DownloadRequest = {url: url, selectedHeight: selectedQuality, customQualityConfiguration: customQualityConfiguration, @@ -299,7 +297,7 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'setConfig', body, this.httpOptions); } - deleteFile(uid: string, isAudio: boolean, blacklistMode = false) { + deleteFile(uid: string, blacklistMode = false) { const body: DeleteMp3Mp4Request = {uid: uid, blacklistMode: blacklistMode} return this.http.post(this.path + 'deleteFile', body, this.httpOptions); } @@ -392,12 +390,12 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); } - enableSharing(uid: string, type: FileType, is_playlist: boolean) { + enableSharing(uid: string, is_playlist: boolean) { const body: SharingToggle = {uid: uid, is_playlist: is_playlist}; return this.http.post(this.path + 'enableSharing', body, this.httpOptions); } - disableSharing(uid: string, type: FileType, is_playlist: boolean) { + disableSharing(uid: string, is_playlist: boolean) { const body: SharingToggle = {uid: uid, is_playlist: is_playlist}; return this.http.post(this.path + 'disableSharing', body, this.httpOptions); } @@ -434,10 +432,9 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'deletePlaylist', body, this.httpOptions); } - createSubscription(url, name, timerange = null, streamingOnly = false, maxQuality = 'best', audioOnly = false, customArgs: string = null, customFileOutput: string = null) { + createSubscription(url, name, timerange = null, maxQuality = 'best', audioOnly = false, customArgs: string = null, customFileOutput: string = null) { const body: SubscribeRequest = {url: url, name: name, timerange: timerange, maxQuality: maxQuality, - streamingOnly: streamingOnly, audioOnly: audioOnly, customArgs: customArgs, - customFileOutput: customFileOutput}; + audioOnly: audioOnly, customArgs: customArgs, customFileOutput: customFileOutput}; return this.http.post(this.path + 'subscribe', body, this.httpOptions); } From c5db1d30e26dce62a809a5879703b707312fb462 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 22:18:55 -0600 Subject: [PATCH 053/212] Added missing routes to API Changed getDBInfo from post to get request --- Public API v1.yaml | 765 ++++++++++++++++-- backend/app.js | 2 +- package-lock.json | 7 + src/api-types/index.ts | 34 + .../models/AddFileToPlaylistRequest.ts | 9 + src/api-types/models/Category.ts | 15 + src/api-types/models/CategoryRule.ts | 26 + .../models/CheckConcurrentStreamRequest.ts | 11 + .../models/CheckConcurrentStreamResponse.ts | 9 + src/api-types/models/ConcurrentStream.ts | 10 + src/api-types/models/CreateCategoryRequest.ts | 8 + .../models/CreateCategoryResponse.ts | 10 + src/api-types/models/DBInfoResponse.ts | 18 + src/api-types/models/DeleteCategoryRequest.ts | 8 + src/api-types/models/DownloadFileRequest.ts | 7 +- .../DownloadTwitchChatByVODIDRequest.ts | 26 + .../DownloadTwitchChatByVODIDResponse.ts | 9 + src/api-types/models/GenerateArgsResponse.ts | 8 + .../models/GetAllCategoriesResponse.ts | 9 + .../models/GetAllDownloadsRequest.ts | 11 + src/api-types/models/GetFileFormatsRequest.ts | 8 + .../models/GetFileFormatsResponse.ts | 12 + .../models/GetFullTwitchChatRequest.ts | 22 + .../models/GetFullTwitchChatResponse.ts | 9 + src/api-types/models/GetLogsRequest.ts | 8 + src/api-types/models/GetLogsResponse.ts | 12 + .../models/IncrementViewCountRequest.ts | 13 + src/api-types/models/TableInfo.ts | 8 + .../models/TestConnectionStringRequest.ts | 11 + .../models/TestConnectionStringResponse.ts | 9 + src/api-types/models/TransferDBRequest.ts | 11 + src/api-types/models/TransferDBResponse.ts | 9 + src/api-types/models/TwitchChatMessage.ts | 18 + .../models/UpdateCategoriesRequest.ts | 9 + src/api-types/models/UpdateCategoryRequest.ts | 9 + .../models/UpdateConcurrentStreamRequest.ts | 12 + .../models/UpdateConcurrentStreamResponse.ts | 9 + src/api-types/models/Version.ts | 11 + src/api-types/models/VersionInfoResponse.ts | 9 + src/app/main/main.component.ts | 2 +- src/app/posts.services.ts | 160 ++-- 41 files changed, 1255 insertions(+), 118 deletions(-) create mode 100644 src/api-types/models/AddFileToPlaylistRequest.ts create mode 100644 src/api-types/models/Category.ts create mode 100644 src/api-types/models/CategoryRule.ts create mode 100644 src/api-types/models/CheckConcurrentStreamRequest.ts create mode 100644 src/api-types/models/CheckConcurrentStreamResponse.ts create mode 100644 src/api-types/models/ConcurrentStream.ts create mode 100644 src/api-types/models/CreateCategoryRequest.ts create mode 100644 src/api-types/models/CreateCategoryResponse.ts create mode 100644 src/api-types/models/DBInfoResponse.ts create mode 100644 src/api-types/models/DeleteCategoryRequest.ts create mode 100644 src/api-types/models/DownloadTwitchChatByVODIDRequest.ts create mode 100644 src/api-types/models/DownloadTwitchChatByVODIDResponse.ts create mode 100644 src/api-types/models/GenerateArgsResponse.ts create mode 100644 src/api-types/models/GetAllCategoriesResponse.ts create mode 100644 src/api-types/models/GetAllDownloadsRequest.ts create mode 100644 src/api-types/models/GetFileFormatsRequest.ts create mode 100644 src/api-types/models/GetFileFormatsResponse.ts create mode 100644 src/api-types/models/GetFullTwitchChatRequest.ts create mode 100644 src/api-types/models/GetFullTwitchChatResponse.ts create mode 100644 src/api-types/models/GetLogsRequest.ts create mode 100644 src/api-types/models/GetLogsResponse.ts create mode 100644 src/api-types/models/IncrementViewCountRequest.ts create mode 100644 src/api-types/models/TableInfo.ts create mode 100644 src/api-types/models/TestConnectionStringRequest.ts create mode 100644 src/api-types/models/TestConnectionStringResponse.ts create mode 100644 src/api-types/models/TransferDBRequest.ts create mode 100644 src/api-types/models/TransferDBResponse.ts create mode 100644 src/api-types/models/TwitchChatMessage.ts create mode 100644 src/api-types/models/UpdateCategoriesRequest.ts create mode 100644 src/api-types/models/UpdateCategoryRequest.ts create mode 100644 src/api-types/models/UpdateConcurrentStreamRequest.ts create mode 100644 src/api-types/models/UpdateConcurrentStreamResponse.ts create mode 100644 src/api-types/models/Version.ts create mode 100644 src/api-types/models/VersionInfoResponse.ts diff --git a/Public API v1.yaml b/Public API v1.yaml index 01cdfcd..35eaa47 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -33,6 +33,27 @@ paths: description: Server download error security: - Auth query parameter: [] + /api/generateArgs: + post: + tags: + - downloader + summary: Download video file + description: Generates args, used for checking what args would run if you ran downloadFile + operationId: post-generateArgs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GenerateArgsResponse' + security: + - Auth query parameter: [] /api/getMp3s: get: tags: @@ -148,6 +169,27 @@ paths: $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] + /api/incrementViewCount: + post: + summary: Increments a file's view count + tags: + - files + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IncrementViewCountRequest' + operationId: post-api-incrementViewCount + description: Increments a file's view count + security: + - Auth query parameter: [] /api/subscribe: post: tags: @@ -359,6 +401,27 @@ paths: $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] + /api/addFileToPlaylist: + post: + tags: + - playlists + summary: Adds a file to a playlist + description: Adds a file to a playlist + operationId: post-api-addFileToPlaylist + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AddFileToPlaylistRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] /api/deleteMp4: post: tags: @@ -487,48 +550,6 @@ paths: $ref: '#/components/schemas/inline_response_200_15' security: - Auth query parameter: [] - /api/checkPin: - post: - tags: - - security - summary: Check if pin is correct - description: Checks the pin against an inputted one. Will return true if they match - operationId: post-api-checkPin - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/body_19' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessObject' - security: - - Auth query parameter: [] - /api/setPin: - post: - tags: - - security - summary: Set pin - operationId: post-api-setPin - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/body_20' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessObject' - security: - - Auth query parameter: [] - description: '' /api/generateNewAPIKey: post: tags: @@ -604,7 +625,7 @@ paths: security: - Auth query parameter: [] /api/downloads: - get: + post: summary: Get info for all downloads tags: - downloader @@ -615,7 +636,12 @@ paths: application/json: schema: $ref: '#/components/schemas/GetAllDownloadsResponse' - operationId: get-api-downloads + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllDownloadsRequest' + operationId: post-api-downloads description: Retrieves all downloads recorded by the server and their status. security: - Auth query parameter: [] @@ -799,6 +825,299 @@ paths: - Auth query parameter: [] tags: - multi-user mode + /api/versionInfo: + get: + tags: + - server + summary: Gets server version info + operationId: get-api-versionInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/VersionInfoResponse' + security: + - Auth query parameter: [] + /api/getLogs: + post: + summary: Gets logs from server + tags: + - server + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetLogsResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetLogsRequest' + operationId: post-api-getLogs + description: Gets logs from server + security: + - Auth query parameter: [] + /api/clearAllLogs: + post: + summary: Clears the log file + tags: + - server + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + operationId: post-api-clearAllLogs + description: Clears the log file + security: + - Auth query parameter: [] + /api/getDBInfo: + get: + tags: + - db + summary: Gets information on the DB + operationId: get-api-getDBInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DBInfoResponse' + security: + - Auth query parameter: [] + /api/transferDB: + post: + summary: Transfers DB between Local and MongoDB + tags: + - db + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TransferDBResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransferDBRequest' + operationId: post-api-transferDB + description: Initiates a transfer between Local and MongoDB. Connection string must be set. + security: + - Auth query parameter: [] + /api/testConnectionString: + post: + summary: Tests a MongoDB connection string + tags: + - db + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestConnectionStringResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestConnectionStringRequest' + operationId: post-api-testConnectionString + description: Tests a MongoDB connection string and returns an error if one exists. + security: + - Auth query parameter: [] + /api/getFullTwitchChat: + post: + summary: Gets the downloaded Twitch Chat (VODs only) + tags: + - twitch + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetFullTwitchChatResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetFullTwitchChatRequest' + operationId: post-api-getFullTwitchChat + description: Gets the downloaded Twitch Chat (VODs only) + security: + - Auth query parameter: [] + /api/downloadTwitchChatByVODID: + post: + summary: Downloads Twitch Chat for a VOD + tags: + - twitch + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadTwitchChatByVODIDResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadTwitchChatByVODIDRequest' + operationId: post-api-downloadTwitchChatByVODID + description: Downloads Twitch Chat for a VOD + security: + - Auth query parameter: [] + /api/checkConcurrentStream: + post: + summary: Checks status of a concurrent stream + tags: + - player + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CheckConcurrentStreamResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CheckConcurrentStreamRequest' + operationId: post-api-checkConcurrentStream + description: Checks status of a concurrent stream + security: + - Auth query parameter: [] + /api/updateConcurrentStream: + post: + summary: Updates a concurrent stream + tags: + - player + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateConcurrentStreamResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateConcurrentStreamRequest' + operationId: post-api-updateConcurrentStream + description: Updates a concurrent stream + security: + - Auth query parameter: [] + /api/getAllCategories: + post: + summary: Gets all categories + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllCategoriesResponse' + operationId: post-api-getAllCategories + description: Gets all categories + security: + - Auth query parameter: [] + /api/createCategory: + post: + summary: Creates a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCategoryResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCategoryRequest' + operationId: post-api-createCategory + description: Creates a category + security: + - Auth query parameter: [] + /api/deleteCategory: + post: + summary: Deletes a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteCategoryRequest' + operationId: post-api-deleteCategory + description: Deletes a category + security: + - Auth query parameter: [] + /api/updateCategory: + post: + summary: Updates a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCategoryRequest' + operationId: post-api-updateCategory + description: Updates a category + security: + - Auth query parameter: [] + /api/updateCategories: + post: + summary: Updates all categories + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCategoriesRequest' + operationId: post-api-updateCategories + description: Updates all categories + security: + - Auth query parameter: [] components: schemas: SuccessObject: @@ -874,6 +1193,13 @@ components: download: $ref: '#/components/schemas/Download' nullable: true + GenerateArgsResponse: + type: object + properties: + args: + type: array + items: + type: string GetDownloadRequest: type: object properties: @@ -887,6 +1213,15 @@ components: download: $ref: '#/components/schemas/Download' nullable: true + GetAllDownloadsRequest: + type: object + properties: + uids: + type: array + items: + type: string + description: Filters downloads with the array + nullable: true GetAllDownloadsResponse: type: object properties: @@ -1159,8 +1494,6 @@ components: type: $ref: '#/components/schemas/FileType' DownloadFileRequest: - required: - - uid type: object properties: uid: @@ -1169,9 +1502,8 @@ components: type: string sub_id: type: string - is_playlist: - type: boolean - description: Only used for subscriptions + playlist_id: + type: string DownloadArchiveRequest: required: - sub @@ -1203,6 +1535,264 @@ components: properties: tag: type: string + DBInfoResponse: + required: + - db_info + type: object + properties: + using_local_db: + type: boolean + stats_by_table: + type: object + properties: + files: + $ref: '#/components/schemas/TableInfo' + playlists: + $ref: '#/components/schemas/TableInfo' + categories: + $ref: '#/components/schemas/TableInfo' + subscriptions: + $ref: '#/components/schemas/TableInfo' + users: + $ref: '#/components/schemas/TableInfo' + roles: + $ref: '#/components/schemas/TableInfo' + download_queue: + $ref: '#/components/schemas/TableInfo' + TransferDBResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + TransferDBRequest: + required: + - local_to_remote + type: object + properties: + local_to_remote: + description: True if transfering DB from Local to MongoDB, false if transferring DB from MongoDB to Local + type: boolean + TestConnectionStringResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + TestConnectionStringRequest: + required: + - connection_string + type: object + properties: + connection_string: + description: MongoDB connection string + type: string + GetFullTwitchChatResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + GetFullTwitchChatRequest: + required: + - id + - type + type: object + properties: + id: + description: File ID + type: string + type: + $ref: '#/components/schemas/FileType' + uuid: + description: User UID + type: string + sub: + description: Subscription + $ref: '#/components/schemas/Subscription' + DownloadTwitchChatByVODIDResponse: + required: + - chat + type: object + properties: + chat: + type: array + items: + $ref: '#/components/schemas/TwitchChatMessage' + DownloadTwitchChatByVODIDRequest: + required: + - id + - type + - vodId + type: object + properties: + id: + description: File ID + type: string + vodId: + description: ID of the VOD + type: string + type: + $ref: '#/components/schemas/FileType' + uuid: + description: User UID + type: string + sub: + description: Subscription + $ref: '#/components/schemas/Subscription' + CheckConcurrentStreamResponse: + required: + - stream + type: object + properties: + stream: + $ref: '#/components/schemas/ConcurrentStream' + CheckConcurrentStreamRequest: + required: + - uid + type: object + properties: + uid: + description: UID of the concurrent stream + type: string + UpdateConcurrentStreamResponse: + required: + - stream + type: object + properties: + stream: + $ref: '#/components/schemas/ConcurrentStream' + UpdateConcurrentStreamRequest: + allOf: + - $ref: '#/components/schemas/ConcurrentStream' + - type: object + properties: + uid: + type: string + description: Concurrent stream UID + required: + - uid + GetLogsResponse: + type: object + properties: + logs: + type: string + description: Number of lines to retrieve from the bottom + success: + type: boolean + GetLogsRequest: + required: + - connection_string + type: object + properties: + lines: + type: number + GetFileFormatsRequest: + type: object + properties: + url: + type: string + GetFileFormatsResponse: + required: + - result + - success + type: object + properties: + success: + type: boolean + result: + allOf: + - $ref: '#/components/schemas/file' + - type: object + properties: + formats: + type: array + items: + type: object + IncrementViewCountRequest: + required: + - file_uid + type: object + properties: + file_uid: + type: string + sub_id: + type: string + uuid: + type: string + description: User UID + AddFileToPlaylistRequest: + required: + - playlist_id + - file_uid + type: object + properties: + file_uid: + type: string + playlist_id: + type: string + GetAllCategoriesResponse: + required: + - categories + type: object + properties: + categories: + type: array + items: + $ref: '#/components/schemas/Category' + CreateCategoryResponse: + type: object + properties: + new_category: + $ref: '#/components/schemas/Category' + success: + type: boolean + CreateCategoryRequest: + required: + - name + type: object + properties: + name: + type: string + DeleteCategoryRequest: + required: + - category_uid + type: object + properties: + category_uid: + type: string + UpdateCategoryRequest: + required: + - category + type: object + properties: + category: + $ref: '#/components/schemas/Category' + UpdateCategoriesRequest: + required: + - categories + type: object + properties: + categories: + type: array + items: + $ref: '#/components/schemas/Category' + VersionInfoResponse: + required: + - version_info + type: object + properties: + version_info: + $ref: '#/components/schemas/Version' inline_response_200_15: required: - is_set @@ -1495,6 +2085,83 @@ components: enum: - 'yes' - 'no' + TableInfo: + type: object + properties: + records_count: + type: number + TwitchChatMessage: + type: object + properties: + created_at: + type: string + content_offset_seconds: + type: number + commenter: + type: object + properties: + name: + type: string + _id: + type: string + created_at: + type: string + message: + type: object + properties: + body: + type: string + user_color: + type: string + ConcurrentStream: + type: object + properties: + playback_timestamp: + type: number + unix_timestamp: + type: number + playing: + type: boolean + Category: + type: object + properties: + name: + type: string + uid: + type: string + rules: + type: array + items: + $ref: '#/components/schemas/CategoryRule' + custom_output: + type: string + description: Overrides file output for downloaded files in category + CategoryRule: + type: object + properties: + preceding_operator: + type: string + enum: + - 'or' + - 'and' + comparator: + type: string + enum: + - 'includes' + - 'not_includes' + - 'equals' + - 'not_equals' + Version: + type: object + properties: + type: + type: string + tag: + type: string + commit: + type: string + date: + type: string BaseChangePermissionsRequest: required: - permission diff --git a/backend/app.js b/backend/app.js index 6b2ca95..b12d502 100644 --- a/backend/app.js +++ b/backend/app.js @@ -950,7 +950,7 @@ app.post('/api/restartServer', optionalJwt, (req, res) => { res.send({success: true}); }); -app.post('/api/getDBInfo', optionalJwt, async (req, res) => { +app.get('/api/getDBInfo', optionalJwt, async (req, res) => { const db_info = await db_api.getDBStats(); res.send({db_info: db_info}); }); diff --git a/package-lock.json b/package-lock.json index 998567e..10f4d52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13767,6 +13767,13 @@ "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", "dev": true }, + "uglify-js": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "dev": true, + "optional": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/src/api-types/index.ts b/src/api-types/index.ts index 83c73a8..c08044a 100644 --- a/src/api-types/index.ts +++ b/src/api-types/index.ts @@ -2,17 +2,27 @@ /* tslint:disable */ /* eslint-disable */ +export type { AddFileToPlaylistRequest } from './models/AddFileToPlaylistRequest'; export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; export type { body_19 } from './models/body_19'; export type { body_20 } from './models/body_20'; +export type { Category } from './models/Category'; +export { CategoryRule } from './models/CategoryRule'; export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermissionsRequest'; export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest'; +export type { CheckConcurrentStreamRequest } from './models/CheckConcurrentStreamRequest'; +export type { CheckConcurrentStreamResponse } from './models/CheckConcurrentStreamResponse'; +export type { ConcurrentStream } from './models/ConcurrentStream'; export type { Config } from './models/Config'; export type { ConfigResponse } from './models/ConfigResponse'; +export type { CreateCategoryRequest } from './models/CreateCategoryRequest'; +export type { CreateCategoryResponse } from './models/CreateCategoryResponse'; export type { CreatePlaylistRequest } from './models/CreatePlaylistRequest'; export type { CreatePlaylistResponse } from './models/CreatePlaylistResponse'; export type { CropFileSettings } from './models/CropFileSettings'; export type { DatabaseFile } from './models/DatabaseFile'; +export type { DBInfoResponse } from './models/DBInfoResponse'; +export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest'; export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; export type { DeleteSubscriptionFileRequest } from './models/DeleteSubscriptionFileRequest'; @@ -22,17 +32,28 @@ export type { DownloadArchiveRequest } from './models/DownloadArchiveRequest'; export type { DownloadFileRequest } from './models/DownloadFileRequest'; export type { DownloadRequest } from './models/DownloadRequest'; export type { DownloadResponse } from './models/DownloadResponse'; +export type { DownloadTwitchChatByVODIDRequest } from './models/DownloadTwitchChatByVODIDRequest'; +export type { DownloadTwitchChatByVODIDResponse } from './models/DownloadTwitchChatByVODIDResponse'; export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; export type { File } from './models/File'; export { FileType } from './models/FileType'; +export type { GenerateArgsResponse } from './models/GenerateArgsResponse'; export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse'; +export type { GetAllCategoriesResponse } from './models/GetAllCategoriesResponse'; +export type { GetAllDownloadsRequest } from './models/GetAllDownloadsRequest'; export type { GetAllDownloadsResponse } from './models/GetAllDownloadsResponse'; export type { GetAllFilesResponse } from './models/GetAllFilesResponse'; export type { GetAllSubscriptionsResponse } from './models/GetAllSubscriptionsResponse'; export type { GetDownloadRequest } from './models/GetDownloadRequest'; export type { GetDownloadResponse } from './models/GetDownloadResponse'; +export type { GetFileFormatsRequest } from './models/GetFileFormatsRequest'; +export type { GetFileFormatsResponse } from './models/GetFileFormatsResponse'; export type { GetFileRequest } from './models/GetFileRequest'; export type { GetFileResponse } from './models/GetFileResponse'; +export type { GetFullTwitchChatRequest } from './models/GetFullTwitchChatRequest'; +export type { GetFullTwitchChatResponse } from './models/GetFullTwitchChatResponse'; +export type { GetLogsRequest } from './models/GetLogsRequest'; +export type { GetLogsResponse } from './models/GetLogsResponse'; export type { GetMp3sResponse } from './models/GetMp3sResponse'; export type { GetMp4sResponse } from './models/GetMp4sResponse'; export type { GetPlaylistRequest } from './models/GetPlaylistRequest'; @@ -43,6 +64,7 @@ export type { GetRolesResponse } from './models/GetRolesResponse'; export type { GetSubscriptionRequest } from './models/GetSubscriptionRequest'; export type { GetSubscriptionResponse } from './models/GetSubscriptionResponse'; export type { GetUsersResponse } from './models/GetUsersResponse'; +export type { IncrementViewCountRequest } from './models/IncrementViewCountRequest'; export type { inline_response_200_15 } from './models/inline_response_200_15'; export type { LoginRequest } from './models/LoginRequest'; export type { LoginResponse } from './models/LoginResponse'; @@ -56,12 +78,24 @@ export type { SubscribeResponse } from './models/SubscribeResponse'; export type { Subscription } from './models/Subscription'; export type { SubscriptionRequestData } from './models/SubscriptionRequestData'; export type { SuccessObject } from './models/SuccessObject'; +export type { TableInfo } from './models/TableInfo'; +export type { TestConnectionStringRequest } from './models/TestConnectionStringRequest'; +export type { TestConnectionStringResponse } from './models/TestConnectionStringResponse'; +export type { TransferDBRequest } from './models/TransferDBRequest'; +export type { TransferDBResponse } from './models/TransferDBResponse'; +export type { TwitchChatMessage } from './models/TwitchChatMessage'; export type { UnsubscribeRequest } from './models/UnsubscribeRequest'; export type { UnsubscribeResponse } from './models/UnsubscribeResponse'; +export type { UpdateCategoriesRequest } from './models/UpdateCategoriesRequest'; +export type { UpdateCategoryRequest } from './models/UpdateCategoryRequest'; +export type { UpdateConcurrentStreamRequest } from './models/UpdateConcurrentStreamRequest'; +export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentStreamResponse'; export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdateServerRequest } from './models/UpdateServerRequest'; export type { UpdateUserRequest } from './models/UpdateUserRequest'; export type { User } from './models/User'; export { UserPermission } from './models/UserPermission'; +export type { Version } from './models/Version'; +export type { VersionInfoResponse } from './models/VersionInfoResponse'; export { YesNo } from './models/YesNo'; diff --git a/src/api-types/models/AddFileToPlaylistRequest.ts b/src/api-types/models/AddFileToPlaylistRequest.ts new file mode 100644 index 0000000..b701175 --- /dev/null +++ b/src/api-types/models/AddFileToPlaylistRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface AddFileToPlaylistRequest { + file_uid: string; + playlist_id: string; +} \ No newline at end of file diff --git a/src/api-types/models/Category.ts b/src/api-types/models/Category.ts new file mode 100644 index 0000000..055a3d7 --- /dev/null +++ b/src/api-types/models/Category.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { CategoryRule } from './CategoryRule'; + +export interface Category { + name?: string; + uid?: string; + rules?: Array; + /** + * Overrides file output for downloaded files in category + */ + custom_output?: string; +} \ No newline at end of file diff --git a/src/api-types/models/CategoryRule.ts b/src/api-types/models/CategoryRule.ts new file mode 100644 index 0000000..9a8acb9 --- /dev/null +++ b/src/api-types/models/CategoryRule.ts @@ -0,0 +1,26 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CategoryRule { + preceding_operator?: CategoryRule.preceding_operator; + comparator?: CategoryRule.comparator; +} + +export namespace CategoryRule { + + export enum preceding_operator { + OR = 'or', + AND = 'and', + } + + export enum comparator { + INCLUDES = 'includes', + NOT_INCLUDES = 'not_includes', + EQUALS = 'equals', + NOT_EQUALS = 'not_equals', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamRequest.ts b/src/api-types/models/CheckConcurrentStreamRequest.ts new file mode 100644 index 0000000..416ab37 --- /dev/null +++ b/src/api-types/models/CheckConcurrentStreamRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CheckConcurrentStreamRequest { + /** + * UID of the concurrent stream + */ + uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamResponse.ts b/src/api-types/models/CheckConcurrentStreamResponse.ts new file mode 100644 index 0000000..bd4c70d --- /dev/null +++ b/src/api-types/models/CheckConcurrentStreamResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface CheckConcurrentStreamResponse { + stream: ConcurrentStream; +} \ No newline at end of file diff --git a/src/api-types/models/ConcurrentStream.ts b/src/api-types/models/ConcurrentStream.ts new file mode 100644 index 0000000..19eab7d --- /dev/null +++ b/src/api-types/models/ConcurrentStream.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface ConcurrentStream { + playback_timestamp?: number; + unix_timestamp?: number; + playing?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryRequest.ts b/src/api-types/models/CreateCategoryRequest.ts new file mode 100644 index 0000000..0871041 --- /dev/null +++ b/src/api-types/models/CreateCategoryRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CreateCategoryRequest { + name: string; +} \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryResponse.ts b/src/api-types/models/CreateCategoryResponse.ts new file mode 100644 index 0000000..16efded --- /dev/null +++ b/src/api-types/models/CreateCategoryResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface CreateCategoryResponse { + new_category?: Category; + success?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/DBInfoResponse.ts b/src/api-types/models/DBInfoResponse.ts new file mode 100644 index 0000000..543f12b --- /dev/null +++ b/src/api-types/models/DBInfoResponse.ts @@ -0,0 +1,18 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { TableInfo } from './TableInfo'; + +export interface DBInfoResponse { + using_local_db?: boolean; + stats_by_table?: { +files?: TableInfo, +playlists?: TableInfo, +categories?: TableInfo, +subscriptions?: TableInfo, +users?: TableInfo, +roles?: TableInfo, +download_queue?: TableInfo, +}; +} \ No newline at end of file diff --git a/src/api-types/models/DeleteCategoryRequest.ts b/src/api-types/models/DeleteCategoryRequest.ts new file mode 100644 index 0000000..37db8d5 --- /dev/null +++ b/src/api-types/models/DeleteCategoryRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteCategoryRequest { + category_uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index 0bee9d2..0986e59 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -4,11 +4,8 @@ export interface DownloadFileRequest { - uid: string; + uid?: string; uuid?: string; sub_id?: string; - /** - * Only used for subscriptions - */ - is_playlist?: boolean; + playlist_id?: string; } \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts new file mode 100644 index 0000000..01ff2c5 --- /dev/null +++ b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts @@ -0,0 +1,26 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Subscription } from './Subscription'; + +export interface DownloadTwitchChatByVODIDRequest { + /** + * File ID + */ + id: string; + /** + * ID of the VOD + */ + vodId: string; + type: FileType; + /** + * User UID + */ + uuid?: string; + /** + * Subscription + */ + sub?: Subscription; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts new file mode 100644 index 0000000..9771759 --- /dev/null +++ b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { TwitchChatMessage } from './TwitchChatMessage'; + +export interface DownloadTwitchChatByVODIDResponse { + chat: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GenerateArgsResponse.ts b/src/api-types/models/GenerateArgsResponse.ts new file mode 100644 index 0000000..953a57c --- /dev/null +++ b/src/api-types/models/GenerateArgsResponse.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GenerateArgsResponse { + args?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllCategoriesResponse.ts b/src/api-types/models/GetAllCategoriesResponse.ts new file mode 100644 index 0000000..e34671d --- /dev/null +++ b/src/api-types/models/GetAllCategoriesResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface GetAllCategoriesResponse { + categories: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsRequest.ts b/src/api-types/models/GetAllDownloadsRequest.ts new file mode 100644 index 0000000..5d26f57 --- /dev/null +++ b/src/api-types/models/GetAllDownloadsRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetAllDownloadsRequest { + /** + * Filters downloads with the array + */ + uids?: Array | null; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsRequest.ts b/src/api-types/models/GetFileFormatsRequest.ts new file mode 100644 index 0000000..1ea3502 --- /dev/null +++ b/src/api-types/models/GetFileFormatsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetFileFormatsRequest { + url?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsResponse.ts b/src/api-types/models/GetFileFormatsResponse.ts new file mode 100644 index 0000000..dc0f859 --- /dev/null +++ b/src/api-types/models/GetFileFormatsResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { File } from './File'; + +export interface GetFileFormatsResponse { + success: boolean; + result: { +formats?: Array, +}; +} \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatRequest.ts b/src/api-types/models/GetFullTwitchChatRequest.ts new file mode 100644 index 0000000..6d6a3a6 --- /dev/null +++ b/src/api-types/models/GetFullTwitchChatRequest.ts @@ -0,0 +1,22 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Subscription } from './Subscription'; + +export interface GetFullTwitchChatRequest { + /** + * File ID + */ + id: string; + type: FileType; + /** + * User UID + */ + uuid?: string; + /** + * Subscription + */ + sub?: Subscription; +} \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatResponse.ts b/src/api-types/models/GetFullTwitchChatResponse.ts new file mode 100644 index 0000000..3bd27f7 --- /dev/null +++ b/src/api-types/models/GetFullTwitchChatResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetFullTwitchChatResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetLogsRequest.ts b/src/api-types/models/GetLogsRequest.ts new file mode 100644 index 0000000..170ce8b --- /dev/null +++ b/src/api-types/models/GetLogsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetLogsRequest { + lines?: number; +} \ No newline at end of file diff --git a/src/api-types/models/GetLogsResponse.ts b/src/api-types/models/GetLogsResponse.ts new file mode 100644 index 0000000..2acf83a --- /dev/null +++ b/src/api-types/models/GetLogsResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetLogsResponse { + /** + * Number of lines to retrieve from the bottom + */ + logs?: string; + success?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/IncrementViewCountRequest.ts b/src/api-types/models/IncrementViewCountRequest.ts new file mode 100644 index 0000000..1294d10 --- /dev/null +++ b/src/api-types/models/IncrementViewCountRequest.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface IncrementViewCountRequest { + file_uid: string; + sub_id?: string; + /** + * User UID + */ + uuid?: string; +} \ No newline at end of file diff --git a/src/api-types/models/TableInfo.ts b/src/api-types/models/TableInfo.ts new file mode 100644 index 0000000..244c1a9 --- /dev/null +++ b/src/api-types/models/TableInfo.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TableInfo { + records_count?: number; +} \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringRequest.ts b/src/api-types/models/TestConnectionStringRequest.ts new file mode 100644 index 0000000..156c01f --- /dev/null +++ b/src/api-types/models/TestConnectionStringRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TestConnectionStringRequest { + /** + * MongoDB connection string + */ + connection_string: string; +} \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringResponse.ts b/src/api-types/models/TestConnectionStringResponse.ts new file mode 100644 index 0000000..0cd0573 --- /dev/null +++ b/src/api-types/models/TestConnectionStringResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TestConnectionStringResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/TransferDBRequest.ts b/src/api-types/models/TransferDBRequest.ts new file mode 100644 index 0000000..fd14f56 --- /dev/null +++ b/src/api-types/models/TransferDBRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TransferDBRequest { + /** + * True if transfering DB from Local to MongoDB, false if transferring DB from MongoDB to Local + */ + local_to_remote: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/TransferDBResponse.ts b/src/api-types/models/TransferDBResponse.ts new file mode 100644 index 0000000..d8cc1c5 --- /dev/null +++ b/src/api-types/models/TransferDBResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TransferDBResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/TwitchChatMessage.ts b/src/api-types/models/TwitchChatMessage.ts new file mode 100644 index 0000000..76da85f --- /dev/null +++ b/src/api-types/models/TwitchChatMessage.ts @@ -0,0 +1,18 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TwitchChatMessage { + created_at?: string; + content_offset_seconds?: number; + commenter?: { +name?: string, +_id?: string, +created_at?: string, +}; + message?: { +body?: string, +user_color?: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoriesRequest.ts b/src/api-types/models/UpdateCategoriesRequest.ts new file mode 100644 index 0000000..cbb3436 --- /dev/null +++ b/src/api-types/models/UpdateCategoriesRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface UpdateCategoriesRequest { + categories: Array; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoryRequest.ts b/src/api-types/models/UpdateCategoryRequest.ts new file mode 100644 index 0000000..273bde1 --- /dev/null +++ b/src/api-types/models/UpdateCategoryRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface UpdateCategoryRequest { + category: Category; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamRequest.ts b/src/api-types/models/UpdateConcurrentStreamRequest.ts new file mode 100644 index 0000000..2a8f9e4 --- /dev/null +++ b/src/api-types/models/UpdateConcurrentStreamRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface UpdateConcurrentStreamRequest extends ConcurrentStream { + /** + * Concurrent stream UID + */ + uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamResponse.ts b/src/api-types/models/UpdateConcurrentStreamResponse.ts new file mode 100644 index 0000000..b1d32e8 --- /dev/null +++ b/src/api-types/models/UpdateConcurrentStreamResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface UpdateConcurrentStreamResponse { + stream: ConcurrentStream; +} \ No newline at end of file diff --git a/src/api-types/models/Version.ts b/src/api-types/models/Version.ts new file mode 100644 index 0000000..5049571 --- /dev/null +++ b/src/api-types/models/Version.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Version { + type?: string; + tag?: string; + commit?: string; + date?: string; +} \ No newline at end of file diff --git a/src/api-types/models/VersionInfoResponse.ts b/src/api-types/models/VersionInfoResponse.ts new file mode 100644 index 0000000..369927b --- /dev/null +++ b/src/api-types/models/VersionInfoResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Version } from './Version'; + +export interface VersionInfoResponse { + version_info: Version; +} \ No newline at end of file diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 08906bd..69e5eb7 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -597,7 +597,7 @@ export class MainComponent implements OnInit { } } - this.postsService.generateArgs(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), + this.postsService.generateArgs(this.url, type as FileType, (this.selectedQuality === '' ? null : this.selectedQuality), customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { const simulated_args = res['args']; if (simulated_args) { diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 56cc403..df2f069 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -61,6 +61,35 @@ import { UpdateUserRequest, UserPermission, YesNo, + GenerateArgsResponse, + GetPlaylistsRequest, + UpdateCategoryRequest, + UpdateCategoriesRequest, + DeleteCategoryRequest, + CreateCategoryRequest, + CreateCategoryResponse, + GetAllCategoriesResponse, + AddFileToPlaylistRequest, + IncrementViewCountRequest, + GetLogsRequest, + GetLogsResponse, + UpdateConcurrentStreamResponse, + UpdateConcurrentStreamRequest, + CheckConcurrentStreamRequest, + CheckConcurrentStreamResponse, + DownloadTwitchChatByVODIDRequest, + DownloadTwitchChatByVODIDResponse, + GetFullTwitchChatRequest, + GetFullTwitchChatResponse, + GetAllDownloadsRequest, + TestConnectionStringRequest, + TestConnectionStringResponse, + TransferDBRequest, + TransferDBResponse, + VersionInfoResponse, + DBInfoResponse, + GetFileFormatsRequest, + GetFileFormatsResponse, } from '../api-types'; import { isoLangs } from './settings/locales_list'; import { Title } from '@angular/platform-browser'; @@ -243,37 +272,40 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'downloadFile', body, this.httpOptions); } - generateArgs(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { - return this.http.post(this.path + 'generateArgs', {url: url, - selectedHeight: selectedQuality, - customQualityConfiguration: customQualityConfiguration, - customArgs: customArgs, - additionalArgs: additionalArgs, - customOutput: customOutput, - youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword, - type: type, - cropFileSettings: cropFileSettings}, this.httpOptions); + generateArgs(url: string, type: FileType, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { + const body: DownloadRequest = {url: url, + selectedHeight: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + additionalArgs: additionalArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + type: type, + cropFileSettings: cropFileSettings} + return this.http.post(this.path + 'generateArgs', body, this.httpOptions); } getDBInfo() { - return this.http.post(this.path + 'getDBInfo', {}, this.httpOptions); + return this.http.get(this.path + 'getDBInfo', this.httpOptions); } transferDB(local_to_remote) { - return this.http.post(this.path + 'transferDB', {local_to_remote: local_to_remote}, this.httpOptions); + const body: TransferDBRequest = {local_to_remote: local_to_remote}; + return this.http.post(this.path + 'transferDB', body, this.httpOptions); } - testConnectionString(connection_string) { - return this.http.post(this.path + 'testConnectionString', {connection_string: connection_string}, this.httpOptions); + testConnectionString(connection_string: string) { + const body: TestConnectionStringRequest = {connection_string: connection_string}; + return this.http.post(this.path + 'testConnectionString', body, this.httpOptions); } killAllDownloads() { - return this.http.post(this.path + 'killAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'killAllDownloads', {}, this.httpOptions); } restartServer() { - return this.http.post(this.path + 'restartServer', {}, this.httpOptions); + return this.http.post(this.path + 'restartServer', {}, this.httpOptions); } loadNavItems() { @@ -319,54 +351,51 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); } - downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null, is_playlist: boolean = null) { + downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null) { const body: DownloadFileRequest = { uid: uid, uuid: uuid, - sub_id: sub_id, - is_playlist: is_playlist + sub_id: sub_id }; return this.http.post(this.path + 'downloadFile', body, {responseType: 'blob', params: this.httpOptions.params}); } getFullTwitchChat(id, type, uuid = null, sub = null) { - return this.http.post(this.path + 'getFullTwitchChat', {id: id, type: type, uuid: uuid, sub: sub}, this.httpOptions); + const body: GetFullTwitchChatRequest = {id: id, type: type, uuid: uuid, sub: sub}; + return this.http.post(this.path + 'getFullTwitchChat', body, this.httpOptions); } downloadTwitchChat(id, type, vodId, uuid = null, sub = null) { - return this.http.post(this.path + 'downloadTwitchChatByVODID', {id: id, type: type, vodId: vodId, uuid: uuid, sub: sub}, this.httpOptions); + const body: DownloadTwitchChatByVODIDRequest = {id: id, type: type, vodId: vodId, uuid: uuid, sub: sub}; + return this.http.post(this.path + 'downloadTwitchChatByVODID', body, this.httpOptions); } downloadPlaylistFromServer(playlist_id, uuid = null) { - return this.http.post(this.path + 'downloadFileFromServer', { - uuid: uuid, - playlist_id: playlist_id - }, - {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadFileRequest = {uuid: uuid, playlist_id: playlist_id}; + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); } downloadSubFromServer(sub_id, uuid = null) { - return this.http.post(this.path + 'downloadFileFromServer', { - uuid: uuid, - sub_id: sub_id - }, - {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadFileRequest = {uuid: uuid, sub_id: sub_id}; + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); } checkConcurrentStream(uid) { - return this.http.post(this.path + 'checkConcurrentStream', {uid: uid}, this.httpOptions); + const body: CheckConcurrentStreamRequest = {uid: uid}; + return this.http.post(this.path + 'checkConcurrentStream', body, this.httpOptions); } updateConcurrentStream(uid, playback_timestamp, unix_timestamp, playing) { - return this.http.post(this.path + 'updateConcurrentStream', {uid: uid, - playback_timestamp: playback_timestamp, - unix_timestamp: unix_timestamp, - playing: playing}, this.httpOptions); + const body: UpdateConcurrentStreamRequest = {uid: uid, + playback_timestamp: playback_timestamp, + unix_timestamp: unix_timestamp, + playing: playing}; + return this.http.post(this.path + 'updateConcurrentStream', body, this.httpOptions); } uploadCookiesFile(fileFormData) { - return this.http.post(this.path + 'uploadCookies', fileFormData, this.httpOptions); + return this.http.post(this.path + 'uploadCookies', fileFormData, this.httpOptions); } downloadArchive(sub) { @@ -375,15 +404,17 @@ export class PostsService implements CanActivate { } getFileFormats(url) { - return this.http.post(this.path + 'getFileFormats', {url: url}, this.httpOptions); + const body: GetFileFormatsRequest = {url: url}; + return this.http.post(this.path + 'getFileFormats', body, this.httpOptions); } getLogs(lines = 50) { - return this.http.post(this.path + 'logs', {lines: lines}, this.httpOptions); + const body: GetLogsRequest = {lines: lines}; + return this.http.post(this.path + 'logs', body, this.httpOptions); } clearAllLogs() { - return this.http.post(this.path + 'clearAllLogs', {}, this.httpOptions); + return this.http.post(this.path + 'clearAllLogs', {}, this.httpOptions); } generateNewAPIKey() { @@ -415,11 +446,12 @@ export class PostsService implements CanActivate { } incrementViewCount(file_uid, sub_id, uuid) { - return this.http.post(this.path + 'incrementViewCount', {file_uid: file_uid, sub_id: sub_id, uuid: uuid}, this.httpOptions); + const body: IncrementViewCountRequest = {file_uid: file_uid, sub_id: sub_id, uuid: uuid}; + return this.http.post(this.path + 'incrementViewCount', body, this.httpOptions); } getPlaylists() { - return this.http.post(this.path + 'getPlaylists', {}, this.httpOptions); + return this.http.post(this.path + 'getPlaylists', {}, this.httpOptions); } updatePlaylist(playlist: Playlist) { @@ -439,31 +471,34 @@ export class PostsService implements CanActivate { } addFileToPlaylist(playlist_id, file_uid) { - return this.http.post(this.path + 'addFileToPlaylist', {playlist_id: playlist_id, - file_uid: file_uid}, - this.httpOptions); + const body: AddFileToPlaylistRequest = {playlist_id: playlist_id, file_uid: file_uid} + return this.http.post(this.path + 'addFileToPlaylist', body, this.httpOptions); } // categories getAllCategories() { - return this.http.post(this.path + 'getAllCategories', {}, this.httpOptions); + return this.http.post(this.path + 'getAllCategories', {}, this.httpOptions); } createCategory(name) { - return this.http.post(this.path + 'createCategory', {name: name}, this.httpOptions); + const body: CreateCategoryRequest = {name: name}; + return this.http.post(this.path + 'createCategory', body, this.httpOptions); } deleteCategory(category_uid) { - return this.http.post(this.path + 'deleteCategory', {category_uid: category_uid}, this.httpOptions); + const body: DeleteCategoryRequest = {category_uid: category_uid}; + return this.http.post(this.path + 'deleteCategory', body, this.httpOptions); } updateCategory(category) { - return this.http.post(this.path + 'updateCategory', {category: category}, this.httpOptions); + const body: UpdateCategoryRequest = {category: category}; + return this.http.post(this.path + 'updateCategory', body, this.httpOptions); } updateCategories(categories) { - return this.http.post(this.path + 'updateCategories', {categories: categories}, this.httpOptions); + const body: UpdateCategoriesRequest = {categories: categories}; + return this.http.post(this.path + 'updateCategories', body, this.httpOptions); } reloadCategories() { @@ -474,7 +509,7 @@ export class PostsService implements CanActivate { updateSubscription(subscription) { delete subscription['videos']; - return this.http.post(this.path + 'updateSubscription', {subscription: subscription}, this.httpOptions); + return this.http.post(this.path + 'updateSubscription', {subscription: subscription}, this.httpOptions); } unsubscribe(sub: SubscriptionRequestData, deleteMode = false) { @@ -498,7 +533,8 @@ export class PostsService implements CanActivate { } getCurrentDownloads(uids: Array = null) { - return this.http.post(this.path + 'downloads', {uids: uids}, this.httpOptions); + const body: GetAllDownloadsRequest = {uids: uids}; + return this.http.post(this.path + 'downloads', body, this.httpOptions); } getCurrentDownload(download_uid: string) { @@ -507,39 +543,39 @@ export class PostsService implements CanActivate { } pauseDownload(download_uid) { - return this.http.post(this.path + 'pauseDownload', {download_uid: download_uid}, this.httpOptions); + return this.http.post(this.path + 'pauseDownload', {download_uid: download_uid}, this.httpOptions); } pauseAllDownloads() { - return this.http.post(this.path + 'pauseAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'pauseAllDownloads', {}, this.httpOptions); } resumeDownload(download_uid) { - return this.http.post(this.path + 'resumeDownload', {download_uid: download_uid}, this.httpOptions); + return this.http.post(this.path + 'resumeDownload', {download_uid: download_uid}, this.httpOptions); } resumeAllDownloads() { - return this.http.post(this.path + 'resumeAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'resumeAllDownloads', {}, this.httpOptions); } restartDownload(download_uid) { - return this.http.post(this.path + 'restartDownload', {download_uid: download_uid}, this.httpOptions); + return this.http.post(this.path + 'restartDownload', {download_uid: download_uid}, this.httpOptions); } cancelDownload(download_uid) { - return this.http.post(this.path + 'cancelDownload', {download_uid: download_uid}, this.httpOptions); + return this.http.post(this.path + 'cancelDownload', {download_uid: download_uid}, this.httpOptions); } clearDownload(download_uid) { - return this.http.post(this.path + 'clearDownload', {download_uid: download_uid}, this.httpOptions); + return this.http.post(this.path + 'clearDownload', {download_uid: download_uid}, this.httpOptions); } clearFinishedDownloads() { - return this.http.post(this.path + 'clearFinishedDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'clearFinishedDownloads', {}, this.httpOptions); } getVersionInfo() { - return this.http.get(this.path + 'versionInfo', this.httpOptions); + return this.http.get(this.path + 'versionInfo', this.httpOptions); } updateServer(tag: string) { From bff40d97bbce1e59858dfcb7ffb4c9a220bdac79 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 22:27:44 -0600 Subject: [PATCH 054/212] Invalid locales do not prevent languages from being selected anymore Fixed video previews on mouse over when in multi-user mode --- .../components/recent-videos/recent-videos.component.html | 2 +- .../unified-file-card/unified-file-card.component.ts | 5 ++--- src/app/settings/settings.component.html | 4 +++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app/components/recent-videos/recent-videos.component.html b/src/app/components/recent-videos/recent-videos.component.html index 14511d8..5a8b889 100644 --- a/src/app/components/recent-videos/recent-videos.component.html +++ b/src/app/components/recent-videos/recent-videos.component.html @@ -32,7 +32,7 @@
- +
No videos found. diff --git a/src/app/components/unified-file-card/unified-file-card.component.ts b/src/app/components/unified-file-card/unified-file-card.component.ts index 5338cab..9b0e424 100644 --- a/src/app/components/unified-file-card/unified-file-card.component.ts +++ b/src/app/components/unified-file-card/unified-file-card.component.ts @@ -75,7 +75,7 @@ export class UnifiedFileCardComponent implements OnInit { } if (this.file_obj && this.file_obj.thumbnailPath) { - this.thumbnailBlobURL = `${this.baseStreamPath}thumbnail/${encodeURIComponent(this.file_obj.thumbnailPath)}${this.jwtString}`; + this.thumbnailBlobURL = `${this.baseStreamPath}thumbnail/${encodeURIComponent(this.file_obj.thumbnailPath)}?jwt=${this.jwtString}`; /*const mime = getMimeByFilename(this.file_obj.thumbnailPath); const blob = new Blob([new Uint8Array(this.file_obj.thumbnailBlob.data)], {type: mime}); const bloburl = URL.createObjectURL(blob); @@ -134,9 +134,8 @@ export class UnifiedFileCardComponent implements OnInit { } generateStreamURL() { - let baseLocation = 'stream/'; + const baseLocation = 'stream/'; let fullLocation = this.baseStreamPath + baseLocation + `?test=test&uid=${this.file_obj['uid']}`; - if (this.jwtString) { fullLocation += `&jwt=${this.jwtString}`; } diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index 74a57dd..689b596 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -81,7 +81,9 @@ Language - {{all_locales[locale]['nativeName']}} + + {{all_locales[locale]['nativeName']}} + From 609f749d6cb0db5be1a7729c97781dabd23a5bd0 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 22:38:57 -0600 Subject: [PATCH 055/212] Updated API docs to fix errors --- Public API v1.yaml | 69 +++++++++---------- src/api-types/models/DownloadResponse.ts | 2 +- .../DownloadTwitchChatByVODIDRequest.ts | 3 - src/api-types/models/GetDownloadResponse.ts | 2 +- 4 files changed, 36 insertions(+), 40 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 35eaa47..ad43d48 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -3,6 +3,10 @@ info: title: YoutubeDL-Material API Docs - Official version: '1.0' description: "Welcome to the official docs for YoutubeDL-Material.\n\n\nYou can check out all the available endpoints. Remember to authenticate with your API key using the \"apiKey\" query parameter with your requests.\n\n\nTo do so, simply add this to the end of your API call:\n\n\n`?apiKey=API_KEY`\n\n\nReplce API_KEY with the API key in the settings menu. If one doesn't exist, click generate to create one.\n\n### Multi-user mode\n\nWhen using multi-user mode, you will need to supply a JWT token to authenticate requests through that user. This lets the server know which user to run the task for, like downloading a video for a specific user. \n\nTo do this, you must use the `/api/auth/login` endpoint to login using a user's username and password. This will result in an object containing a `token`. Supply this along with your API key like so:\n\n`?apiKey=API_KEY&jwt=JWT_TOKEN`\n\nNotice the `&` between the `API_KEY` and `jwt`." + contact: + name: Isaac Abadi + url: https://github.com/Tzahi12345/YoutubeDL-Material + email: IsaacMGrynsztein@gmail.com servers: - url: 'http://localhost:17442' paths: @@ -825,21 +829,21 @@ paths: - Auth query parameter: [] tags: - multi-user mode - /api/versionInfo: - get: - tags: - - server - summary: Gets server version info - operationId: get-api-versionInfo - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/VersionInfoResponse' - security: - - Auth query parameter: [] + /api/versionInfo: + get: + tags: + - server + summary: Gets server version info + operationId: get-api-versionInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/VersionInfoResponse' + security: + - Auth query parameter: [] /api/getLogs: post: summary: Gets logs from server @@ -877,21 +881,21 @@ paths: description: Clears the log file security: - Auth query parameter: [] - /api/getDBInfo: - get: - tags: - - db - summary: Gets information on the DB - operationId: get-api-getDBInfo - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/DBInfoResponse' - security: - - Auth query parameter: [] + /api/getDBInfo: + get: + tags: + - db + summary: Gets information on the DB + operationId: get-api-getDBInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DBInfoResponse' + security: + - Auth query parameter: [] /api/transferDB: post: summary: Transfers DB between Local and MongoDB @@ -1192,7 +1196,6 @@ components: properties: download: $ref: '#/components/schemas/Download' - nullable: true GenerateArgsResponse: type: object properties: @@ -1212,7 +1215,6 @@ components: properties: download: $ref: '#/components/schemas/Download' - nullable: true GetAllDownloadsRequest: type: object properties: @@ -1617,7 +1619,6 @@ components: description: User UID type: string sub: - description: Subscription $ref: '#/components/schemas/Subscription' DownloadTwitchChatByVODIDResponse: required: @@ -1647,7 +1648,6 @@ components: description: User UID type: string sub: - description: Subscription $ref: '#/components/schemas/Subscription' CheckConcurrentStreamResponse: required: @@ -1922,7 +1922,6 @@ components: - url - type - title - - type - options - uid - step_index diff --git a/src/api-types/models/DownloadResponse.ts b/src/api-types/models/DownloadResponse.ts index 5450cfd..3452abc 100644 --- a/src/api-types/models/DownloadResponse.ts +++ b/src/api-types/models/DownloadResponse.ts @@ -5,5 +5,5 @@ import { Download } from './Download'; export interface DownloadResponse { - download?: Download | null; + download?: Download; } \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts index 01ff2c5..8b86a4e 100644 --- a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts +++ b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts @@ -19,8 +19,5 @@ export interface DownloadTwitchChatByVODIDRequest { * User UID */ uuid?: string; - /** - * Subscription - */ sub?: Subscription; } \ No newline at end of file diff --git a/src/api-types/models/GetDownloadResponse.ts b/src/api-types/models/GetDownloadResponse.ts index 029e21f..69579b5 100644 --- a/src/api-types/models/GetDownloadResponse.ts +++ b/src/api-types/models/GetDownloadResponse.ts @@ -5,5 +5,5 @@ import { Download } from './Download'; export interface GetDownloadResponse { - download?: Download | null; + download?: Download; } \ No newline at end of file From b9dabcf2f418d5fbfe8d1f68bdf35e1077376896 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 30 Sep 2021 22:48:17 -0600 Subject: [PATCH 056/212] Updated dev default.json --- src/assets/default.json | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/assets/default.json b/src/assets/default.json index a0640fd..c479d6e 100644 --- a/src/assets/default.json +++ b/src/assets/default.json @@ -11,7 +11,10 @@ "custom_args": "", "safe_download_override": false, "include_thumbnail": false, - "include_metadata": true + "include_metadata": true, + "default_file_output": "", + "max_concurrent_downloads": 5, + "download_rate_limit": "" }, "Extra": { "title_top": "YoutubeDL-Material", @@ -21,7 +24,8 @@ "allow_multi_download_mode": true, "settings_pin_required": false, "enable_downloads_manager": true, - "allow_playlist_categorization": true + "allow_playlist_categorization": true, + "allow_autoplay": true }, "API": { "use_API_key": false, @@ -30,7 +34,9 @@ "youtube_API_key": "", "use_twitch_API": false, "twitch_API_key": "", - "twitch_auto_download_chat": true + "twitch_auto_download_chat": true, + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", @@ -40,7 +46,8 @@ "allow_subscriptions": true, "subscriptions_base_path": "subscriptions/", "subscriptions_check_interval": "86400", - "subscriptions_use_youtubedl_archive": true + "subscriptions_use_youtubedl_archive": true, + "redownload_fresh_uploads": false }, "Users": { "base_path": "users/", @@ -69,4 +76,4 @@ "default_downloader": "youtube-dl" } } -} +} \ No newline at end of file From be94bc81c8bfa951cb8646c5129b7159f8267e49 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 1 Oct 2021 01:38:23 -0600 Subject: [PATCH 057/212] Removed prepare statement in package.json --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 995c239..9bfb0ca 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "lint": "ng lint", "e2e": "ng e2e", "electron": "ng build --base-href ./ && electron .", - "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true", - "prepare": "npm run generate" + "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true" }, "engines": { "node": "12.3.1", From 829b8af942b97e2b20e0ece79a015aa17de96b0a Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 1 Oct 2021 01:54:44 -0600 Subject: [PATCH 058/212] Fixed mangled merge where getSubscriptions became getAllSubscriptions --- src/app/posts.services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index df2f069..9be0841 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -529,7 +529,7 @@ export class PostsService implements CanActivate { } getAllSubscriptions() { - return this.http.post(this.path + 'getAllSubscriptions', {}, this.httpOptions); + return this.http.post(this.path + 'getSubscriptions', {}, this.httpOptions); } getCurrentDownloads(uids: Array = null) { From 86fc02f9e472c162bbb7ef4227dd8bb26613b339 Mon Sep 17 00:00:00 2001 From: min Date: Wed, 6 Oct 2021 01:28:02 +0000 Subject: [PATCH 059/212] Translated using Weblate (Korean) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ko/ --- src/assets/i18n/messages.ko.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf index aaac8b5..eecfa9f 100644 --- a/src/assets/i18n/messages.ko.xlf +++ b/src/assets/i18n/messages.ko.xlf @@ -1304,7 +1304,7 @@ Extra - 추가 + 기타 src/app/settings/settings.component.html 185 From b922a904d04203de62f86b84d55077786f11be7b Mon Sep 17 00:00:00 2001 From: Minhyuk Lee Date: Thu, 7 Oct 2021 16:02:04 +0900 Subject: [PATCH 060/212] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a081a6e..94d09f1 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,12 @@ To get started, go to the settings menu and enable the public API from the *Extr Once you have enabled the API and have the key, you can start sending requests by adding the query param `apiKey=API_KEY`. Replace `API_KEY` with your actual API key, and you should be good to go! Nearly all of the backend should be at your disposal. View available endpoints in the link above. +## iOS Shortcut + +If you are using iOS, try YoutubeDL-Material more conveniently with a Shortcut. With this Shorcut, you can easily start downloading YouTube video with just two taps! (Or maybe three?) + +You can download Shortcut [here.](https://routinehub.co/shortcut/10283/) + ## Contributing If you're interested in contributing, first: awesome! Second, please refer to the guidelines/setup information located in the [Contributing](https://github.com/Tzahi12345/YoutubeDL-Material/wiki/Contributing) wiki page, it's a helpful way to get you on your feet and coding away. From cae88433b60aaef481259b809f71dd7c6421a226 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 12 Oct 2021 07:25:20 +0200 Subject: [PATCH 061/212] Git Bug Report template; better user guidance --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 79e05a2..94f04ca 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,5 +27,12 @@ If applicable, add screenshots to help explain your problem. - YoutubeDL-Material version - Docker tag: (optional) +Ideally you'd copy the info as presented on the "About" dialogue +in YoutubeDL-Material. +(for that, click on the three dots on the top right and then +check "installation details". On later versions of YoutubeDL- +Material you will find pretty much all the crucial information +here that we need in most cases!) + **Additional context** Add any other context about the problem here. For example, a YouTube link. From ef2309d2f34c29cc48fde9d4dc3ad3d9000dda53 Mon Sep 17 00:00:00 2001 From: Bitpaint Date: Mon, 1 Nov 2021 02:32:37 +0000 Subject: [PATCH 062/212] Translated using Weblate (French) Currently translated at 89.7% (271 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/fr/ --- src/assets/i18n/messages.fr.xlf | 40 +++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.fr.xlf b/src/assets/i18n/messages.fr.xlf index 13c79f1..d670399 100644 --- a/src/assets/i18n/messages.fr.xlf +++ b/src/assets/i18n/messages.fr.xlf @@ -1,4 +1,4 @@ - + @@ -1262,7 +1262,7 @@ About YoutubeDL-Material - Sobre YoutubeDL-Material + A propos de YoutubeDL-Material app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2841,6 +2841,42 @@ 469 + + Database information could not be retrieved. Check the server logs for more information. + Les informations de la base de données n'ont pas pu être récupérées. Consultez les journaux du serveur pour plus d'informations. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Restart server + Redémarrer le serveur + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Installation type: + Type d'installation : + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Build date: + Date de construction: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + From 4e2b7c4a560a9064ed59bb2a3436cf921cf5d9d8 Mon Sep 17 00:00:00 2001 From: Maxime Leroy Date: Mon, 15 Nov 2021 06:21:13 +0000 Subject: [PATCH 063/212] Translated using Weblate (French) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/fr/ --- src/assets/i18n/messages.fr.xlf | 292 +++++++++++++++++++++++++++++++- 1 file changed, 290 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.fr.xlf b/src/assets/i18n/messages.fr.xlf index d670399..8966147 100644 --- a/src/assets/i18n/messages.fr.xlf +++ b/src/assets/i18n/messages.fr.xlf @@ -2835,7 +2835,7 @@ Download for has been queued! - Le téléchargement à était ajouté à la queue! + Le téléchargement à était ajouté à la queue ! src/app/main/main.component.ts 469 @@ -2870,13 +2870,301 @@ Build date: - Date de construction: + Date de compilation : src/app/dialogs/about-dialog/about-dialog.component.html 33 Build date + + Share file + Partager le fichier + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Docker tag: + Étiquette Docker : + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Commit hash: + Hash du commit : + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Creating download + Création du téléchargement + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + Récupération des infos + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Téléchargement du fichier + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + Terminé + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Nettoyer les téléchargements finis + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Voulez-vous nettoyer tous les téléchargements finis ? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + Nettoyer + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Erreur pour + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + Copier dans le presse-papier + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + Fermer + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + Copié dans le presse-papier ! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Date + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + Titre + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + Souscription + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Étape + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Progression + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Actions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Effacer + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + Reprendre + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + Regarder le contenu + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Afficher l'erreur + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Recommencer + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + Mettre tous en pause + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + Reprendre tous + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Nettoyer les téléchargements finis + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Ajouter à la liste de lecture + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Passer la pub + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + From 0747c28d8aed8dd3cd17877fcb34b59fdebbd06f Mon Sep 17 00:00:00 2001 From: Biepa Date: Tue, 14 Dec 2021 10:57:37 +0000 Subject: [PATCH 064/212] Translated using Weblate (German) Currently translated at 88.0% (266 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/de/ --- src/assets/i18n/messages.de.xlf | 117 +++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/messages.de.xlf b/src/assets/i18n/messages.de.xlf index 5d6c121..343562b 100644 --- a/src/assets/i18n/messages.de.xlf +++ b/src/assets/i18n/messages.de.xlf @@ -1,4 +1,4 @@ - + @@ -2698,6 +2698,121 @@ Crop video checkbox + + Audio only + Nur Audio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Download for has been queued! + Download für in Warteschlange eingereiht! + + src/app/main/main.component.ts + 469 + + + + Autoplay + Automatisches abspielen + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Argumente ersetzen + + src/app/main/main.component.html + 116,117 + + Replace args + + + File type + Dateityp + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + Beide + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + Nur Video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + You must enable multi-user mode to access this tab. + Für den Zugriff auf diesen Reiter "Multi-User" Modus aktivieren. + + src/app/settings/settings.component.ts + 48 + + + + Max concurrent downloads + Maximale gleichzeitige Downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitiert die Anzahl simultaner Downloads. Nutze -1 für kein Limit. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + Downloadrate Limit + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + Legt die maximale Downloadrate fest. Z.B. 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Allow autoplay + Automatisches Abspielen erlauben + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + From 548cb654d5fc0578c4f21503dc882324cee7053f Mon Sep 17 00:00:00 2001 From: Diamond Date: Wed, 15 Dec 2021 04:21:20 +0000 Subject: [PATCH 065/212] Translated using Weblate (Russian) Currently translated at 97.0% (293 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ru/ --- src/assets/i18n/messages.ru.xlf | 372 +++++++++++++++++++++++++++++++- 1 file changed, 371 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/messages.ru.xlf b/src/assets/i18n/messages.ru.xlf index c4384a4..b82ff7a 100644 --- a/src/assets/i18n/messages.ru.xlf +++ b/src/assets/i18n/messages.ru.xlf @@ -1,4 +1,4 @@ - + @@ -2728,6 +2728,376 @@ Crop video checkbox + + Installation type: + Тип установки: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Watch content + Смотреть контент + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Rate limits your downloads to the specified amount. Ex: 200K + Ограничить скорость загрузки, например 200К + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download for has been queued! + Загрузка для выла добавлена в очередь! + + src/app/main/main.component.ts + 469 + + + + Replace args + Поменять аргументы + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Автопроигрывание + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Both + Обa + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Тип файла + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Только видео + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + Только аудио + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + You must enable multi-user mode to access this tab. + Вы должны включить многопользовательский режим для доступа к этой вкладке. + + src/app/settings/settings.component.ts + 48 + + + + Use SponsorBlock API + Использовать SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Download rate limit + Ограничение скорости загрузки + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Max concurrent downloads + Максимальное количество одновременных загрузок + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Ограничивает количество одновременных загрузок. Используйте -1 для безлимитной загрузки. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Generate NFO files + Генерировать файлы NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Allow autoplay + Разрешить автопроигрывание + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Build date: + Дата постройки: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Clear + Стереть + + src/app/components/downloads/downloads.component.ts + 131 + + + + Complete + Закончено + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Очистить законченны загрузки + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Хотите ли вы очистить завершённые загрузки? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Downloading file + Загружается файл + + src/app/components/downloads/downloads.component.ts + 60 + + + + Creating download + Готовится загрузка + + src/app/components/downloads/downloads.component.ts + 58 + + + + Date + Дата + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + Название + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Clear + Стереть + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Close + Закрыть + + src/app/components/downloads/downloads.component.ts + 241 + + + + Pause + Пауза + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Show error + Показать ошибку + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Clear finished downloads + Очистить законченные загрузки + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Restart + Перезапустить + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Progress + Прогресс + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Error for + Ошибка для + + src/app/components/downloads/downloads.component.ts + 238 + + + + Subscription + Подписка + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Этап + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Actions + Действия + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Resume + Возобновить + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Resume all downloads + Возобновить все загрузки + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + Приостановить все загрузки + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + From 71eaf70b2e3b79fe956b4b5cfd6b2796ab817659 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Thu, 16 Dec 2021 12:59:52 +0000 Subject: [PATCH 066/212] Translated using Weblate (Russian) Currently translated at 99.6% (301 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ru/ --- src/assets/i18n/messages.ru.xlf | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/assets/i18n/messages.ru.xlf b/src/assets/i18n/messages.ru.xlf index b82ff7a..7c74a11 100644 --- a/src/assets/i18n/messages.ru.xlf +++ b/src/assets/i18n/messages.ru.xlf @@ -3098,6 +3098,75 @@ Pause all downloads + + Enables a button to skip ads when viewing supported videos. + Включает кнопку для пропуска рекламы при просмотре поддерживаемых видео. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Generates NFO files with every download, primarily used by Kodi. + Генерирует файлы NFO при каждой загрузке, в основном используется Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Docker tag: + Тег Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Copy to clipboard + Скопировать в буфер обмена + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + Скопировано в буфер обмена! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Getting info + Получение информации + + src/app/components/downloads/downloads.component.ts + 59 + + + + Add to playlist + Добавить в плейлист + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Пропустить рекламу + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + From 4a0000af5f8023d202c63f9006c255d076c7b3b9 Mon Sep 17 00:00:00 2001 From: Jagadeesh Vijay Varma Date: Sat, 25 Dec 2021 08:44:10 +0100 Subject: [PATCH 067/212] Added translation using Weblate (Telugu) --- src/assets/i18n/messages.te.xlf | 3040 +++++++++++++++++++++++++++++++ 1 file changed, 3040 insertions(+) create mode 100644 src/assets/i18n/messages.te.xlf diff --git a/src/assets/i18n/messages.te.xlf b/src/assets/i18n/messages.te.xlf new file mode 100644 index 0000000..8aee849 --- /dev/null +++ b/src/assets/i18n/messages.te.xlf @@ -0,0 +1,3040 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 67 + + Dark mode toggle label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 34 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Settings + + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + + + src/app/main/main.component.ts + 469 + + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Autoplay + + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Replace args + + + src/app/main/main.component.html + 116,117 + + Replace args + + + Custom args + + + src/app/main/main.component.html + 120 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 123,124 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 131,132 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 135 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 137 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 117 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 138 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 145,146 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 149 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 154 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Crop from (seconds) + + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 10 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 38 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 487 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + File type + + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 16 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 46 + + No playlist subscriptions text + + + You must enable multi-user mode to access this tab. + + + src/app/settings/settings.component.ts + 48 + + + + Main + + + src/app/settings/settings.component.html + 4 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 94 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 198 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 339 + + Host settings label + + + Logs + + + src/app/settings/settings.component.html + 476 + + + src/app/settings/settings.component.html + 476 + + Logs settings label + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 11 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 16 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 17 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 26 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 30 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 31 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 40 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 44 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 45 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 50 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 51 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 64 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 66 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 72 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 81 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 101 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 102 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 108 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 109 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 115 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 118 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 125 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 126 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 136 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 158 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 162 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 166 + + Include metadata setting + + + Max concurrent downloads + + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Kill all downloads + + + src/app/settings/settings.component.html + 191 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 204 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 209 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 212 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 215 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 218 + + Download only mode setting + + + Allow autoplay + + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enable Public API + + + src/app/settings/settings.component.html + 229 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 234 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 235 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 239 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 239 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 248 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 253 + + + src/app/settings/settings.component.html + 265 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 257 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 264 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 265 + + Twitch API Key setting hint AKA preamble + + + Enables a button to skip ads when viewing supported videos. + + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 260 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 281 + + + src/app/settings/settings.component.html + 287 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 281 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 282 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 287 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 288 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 288 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 293 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 294 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 345 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 354 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 358 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 372 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 384 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 395 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 403 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 404 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Users + + + src/app/settings/settings.component.html + 425 + + Users settings label + + + Allow user registration + + + src/app/settings/settings.component.html + 431 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 435 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 437 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 440 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 447 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 452 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 457 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 462 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 467 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Installation type: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Docker tag: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Skip ad + + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From dd7354bd77bd72cd6629d03a8ca17e1491e7fb22 Mon Sep 17 00:00:00 2001 From: Jagadeesh Vijay Varma Date: Sat, 25 Dec 2021 11:25:34 +0000 Subject: [PATCH 068/212] Translated using Weblate (Telugu) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/te/ --- src/assets/i18n/messages.te.xlf | 648 ++++++++++++++++---------------- 1 file changed, 324 insertions(+), 324 deletions(-) diff --git a/src/assets/i18n/messages.te.xlf b/src/assets/i18n/messages.te.xlf index 8aee849..aba533f 100644 --- a/src/assets/i18n/messages.te.xlf +++ b/src/assets/i18n/messages.te.xlf @@ -4,7 +4,7 @@ About - + గురించి src/app/app.component.html 32 @@ -13,7 +13,7 @@ Profile - + ప్రొఫైల్ src/app/app.component.html 19 @@ -22,7 +22,7 @@ Dark - + చీకటి src/app/app.component.html 23 @@ -35,7 +35,7 @@ Home - + ఇల్లు src/app/app.component.html 43 @@ -44,7 +44,7 @@ Login - + లాగిన్ src/app/app.component.html 44 @@ -61,7 +61,7 @@ Subscriptions - + సభ్యత్వాలు src/app/app.component.html 45 @@ -70,7 +70,7 @@ Downloads - + డౌన్‌లోడ్‌లు src/app/app.component.html 46 @@ -79,7 +79,7 @@ Settings - + సెట్టింగులు src/app/app.component.html 49 @@ -92,15 +92,15 @@ Download for has been queued! - + కోసం డౌన్‌లోడ్ క్యూలో ఉంచబడింది! src/app/main/main.component.ts 469 - Only Audio - + Only Audio + ధ్వని మాత్రమే src/app/main/main.component.html 65,66 @@ -108,8 +108,8 @@ Only Audio checkbox - Download - + Download + డౌన్‌లోడ్ src/app/main/main.component.html 79,80 @@ -117,8 +117,8 @@ Main download button - Quality - + Quality + నాణ్యత src/app/main/main.component.html 19,20 @@ -127,7 +127,7 @@ Use URL - + URLని ఉపయోగించండి src/app/main/main.component.html 51 @@ -135,8 +135,8 @@ YT search Use URL button for searched video - View - + View + వీక్షించు src/app/main/main.component.html 55,56 @@ -144,8 +144,8 @@ YT search View button for searched video - Autoplay - + Autoplay + స్వీయ ప్లే src/app/main/main.component.html 70,71 @@ -153,8 +153,8 @@ Autoplay checkbox - Cancel - + Cancel + రద్దుచేయి src/app/main/main.component.html 84,85 @@ -162,8 +162,8 @@ Cancel download button - Advanced - + Advanced + ఆధునిక src/app/main/main.component.html 96,97 @@ -171,8 +171,8 @@ Advanced download mode panel - Use custom args - + Use custom args + కస్టమ్ ఆర్గ్‌లను ఉపయోగించండి src/app/main/main.component.html 110,111 @@ -180,8 +180,8 @@ Use custom args checkbox - Replace args - + Replace args + ఆర్గ్‌లను భర్తీ చేయి src/app/main/main.component.html 116,117 @@ -190,7 +190,7 @@ Custom args - + కస్టమ్ ఆర్గ్స్ src/app/main/main.component.html 120 @@ -206,8 +206,8 @@ Custom args placeholder - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + URLని చేర్చాల్సిన అవసరం లేదు, తర్వాత ప్రతిదీ. రెండు కామాలను ఉపయోగించి ఆర్గ్‌లు వేరు చేయబడ్డాయి: ,, src/app/main/main.component.html 123,124 @@ -215,8 +215,8 @@ Custom Args input hint - Use custom output - + Use custom output + కస్టమ్ అవుట్‌పుట్‌ని ఉపయోగించండి src/app/main/main.component.html 131,132 @@ -225,7 +225,7 @@ Custom output - + కస్టమ్ అవుట్‌పుట్‌ src/app/main/main.component.html 135 @@ -234,7 +234,7 @@ Documentation - + దస్తావేజుల పట్టిక src/app/main/main.component.html 137 @@ -259,7 +259,7 @@ Path is relative to the config download path. Don't include extension. - + మార్గం కాన్ఫిగర్ డౌన్‌లోడ్ పాత్‌కి సంబంధించింది. పొడిగింపును చేర్చవద్దు. src/app/main/main.component.html 138 @@ -279,8 +279,8 @@ Custom Output input hint - Crop file - + Crop file + ఫైల్‌ను కత్తిరించండి src/app/main/main.component.html 160,161 @@ -288,8 +288,8 @@ Crop video checkbox - Simulated command: - + Simulated command: + అనుకరణ కమాండ్: src/app/main/main.component.html 102,103 @@ -297,8 +297,8 @@ Simulated command label - Use authentication - + Use authentication + ప్రమాణీకరణను ఉపయోగించండి src/app/main/main.component.html 145,146 @@ -307,7 +307,7 @@ Username - + వినియోగదారు పేరు src/app/main/main.component.html 149 @@ -316,7 +316,7 @@ Password - + గుర్తింపు పదము src/app/main/main.component.html 154 @@ -333,7 +333,7 @@ Crop from (seconds) - + (సెకన్లు) నుండి కత్తిరించు src/app/main/main.component.html 164 @@ -342,7 +342,7 @@ Crop to (seconds) - + (సెకన్లు) వరకు కత్తిరించండి src/app/main/main.component.html 169 @@ -351,7 +351,7 @@ Create a playlist - + ప్లేజాబితాను సృష్టించండి src/app/create-playlist/create-playlist.component.html 1 @@ -360,7 +360,7 @@ Name - + పేరు src/app/create-playlist/create-playlist.component.html 6 @@ -377,7 +377,7 @@ Type - + రకం src/app/create-playlist/create-playlist.component.html 11 @@ -386,7 +386,7 @@ Audio - + ధ్వని src/app/create-playlist/create-playlist.component.html 12 @@ -395,7 +395,7 @@ Video - + వీడియో src/app/create-playlist/create-playlist.component.html 13 @@ -404,7 +404,7 @@ Audio files - + ధ్వని ఫైల్స్ src/app/create-playlist/create-playlist.component.html 19 @@ -413,7 +413,7 @@ Videos - + వీడియోలు src/app/create-playlist/create-playlist.component.html 20 @@ -426,7 +426,7 @@ Subscribe to playlist or channel - + ప్లేజాబితా లేదా ఛానెల్‌కు సభ్యత్వం పొందండి src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -435,7 +435,7 @@ URL - + URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 8 @@ -448,7 +448,7 @@ The playlist or channel URL - + ప్లేజాబితా లేదా ఛానెల్ URL src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -457,7 +457,7 @@ Custom name - + కస్టమ్ పేరు src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 19 @@ -466,7 +466,7 @@ Download all uploads - + అన్ని అప్‌లోడ్‌లను డౌన్‌లోడ్ చేయండి src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -479,7 +479,7 @@ Max quality - + గరిష్ట నాణ్యత src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 40 @@ -492,7 +492,7 @@ Audio-only mode - + ధ్వని-మాత్రమే మోడ్ src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -505,7 +505,7 @@ Streaming-only mode - + స్ట్రీమింగ్-మాత్రమే మోడ్ src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -518,7 +518,7 @@ These are added after the standard args. - + ఇవి ప్రామాణిక ఆర్గ్‌ల తర్వాత జోడించబడతాయి. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -531,7 +531,7 @@ Custom file output - + కస్టమ్ ఫైల్ అవుట్‌పుట్ src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -548,7 +548,7 @@ Cancel - + రద్దుచేయి src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -589,7 +589,7 @@ Subscribe - + సభ్యత్వం పొందండి src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -598,7 +598,7 @@ Download videos uploaded in the last - + చివరిగా అప్‌లోడ్ చేసిన వీడియోలను డౌన్‌లోడ్ చేయండి src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -611,7 +611,7 @@ Type: - + రకం: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 5 @@ -620,7 +620,7 @@ URL: - + URL: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 9 @@ -633,7 +633,7 @@ ID: - + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -650,7 +650,7 @@ Close - + మూసివేయి src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -695,7 +695,7 @@ Export Archive - + ఆర్కైవ్ ని ఎగుమతిచేయి src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -704,7 +704,7 @@ Unsubscribe - + సభ్యత్వాన్ని నిష్క్రమించండి src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -713,7 +713,7 @@ (Paused) - + (పాజ్ చేయబడింది) src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -738,7 +738,7 @@ Archive: - + ఆర్కైవ్: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -747,7 +747,7 @@ Name: - + పేరు: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 5 @@ -760,7 +760,7 @@ Uploader: - + అప్‌లోడర్: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 13 @@ -769,7 +769,7 @@ File size: - + ఫైల్ పరిమాణం: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 17 @@ -778,7 +778,7 @@ Path: - + మార్గం: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 21 @@ -787,7 +787,7 @@ Upload Date: - + అప్‌లోడ్ తేదీ: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 25 @@ -796,7 +796,7 @@ Category: - + వర్గం: src/app/dialogs/video-info-dialog/video-info-dialog.component.html 29 @@ -805,7 +805,7 @@ Modify youtube-dl args - + యూట్యూబ్-dl ఆర్గ్‌లను సవరించండి src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -814,7 +814,7 @@ Simulated new args - + కొత్త ఆర్గ్‌లను అనుకరించారు src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -823,7 +823,7 @@ Add an arg - + ఒక ఆర్గ్ జోడించండి src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -832,7 +832,7 @@ Search by category - + వర్గం వారీగా శోధించండి src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -841,7 +841,7 @@ Use arg value - + ఆర్గ్ విలువను ఉపయోగించండి src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -850,7 +850,7 @@ Add arg - + ఆర్గ్ జోడించండి src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -859,7 +859,7 @@ Modify - + సవరించు src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -868,7 +868,7 @@ Arg value - + ఆర్గ్ విలువ src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -877,7 +877,7 @@ Updater - + అప్‌డేటర్ src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 @@ -886,7 +886,7 @@ Register a user - + వినియోగదారుని నమోదు చేయండి src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -895,7 +895,7 @@ User name - + వినియోగదారు పేరు src/app/dialogs/add-user-dialog/add-user-dialog.component.html 6 @@ -904,7 +904,7 @@ Register - + నమోదుచేయండి src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -917,7 +917,7 @@ Upload new cookies - + కొత్త కుక్కీలను అప్‌లోడ్ చేయండి src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -926,7 +926,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - + గమనిక: కొత్త కుక్కీలను అప్‌లోడ్ చేయడం వలన మీ మునుపటి కుక్కీలు భర్తీ చేయబడతాయి. కుక్కీలు ఇన్‌స్టాన్స్-వైడ్ అని కూడా గమనించండి, ఒక్కో యూజర్ కాదు. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -935,7 +935,7 @@ Drag and Drop - + డ్రాగ్ మరియు డ్రాప్ src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 11 @@ -944,7 +944,7 @@ Modify playlist - + ప్లేజాబితాను సవరించండి src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -953,7 +953,7 @@ Save - + సేవ్ src/app/dialogs/modify-playlist/modify-playlist.component.html 43 @@ -978,7 +978,7 @@ Randomize order when playing - + ప్లే అవుతున్నపుడు క్రమాన్ని యాదృచ్ఛికంగా మార్చండి src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -987,7 +987,7 @@ Add content - + కంటెంట్‌ని జోడించండి src/app/dialogs/modify-playlist/modify-playlist.component.html 24 @@ -995,8 +995,8 @@ Add content - Normal order  - + Normal order + సాధారణ క్రమం src/app/dialogs/modify-playlist/modify-playlist.component.html 18 @@ -1004,8 +1004,8 @@ Normal order - Reverse order  - + Reverse order + రివర్స్ క్రమం src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -1014,7 +1014,7 @@ My videos - + నా వీడియోలు src/app/components/recent-videos/recent-videos.component.html 20 @@ -1023,7 +1023,7 @@ Search - + శోధన src/app/components/recent-videos/recent-videos.component.html 24 @@ -1040,7 +1040,7 @@ File type - + ఫైల్ రకం src/app/components/recent-videos/recent-videos.component.html 52 @@ -1049,7 +1049,7 @@ Both - + రెండు src/app/components/recent-videos/recent-videos.component.html 54 @@ -1058,7 +1058,7 @@ Video only - + వీడియో మాత్రమే src/app/components/recent-videos/recent-videos.component.html 55 @@ -1067,7 +1067,7 @@ Audio only - + ధ్వని మాత్రమే src/app/components/recent-videos/recent-videos.component.html 56 @@ -1076,7 +1076,7 @@ No videos found. - + వీడియోలు ఏవీ కనుగొనబడలేదు. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1085,7 +1085,7 @@ Editing - + సవరించుతుంది src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 1 @@ -1094,7 +1094,7 @@ Paused - + పాజ్ చేయబడింది src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1103,7 +1103,7 @@ Editing category - + వర్గాన్ని సవరించుతుంది src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1112,7 +1112,7 @@ Rules - + నియమాలు src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 10 @@ -1121,7 +1121,7 @@ Add new rule - + కొత్త నియమాన్ని జోడించండి src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1130,7 +1130,7 @@ Download Twitch Chat - + ట్విచ్ చాట్‌ని డౌన్‌లోడ్ చేయండి src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1139,7 +1139,7 @@ Edit - + సవరించు src/app/file-card/file-card.component.html 19 @@ -1152,7 +1152,7 @@ Delete - + తొలగించు src/app/file-card/file-card.component.html 20 @@ -1173,7 +1173,7 @@ Info - + సమాచారం src/app/file-card/file-card.component.html 24 @@ -1190,7 +1190,7 @@ Count: - + సంఖ్య: src/app/file-card/file-card.component.html 8 @@ -1199,7 +1199,7 @@ Delete and blacklist - + తొలగించి బ్లాక్‌లిస్ట్ చేయండి src/app/file-card/file-card.component.html 26 @@ -1212,7 +1212,7 @@ views - + వీక్షణలు src/app/player/player.component.html 16 @@ -1221,7 +1221,7 @@ The download was successful - + డౌన్‌లోడ్ విజయవంతమైంది src/app/download-item/download-item.component.html 8 @@ -1234,7 +1234,7 @@ An error has occurred - + ఒక లోపము సంభవించినది src/app/download-item/download-item.component.html 9 @@ -1247,7 +1247,7 @@ Details - + వివరాలు src/app/download-item/download-item.component.html 18 @@ -1256,7 +1256,7 @@ An error has occurred: - + ఒక లోపము సంభవించినది: src/app/download-item/download-item.component.html 27 @@ -1265,7 +1265,7 @@ Download start: - + డౌన్‌లోడ్ ప్రారంభం: src/app/download-item/download-item.component.html 32 @@ -1274,7 +1274,7 @@ Download end: - + డౌన్‌లోడ్ ముగింపు: src/app/download-item/download-item.component.html 35 @@ -1283,7 +1283,7 @@ File path(s): - + ఫైల్ మార్గం(ఎస్): src/app/download-item/download-item.component.html 38 @@ -1292,7 +1292,7 @@ Your subscriptions - + మీ సభ్యత్వాలు src/app/subscriptions/subscriptions.component.html 3 @@ -1301,7 +1301,7 @@ Channels - + ఛనల్స్ src/app/subscriptions/subscriptions.component.html 8 @@ -1310,7 +1310,7 @@ Playlists - + ప్లేజాబితాలు src/app/subscriptions/subscriptions.component.html 30 @@ -1319,7 +1319,7 @@ Name not available. Channel retrieval in progress. - + పేరు అందుబాటులో లేదు. ఛానెల్ పునరుద్ధరణ పురోగతిలో ఉంది. src/app/subscriptions/subscriptions.component.html 14 @@ -1328,7 +1328,7 @@ You have no channel subscriptions. - + మీకు ఛానెల్ సభ్యత్వాలు లేవు. src/app/subscriptions/subscriptions.component.html 27 @@ -1337,7 +1337,7 @@ Name not available. Playlist retrieval in progress. - + పేరు అందుబాటులో లేదు. ప్లేజాబితా పునరుద్ధరణ ప్రోగ్రెస్‌లో ఉంది. src/app/subscriptions/subscriptions.component.html 36 @@ -1346,7 +1346,7 @@ You have no playlist subscriptions. - + మీకు ప్లేజాబితా సభ్యత్వాలు లేవు. src/app/subscriptions/subscriptions.component.html 46 @@ -1355,7 +1355,7 @@ You must enable multi-user mode to access this tab. - + ఈ ట్యాబ్‌ని యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా బహుళ-వినియోగదారు మోడ్‌ను ప్రారంభించాలి. src/app/settings/settings.component.ts 48 @@ -1363,7 +1363,7 @@ Main - + ప్రధాన src/app/settings/settings.component.html 4 @@ -1372,7 +1372,7 @@ Downloader - + డౌన్‌లోడర్ src/app/settings/settings.component.html 94 @@ -1381,7 +1381,7 @@ Extra - + అదనపు src/app/settings/settings.component.html 198 @@ -1390,7 +1390,7 @@ Database - + డేటాబేస్ src/app/settings/settings.component.html 303 @@ -1399,7 +1399,7 @@ Advanced - + ఆధునిక src/app/settings/settings.component.html 339 @@ -1408,7 +1408,7 @@ Logs - + లాగ్స్ src/app/settings/settings.component.html 476 @@ -1421,7 +1421,7 @@ URL this app will be accessed from, without the port. - + URL ఈ యాప్ పోర్ట్ లేకుండా యాక్సెస్ చేయబడుతుంది. src/app/settings/settings.component.html 11 @@ -1430,7 +1430,7 @@ Port - + పోర్ట్ src/app/settings/settings.component.html 16 @@ -1439,7 +1439,7 @@ The desired port. Default is 17442. - + కావలసిన పోర్ట్. డిఫాల్ట్ 17442. src/app/settings/settings.component.html 17 @@ -1448,7 +1448,7 @@ Multi-user mode - + బహుళ-వినియోగదారు మోడ్ src/app/settings/settings.component.html 26 @@ -1457,7 +1457,7 @@ Users base path - + వినియోగదారుల ఆధార మార్గం src/app/settings/settings.component.html 30 @@ -1466,7 +1466,7 @@ Base path for users and their downloaded videos. - + వినియోగదారులు మరియు వారి డౌన్‌లోడ్ చేసిన వీడియోల కోసం ఆధార మార్గం. src/app/settings/settings.component.html 31 @@ -1475,7 +1475,7 @@ Allow subscriptions - + సభ్యత్వాలను అనుమతించండి src/app/settings/settings.component.html 40 @@ -1484,7 +1484,7 @@ Subscriptions base path - + సభ్యత్వాల ఆధార మార్గం src/app/settings/settings.component.html 44 @@ -1493,7 +1493,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - + మీ సభ్యత్వం పొందిన ఛానెల్‌లు మరియు ప్లేజాబితాల నుండి వీడియోల కోసం ప్రాథమిక మార్గం. ఇది YTDL-పదార్ధాలు యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. src/app/settings/settings.component.html 45 @@ -1502,7 +1502,7 @@ Check interval - + ఇంటర్వెల్ తనిఖీ చేయండి src/app/settings/settings.component.html 50 @@ -1511,7 +1511,7 @@ Unit is seconds, only include numbers. - + యూనిట్ సెకన్లు, సంఖ్యలను మాత్రమే చేర్చండి. src/app/settings/settings.component.html 51 @@ -1520,7 +1520,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - + కొన్నిసార్లు పూర్తిగా ప్రాసెస్ చేయడానికి ముందే కొత్త వీడియోలు డౌన్‌లోడ్ చేయబడతాయి. ఈ సెట్టింగ్ అంటే కొత్త వీడియోలు మరుసటి రోజు అధిక నాణ్యత వెర్షన్ కోసం తనిఖీ చేయబడతాయని అర్థం. src/app/settings/settings.component.html 55 @@ -1529,7 +1529,7 @@ Redownload fresh uploads - + తాజా అప్‌లోడ్‌లను మళ్లీ డౌన్‌లోడ్ చేయండి src/app/settings/settings.component.html 55 @@ -1538,7 +1538,7 @@ Theme - + థీమ్ src/app/settings/settings.component.html 64 @@ -1547,7 +1547,7 @@ Default - + డిఫాల్ట్ src/app/settings/settings.component.html 66 @@ -1556,7 +1556,7 @@ Allow theme change - + థీమ్ మార్పును అనుమతించండి src/app/settings/settings.component.html 72 @@ -1565,7 +1565,7 @@ Language - + భాష src/app/settings/settings.component.html 81 @@ -1574,7 +1574,7 @@ Audio folder path - + ధ్వని ఫోల్డర్ మార్గం src/app/settings/settings.component.html 101 @@ -1583,7 +1583,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - + ఆడియో మాత్రమే డౌన్‌లోడ్‌ల కోసం మార్గం. ఇది YTDL-పదార్ధాలు యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. src/app/settings/settings.component.html 102 @@ -1592,7 +1592,7 @@ Video folder path - + వీడియో ఫోల్డర్ మార్గం src/app/settings/settings.component.html 108 @@ -1601,7 +1601,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - + వీడియో డౌన్‌లోడ్‌ల కోసం మార్గం. ఇది YTDL-మెటీరియల్స్ యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. src/app/settings/settings.component.html 109 @@ -1610,7 +1610,7 @@ Default file output - + డిఫాల్ట్ ఫైల్ అవుట్‌పుట్ src/app/settings/settings.component.html 115 @@ -1619,7 +1619,7 @@ Path is relative to the above download paths. Don't include extension. - + పై డౌన్‌లోడ్ మార్గము సంబంధించి మార్గం ఉంది. పొడిగింపును చేర్చవద్దు. src/app/settings/settings.component.html 118 @@ -1628,7 +1628,7 @@ Global custom args - + గ్లోబల్ కస్టమ్ ఆర్గ్స్ src/app/settings/settings.component.html 125 @@ -1637,7 +1637,7 @@ Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - + ఇల్లు పేజీలో డౌన్‌లోడ్‌ల కోసం గ్లోబల్ కస్టమ్ ఆర్గ్‌లు. రెండు కామాలను ఉపయోగించి ఆర్గ్‌లు వేరు చేయబడ్డాయి: ,, src/app/settings/settings.component.html 126 @@ -1646,7 +1646,7 @@ Categories - + వర్గాలు src/app/settings/settings.component.html 136 @@ -1655,7 +1655,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - + ఈ సెట్టింగ్ ప్రారంభించబడితే, ఒక వీడియో ఒక వర్గానికి సరిపోలితే, మొత్తం ప్లేజాబితా ఆ వర్గాన్ని స్వీకరిస్తుంది. src/app/settings/settings.component.html 150 @@ -1664,7 +1664,7 @@ Allow playlist categorization - + ప్లేజాబితా వర్గీకరణను అనుమతించండి src/app/settings/settings.component.html 150 @@ -1673,7 +1673,7 @@ Use youtube-dl archive - + youtube-dl ఆర్కైవ్‌ని ఉపయోగించండి src/app/settings/settings.component.html 158 @@ -1682,7 +1682,7 @@ Include thumbnail - + సూక్ష్మచిత్రాన్ని చేర్చండి src/app/settings/settings.component.html 162 @@ -1691,7 +1691,7 @@ Include metadata - + మెటాడేటాను చేర్చండి src/app/settings/settings.component.html 166 @@ -1700,7 +1700,7 @@ Max concurrent downloads - + గరిష్టంగా ఏకకాల డౌన్‌లోడ్‌లు src/app/settings/settings.component.html 175 @@ -1709,7 +1709,7 @@ Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. - + ఏకకాలంలో డౌన్‌లోడ్ చేయగల డౌన్‌లోడ్‌ల పరిమాణాన్ని పరిమితం చేస్తుంది. పరిమితి లేకుండా -1 ఉపయోగించండి. src/app/settings/settings.component.html 176 @@ -1718,7 +1718,7 @@ Download rate limit - + డౌన్‌లోడ్ రేట్ పరిమితి src/app/settings/settings.component.html 181 @@ -1727,7 +1727,7 @@ Rate limits your downloads to the specified amount. Ex: 200K - + రేట్ మీ డౌన్‌లోడ్‌లను పేర్కొన్న మొత్తానికి పరిమితం చేస్తుంది. ఉదా: 200K src/app/settings/settings.component.html 182 @@ -1736,7 +1736,7 @@ Kill all downloads - + అన్ని డౌన్‌లోడ్‌లను చంపండి src/app/settings/settings.component.html 191 @@ -1745,7 +1745,7 @@ Top title - + అగ్ర శీర్షిక src/app/settings/settings.component.html 204 @@ -1754,7 +1754,7 @@ File manager enabled - + ఫైల్ మేనేజర్ ప్రారంభించబడింది src/app/settings/settings.component.html 209 @@ -1763,7 +1763,7 @@ Downloads manager enabled - + డౌన్‌లోడ్‌ల మేనేజర్ ప్రారంభించబడింది src/app/settings/settings.component.html 212 @@ -1772,7 +1772,7 @@ Allow quality select - + నాణ్యత ఎంపికను అనుమతించండి src/app/settings/settings.component.html 215 @@ -1781,7 +1781,7 @@ Download only mode - + డౌన్‌లోడ్ మోడ్ మాత్రమే src/app/settings/settings.component.html 218 @@ -1790,7 +1790,7 @@ Allow autoplay - + స్వయం ప్లేను అనుమతించండి src/app/settings/settings.component.html 221 @@ -1799,7 +1799,7 @@ Enable Public API - + ప్రజా APIని ప్రారంభించండి src/app/settings/settings.component.html 229 @@ -1808,7 +1808,7 @@ Public API Key - + ప్రజా API తాళం src/app/settings/settings.component.html 234 @@ -1817,7 +1817,7 @@ View documentation - + డాక్యుమెంటేషన్‌ని వీక్షించండి src/app/settings/settings.component.html 235 @@ -1826,7 +1826,7 @@ This will delete your old API key! - + ఇది మీ పాత API తాళంని తొలగిస్తుంది! src/app/settings/settings.component.html 239 @@ -1835,7 +1835,7 @@ Generate - + ఉత్పత్తి src/app/settings/settings.component.html 239 @@ -1844,7 +1844,7 @@ Use YouTube API - + యూట్యూబ్ APIని ఉపయోగించండి src/app/settings/settings.component.html 248 @@ -1853,7 +1853,7 @@ Youtube API Key - + యూట్యూబ్ API తాళం src/app/settings/settings.component.html 252 @@ -1862,7 +1862,7 @@ Generating a key is easy! - + తాళంని రూపొందించడం సులభం! src/app/settings/settings.component.html 253 @@ -1875,7 +1875,7 @@ Use Twitch API - + ట్విచ్ APIని ఉపయోగించండి src/app/settings/settings.component.html 257 @@ -1884,7 +1884,7 @@ Twitch API Key - + ట్విచ్ API తాళం src/app/settings/settings.component.html 264 @@ -1893,7 +1893,7 @@ Also known as a Client ID. - + క్లయింట్ ID అని కూడా అంటారు. src/app/settings/settings.component.html 265 @@ -1902,7 +1902,7 @@ Enables a button to skip ads when viewing supported videos. - + మద్దతు ఉన్న వీడియోలను వీక్షిస్తున్నప్పుడు ప్రకటనలను దాటవేయడానికి బటన్‌ను ప్రారంభిస్తుంది. src/app/settings/settings.component.html 269 @@ -1911,7 +1911,7 @@ Use SponsorBlock API - + పోషక సంస్థ బ్లాక్ APIని ఉపయోగించండి src/app/settings/settings.component.html 269 @@ -1920,7 +1920,7 @@ Generates NFO files with every download, primarily used by Kodi. - + ప్రతి డౌన్‌లోడ్‌తో NFO ఫైల్‌లను రూపొందిస్తుంది, ప్రధానంగా కోడి ద్వారా ఉపయోగించబడుతుంది. src/app/settings/settings.component.html 272 @@ -1929,7 +1929,7 @@ Generate NFO files - + NFO ఫైల్‌లను రూపొందించు src/app/settings/settings.component.html 272 @@ -1938,7 +1938,7 @@ Auto-download Twitch Chat - + ట్విచ్ చాట్‌ని స్వయం-డౌన్‌లోడ్ చేయండి src/app/settings/settings.component.html 260 @@ -1947,7 +1947,7 @@ Click here - + ఇక్కడ నొక్కండి src/app/settings/settings.component.html 281 @@ -1964,7 +1964,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - + అధికారిక యూట్యూబ్DL-పదార్ధాలు క్రోమ్ పొడిగింపును మాన్యువల్‌గా డౌన్‌లోడ్ చేయడానికి.. src/app/settings/settings.component.html 281 @@ -1973,7 +1973,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - + ఫ్రంటెండ్ URLని సెట్ చేయడానికి మీరు తప్పనిసరిగా పొడగింపును మాన్యువల్‌గా లోడ్ చేయాలి మరియు పొడగింపు సెట్టింగ్‌లను సవరించాలి. src/app/settings/settings.component.html 282 @@ -1982,7 +1982,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - + అధికారిక యూట్యూబ్DL-పదార్ధాలు ఫైర్‌ఫాక్స్ పొడిగింపును ఫైర్‌ఫాక్స్ పొడిగింపుల పేజీ నుండి ఇన్‌స్టాల్ చేయడానికి. src/app/settings/settings.component.html 287 @@ -1991,7 +1991,7 @@ Detailed setup instructions. - + వివరణాత్మక సెటప్ సూచనలు. src/app/settings/settings.component.html 288 @@ -2000,7 +2000,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - + ఫ్రంటెండ్ URLని సెట్ చేయడానికి ఎక్స్‌టెన్షన్ సెట్టింగ్‌లను మార్చడం మినహా ఎక్కువ అవసరం లేదు. src/app/settings/settings.component.html 288 @@ -2009,7 +2009,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - + దిగువ లింక్‌ను మీ బుక్‌మార్క్‌లకు లాగండి మరియు ఇంకా పని చేయడానికి సిద్ధం! మీరు డౌన్‌లోడ్ చేయాలనుకుంటున్న యూట్యూబ్ వీడియోకి నావిగేట్ చేసి, బుక్‌మార్క్‌పై నొక్కండి. src/app/settings/settings.component.html 293 @@ -2018,7 +2018,7 @@ Generate 'audio only' bookmarklet - + 'ధ్వని మాత్రమే' బుక్‌మార్క్‌లెట్‌ని రూపొందించండి src/app/settings/settings.component.html 294 @@ -2027,7 +2027,7 @@ Database location: - + డేటాబేస్ స్థానం: src/app/settings/settings.component.html 309 @@ -2036,7 +2036,7 @@ Records per table - + ఒకో పట్టికకు రికార్డులు src/app/settings/settings.component.html 310 @@ -2045,7 +2045,7 @@ MongoDB Connection String - + మొంగోDB కనెక్షన్ స్ట్రింగ్ src/app/settings/settings.component.html 318 @@ -2054,7 +2054,7 @@ Example: - + ఉదాహరణ: src/app/settings/settings.component.html 319 @@ -2063,7 +2063,7 @@ Test connection string - + పరీక్ష కనెక్షన్ స్ట్రింగ్ src/app/settings/settings.component.html 323 @@ -2071,8 +2071,8 @@ Test connection string button - Transfer DB to - + Transfer DB to + ఇక్కడికి DBని బదిలీ చేయండి src/app/settings/settings.component.html 327 @@ -2081,7 +2081,7 @@ Database information could not be retrieved. Check the server logs for more information. - + డేటాబేస్ సమాచారాన్ని తిరిగి పొందడం సాధ్యం కాలేదు. మరింత సమాచారం కోసం సర్వర్ లాగ్‌లను తనిఖీ చేయండి. src/app/settings/settings.component.html 331 @@ -2090,7 +2090,7 @@ Select a downloader - + డౌన్‌లోడర్‌ను ఎంచుకోండి src/app/settings/settings.component.html 345 @@ -2099,7 +2099,7 @@ Use default downloading agent - + డిఫాల్ట్ డౌన్‌లోడ్ ఏజెంట్‌ని ఉపయోగించండి src/app/settings/settings.component.html 354 @@ -2108,7 +2108,7 @@ Select a download agent - + డౌన్‌లోడ్ ఏజెంట్‌ను ఎంచుకోండి src/app/settings/settings.component.html 358 @@ -2117,7 +2117,7 @@ Log Level - + లాగ్ స్థాయి src/app/settings/settings.component.html 372 @@ -2126,7 +2126,7 @@ Login expiration - + లాగిన్ గడువు src/app/settings/settings.component.html 384 @@ -2135,7 +2135,7 @@ Allow advanced download - + అధునాతన డౌన్‌లోడ్‌ను అనుమతించండి src/app/settings/settings.component.html 395 @@ -2144,7 +2144,7 @@ Use Cookies - + కుక్కీలను ఉపయోగించండి src/app/settings/settings.component.html 403 @@ -2153,7 +2153,7 @@ Set Cookies - + కుకీలను సెట్ చేయండి src/app/settings/settings.component.html 404 @@ -2162,7 +2162,7 @@ Restart server - + సర్వర్ ను పనఃప్రారంభించండి src/app/settings/settings.component.html 416 @@ -2171,7 +2171,7 @@ Users - + వినియోగదారులు src/app/settings/settings.component.html 425 @@ -2180,7 +2180,7 @@ Allow user registration - + వినియోగదారు నమోదును అనుమతించండి src/app/settings/settings.component.html 431 @@ -2189,7 +2189,7 @@ Auth method - + ప్రమాణీకరణ పద్ధతి src/app/settings/settings.component.html 435 @@ -2198,7 +2198,7 @@ Internal - + అంతర్గత src/app/settings/settings.component.html 437 @@ -2207,7 +2207,7 @@ LDAP - + LDAP src/app/settings/settings.component.html 440 @@ -2216,7 +2216,7 @@ LDAP URL - + LDAP URL src/app/settings/settings.component.html 447 @@ -2225,7 +2225,7 @@ Bind DN - + బైండ్ DN src/app/settings/settings.component.html 452 @@ -2234,7 +2234,7 @@ Bind Credentials - + పరిచయ పత్రాలను బైండ్ చేయండి src/app/settings/settings.component.html 457 @@ -2243,7 +2243,7 @@ Search Base - + శోధన బేస్ src/app/settings/settings.component.html 462 @@ -2252,7 +2252,7 @@ Search Filter - + శోధన ఫిల్టర్ src/app/settings/settings.component.html 467 @@ -2261,7 +2261,7 @@ About YoutubeDL-Material - + యూట్యూబ్DL-పదార్థం గురించి src/app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2270,7 +2270,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - + గూగుల్ యొక్క పదార్ధం డిజైన్ స్పెసిఫికేషన్‌ల క్రింద రూపొందించబడిన ఓపెన్ సోర్స్ యూట్యూబ్ డౌన్‌లోడ్. మీరు మీకు ఇష్టమైన వీడియోలను వీడియో లేదా ధ్వని ఫైల్‌లుగా సజావుగా డౌన్‌లోడ్ చేసుకోవచ్చు మరియు మీకు ఇష్టమైన ఛానెల్‌లు మరియు ప్లేజాబితాల కొత్త వీడియోలతో అప్‌డేట్ అవ్వడానికి సభ్యత్వం చేసుకోవచ్చు. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2279,7 +2279,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - + కొన్ని అద్భుతమైన లక్షణాలను కలిగి ఉంది! విస్తృతమైన API, డాకర్ మద్దతు మరియు స్థానికీకరణ (అనువాదం) మద్దతు. ఎగువన ఉన్న గిట్ హబ్ చిహ్నంపై క్లిక్ చేయడం ద్వారా అన్ని మద్దతు ఉన్న ఫీచర్‌లను చదవచ్చు. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2288,7 +2288,7 @@ Installed version: - + ఇన్‌స్టాల్ చేసిన వెర్షన్: src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2297,7 +2297,7 @@ Installation type: - + ఇన్‌స్టాల్ రకం: src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2306,7 +2306,7 @@ Commit hash: - + కమిట్ హాష్: src/app/dialogs/about-dialog/about-dialog.component.html 31 @@ -2315,7 +2315,7 @@ Build date: - + నిర్మాణ తేదీ: src/app/dialogs/about-dialog/about-dialog.component.html 33 @@ -2324,7 +2324,7 @@ Found a bug or have a suggestion? - + సమస్య కనుగొంనారా లేదా ఏదైనా సూచన ఉందా? src/app/dialogs/about-dialog/about-dialog.component.html 36 @@ -2333,7 +2333,7 @@ to create an issue! - + జారిను సృష్టించడానికి! src/app/dialogs/about-dialog/about-dialog.component.html 36 @@ -2342,7 +2342,7 @@ Checking for updates... - + నవీకరణల కోసం తనిఖీ చేస్తోంది... src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2351,7 +2351,7 @@ Update available - + నవీకరణ అందుబాటులో ఉంది src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2360,7 +2360,7 @@ You can update from the settings menu. - + మీరు సెట్టింగ్‌ల మెను నుండి నవీకరించవచ్చు. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2369,7 +2369,7 @@ Docker tag: - + డాకర్ ట్యాగ్: src/app/dialogs/about-dialog/about-dialog.component.html 28 @@ -2378,7 +2378,7 @@ Select a version: - + సంస్కరణను ఎంచుకోండి: src/app/updater/updater.component.html 3 @@ -2387,7 +2387,7 @@ Enable sharing - + భాగస్వామ్యాన్ని ప్రారంభించండి src/app/dialogs/share-media-dialog/share-media-dialog.component.html 9 @@ -2396,7 +2396,7 @@ Use timestamp - + సమయం స్టాంప్ ఉపయోగించండి src/app/dialogs/share-media-dialog/share-media-dialog.component.html 12 @@ -2405,7 +2405,7 @@ Seconds - + క్షణాలు src/app/dialogs/share-media-dialog/share-media-dialog.component.html 14 @@ -2414,7 +2414,7 @@ Copy to clipboard - + క్లిప్‌బోర్డ్‌కి కాపీ చేయండి src/app/dialogs/share-media-dialog/share-media-dialog.component.html 23 @@ -2423,7 +2423,7 @@ Share playlist - + ప్లేజాబితాను భాగస్వామ్యం చేయండి src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2432,7 +2432,7 @@ Share file - + ఫైళ్లను భాగస్వామ్యం చేయండి src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2441,7 +2441,7 @@ Creating download - + డౌన్‌లోడ్ సృష్టిస్తోంది src/app/components/downloads/downloads.component.ts 58 @@ -2449,7 +2449,7 @@ Getting info - + సమాచారాన్ని పొందుతోంది src/app/components/downloads/downloads.component.ts 59 @@ -2457,7 +2457,7 @@ Downloading file - + ఫైల్‌ని డౌన్‌లోడ్ చేస్తోంది src/app/components/downloads/downloads.component.ts 60 @@ -2465,7 +2465,7 @@ Complete - + పూర్తయింది src/app/components/downloads/downloads.component.ts 61 @@ -2473,7 +2473,7 @@ Clear finished downloads - + పూర్తయిన డౌన్‌లోడ్‌లను క్లియర్ చేయండి src/app/components/downloads/downloads.component.ts 129 @@ -2481,7 +2481,7 @@ Would you like to clear your finished downloads? - + మీరు పూర్తయిన మీ డౌన్‌లోడ్‌లను క్లియర్ చేయాలనుకుంటున్నారా? src/app/components/downloads/downloads.component.ts 130 @@ -2489,7 +2489,7 @@ Clear - + క్లియర్ src/app/components/downloads/downloads.component.ts 131 @@ -2497,7 +2497,7 @@ Error for - + కోసం లోపం src/app/components/downloads/downloads.component.ts 238 @@ -2505,7 +2505,7 @@ Copy to clipboard - + క్లిప్‌బోర్డ్‌కి కాపీ చేయండి src/app/components/downloads/downloads.component.ts 240 @@ -2513,7 +2513,7 @@ Close - + మూసివేయి src/app/components/downloads/downloads.component.ts 241 @@ -2521,7 +2521,7 @@ Copied to clipboard! - + క్లిప్‌బోర్డ్‌కి కాపీ చేయబడింది! src/app/components/downloads/downloads.component.ts 249 @@ -2529,7 +2529,7 @@ Date - + తేది src/app/components/downloads/downloads.component.html 7 @@ -2538,7 +2538,7 @@ Title - + శీర్షిక src/app/components/downloads/downloads.component.html 13 @@ -2547,7 +2547,7 @@ Subscription - + సభ్యత్వం src/app/components/downloads/downloads.component.html 23 @@ -2556,7 +2556,7 @@ Stage - + వేదిక src/app/components/downloads/downloads.component.html 36 @@ -2565,7 +2565,7 @@ Progress - + పురోగతి src/app/components/downloads/downloads.component.html 42 @@ -2574,7 +2574,7 @@ Actions - + చర్యలు src/app/components/downloads/downloads.component.html 55 @@ -2583,7 +2583,7 @@ Clear - + క్లియర్ src/app/components/downloads/downloads.component.html 68 @@ -2596,7 +2596,7 @@ Pause - + పాజ్ src/app/components/downloads/downloads.component.html 59 @@ -2609,7 +2609,7 @@ Resume - + పునఃప్రారంభించ్చు src/app/components/downloads/downloads.component.html 60 @@ -2622,7 +2622,7 @@ Watch content - + కంటెంట్‌ని చూడండి src/app/components/downloads/downloads.component.html 64 @@ -2635,7 +2635,7 @@ Show error - + లోపం చూపించు src/app/components/downloads/downloads.component.html 65 @@ -2648,7 +2648,7 @@ Restart - + పునఃప్రారంభించండి src/app/components/downloads/downloads.component.html 66 @@ -2657,7 +2657,7 @@ Pause all downloads - + అన్ని డౌన్‌లోడ్‌లను పాజ్ చేయండి src/app/components/downloads/downloads.component.html 83 @@ -2666,7 +2666,7 @@ Resume all downloads - + అన్ని డౌన్‌లోడ్‌లను పునఃప్రారంభించండి src/app/components/downloads/downloads.component.html 84 @@ -2675,7 +2675,7 @@ Clear finished downloads - + పూర్తయిన డౌన్‌లోడ్‌లను క్లియర్ చేయండి src/app/components/downloads/downloads.component.html 85 @@ -2684,7 +2684,7 @@ No downloads available! - + డౌన్‌లోడ్‌లు ఏవీ అందుబాటులో లేవు! src/app/components/downloads/downloads.component.html 90 @@ -2693,7 +2693,7 @@ Your Profile - + మీ ప్రొఫైల్ src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2702,7 +2702,7 @@ Logout - + లాగ్అవుట్ src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2711,7 +2711,7 @@ UID: - + UID: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 9 @@ -2720,7 +2720,7 @@ Created: - + సృష్టించబడింది: src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 12 @@ -2729,7 +2729,7 @@ You are not logged in. - + మీరు లాగిన్ కాలేదు. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2738,7 +2738,7 @@ Create admin account - + నిర్వాహక ఖాతాను సృష్టించండి src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2747,7 +2747,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - + డిఫాల్ట్ అడ్మిన్ ఖాతా కనుగొనబడలేదు. ఇది వినియోగదారు పేరు 'అడ్మిన్'గా అడ్మిన్ ఖాతా కోసం పాస్‌వర్డ్‌ను సృష్టించి, సెట్ చేస్తుంది. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2756,7 +2756,7 @@ Create - + సృష్టించు src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2765,7 +2765,7 @@ Add Users - + వినియోగదారులను జోడించండి src/app/components/modify-users/modify-users.component.html 90 @@ -2774,7 +2774,7 @@ Edit Role - + పాత్రను సవరించండి src/app/components/modify-users/modify-users.component.html 95 @@ -2782,8 +2782,8 @@ Edit role - User name - + User name + వినియోగదారు పేరు src/app/components/modify-users/modify-users.component.html 17 @@ -2791,8 +2791,8 @@ Username users table header - Role - + Role + పాత్ర src/app/components/modify-users/modify-users.component.html 35 @@ -2800,8 +2800,8 @@ Role users table header - Actions - + Actions + చర్యలు src/app/components/modify-users/modify-users.component.html 55 @@ -2810,7 +2810,7 @@ Manage user - + వినియోగదారుని నిర్వహించండి src/app/components/modify-users/modify-users.component.html 70 @@ -2823,7 +2823,7 @@ Delete user - + వినియోగదారుని తొలగించండి src/app/components/modify-users/modify-users.component.html 73 @@ -2832,7 +2832,7 @@ Edit user - + వినియోగదారుని సవరించండి src/app/components/modify-users/modify-users.component.html 66 @@ -2841,7 +2841,7 @@ User UID: - + వినియోగదారు UID: src/app/components/manage-user/manage-user.component.html 4 @@ -2850,7 +2850,7 @@ New password - + కొత్త గుర్తింపు పదం src/app/components/manage-user/manage-user.component.html 8 @@ -2859,7 +2859,7 @@ Set new password - + కొత్త గుర్తింపు పదాన్ని సెట్ చేయండి src/app/components/manage-user/manage-user.component.html 10 @@ -2868,7 +2868,7 @@ Use role default - + డిఫాల్ట్‌ పాత్రని ఉపయోగించండి src/app/components/manage-user/manage-user.component.html 19 @@ -2877,7 +2877,7 @@ Yes - + అవును src/app/components/manage-user/manage-user.component.html 20 @@ -2890,7 +2890,7 @@ No - + కాదు src/app/components/manage-user/manage-user.component.html 21 @@ -2903,7 +2903,7 @@ Manage role - + పాత్రను నిర్వహించండి src/app/components/manage-role/manage-role.component.html 1 @@ -2912,7 +2912,7 @@ Lines: - + గీతలు: src/app/components/logs-viewer/logs-viewer.component.html 22 @@ -2921,7 +2921,7 @@ Clear logs - + లాగ్‌లను క్లియర్ చేయండి src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2930,7 +2930,7 @@ Auto-generated - + స్వయంచాలకంగా రూపొందించబడింది src/app/components/unified-file-card/unified-file-card.component.html 5 @@ -2939,7 +2939,7 @@ Open file - + ఫైలును తెరవండి src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2948,7 +2948,7 @@ Open file in new tab - + ఫైల్‌ని కొత్త ట్యాబ్‌లో తెరవండి src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2957,7 +2957,7 @@ Go to subscription - + సభ్యత్వానికి వెళ్లండి src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2966,7 +2966,7 @@ Add to playlist - + ప్లేజాబితాకు చేర్చు src/app/components/unified-file-card/unified-file-card.component.html 26 @@ -2975,7 +2975,7 @@ Delete and redownload - + తొలగించి మళ్లీ డౌన్‌లోడ్ చేయండి src/app/components/unified-file-card/unified-file-card.component.html 34 @@ -2988,7 +2988,7 @@ Delete forever - + శాశ్వతంగా తొలగించండి src/app/components/unified-file-card/unified-file-card.component.html 37 @@ -3000,8 +3000,8 @@ Delete forever subscription video button - See more. - + See more. + ఎక్కువ చూడండి. src/app/components/see-more/see-more.component.html 5,6 @@ -3009,8 +3009,8 @@ See more - See less. - + See less. + తక్కువ చూడండి. src/app/components/see-more/see-more.component.html 8,9 @@ -3019,7 +3019,7 @@ Skip ad - + ప్రకటనను దాటవేయండి src/app/components/skip-ad-button/skip-ad-button.component.html 1 @@ -3028,7 +3028,7 @@ Length: - + పొడపు: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 From cf6546dd020119694c8aae42c68bc1b98c96b786 Mon Sep 17 00:00:00 2001 From: Vitor V Date: Sun, 16 Jan 2022 17:58:13 +0000 Subject: [PATCH 069/212] Translated using Weblate (Portuguese) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/pt/ --- src/assets/i18n/messages.pt.xlf | 602 +++++++++++++++++++++++++++++++- 1 file changed, 597 insertions(+), 5 deletions(-) diff --git a/src/assets/i18n/messages.pt.xlf b/src/assets/i18n/messages.pt.xlf index 9076586..f3404b0 100644 --- a/src/assets/i18n/messages.pt.xlf +++ b/src/assets/i18n/messages.pt.xlf @@ -1,4 +1,4 @@ - + @@ -1214,7 +1214,7 @@ Playlists - Playlists + Lista de reprodução src/app/subscriptions/subscriptions.component.html 27 @@ -1972,7 +1972,7 @@ Bind Credentials - Bind Credentials + Bind Credenciais src/app/settings/settings.component.html 385 @@ -1981,7 +1981,7 @@ Search Base - Search Base + Pesquisar Base src/app/settings/settings.component.html 390 @@ -1990,7 +1990,7 @@ Search Filter - Search Filter + Pesquisar Filtro src/app/settings/settings.component.html 395 @@ -2512,6 +2512,598 @@ Video duration label + + Crop to (seconds) + Cortar para (segundos) + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Autoplay + Reprodução automática + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + File type + Tipo do arquivo + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Apenas vídeo + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Amobs + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + You must enable multi-user mode to access this tab. + Você deve habilitar o modo multiusuário para acessar essa aba. + + src/app/settings/settings.component.ts + 48 + + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limita a quantidade de downloads simultâneos. Use -1 para ilimitado. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Número máximo de downloads simultâneos + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Allow autoplay + Permitir reprodução automática + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Restart server + Reiniciar servidor + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Generates NFO files with every download, primarily used by Kodi. + Gera arquivos NFO em todos os downloads, usado primariamente pelo Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Build date: + Data da compilação: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Close + Fechar + + src/app/components/downloads/downloads.component.ts + 241 + + + + Title + Título + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Pause all downloads + Pausar todos os downloads + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Show error + Mostrar erro + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Reiniciar + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Clear + Limpar + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Download for has been queued! + Download de foi adicionado à fila! + + src/app/main/main.component.ts + 469 + + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Com essa configuração ativada, se um único vídeo corresponder a uma categoria, a playlist inteira vai receber essa categoria. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Crop from (seconds) + Cortar de (segundos) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Database + Banco de dados + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Replace args + Substituir argumentos + + src/app/main/main.component.html + 116,117 + + Replace args + + + Crop file + Cortar arquivo + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Audio only + Apenas áudio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Randomize order when playing + Randomizar ordem ao reproduzir + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Resume + Resumir + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Allow playlist categorization + Permitir categorização de playlist + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Download rate limit + Taxa limite do download + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + Limita a taxa de seus downloads na quantidade especificada. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Watch content + Assistir conteúdo + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Enables a button to skip ads when viewing supported videos. + Habilita um botão para pular propagandas em vídeos suportados. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + Usar API SponsorBlock + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generate NFO files + Gerar arquivos NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Transfer DB to + Transferir banco de dados para + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + Informação do banco de dados não pôde ser obtida. Verifique os logs do servidor para mais informação. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Installation type: + Tipo de instalação: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Database location: + Localização do banco de dados: + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + Registros por tabela + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + String de conexão do MongoDB + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + Exemplo: + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + Testar string de conexão + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Commit hash: + Commitar hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Docker tag: + Tag Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Share file + Compartilhar arquivo + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + Criando download + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + Obtendo informações + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Baixando arquivo + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + Concluído + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Limpar downloads concluídos + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Você gostaria de limpar os downloads concluídos? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + Limpar + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Erro para + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + Copiar para a área de transferência + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + Copiado para a área de transferência! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Data + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Inscrição + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Progress + Progresso + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Ações + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Pause + Pausar + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Stage + Estágio + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Resume all downloads + Resumir todos os downloads + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Limpar downloads concluídos + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Adicionar à playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Pular propaganda + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + From 0fb4593dc380596a2d7afbec3d8e455af1fcf892 Mon Sep 17 00:00:00 2001 From: Maite Guix Date: Mon, 24 Jan 2022 10:10:10 +0000 Subject: [PATCH 070/212] Translated using Weblate (Catalan) Currently translated at 99.6% (301 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ca/ --- src/assets/i18n/messages.ca.xlf | 758 +++++++++++++++++++++++++------- 1 file changed, 603 insertions(+), 155 deletions(-) diff --git a/src/assets/i18n/messages.ca.xlf b/src/assets/i18n/messages.ca.xlf index 53e7aae..5637d0e 100644 --- a/src/assets/i18n/messages.ca.xlf +++ b/src/assets/i18n/messages.ca.xlf @@ -1,4 +1,4 @@ - + @@ -35,7 +35,7 @@ Settings - Paràmetres + Configuració src/app/app.component.html 28 @@ -57,7 +57,7 @@ Login - Inicia la sessió + Iniciar sessió src/app/app.component.html 44 @@ -83,7 +83,7 @@ Downloads - Baixades + Descàrregues src/app/app.component.html 46 @@ -101,7 +101,7 @@ Download - Baixa + Descarregar src/app/main/main.component.html 74,75 @@ -119,7 +119,7 @@ Use URL - Utilitza un URL + Utilitzar l'URL src/app/main/main.component.html 46 @@ -128,7 +128,7 @@ View - Visualitza + Veure src/app/main/main.component.html 50,51 @@ -146,7 +146,7 @@ Cancel - Cancel·la + Cancel·lar src/app/main/main.component.html 79,80 @@ -164,7 +164,7 @@ Use custom args - Utilitza arguments personalitzats + Utilitzar arguments personalitzats src/app/main/main.component.html 105,106 @@ -190,7 +190,7 @@ No need to include URL, just everything after. Args are delimited using two commas like so: ,, - No cal incloure l’URL, només tot el que hi ha després. Separeu els arguments amb dues comes: ,, + No cal incloure l’URL, només tot el que hi ha després. Separa els arguments amb dues comes: ,, src/app/main/main.component.html 113,114 @@ -199,7 +199,7 @@ Use custom output - Utilitza una sortida personalitzada + Utilitzar una sortida personalitzada src/app/main/main.component.html 121,122 @@ -242,7 +242,7 @@ Path is relative to the config download path. Don't include extension. - El camí és relatiu al camí de baixada de la configuració. No hi inclogueu l’extensió. + El camí és relatiu al camí de descàrrega de la configuració. No incloure l’extensió. src/app/main/main.component.html 128 @@ -272,7 +272,7 @@ Use authentication - Utilitza autenticació + Utilitzar l'autenticació src/app/main/main.component.html 135,136 @@ -307,7 +307,7 @@ Create a playlist - Crea una llista de reproducció + Crear una llista de reproducció src/app/create-playlist/create-playlist.component.html 1 @@ -382,7 +382,7 @@ Subscribe to playlist or channel - Subscriviu-vos a la llista o al canal + Subscriu-te a la llista de reproducció o al canal src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -404,7 +404,7 @@ The playlist or channel URL - L’URL de la llista o el canal + URL de la llista de reproducció o del canal src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -422,7 +422,7 @@ Download all uploads - Baixa totes les pujades + Descarregar tots els vídeos penjats src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -448,7 +448,7 @@ Audio-only mode - Mode només d’àudio + Mode de només àudio src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -461,7 +461,7 @@ Streaming-only mode - Mode només de transmissió + Mode de només transmissió src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -474,7 +474,7 @@ These are added after the standard args. - Aquestes s’afegeixen després dels arguments estàndards. + Aquests s’afegeixen després dels arguments estàndards. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -487,7 +487,7 @@ Custom file output - Sortida de fitxer personalitzada + Sortida de fitxer personalitzat src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -504,7 +504,7 @@ Cancel - Cancel·la + Cancel·lar src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -529,7 +529,7 @@ Subscribe - Subscriviu-vos + Subscriu-te src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -538,7 +538,7 @@ Download videos uploaded in the last - Baixeu els vídeos penjats a la darrera + Descarregar els vídeos penjats en els darrers src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -573,7 +573,7 @@ ID: - Id.: + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -590,7 +590,7 @@ Close - Tanca + Tancar src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -635,7 +635,7 @@ Export Archive - Exporta l’arxiu + Exportar el fitxer src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -644,7 +644,7 @@ Unsubscribe - Cancel·la la subscripció + Cancel·lar la subscripció src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -678,7 +678,7 @@ Archive: - Arxiu: + Fitxer: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -745,7 +745,7 @@ Modify youtube-dl args - Modifica arguments del youtube-dl + Modificar els arguments de descàrrega src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -754,7 +754,7 @@ Simulated new args - Arguments nous simulats + Arguments simulats nous src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -763,7 +763,7 @@ Add an arg - Afegeix un argument + Afegir un argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -772,7 +772,7 @@ Search by category - Cerca per categoria + Cercar per categoria src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -781,7 +781,7 @@ Use arg value - Utilitza el valor de l’argument + Utilitzar el valor de l’argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -790,7 +790,7 @@ Add arg - Afegeix un argument + Afegir un argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -799,7 +799,7 @@ Modify - Modifica + Modificar src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -826,7 +826,7 @@ Register a user - Registra un usuari + Registrar un usuari src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -844,7 +844,7 @@ Register - Registra + Registrar-se src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -857,7 +857,7 @@ Upload new cookies - Puja galetes noves + Pujar galetes noves src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -866,7 +866,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Tingueu en compte també que les galetes són de tota la instància i no per usuari. + NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Les galetes són per a tota la instància, no per usuari. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -884,7 +884,7 @@ Modify playlist - Modifica la llista de reproducció + Modificar la llista de reproducció src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -893,7 +893,7 @@ Add content - Afegeix contingut + Afegir contingut src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -902,7 +902,7 @@ Save - Desa + Desar src/app/dialogs/modify-playlist/modify-playlist.component.html 37 @@ -954,7 +954,7 @@ Search - Cerca + Cercar src/app/components/recent-videos/recent-videos.component.html 24 @@ -989,7 +989,7 @@ Paused - Pausat + En pausa src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -998,7 +998,7 @@ Editing category - Editant la categoria + Modificació de la categoria src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1016,7 +1016,7 @@ Add new rule - Afegeix una regla nova + Afegir una regla nova src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1025,7 +1025,7 @@ Download Twitch Chat - Baixa el xat del Twitch + Descarregar el xat de Twitch src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1034,7 +1034,7 @@ Edit - Edita + Editar src/app/file-card/file-card.component.html 19 @@ -1047,7 +1047,7 @@ Delete - Suprimeix + Eliminar src/app/file-card/file-card.component.html 20 @@ -1094,7 +1094,7 @@ Delete and blacklist - Suprimeix i afegeix a la llista negra + Eliminar i posar a la llista negra src/app/file-card/file-card.component.html 26 @@ -1125,7 +1125,7 @@ The download was successful - La baixada ha estat correcta + Descàrrega correcta src/app/download-item/download-item.component.html 8 @@ -1169,7 +1169,7 @@ Download start: - Inici de la baixada: + Inici de la descàrrega: src/app/download-item/download-item.component.html 32 @@ -1178,7 +1178,7 @@ Download end: - Final de la baixada: + Final de la descàrrega: src/app/download-item/download-item.component.html 35 @@ -1196,7 +1196,7 @@ Your subscriptions - Les vostres subscripcions + Les teves subscripcions src/app/subscriptions/subscriptions.component.html 3 @@ -1223,7 +1223,7 @@ Name not available. Channel retrieval in progress. - El nom no està disponible. S’està recuperant el canal. + El nom no està disponible. S'estan recuperant els canals. src/app/subscriptions/subscriptions.component.html 14 @@ -1250,7 +1250,7 @@ You have no playlist subscriptions. - No teniu cap subscripció a llistes de reproducció. + No tens cap subscripció a llistes de reproducció. src/app/subscriptions/subscriptions.component.html 43 @@ -1268,7 +1268,7 @@ Downloader - Baixador + Descarregador src/app/settings/settings.component.html 102 @@ -1348,7 +1348,7 @@ The desired port. Default is 17442. - El port desitjat. Per defecte és 17442. + Port desitjat. Per defecte 17442. src/app/settings/settings.component.html 25 @@ -1366,7 +1366,7 @@ Users base path - Ruta base dels usuaris + Camí base d'usuaris src/app/settings/settings.component.html 38 @@ -1375,7 +1375,7 @@ Base path for users and their downloaded videos. - Ruta base per als usuaris i els seus vídeos descarregats. + Camí base per als usuaris i els seus vídeos descarregats. src/app/settings/settings.component.html 39 @@ -1384,7 +1384,7 @@ Allow subscriptions - Permet les subscripcions + Permetre subscripcions src/app/settings/settings.component.html 48 @@ -1393,7 +1393,7 @@ Subscriptions base path - Ruta base de subscripcions + Camí base de subscripcions src/app/settings/settings.component.html 52 @@ -1402,7 +1402,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - Ruta base per als vídeos dels vostres canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material. + Camí base per als vídeos dels teus canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material. src/app/settings/settings.component.html 53 @@ -1420,7 +1420,7 @@ Unit is seconds, only include numbers. - La unitat és de segons, només inclou números. + La unitat és de segons, posa només números. src/app/settings/settings.component.html 59 @@ -1438,7 +1438,7 @@ Redownload fresh uploads - Torneu a descarregar les càrregues noves + Tornar a descarregar les pujades noves src/app/settings/settings.component.html 63 @@ -1465,7 +1465,7 @@ Allow theme change - Permet canviar el tema + Permetre canviar el tema src/app/settings/settings.component.html 80 @@ -1492,7 +1492,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - Camí de baixades només d’àudio. És relatiu a la carpeta arrel del YTDL-Material. + Camí de descàrregues de només àudio. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 110 @@ -1510,7 +1510,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - Camí de baixades de vídeo. És relatiu a la carpeta arrel del YTDL-Material. + Camí de descàrregues de vídeo. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 117 @@ -1519,7 +1519,7 @@ Default file output - Sortida de fitxer per defecte + Sortida de fitxer predeterminada src/app/settings/settings.component.html 123 @@ -1528,7 +1528,7 @@ Path is relative to the above download paths. Don't include extension. - La ruta és relativa a les rutes de descàrrega anteriors. No inclogueu l'extensió. + El camí és relatiu als camins de descàrrega anteriors. No incloguis l'extensió. src/app/settings/settings.component.html 126 @@ -1564,7 +1564,7 @@ Use youtube-dl archive - Utilitzeu l'arxiu youtube-dl + Utilitzar el fitxer youtube-dl src/app/settings/settings.component.html 163 @@ -1573,7 +1573,7 @@ Include thumbnail - Inclou la miniatura + Incloure la miniatura src/app/settings/settings.component.html 167 @@ -1582,7 +1582,7 @@ Include metadata - Inclou-hi metadades + Incloure metadades src/app/settings/settings.component.html 171 @@ -1591,7 +1591,7 @@ Kill all downloads - Finalitza totes les baixades + Finalitzar totes les descàrregues src/app/settings/settings.component.html 175 @@ -1609,7 +1609,7 @@ File manager enabled - Gestor de fitxers habilitat + Gestor de fitxers activat src/app/settings/settings.component.html 193 @@ -1618,7 +1618,7 @@ Downloads manager enabled - Gestor de descàrregues habilitat + Gestor de descàrregues activat src/app/settings/settings.component.html 196 @@ -1627,7 +1627,7 @@ Allow quality select - Permet seleccionar la qualitat + Permetre seleccionar la qualitat src/app/settings/settings.component.html 199 @@ -1636,7 +1636,7 @@ Download only mode - Mode de només baixades + Mode de només descàrrega src/app/settings/settings.component.html 202 @@ -1654,7 +1654,7 @@ Enable Public API - Habilita l'API pública + Activar API pública src/app/settings/settings.component.html 213 @@ -1672,7 +1672,7 @@ View documentation - Mostra la documentació + Veure la documentació src/app/settings/settings.component.html 219 @@ -1681,7 +1681,7 @@ This will delete your old API key! - Això suprimirà la vostra clau de l’API anterior. + Això eliminarà la teva clau API anterior! src/app/settings/settings.component.html 223 @@ -1690,7 +1690,7 @@ Generate - Genera + Generar src/app/settings/settings.component.html 223 @@ -1699,7 +1699,7 @@ Use YouTube API - Utilitza l’API del YouTube + Utilitzar l’API de YouTube src/app/settings/settings.component.html 232 @@ -1708,7 +1708,7 @@ Youtube API Key - Clau de l’API del YouTube + Clau API de YouTube src/app/settings/settings.component.html 236 @@ -1730,7 +1730,7 @@ Use Twitch API - Utilitza l’API del Twitch + Utilitzar l’API de Twitch src/app/settings/settings.component.html 241 @@ -1739,7 +1739,7 @@ Twitch API Key - Clau de l’API del Twitch + Clau API de Twitch src/app/settings/settings.component.html 248 @@ -1748,7 +1748,7 @@ Also known as a Client ID. - També coneguda com a identificador de client. + També coneguda com a ID de client. src/app/settings/settings.component.html 249 @@ -1757,7 +1757,7 @@ Auto-download Twitch Chat - Baixa automàticament el xat del Twitch + Descarregar automàticament el xat de Twitch src/app/settings/settings.component.html 244 @@ -1766,7 +1766,7 @@ Click here - Feu clic aquí + Fes clic aquí src/app/settings/settings.component.html 259 @@ -1783,7 +1783,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - per a baixar manualment l’extensió YouTubeDL-Material per al Chrome. + per a descarregar manualment l’extensió YouTubeDL-Material per a Chrome. src/app/settings/settings.component.html 259 @@ -1792,7 +1792,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - Heu de carregar manualment l'extensió i modificar la seva configuració per configurar l'URL de la interfície. + Has de carregar manualment l'extensió i modificar-ne la configuració per a definir l'URL de la interfície. src/app/settings/settings.component.html 260 @@ -1801,7 +1801,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - per instal·lar l'extensió oficial de YoutubeDL-Material per a Firefox directament des de la pàgina d'extensions de Firefox. + per a instal·lar l'extensió YoutubeDL-Material per a Firefox, directament des de la pàgina d'extensions de Firefox. src/app/settings/settings.component.html 265 @@ -1819,7 +1819,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - No cal gaire cosa, a part de canviar la configuració de l'extensió per establir l'URL de la interfície. + No cal gran cosa, només canviar la configuració de l'extensió per a establir l'URL de la interfície. src/app/settings/settings.component.html 266 @@ -1828,7 +1828,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - Arrossegueu l’enllaç següent als vostres adreces d'interès i ja podreu començar! Només cal que aneu al vídeo de YouTube que vulgueu baixar i feu clic al marcador. + Arrossega l’enllaç següent als teus marcadors i ja pots començar! Ara ves al vídeo de YouTube a descarregar i fes clic al marcador. src/app/settings/settings.component.html 271 @@ -1837,7 +1837,7 @@ Generate 'audio only' bookmarklet - Genera una miniaplicació «només d’àudio» + Generar un marcador «només àudio» src/app/settings/settings.component.html 272 @@ -1846,7 +1846,7 @@ Select a downloader - Seleccioneu un baixador + Seleccionar un descarregador src/app/settings/settings.component.html 287 @@ -1855,7 +1855,7 @@ Use default downloading agent - Utilitza l’agent de baixada per defecte + Utilitzar el descarregador predeterminat src/app/settings/settings.component.html 295 @@ -1864,7 +1864,7 @@ Select a download agent - Seleccioneu un agent de baixada + Seleccionar un descarregador src/app/settings/settings.component.html 299 @@ -1891,7 +1891,7 @@ Allow advanced download - Permet la baixada avançada + Permetre la descàrrega avançada src/app/settings/settings.component.html 336 @@ -1900,7 +1900,7 @@ Use Cookies - Utilitza les galetes + Utilitzar les galetes src/app/settings/settings.component.html 344 @@ -1909,7 +1909,7 @@ Set Cookies - Defineix les galetes + Configurar les galetes src/app/settings/settings.component.html 345 @@ -1918,7 +1918,7 @@ Allow user registration - Permet el registre d’usuaris + Permetre el registre d’usuaris src/app/settings/settings.component.html 359 @@ -1963,7 +1963,7 @@ Bind DN - DN de vinculació + DN d'enllaç src/app/settings/settings.component.html 380 @@ -1972,7 +1972,7 @@ Bind Credentials - Credencials de vinculació + Credencials d'enllaç src/app/settings/settings.component.html 385 @@ -1981,7 +1981,7 @@ Search Base - Base de Cerca + Base de cerques src/app/settings/settings.component.html 390 @@ -1990,7 +1990,7 @@ Search Filter - Filtre de cerca + Filtre de cerques src/app/settings/settings.component.html 395 @@ -2008,7 +2008,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - és un baixador de YouTube de codi obert construït segons les especificacions Material Design de Google. Podeu baixar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per a estar al dia amb les novetats. + és un descarregador de YouTube de codi obert construït segons les especificacions Material Design de Google. Pots descarregar sense problemes els vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure't als canals i llistes de reproducció preferits per a estar al dia amb les novetats. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2017,7 +2017,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - té algunes funcions increïbles incloses. Una àmplia API, assistència de Docker i suport de localització (traducció). Feu clic a la icona de GitHub de més amunt per llegir totes les funcions compatibles. + té algunes funcions increïbles incloses. Una API àmplia, assistència de Docker i suport de localització (traducció). Fes clic a la icona de GitHub de més amunt per a llegir totes les funcions compatibles. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2035,7 +2035,7 @@ Found a bug or have a suggestion? - Heu trobat un error o teniu un suggeriment? + Has trobat un error o tens un suggeriment? src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2044,7 +2044,7 @@ to create an issue! - per a crear un informe d’error. + per a crear un informe d’error! src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2053,7 +2053,7 @@ Checking for updates... - S’està comprovant si hi ha actualitzacions… + Comprovant actualitzacions… src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2062,7 +2062,7 @@ Update available - Hi ha una actualització disponible + Actualització disponible src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2071,7 +2071,7 @@ You can update from the settings menu. - Podeu actualitzar des del menú de paràmetres. + Pots actualitzar des del menú configuració. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2080,7 +2080,7 @@ Select a version: - Seleccioneu una versió: + Seleccionar una versió: src/app/updater/updater.component.html 3 @@ -2089,7 +2089,7 @@ Enable sharing - Activa la compartició + Activar la compartició src/app/dialogs/share-media-dialog/share-media-dialog.component.html 10 @@ -2098,7 +2098,7 @@ Use timestamp - Usa la marca de temps + Utilitzar la marca horària src/app/dialogs/share-media-dialog/share-media-dialog.component.html 13 @@ -2116,7 +2116,7 @@ Copy to clipboard - Copia al porta-retalls + Copiar al porta-retalls src/app/dialogs/share-media-dialog/share-media-dialog.component.html 24 @@ -2125,7 +2125,7 @@ Share playlist - Comparteix la llista + Compartir la llista de reproducció src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2179,7 +2179,7 @@ No downloads available! - No hi ha cap baixada disponible. + No hi ha cap descàrrega disponible! src/app/components/downloads/downloads.component.html 25 @@ -2188,7 +2188,7 @@ Your Profile - El vostre perfil + El teu perfil src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 1 @@ -2197,7 +2197,7 @@ Logout - Finalitza la sessió + Finalitzar la sessió src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2224,7 +2224,7 @@ You are not logged in. - No heu iniciat la sessió. + No has iniciat la sessió. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2233,7 +2233,7 @@ Create admin account - Crea un compte administratiu + Crear un compte d'administrador src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2242,7 +2242,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - No s’ha detectat cap compte administratiu per defecte. Això crearà i definirà la contrasenya d’un compte administratiu amb el nom d’usuari «admin». + No s’ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d’un compte d'administrador amb el nom d’usuari «admin». src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2251,7 +2251,7 @@ Create - Crea + Crear src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2260,7 +2260,7 @@ Add Users - Afegeix usuaris + Afegir usuaris src/app/components/modify-users/modify-users.component.html 90 @@ -2269,7 +2269,7 @@ Edit Role - Edita el rol + Modificar el rol src/app/components/modify-users/modify-users.component.html 95 @@ -2305,7 +2305,7 @@ Manage user - Gestiona l’usuari + Gestionar usuari src/app/components/modify-users/modify-users.component.html 70 @@ -2318,7 +2318,7 @@ Delete user - Suprimeix l’usuari + Eliminar usuari src/app/components/modify-users/modify-users.component.html 73 @@ -2327,7 +2327,7 @@ Edit user - Edita l’usuari + Modificar usuari src/app/components/modify-users/modify-users.component.html 66 @@ -2336,7 +2336,7 @@ User UID: - UID de l’usuari: + UID d’usuari: src/app/components/manage-user/manage-user.component.html 4 @@ -2354,7 +2354,7 @@ Set new password - Defineix una contrasenya nova + Definir una contrasenya nova src/app/components/manage-user/manage-user.component.html 10 @@ -2363,7 +2363,7 @@ Use role default - Utilitzeu el rol per defecte + Utilitzar el rol predeterminat src/app/components/manage-user/manage-user.component.html 19 @@ -2398,7 +2398,7 @@ Manage role - Gestiona el rol + Gestionar rol src/app/components/manage-role/manage-role.component.html 1 @@ -2416,7 +2416,7 @@ Clear logs - Esborra els registres + Eliminar registres src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2434,7 +2434,7 @@ Open file - Obre el fitxer + Obrir fitxer src/app/components/unified-file-card/unified-file-card.component.html 18 @@ -2443,7 +2443,7 @@ Open file in new tab - Obre el fitxer en una pestanya nova + Obrir fitxer en una pestanya nova src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2452,7 +2452,7 @@ Go to subscription - Vés a la subscripció + Anar a la subscripció src/app/components/unified-file-card/unified-file-card.component.html 25 @@ -2461,7 +2461,7 @@ Delete and redownload - Suprimeix i torna a baixar + Eliminar i tornar a descarregar src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2474,7 +2474,7 @@ Delete forever - Suprimeix per sempre + Eliminar permanentment src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2487,7 +2487,7 @@ See more. - Mostra’n més. + Veure més. src/app/components/see-more/see-more.component.html 5,6 @@ -2496,7 +2496,7 @@ See less. - Mostra’n menys. + Veure menys. src/app/components/see-more/see-more.component.html 8,9 @@ -2514,7 +2514,7 @@ Transfer DB to - Transfereix la BD a + Transferir la BD a src/app/settings/settings.component.html 308 @@ -2523,7 +2523,7 @@ Test connection string - Prova la cadena de connexió + Provar la cadena de connexió src/app/settings/settings.component.html 304 @@ -2532,7 +2532,7 @@ MongoDB Connection String - Cadena de connexió del MongoDB + Cadena de connexió MongoDB src/app/settings/settings.component.html 299 @@ -2541,7 +2541,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - Amb aquest paràmetre activat, si un sol vídeo coincideix amb alguna categoria, tota la llista de reproducció s’hi classificarà. + Amb aquesta opció activada, si un vídeo coincideix amb alguna categoria, tota la llista de reproducció es classificarà a la mateixa. src/app/settings/settings.component.html 158 @@ -2550,7 +2550,7 @@ Database information could not be retrieved. Check the server logs for more information. - No s’ha pogut recuperar la informació de la base de dades. Comproveu els registres del servidor per a conéixer-ne més detalls. + No s’ha pogut recuperar la informació de la base de dades. Comprova els registres del servidor per a més detalls. src/app/settings/settings.component.html 312 @@ -2559,7 +2559,7 @@ Randomize order when playing - Aleatoritza l’ordre en reproduir + Reproduir aleatòriament src/app/dialogs/modify-playlist/modify-playlist.component.html 13 @@ -2568,7 +2568,7 @@ Restart server - Reinicia el servidor + Reiniciar el servidor src/app/settings/settings.component.html 397 @@ -2604,7 +2604,7 @@ Allow playlist categorization - Permet la categorització de les llistes + Permetre la categorització de les llistes de reproducció src/app/settings/settings.component.html 158 @@ -2622,7 +2622,7 @@ Share file - Compartició del fitxer + Compartir fitxer src/app/dialogs/share-media-dialog/share-media-dialog.component.html 3 @@ -2631,7 +2631,7 @@ Crop to (seconds) - Escapça fins a (segons) + Escapçar fins a (segons) src/app/main/main.component.html 164 @@ -2640,7 +2640,7 @@ Crop from (seconds) - Escapça des de (segons) + Escapçar des de (segons) src/app/main/main.component.html 159 @@ -2649,13 +2649,461 @@ Crop file - Escapça el fitxer + Escapçar el fitxer src/app/main/main.component.html 155,156 Crop video checkbox + + Autoplay + Reproducció automàtica + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Substituir els arguments + + src/app/main/main.component.html + 116,117 + + Replace args + + + Both + Tots dos + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Audio only + Només àudio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + You must enable multi-user mode to access this tab. + Cal activar el mode multiusuari per a accedir a aquesta pestanya. + + src/app/settings/settings.component.ts + 48 + + + + Max concurrent downloads + Màxim de descàrregues simultànies + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Download rate limit + Límit de velocitat de descàrrega + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Generate NFO files + Generar fitxers NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Allow autoplay + Permetre la reproducció automàtica + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enables a button to skip ads when viewing supported videos. + Activar el botó per a saltar els anuncis quan es visualitzen vídeos compatibles. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Generates NFO files with every download, primarily used by Kodi. + Generar fitxers NFO amb cada descàrrega, utilitzats principalment per Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Docker tag: + Etiqueta Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Complete + Completat + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear + Netejar + + src/app/components/downloads/downloads.component.ts + 131 + + + + Copy to clipboard + Copiar al porta-retalls + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + Tancar + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + Copiat al porta-retalls! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Title + Títol + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + Subcripció + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Etapa + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Progrés + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Accions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Netejar + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pausa + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Watch content + Veure el contingut + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Mostrar error + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Reiniciar + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Commit hash: + Aplicar hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Creating download + Creant la descàrrega + + src/app/components/downloads/downloads.component.ts + 58 + + + + Build date: + Data de compilació: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Getting info + Obtenint informació + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Descarregant fitxer + + src/app/components/downloads/downloads.component.ts + 60 + + + + Clear finished downloads + Netejar les descàrregues finalitzades + + src/app/components/downloads/downloads.component.ts + 129 + + + + Resume + Reprendre + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause all downloads + Posar en pausa totes les descàrregues + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Clear finished downloads + Eliminar les descàrregues finalitzades + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Afegir a la llista de reproducció + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Saltar anunci + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Download for has been queued! + La descàrrega de s'ha posat a la cua! + + src/app/main/main.component.ts + 469 + + + + File type + Tipus de fitxer + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Només vídeo + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitar la quantitat de descàrregues que es poden fer simultàniament. Utilitzar -1 per a il·limitades. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Rate limits your downloads to the specified amount. Ex: 200K + Establir la velocitat màxima de descàrrega. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Use SponsorBlock API + Utilitzar API de SponsorBlock + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Installation type: + Tipus d'intal·lació: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Error for + Error a + + src/app/components/downloads/downloads.component.ts + 238 + + + + Date + Data + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Resume all downloads + Reprendre totes les descàrregues + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Would you like to clear your finished downloads? + Vols eliminar les descàrregues finalitzades? + + src/app/components/downloads/downloads.component.ts + 130 + + From 850a3ba12f454901cecac6f47df0e767dd23a122 Mon Sep 17 00:00:00 2001 From: Kachelkaiser Date: Sat, 29 Jan 2022 14:59:21 +0000 Subject: [PATCH 071/212] Translated using Weblate (German) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/de/ --- src/assets/i18n/messages.de.xlf | 339 +++++++++++++++++++++++++++++++- 1 file changed, 336 insertions(+), 3 deletions(-) diff --git a/src/assets/i18n/messages.de.xlf b/src/assets/i18n/messages.de.xlf index 343562b..a008658 100644 --- a/src/assets/i18n/messages.de.xlf +++ b/src/assets/i18n/messages.de.xlf @@ -2140,7 +2140,7 @@ Go to subscription - Zu den Abonnements gehen + Zu den Abonnements app/components/unified-file-card/unified-file-card.component.html 20 @@ -2149,7 +2149,7 @@ Open file in new tab - Datei in einer neuen Registerkarte öffnen + Datei in neuem Tab öffnen app/components/unified-file-card/unified-file-card.component.html 14 @@ -2248,7 +2248,7 @@ Search Base - Search Base + Suchbasis app/settings/settings.component.html 333 @@ -2813,6 +2813,339 @@ Allow autoplay setting + + Installation type: + Installationsart: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Title + Titel + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Complete + Vollständig + + src/app/components/downloads/downloads.component.ts + 61 + + + + Restart + Neustart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + Alle Downloads pausieren + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Close + Schließen + + src/app/components/downloads/downloads.component.ts + 241 + + + + Resume + Fortfahren + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + Inhalt ansehen + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Fehler anzeigen + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Enables a button to skip ads when viewing supported videos. + Fügt einen Knopf zum Überspringen von Werbung bei unterstützten Videos hinzu. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + SponsorBlock API benutzen + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + Erzeugt bei jedem Download NFO-Dateien, die hauptsächlich von Kodi verwendet werden. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + NFO-Dateien generieren + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Commit hash: + Commit-Hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Docker tag: + Docker-Tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Creating download + Erstelle Downloads + + src/app/components/downloads/downloads.component.ts + 58 + + + + Build date: + Builddatum: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Clear finished downloads + Fertige Downloads löschen + + src/app/components/downloads/downloads.component.ts + 129 + + + + Clear + Löschen + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Fehler für + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + In Zwischenablage kopieren + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + In Zwischenablage kopiert! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Datum + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Stufe + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Fortschritt + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Aktionen + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Leeren + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume all downloads + Alle Downloads fortsetzn + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Fertige Downloads löschen + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Getting info + Hole Infos + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Lade Datei herunter + + src/app/components/downloads/downloads.component.ts + 60 + + + + Would you like to clear your finished downloads? + Möchten Sie Ihre fertigen Downloads löschen? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Add to playlist + Zu Wiedergabeliste hinzufügen + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Werbung überspringen + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + From f305deadc78f0e6628453a74a961ea10de3085b5 Mon Sep 17 00:00:00 2001 From: Dawson Date: Fri, 4 Feb 2022 10:15:59 +0100 Subject: [PATCH 072/212] Added translation using Weblate (Hindi) --- src/assets/i18n/messages.hi.xlf | 3040 +++++++++++++++++++++++++++++++ 1 file changed, 3040 insertions(+) create mode 100644 src/assets/i18n/messages.hi.xlf diff --git a/src/assets/i18n/messages.hi.xlf b/src/assets/i18n/messages.hi.xlf new file mode 100644 index 0000000..29f68db --- /dev/null +++ b/src/assets/i18n/messages.hi.xlf @@ -0,0 +1,3040 @@ + + + + + + About + + + src/app/app.component.html + 32 + + About menu label + + + Profile + + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 67 + + Dark mode toggle label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 34 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Settings + + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + + + src/app/main/main.component.ts + 469 + + + + Only Audio + + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Autoplay + + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Cancel + + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Replace args + + + src/app/main/main.component.html + 116,117 + + Replace args + + + Custom args + + + src/app/main/main.component.html + 120 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + + + src/app/main/main.component.html + 123,124 + + Custom Args input hint + + + Use custom output + + + src/app/main/main.component.html + 131,132 + + Use custom output checkbox + + + Custom output + + + src/app/main/main.component.html + 135 + + Custom output placeholder + + + Documentation + + + src/app/main/main.component.html + 137 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 117 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 138 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Simulated command: + + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + + + src/app/main/main.component.html + 145,146 + + Use authentication checkbox + + + Username + + + src/app/main/main.component.html + 149 + + YT Username placeholder + + + Password + + + src/app/main/main.component.html + 154 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Crop from (seconds) + + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Create a playlist + + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 10 + + Subscription URL input placeholder + + + The playlist or channel URL + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 38 + + Register user button + + + Upload new cookies + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 487 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + File type + + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + No videos found. + + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button + + + Delete + + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete playlist + + + Info + + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + views + + + src/app/player/player.component.html + 16 + + View count label + + + The download was successful + + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + + src/app/subscriptions/subscriptions.component.html + 46 + + No playlist subscriptions text + + + You must enable multi-user mode to access this tab. + + + src/app/settings/settings.component.ts + 48 + + + + Main + + + src/app/settings/settings.component.html + 4 + + Main settings label + + + Downloader + + + src/app/settings/settings.component.html + 94 + + Downloader settings label + + + Extra + + + src/app/settings/settings.component.html + 198 + + Extra settings label + + + Database + + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Advanced + + + src/app/settings/settings.component.html + 339 + + Host settings label + + + Logs + + + src/app/settings/settings.component.html + 476 + + + src/app/settings/settings.component.html + 476 + + Logs settings label + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 11 + + URL setting input hint + + + Port + + + src/app/settings/settings.component.html + 16 + + Port input placeholder + + + The desired port. Default is 17442. + + + src/app/settings/settings.component.html + 17 + + Port setting input hint + + + Multi-user mode + + + src/app/settings/settings.component.html + 26 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 30 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 31 + + Users base path hint + + + Allow subscriptions + + + src/app/settings/settings.component.html + 40 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 44 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 45 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 50 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 51 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 64 + + Theme select label + + + Default + + + src/app/settings/settings.component.html + 66 + + Default theme label + + + Allow theme change + + + src/app/settings/settings.component.html + 72 + + Allow theme change setting + + + Language + + + src/app/settings/settings.component.html + 81 + + Language select label + + + Audio folder path + + + src/app/settings/settings.component.html + 101 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 102 + + Aduio path setting input hint + + + Video folder path + + + src/app/settings/settings.component.html + 108 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 109 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 115 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 118 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 125 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 126 + + Custom args setting input hint + + + Categories + + + src/app/settings/settings.component.html + 136 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Use youtube-dl archive + + + src/app/settings/settings.component.html + 158 + + Use youtubedl archive setting + + + Include thumbnail + + + src/app/settings/settings.component.html + 162 + + Include thumbnail setting + + + Include metadata + + + src/app/settings/settings.component.html + 166 + + Include metadata setting + + + Max concurrent downloads + + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Kill all downloads + + + src/app/settings/settings.component.html + 191 + + Kill all downloads button + + + Top title + + + src/app/settings/settings.component.html + 204 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 209 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 212 + + Downloads manager enabled setting + + + Allow quality select + + + src/app/settings/settings.component.html + 215 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 218 + + Download only mode setting + + + Allow autoplay + + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enable Public API + + + src/app/settings/settings.component.html + 229 + + Enable Public API key setting + + + Public API Key + + + src/app/settings/settings.component.html + 234 + + Public API Key setting placeholder + + + View documentation + + + src/app/settings/settings.component.html + 235 + + View API docs setting hint + + + This will delete your old API key! + + + src/app/settings/settings.component.html + 239 + + delete api key tooltip + + + Generate + + + src/app/settings/settings.component.html + 239 + + Generate key button + + + Use YouTube API + + + src/app/settings/settings.component.html + 248 + + Use YouTube API setting + + + Youtube API Key + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting placeholder + + + Generating a key is easy! + + + src/app/settings/settings.component.html + 253 + + + src/app/settings/settings.component.html + 265 + + Youtube API Key setting hint + + + Use Twitch API + + + src/app/settings/settings.component.html + 257 + + Use Twitch API setting + + + Twitch API Key + + + src/app/settings/settings.component.html + 264 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + + + src/app/settings/settings.component.html + 265 + + Twitch API Key setting hint AKA preamble + + + Enables a button to skip ads when viewing supported videos. + + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 260 + + Auto download Twitch Chat setting + + + Click here + + + src/app/settings/settings.component.html + 281 + + + src/app/settings/settings.component.html + 287 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 281 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 282 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 287 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 288 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 288 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 293 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 294 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Transfer DB to + + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Select a downloader + + + src/app/settings/settings.component.html + 345 + + Default downloader select label + + + Use default downloading agent + + + src/app/settings/settings.component.html + 354 + + Use default downloading agent setting + + + Select a download agent + + + src/app/settings/settings.component.html + 358 + + Custom downloader select label + + + Log Level + + + src/app/settings/settings.component.html + 372 + + Log Level label + + + Login expiration + + + src/app/settings/settings.component.html + 384 + + Login expiration select label + + + Allow advanced download + + + src/app/settings/settings.component.html + 395 + + Allow advanced downloading setting + + + Use Cookies + + + src/app/settings/settings.component.html + 403 + + Use cookies setting + + + Set Cookies + + + src/app/settings/settings.component.html + 404 + + Set cookies button + + + Restart server + + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Users + + + src/app/settings/settings.component.html + 425 + + Users settings label + + + Allow user registration + + + src/app/settings/settings.component.html + 431 + + Allow registration setting + + + Auth method + + + src/app/settings/settings.component.html + 435 + + Auth method select + + + Internal + + + src/app/settings/settings.component.html + 437 + + Internal auth method + + + LDAP + + + src/app/settings/settings.component.html + 440 + + LDAP auth method + + + LDAP URL + + + src/app/settings/settings.component.html + 447 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 452 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 457 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 462 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 467 + + Search Filter + + + About YoutubeDL-Material + + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Installation type: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Docker tag: + + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Your Profile + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Skip ad + + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Length: + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + From b46b9ea386e0b6aa83f5a6d805e55cdb7476a871 Mon Sep 17 00:00:00 2001 From: Joeri Colman Date: Tue, 8 Feb 2022 10:07:37 +0100 Subject: [PATCH 073/212] Added deleteAllFiles api endpoint --- Public API v1.yaml | 29 +++++++++++++++++++++++++++++ backend/app.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/Public API v1.yaml b/Public API v1.yaml index ad43d48..5768979 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -482,6 +482,26 @@ paths: description: OK security: - Auth query parameter: [] + /api/deleteAllFiles: + post: + tags: + - files + summary: Delete all downloaded files + operationId: post-api-deleteAllFiles + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteMp3Mp4Request' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteAllFilesResponse' + security: + - Auth query parameter: [] /api/downloadArchive: post: tags: @@ -1356,6 +1376,15 @@ components: type: boolean error: type: string + DeleteAllFilesResponse: + type: object + properties: + file_count: + type: number + description: Number of files found matching search parameters + delete_count: + type: number + description: Number of files removed DeleteSubscriptionFileRequest: required: - file diff --git a/backend/app.js b/backend/app.js index b12d502..7d46f16 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1616,6 +1616,46 @@ app.post('/api/deleteFile', optionalJwt, async (req, res) => { res.send(wasDeleted); }); +app.post('/api/deleteAllFiles', optionalJwt, async (req, res) => { + const blacklistMode = false; + const uuid = req.isAuthenticated() ? req.user.uid : null; + + let files = null; + let text_search = req.body.text_search; + let file_type_filter = req.body.file_type_filter; + + const filter_obj = {user_uid: uuid}; + const regex = true; + if (text_search) { + if (regex) { + filter_obj['title'] = {$regex: `.*${text_search}.*`, $options: 'i'}; + } else { + filter_obj['$text'] = { $search: utils.createEdgeNGrams(text_search) }; + } + } + + if (file_type_filter === 'audio_only') filter_obj['isAudio'] = true; + else if (file_type_filter === 'video_only') filter_obj['isAudio'] = false; + + files = await db_api.getRecords('files', filter_obj); + + let file_count = await db_api.getRecords('files', filter_obj, true); + let delete_count = 0; + + for (let i = 0; i < files.length; i++) { + let wasDeleted = false; + wasDeleted = await db_api.deleteFile(files[i].uid, uuid, blacklistMode); + if (wasDeleted) { + delete_count++; + } + } + + res.send({ + file_count: file_count, + delete_count: delete_count + }); +}); + app.post('/api/downloadFileFromServer', optionalJwt, async (req, res) => { let uid = req.body.uid; let uuid = req.body.uuid; From 8d88a14a119720036cf2856918cd9ec0aa393a18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 10:19:47 +0000 Subject: [PATCH 074/212] Bump ajv from 6.12.0 to 6.12.6 in /backend Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.0 to 6.12.6. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.0...v6.12.6) --- updated-dependencies: - dependency-name: ajv dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 6554427..b458ea5 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -162,9 +162,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", From 72af057a0e10d3b312024da3bb96311c73acffde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:18:23 +0000 Subject: [PATCH 075/212] Bump follow-redirects from 1.14.4 to 1.14.8 in /backend Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.4 to 1.14.8. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.4...v1.14.8) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 6554427..ea6a2aa 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1291,9 +1291,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "forever-agent": { "version": "0.6.1", From 084367cb50b3405bc602e750caf84e6d397110c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 13 Feb 2022 08:32:16 +0000 Subject: [PATCH 076/212] Translated using Weblate (English) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/en/ --- src/assets/i18n/messages.en.xlf | 35 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index da1b3d7..84d47e4 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -1,6 +1,6 @@ - - - + + + About @@ -234,7 +234,7 @@ Youtube-dl output template documentation link - Path is relative to the config download path. Don't include extension. + Path is relative to the config download path. Don't include extension. src/app/main/main.component.html 138 @@ -1349,7 +1349,8 @@ Allow subscriptions setting - Subscriptions base path + Base bath for subscriptions + Base bath for subscriptions src/app/settings/settings.component.html 44 @@ -1357,7 +1358,7 @@ Subscriptions base path input setting placeholder - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html 45 @@ -1437,7 +1438,7 @@ Audio folder path input placeholder - Path for audio only downloads. It is relative to YTDL-Material's root folder. + Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html 102 @@ -1453,7 +1454,7 @@ Video folder path input placeholder - Path for video downloads. It is relative to YTDL-Material's root folder. + Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html 109 @@ -1469,7 +1470,7 @@ Default file output placeholder - Path is relative to the above download paths. Don't include extension. + Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html 118 @@ -1785,7 +1786,7 @@ Chrome click here suffix - You must manually load the extension and modify the extension's settings to set the frontend URL. + You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html 282 @@ -1809,7 +1810,7 @@ Firefox setup prefix link - Not much is required other than changing the extension's settings to set the frontend URL. + Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html 288 @@ -1817,7 +1818,7 @@ Firefox setup suffix - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html 293 @@ -1825,7 +1826,7 @@ Bookmarklet instructions - Generate 'audio only' bookmarklet + Generate 'audio only' bookmarklet src/app/settings/settings.component.html 294 @@ -2049,7 +2050,7 @@ About dialog title - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2250,9 +2251,7 @@ - Error for + Error for src/app/components/downloads/downloads.component.ts 238 @@ -2476,7 +2475,7 @@ Create admin account dialog title - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 From c80670d0a3a9c99b14a04c1a4c9396fc9dacc86f Mon Sep 17 00:00:00 2001 From: Maite Guix Date: Sat, 12 Feb 2022 18:08:43 +0000 Subject: [PATCH 077/212] Translated using Weblate (Catalan) Currently translated at 99.6% (301 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ca/ --- src/assets/i18n/messages.ca.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/messages.ca.xlf b/src/assets/i18n/messages.ca.xlf index 5637d0e..91a3e6d 100644 --- a/src/assets/i18n/messages.ca.xlf +++ b/src/assets/i18n/messages.ca.xlf @@ -573,7 +573,7 @@ ID: - ID: + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 From 82321f28cdb18dfc7684395e6d88ed8adba1312e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 13 Feb 2022 08:28:26 +0000 Subject: [PATCH 078/212] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.5% (201 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nb_NO/ --- src/assets/i18n/messages.nb-NO.xlf | 335 +++++++++++++++++++++++++---- 1 file changed, 295 insertions(+), 40 deletions(-) diff --git a/src/assets/i18n/messages.nb-NO.xlf b/src/assets/i18n/messages.nb-NO.xlf index fdc2764..4f8218a 100644 --- a/src/assets/i18n/messages.nb-NO.xlf +++ b/src/assets/i18n/messages.nb-NO.xlf @@ -1,4 +1,4 @@ - + @@ -189,8 +189,8 @@ Custom args placeholder - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter inndeles med to komma, slik: ,, src/app/main/main.component.html 118,119 @@ -198,8 +198,8 @@ Custom Args input hint - Use custom output - + Use custom output + Bruk egendefinert utdata src/app/main/main.component.html 126,127 @@ -208,7 +208,7 @@ Custom output - + Egendefinert utdata src/app/main/main.component.html 130 @@ -680,7 +680,7 @@ (Paused) - + (Pauset) src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 1 @@ -772,7 +772,7 @@ Modify youtube-dl args - + Endre youtube-dl-argumenter src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -799,7 +799,7 @@ Search by category - + Søk etter kategori src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -808,7 +808,7 @@ Use arg value - + Bruk argument-verdi src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -817,7 +817,7 @@ Add arg - + Legg til argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -826,7 +826,7 @@ Modify - + Endre src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -835,7 +835,7 @@ Arg value - + Argument-verdi src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 68 @@ -1025,7 +1025,7 @@ Paused - + Pauset src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -1034,7 +1034,7 @@ Editing category - + Redigerer kategori src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1061,7 +1061,7 @@ Download Twitch Chat - + Last ned Twitch-sludring src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1165,7 +1165,7 @@ An error has occurred - + En feil oppstod src/app/download-item/download-item.component.html 9 @@ -1187,7 +1187,7 @@ An error has occurred: - + En feil har oppstått: src/app/download-item/download-item.component.html 27 @@ -1591,7 +1591,7 @@ Categories - + Kategorier src/app/settings/settings.component.html 144 @@ -1618,7 +1618,7 @@ Use youtube-dl archive - + Bruk youtube-dl-arkivet src/app/settings/settings.component.html 166 @@ -1645,7 +1645,7 @@ Kill all downloads - + Drep alle nedlastinger src/app/settings/settings.component.html 178 @@ -1708,7 +1708,7 @@ Enable Public API - + Skru på offentlig API src/app/settings/settings.component.html 216 @@ -1717,7 +1717,7 @@ Public API Key - + Nøkkel for offentlig API src/app/settings/settings.component.html 221 @@ -1735,7 +1735,7 @@ This will delete your old API key! - + Dette vil slette din gamle API-nøkkel. src/app/settings/settings.component.html 226 @@ -1771,7 +1771,7 @@ Generating a key is easy! - + Generering av nøkkel er enkelt. src/app/settings/settings.component.html 240 @@ -1802,7 +1802,7 @@ Also known as a Client ID. - + Også kjent som «klient-ID». src/app/settings/settings.component.html 252 @@ -1927,7 +1927,7 @@ Example: - + Eksempel: src/app/settings/settings.component.html 300 @@ -1944,8 +1944,8 @@ Test connection string button - Transfer DB to - + Transfer DB to + Overfør database til src/app/settings/settings.component.html 308 @@ -1963,7 +1963,7 @@ Select a downloader - + Velg en nedlaster src/app/settings/settings.component.html 326 @@ -1972,7 +1972,7 @@ Use default downloading agent - + Bruk forvalgt nedlastingsagent src/app/settings/settings.component.html 335 @@ -1981,7 +1981,7 @@ Select a download agent - + Velg en nedlastingsagent src/app/settings/settings.component.html 339 @@ -1990,7 +1990,7 @@ Log Level - + Loggføringsnivå src/app/settings/settings.component.html 353 @@ -1999,7 +1999,7 @@ Login expiration - + Innloggingsutløp src/app/settings/settings.component.html 365 @@ -2008,7 +2008,7 @@ Allow advanced download - + Tillat avansert nedlasting src/app/settings/settings.component.html 376 @@ -2026,7 +2026,7 @@ Set Cookies - + Sett kaker src/app/settings/settings.component.html 385 @@ -2053,7 +2053,7 @@ Auth method - + Identitetbekreftelsesmetode src/app/settings/settings.component.html 411 @@ -2062,7 +2062,7 @@ Internal - + Intern src/app/settings/settings.component.html 413 @@ -2152,7 +2152,7 @@ Installed version: - + Installert versjon: src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2480,7 +2480,7 @@ Use role default - + Bruk folleforvalg src/app/components/manage-user/manage-user.component.html 19 @@ -2629,6 +2629,261 @@ Video duration label + + Autoplay + Spill automatisk + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Erstatt argumenter + + src/app/main/main.component.html + 116,117 + + Replace args + + + Max concurrent downloads + Maks. samtidige nedlastinger + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Date + Dato + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Progress + Framdrift + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Handlinger + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Tøm + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + Fortsett + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Add to playlist + Legg til i spilleliste + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Resume all downloads + Fortsett alle nedlastinger + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Download for has been queued! + Nedlasting for har blitt lagt i kø. + + src/app/main/main.component.ts + 469 + + + + Both + Begge + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Skip ad + Hopp over reklame + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Video only + Kun video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + File type + Filtype + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Audio only + Kun lyd + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Show error + Vis feil + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Allow autoplay + Tillat automatisk avspilling + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Close + Lukk + + src/app/components/downloads/downloads.component.ts + 241 + + + + Installation type: + Installasjonstype: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Copy to clipboard + Kopier til utklippstavle + + src/app/components/downloads/downloads.component.ts + 240 + + + + Clear finished downloads + Tøm fullførte nedlastinger + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Copied to clipboard! + Kopiert til utklippstavlen. + + src/app/components/downloads/downloads.component.ts + 249 + + + + Pause all downloads + Sett alle nedlastinger på pause + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + Omstart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + From 1faabda5f0cf2b222fe2b8161a405e8d50c61107 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Mon, 14 Feb 2022 10:36:47 +0000 Subject: [PATCH 079/212] Translated using Weblate (Dutch) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nl/ --- src/assets/i18n/messages.nl.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 50b9369..3d6b59f 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -1,4 +1,4 @@ - + @@ -1392,7 +1392,7 @@ Allow subscriptions setting - Subscriptions base path + Base bath for subscriptions Abonnementenbasispad src/app/settings/settings.component.html From 2c49b6e260b3466a45801da9271795ffcb8e4d2e Mon Sep 17 00:00:00 2001 From: S3aBreeze Date: Thu, 17 Feb 2022 13:23:55 +0000 Subject: [PATCH 080/212] Translated using Weblate (Russian) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ru/ --- src/assets/i18n/messages.ru.xlf | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.ru.xlf b/src/assets/i18n/messages.ru.xlf index 7c74a11..98528a4 100644 --- a/src/assets/i18n/messages.ru.xlf +++ b/src/assets/i18n/messages.ru.xlf @@ -744,8 +744,8 @@ Allow subscriptions setting - Subscriptions base path - Базовый путь подписки + Base bath for subscriptions + Базовый путь для подписок app/settings/settings.component.html 72 @@ -3167,6 +3167,15 @@ Skip ad button + + Commit hash: + Хэш коммита: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + From 3dc03b3fa065a8574ca61190c7d0c5f86070b75f Mon Sep 17 00:00:00 2001 From: Maxime Leroy Date: Fri, 25 Feb 2022 06:06:54 +0000 Subject: [PATCH 081/212] Translated using Weblate (French) Currently translated at 99.6% (301 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/fr/ --- src/assets/i18n/messages.fr.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.fr.xlf b/src/assets/i18n/messages.fr.xlf index 8966147..f517f89 100644 --- a/src/assets/i18n/messages.fr.xlf +++ b/src/assets/i18n/messages.fr.xlf @@ -732,8 +732,8 @@ Allow subscriptions setting - Subscriptions base path - Chemin d'enregistrement des abonnements + Base bath for subscriptions + Chemin de base pour les abonnements app/settings/settings.component.html 72 From 9cb3b71b0f183816667c3eedb43dfbced53bb25b Mon Sep 17 00:00:00 2001 From: Maite Guix Date: Sun, 27 Feb 2022 17:09:50 +0000 Subject: [PATCH 082/212] Translated using Weblate (Catalan) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/ca/ --- src/assets/i18n/messages.ca.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/messages.ca.xlf b/src/assets/i18n/messages.ca.xlf index 91a3e6d..0093b91 100644 --- a/src/assets/i18n/messages.ca.xlf +++ b/src/assets/i18n/messages.ca.xlf @@ -1392,7 +1392,7 @@ Allow subscriptions setting - Subscriptions base path + Base bath for subscriptions Camí base de subscripcions src/app/settings/settings.component.html From a7c36898fabb480a0e884de2f940befcc53c6768 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Mar 2022 02:19:07 +0000 Subject: [PATCH 083/212] Bump karma from 5.0.9 to 6.3.16 Bumps [karma](https://github.com/karma-runner/karma) from 5.0.9 to 6.3.16. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v5.0.9...v6.3.16) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 612 +++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 200 insertions(+), 414 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10f4d52..8064c93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1882,6 +1882,12 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -1891,12 +1897,30 @@ "defer-to-connect": "^1.0.1" } }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, "@types/core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.3.tgz", "integrity": "sha512-F9RHpjuPSit4dCCRXgi7XcqA01DAjy9QY+v9yICoxXsjXD9cgQpyZyL2eSZnTkBGXGaQnea8waZOZTogLDB+rA==", "dev": true }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", @@ -2430,12 +2454,6 @@ "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -2616,12 +2634,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2832,12 +2844,6 @@ "object.assign": "^4.1.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2898,12 +2904,6 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2943,12 +2943,6 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", @@ -3705,24 +3699,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", @@ -4014,6 +3996,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -4399,9 +4391,9 @@ } }, "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", "dev": true }, "debug": { @@ -4902,86 +4894,53 @@ } }, "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" }, "dependencies": { "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, - "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - }, - "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true } } }, "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "@socket.io/base64-arraybuffer": "~1.0.2" } }, "enhanced-resolve": { @@ -6088,9 +6047,9 @@ } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "flush-write-stream": { @@ -6456,29 +6415,6 @@ } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6981,12 +6917,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -7416,9 +7346,9 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", "dev": true }, "isexe": { @@ -7763,92 +7693,74 @@ } }, "karma": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", - "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", "dev": true, "requires": { "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.4.0", + "chokidar": "^3.5.1", + "colors": "1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", - "flatted": "^2.0.2", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.15", - "log4js": "^6.2.1", - "mime": "^2.4.5", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^2.3.0", + "socket.io": "^4.2.0", "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "optional": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7859,41 +7771,44 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "is-glob": "^4.0.1" } }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "minimist": "^1.2.5" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } }, "source-map": { "version": "0.6.1", @@ -7909,52 +7824,6 @@ "requires": { "rimraf": "^3.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -8279,16 +8148,27 @@ } }, "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "dev": true, "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "loglevel": { @@ -9931,18 +9811,6 @@ } } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -11801,9 +11669,9 @@ "dev": true }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rgb-regex": { @@ -12537,100 +12405,55 @@ } }, "socket.io": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", - "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "dev": true, "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" + "ms": "2.1.2" } } } }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } } } }, @@ -13000,33 +12823,14 @@ "dev": true }, "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", "dev": true, "requires": { - "date-format": "^2.1.0", + "date-format": "^4.0.3", "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } + "fs-extra": "^10.0.0" } }, "string-width": { @@ -13444,12 +13248,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -13762,9 +13560,9 @@ "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==" }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, "uglify-js": { @@ -15437,12 +15235,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz", - "integrity": "sha512-tYOaldF/0BLfKuoA39QMwD4j2m8lq4DIncqj1yuNELX4vz9+z/ieG/vwmctjJce+boFHXstqhWnHSxc4W8f4qg==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -15495,12 +15287,6 @@ "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", diff --git a/package.json b/package.json index 9bfb0ca..0609e0d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "eslint": "^7.32.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", - "karma": "~5.0.0", + "karma": "~6.3.16", "karma-chrome-launcher": "~3.1.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "~3.0.2", From 1980893d9ce282c025e82925b1a2c06776967418 Mon Sep 17 00:00:00 2001 From: Guillermo Chavez Date: Sun, 20 Mar 2022 23:14:56 -0600 Subject: [PATCH 084/212] Add download video button on player component. --- src/api-types/models/DownloadFileRequest.ts | 2 ++ src/app/player/player.component.html | 1 + src/app/player/player.component.ts | 26 ++++++++++++++++++--- src/app/posts.services.ts | 6 +++-- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index 0986e59..31ba393 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -8,4 +8,6 @@ export interface DownloadFileRequest { uuid?: string; sub_id?: string; playlist_id?: string; + url?: string; + type?: string; } \ No newline at end of file diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index 04b907b..74c0b1b 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -33,6 +33,7 @@ + diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index fb40ed1..5fe3936 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -9,6 +9,7 @@ import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-m import { FileType } from '../../api-types'; import { TwitchChatComponent } from 'app/components/twitch-chat/twitch-chat.component'; import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; +import { HttpClient, HttpParams } from '@angular/common/http'; export interface IMedia { title: string; @@ -109,10 +110,9 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { } constructor(public postsService: PostsService, private route: ActivatedRoute, private dialog: MatDialog, private router: Router, - public snackBar: MatSnackBar, private cdr: ChangeDetectorRef) { + public snackBar: MatSnackBar, private cdr: ChangeDetectorRef, private http: HttpClient) { } - processConfig() { this.baseStreamPath = this.postsService.path; this.audioFolderPath = this.postsService.config['Downloader']['path-audio']; @@ -315,8 +315,10 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { downloadFile() { const filename = this.playlist[0].title; const ext = (this.playlist[0].type === 'audio/mp3') ? '.mp3' : '.mp4'; + const type = this.playlist[0].type; + const url = this.playlist[0].url; this.downloading = true; - this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id).subscribe(res => { + this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id, url, type).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, filename + ext); @@ -326,6 +328,24 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { }); } + downloadVideo() { + const filename = this.currentItem.label; + const ext = (this.currentItem.type === 'audio/mp3') ? '.mp3' : '.mp4'; + // const type = this.currentItem.type; + const url = this.currentItem.src; + this.downloading = true; + this.http.get(url, { + responseType: 'blob' + }).subscribe(res => { + const blob: Blob = res; + this.downloading = false; + saveAs(blob, filename + ext); + }, err => { + console.log(err); + this.downloading = false; + }) + } + playlistPostCreationHandler(playlistID) { // changes the route without moving from the current view or // triggering a navigation event diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 9be0841..f157d47 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -351,11 +351,13 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); } - downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null) { + downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null, url: string = null, type: string = null) { const body: DownloadFileRequest = { uid: uid, uuid: uuid, - sub_id: sub_id + sub_id: sub_id, + url: url, + type: type }; return this.http.post(this.path + 'downloadFile', body, {responseType: 'blob', params: this.httpOptions.params}); } From 033d0d0658395786995d4b2dce5baaf60a0cc0b6 Mon Sep 17 00:00:00 2001 From: Egor Bakanov <33174871+EgorBakanov@users.noreply.github.com> Date: Tue, 22 Mar 2022 13:16:13 +0700 Subject: [PATCH 085/212] Fixed file type dropdown margin --- src/app/components/recent-videos/recent-videos.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/recent-videos/recent-videos.component.html b/src/app/components/recent-videos/recent-videos.component.html index 5a8b889..fa2ba2a 100644 --- a/src/app/components/recent-videos/recent-videos.component.html +++ b/src/app/components/recent-videos/recent-videos.component.html @@ -47,7 +47,7 @@
-
+
File type @@ -62,4 +62,4 @@ [pageSizeOptions]="[5, 10, 25, 100, this.paged_data && this.paged_data.length > 100 ? this.paged_data.length : 250]">
-
\ No newline at end of file +
From 910ae90882352a0f5180de91fb1c5a37f1c68e37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Mar 2022 09:30:07 +0000 Subject: [PATCH 086/212] Bump node-fetch from 2.6.1 to 2.6.7 in /backend Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 28 +++++++++++++++++++++++++--- backend/package.json | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 4dae423..654fb27 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -2392,9 +2392,12 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-id3": { "version": "0.1.16", @@ -3261,6 +3264,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -3472,6 +3480,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index ef5d119..59999da 100644 --- a/backend/package.json +++ b/backend/package.json @@ -50,7 +50,7 @@ "moment": "^2.29.1", "mongodb": "^3.6.9", "multer": "^1.4.2", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "node-id3": "^0.1.14", "nodemon": "^2.0.7", "passport": "^0.4.1", From 699b3f5316f6afba9f082869cc61b83005a6c299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Mar 2022 09:30:37 +0000 Subject: [PATCH 087/212] Bump url-parse from 1.5.1 to 1.5.10 Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8064c93..8d29928 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13750,9 +13750,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", From 343a9bf70b64a0d140579a0ab60a10b373b185f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Mar 2022 09:32:46 +0000 Subject: [PATCH 088/212] Bump electron from 9.4.0 to 13.6.6 Bumps [electron](https://github.com/electron/electron) from 9.4.0 to 13.6.6. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v9.4.0...v13.6.6) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 44 ++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8064c93..d8f2eb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1633,15 +1633,15 @@ } }, "@electron/get": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.0.tgz", - "integrity": "sha512-+SjZhRuRo+STTO1Fdhzqnv9D2ZhjxXP6egsJ9kiO8dtP68cDx7dFCwWi64dlMQV7sWcfW1OYCW4wviEBzmRsfQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", + "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", "dev": true, "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", + "global-agent": "^3.0.0", "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", "progress": "^2.0.3", @@ -3026,9 +3026,9 @@ "dev": true }, "boolean": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", - "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "dev": true, "optional": true }, @@ -4808,14 +4808,22 @@ "dev": true }, "electron": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-9.4.0.tgz", - "integrity": "sha512-hOC4q0jkb+UDYZRy8vrZ1IANnq+jznZnbkD62OEo06nU+hIbp2IrwDRBNuSLmQ3cwZMVir0WSIA1qEVK0PkzGA==", + "version": "13.6.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.6.tgz", + "integrity": "sha512-TP2Bl1nTxaH1yRmlYiF7imzvKE/NASE0cl6wOYA3AaP/UrBGc4L3NwJfn5Z55o+1t4TH8vCRxENufESyb32HhA==", "dev": true, "requires": { "@electron/get": "^1.0.1", - "@types/node": "^12.0.12", + "@types/node": "^14.6.2", "extract-zip": "^1.0.3" + }, + "dependencies": { + "@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "dev": true + } } }, "electron-to-chromium": { @@ -6267,14 +6275,13 @@ } }, "global-agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz", - "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "optional": true, "requires": { "boolean": "^3.0.1", - "core-js": "^3.6.5", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", @@ -6282,13 +6289,6 @@ "serialize-error": "^7.0.1" }, "dependencies": { - "core-js": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", - "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==", - "dev": true, - "optional": true - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", diff --git a/package.json b/package.json index 0609e0d..de0bb1a 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", "codelyzer": "^6.0.0", - "electron": "^9.4.0", + "electron": "^13.6.6", "eslint": "^7.32.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", From b6399eb876379820ce9466ccb2cec8d3392e692e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Mar 2022 13:21:08 +0000 Subject: [PATCH 089/212] Bump follow-redirects from 1.13.0 to 1.14.9 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.13.0 to 1.14.9. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.13.0...v1.14.9) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23c1d73..d2d32cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6071,9 +6071,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "for-in": { From b76a7f2e434de4f016dad2806d1c3048d5201f9a Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Fri, 25 Mar 2022 11:09:54 +0100 Subject: [PATCH 090/212] Update README to highlight usage of nightlies... ... and best practices with large datasets. --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 94d09f1..ce8d1a7 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.gi Now with [Docker](#Docker) support! +
+ +### USAGE OF THE NIGHTLY BUILDS IS HIGHLY RECOMMENDED. + +For much better scaling with large datasets please run your YTDL-M instance with a MongoDB backend rather than the json file-based default. +It will fix a lot of performance problems (especially with datasets in the tens of thousands videos/audios)! +The (closed) issues as well as the project's Wiki will give you good starting points for your journey with YTDL-M. + +
+ ## Getting Started Check out the prerequisites, and go to the installation section. Easy as pie! From d4ef7066df9ae6a7847889c3d2933981ef75d1d9 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Fri, 25 Mar 2022 11:17:37 +0100 Subject: [PATCH 091/212] Update README to include legal disclaimer and one small change in the notice about best practices. (because I'm forgetful ok) --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ce8d1a7..588d8f3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Now with [Docker](#Docker) support! For much better scaling with large datasets please run your YTDL-M instance with a MongoDB backend rather than the json file-based default. It will fix a lot of performance problems (especially with datasets in the tens of thousands videos/audios)! -The (closed) issues as well as the project's Wiki will give you good starting points for your journey with YTDL-M. +The (closed) issues as well as the project's Wiki will give you good starting points for your journey!
@@ -150,6 +150,10 @@ See also the list of [contributors](https://github.com/Tzahi12345/YoutubeDL-Mate This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details +## Legal Disclaimer + +This project is in no way affiliated with Google LLC, Alphabet Inc. or YouTube (or their subsidiaries) nor endorsed by them. + ## Acknowledgments * youtube-dl From 8456accda0a3fc6954660eaed59a7513b79f62d6 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Fri, 25 Mar 2022 13:26:57 +0100 Subject: [PATCH 092/212] Adding link to MongoDB transfer guide in README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 588d8f3..15b12b8 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ For much better scaling with large datasets please run your YTDL-M instance with It will fix a lot of performance problems (especially with datasets in the tens of thousands videos/audios)! The (closed) issues as well as the project's Wiki will give you good starting points for your journey! +For MongoDB specifically there is [this little guide](https://github.com/Tzahi12345/YoutubeDL-Material/wiki/Setting-a-MongoDB-backend-to-use-as-database-provider-for-YTDL-M). +
## Getting Started From f1a7986e7aca97f9edf23453c4f47ea84e9fe236 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Fri, 8 Apr 2022 19:17:14 +0200 Subject: [PATCH 093/212] Made Global custom args hint clearer. (scope: EN) --- src/app/settings/settings.component.html | 2 +- src/assets/i18n/messages.en.xlf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index e7e0223..13195c7 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -130,7 +130,7 @@
- Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,,
diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index 99e0f16..eae985d 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -1435,7 +1435,7 @@ Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, src/app/settings/settings.component.html 134 From 7d3079f042bf37433c238110444a7dca4b344a96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 07:19:13 +0000 Subject: [PATCH 094/212] Bump moment from 2.29.1 to 2.29.2 in /backend Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 6 +++--- backend/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 654fb27..eafeb41 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -2237,9 +2237,9 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", + "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" }, "mongodb": { "version": "3.6.9", diff --git a/backend/package.json b/backend/package.json index 59999da..d30ded2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -47,7 +47,7 @@ "md5": "^2.2.1", "merge-files": "^0.1.2", "mocha": "^8.4.0", - "moment": "^2.29.1", + "moment": "^2.29.2", "mongodb": "^3.6.9", "multer": "^1.4.2", "node-fetch": "^2.6.7", From 80aba6b4a71e3e2f596f6d1a4a9baacc84ba6ccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 09:38:56 +0000 Subject: [PATCH 095/212] Bump minimist from 1.2.5 to 1.2.6 in /backend Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index eafeb41..d282165 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -2147,9 +2147,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp": { "version": "0.5.4", From d15709008cc285df748710442d854720e459e248 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 09:38:59 +0000 Subject: [PATCH 096/212] Bump ansi-regex from 3.0.0 to 3.0.1 in /backend Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/chalk/ansi-regex/releases) - [Commits](https://github.com/chalk/ansi-regex/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: ansi-regex dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index eafeb41..8b95d23 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -198,9 +198,9 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" }, "ansi-styles": { "version": "4.3.0", @@ -682,9 +682,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.0", @@ -3125,9 +3125,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "emoji-regex": { "version": "8.0.0", @@ -3163,6 +3163,13 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + } } }, "strip-final-newline": { @@ -3510,11 +3517,6 @@ "string-width": "^1.0.2 || 2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3599,9 +3601,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.0", From 478d0c8fad3fe0257743de76cd113d19daca8a39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 09:39:19 +0000 Subject: [PATCH 097/212] Bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2d32cd..bd536f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8560,9 +8560,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "3.1.3", From 9e35e0fe4ded1cced51525c205a231960b419b99 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 17 Apr 2022 21:15:52 +0200 Subject: [PATCH 098/212] Switch to alpine edge community repo for ffmpeg --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ead755e..cca8764 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,13 +26,14 @@ ENV NO_UPDATE_NOTIFIER=true RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID RUN apk add --no-cache \ - ffmpeg \ npm \ python2 \ python3 \ su-exec \ && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ atomicparsley + && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \ + ffmpeg WORKDIR /app COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] From f11baf6d4b3ae3c650bfcad14fa76fe67497bdc6 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 17 Apr 2022 21:38:01 +0200 Subject: [PATCH 099/212] fix missing \ in DOCKEFILE --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cca8764..eb36428 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,7 @@ RUN apk add --no-cache \ python3 \ su-exec \ && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley + atomicparsley \ && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \ ffmpeg From de79efafa61dcb8a237a89b1eecf870309603e46 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 17 Apr 2022 23:46:08 +0200 Subject: [PATCH 100/212] try to fix ffmpeg install from edge --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index eb36428..28d3d47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,15 +25,16 @@ ENV NO_UPDATE_NOTIFIER=true RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID +RUN apk -UvX http://dl-cdn.alpinelinux.org/alpine/edge/community/ add -u\ + ffmpeg + RUN apk add --no-cache \ npm \ python2 \ python3 \ su-exec \ && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \ - ffmpeg + atomicparsley WORKDIR /app COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] From 74f5a9983dc5a4a4aa39b5a0b6bafa494182a36f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 18 Apr 2022 01:56:16 +0200 Subject: [PATCH 101/212] revert ffmpeg changees --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 28d3d47..ead755e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,10 +25,8 @@ ENV NO_UPDATE_NOTIFIER=true RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID -RUN apk -UvX http://dl-cdn.alpinelinux.org/alpine/edge/community/ add -u\ - ffmpeg - RUN apk add --no-cache \ + ffmpeg \ npm \ python2 \ python3 \ From 2b1771d30d7562945208e1df5ef12b8cc9dc5252 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 17 Apr 2022 23:37:47 -0400 Subject: [PATCH 102/212] Began work on tasks --- backend/db.js | 72 +++++++++++++++++++++++++-- backend/tasks.js | 112 ++++++++++++++++++++++++++++++++++++++++++ backend/test/tests.js | 91 +++++++++++++++++++++++++++++++++- backend/utils.js | 7 +++ 4 files changed, 278 insertions(+), 4 deletions(-) create mode 100644 backend/tasks.js diff --git a/backend/db.js b/backend/db.js index 18f9064..af51a4e 100644 --- a/backend/db.js +++ b/backend/db.js @@ -300,6 +300,7 @@ exports.getFileDirectoriesAndDBs = async () => { } exports.importUnregisteredFiles = async () => { + const imported_files = []; const dirs_to_check = await exports.getFileDirectoriesAndDBs(); // run through check list and check each file to see if it's missing from the db @@ -316,12 +317,17 @@ exports.importUnregisteredFiles = async () => { const file_is_registered = !!(files_with_same_url.find(file_with_same_url => path.resolve(file_with_same_url.path) === path.resolve(file.path))); if (!file_is_registered) { // add additional info - await exports.registerFileDB(file['path'], dir_to_check.type, dir_to_check.user_uid, null, dir_to_check.sub_id, null); - logger.verbose(`Added discovered file to the database: ${file.id}`); + const file_obj = await exports.registerFileDB(file['path'], dir_to_check.type, dir_to_check.user_uid, null, dir_to_check.sub_id, null); + if (file_obj) { + imported_files.push(file_obj['uid']); + logger.verbose(`Added discovered file to the database: ${file.id}`); + } else { + logger.error(`Failed to import ${file['path']} automatically.`); + } } } } - + return imported_files; } exports.addMetadataPropertyToDB = async (property_key) => { @@ -744,6 +750,66 @@ exports.removeRecord = async (table, filter_obj) => { return !!(output['result']['ok']); } +// exports.removeRecordsByUIDBulk = async (table, uids) => { +// // local db override +// if (using_local_db) { +// applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); +// return true; +// } + +// const table_collection = database.collection(table); + +// let bulk = table_collection.initializeOrderedBulkOp(); // Initialize the Ordered Batch + +// const item_ids_to_remove = + +// for (let i = 0; i < item_ids_to_update.length; i++) { +// const item_id_to_update = item_ids_to_update[i]; +// bulk.find({[key_label]: item_id_to_update }).updateOne({ +// "$set": update_obj[item_id_to_update] +// }); +// } + +// const output = await bulk.execute(); +// return !!(output['result']['ok']); +// } + + +exports.findDuplicatesByKey = async (table, key) => { + let duplicates = []; + if (using_local_db) { + // this can probably be optimized + const all_records = await exports.getRecords(table); + const existing_records = {}; + for (let i = 0; i < all_records.length; i++) { + const record = all_records[i]; + const value = record[key]; + + if (existing_records[value]) { + duplicates.push(record); + } + + existing_records[value] = true; + } + return duplicates; + } + + const duplicated_values = await database.collection(table).aggregate([ + {"$group" : { "_id": `$${key}`, "count": { "$sum": 1 } } }, + {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, + {"$project": {[key] : "$_id", "_id" : 0} } + ]).toArray(); + + for (let i = 0; i < duplicated_values.length; i++) { + const duplicated_value = duplicated_values[i]; + const duplicated_records = await exports.getRecords(table, duplicated_value, false); + if (duplicated_records.length > 1) { + duplicates = duplicates.concat(duplicated_records.slice(1, duplicated_records.length)); + } + } + return duplicates; +} + exports.removeAllRecords = async (table = null, filter_obj = null) => { // local db override const tables_to_remove = table ? [table] : tables_list; diff --git a/backend/tasks.js b/backend/tasks.js new file mode 100644 index 0000000..e928725 --- /dev/null +++ b/backend/tasks.js @@ -0,0 +1,112 @@ +const utils = require('./utils'); +const db_api = require('./db'); + +const fs = require('fs-extra'); +const logger = require('./logger'); + +const TASKS = { + backup_local_db: { + run: utils.backupLocalDB, + title: 'Backup Local DB', + }, + missing_files_check: { + run: checkForMissingFiles, + confirm: deleteMissingFiles, + title: 'Missing files check' + }, + missing_db_records: { + run: db_api.importUnregisteredFiles, + title: 'Import missing DB records' + }, + duplicate_files_check: { + run: checkForDuplicateFiles, + confirm: removeDuplicates, + title: 'Find duplicate files in DB' + } +} + +exports.initialize = async () => { + const tasks_keys = Object.keys(TASKS); + for (let i = 0; i < tasks_keys.length; i++) { + const task_key = tasks_keys[i]; + const task_in_db = await db_api.getRecord('tasks', {key: task_key}); + if (!task_in_db) { + await db_api.insertRecordIntoTable('tasks', { + key: task_key, + last_ran: null, + last_confirmed: null, + running: false, + confirming: false, + data: null, + error: null + }); + } + } +} + +exports.executeTask = async (task_key) => { + if (!TASKS[task_key]) { + logger.error(`Task ${task_key} does not exist!`); + return; + } + logger.verbose(`Executing task ${task_key}`); + await exports.executeRun(task_key); + if (!TASKS[task_key]['confirm']) return; + await exports.executeConfirm(task_key); + logger.verbose(`Finished executing ${task_key}`); +} + +exports.executeRun = async (task_key) => { + await db_api.updateRecord('tasks', {key: task_key}, {running: true}); + const data = await TASKS[task_key].run(); + await db_api.updateRecord('tasks', {key: task_key}, {data: data, last_ran: Date.now()/1000, running: false}); +} + +exports.executeConfirm = async (task_key) => { + if (!TASKS[task_key]['confirm']) { + return null; + } + await db_api.updateRecord('tasks', {key: task_key}, {confirming: true}); + const task_obj = await db_api.getRecord('tasks', {key: task_key}); + const data = task_obj['data']; + await TASKS[task_key].confirm(data); + await db_api.updateRecord('tasks', {key: task_key}, {confirming: false, last_confirmed: Date.now()/1000}); +} + +// missing files check + +async function checkForMissingFiles() { + const missing_files = []; + const all_files = await db_api.getRecords('files'); + for (let i = 0; i < all_files.length; i++) { + const file_to_check = all_files[i]; + const file_exists = fs.existsSync(file_to_check['path']); + if (!file_exists) missing_files.push(file_to_check['uid']); + } + return {uids: missing_files}; +} + +async function deleteMissingFiles(data) { + const uids = data['uids']; + for (let i = 0; i < uids.length; i++) { + const uid = uids[i]; + await db_api.removeRecord('files', {uid: uid}); + } +} + +// duplicate files check + +async function checkForDuplicateFiles() { + const duplicate_files = await db_api.findDuplicatesByKey('files', 'path'); + const duplicate_uids = duplicate_files.map(duplicate_file => duplicate_file['uid']); + if (duplicate_uids && duplicate_uids.length > 0) { + return {uids: duplicate_uids}; + } + return {uids: []}; +} + +async function removeDuplicates(data) { + for (let i = 0; i < data['uids'].length; i++) { + await db_api.removeRecord('files', {uid: data['uids'][i]}); + } +} \ No newline at end of file diff --git a/backend/test/tests.js b/backend/test/tests.js index c52fa13..7856f28 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -83,12 +83,37 @@ describe('Database', async function() { await db_api.removeAllRecords('test'); }); it('Add and read record', async function() { + this.timeout(120000); await db_api.insertRecordIntoTable('test', {test_add: 'test', test_undefined: undefined, test_null: undefined}); const added_record = await db_api.getRecord('test', {test_add: 'test', test_undefined: undefined, test_null: null}); assert(added_record['test_add'] === 'test'); await db_api.removeRecord('test', {test_add: 'test'}); }); + it('Find duplicates by key', async function() { + const test_duplicates = [ + { + test: 'testing', + key: '1' + }, + { + test: 'testing', + key: '2' + }, + { + test: 'testing_missing', + key: '3' + }, + { + test: 'testing', + key: '4' + } + ]; + await db_api.insertRecordsIntoTable('test', test_duplicates); + const duplicates = await db_api.findDuplicatesByKey('test', 'test'); + console.log(duplicates); + }); + it('Update record', async function() { await db_api.insertRecordIntoTable('test', {test_update: 'test'}); await db_api.updateRecord('test', {test_update: 'test'}, {added_field: true}); @@ -122,6 +147,7 @@ describe('Database', async function() { }); it('Bulk add', async function() { + this.timeout(120000); const NUM_RECORDS_TO_ADD = 2002; // max batch ops is 1000 const test_records = []; for (let i = 0; i < NUM_RECORDS_TO_ADD; i++) { @@ -291,7 +317,6 @@ describe('Multi User', async function() { describe('Downloader', function() { const downloader_api = require('../downloader'); - downloader_api.initialize(db_api); const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; const sub_id = 'dc834388-3454-41bf-a618-e11cb8c7de1c'; const options = { @@ -348,5 +373,69 @@ describe('Downloader', function() { const sample_json = fs.readJSONSync('./test/sample.info.json'); downloader_api.generateNFOFile(sample_json, nfo_file_path); assert(fs.existsSync(nfo_file_path), true); + fs.unlinkSync(nfo_file_path); }); }); + +describe('Tasks', function() { + const tasks_api = require('../tasks'); + beforeEach(async function() { + await db_api.connectToDB(); + await db_api.removeAllRecords('tasks'); + await tasks_api.initialize(); + }); + it('Backup local db', async function() { + const backups_original = await utils.recFindByExt('appdata', 'bak'); + const original_length = backups_original.length; + await tasks_api.executeTask('backup_local_db'); + const backups_new = await utils.recFindByExt('appdata', 'bak'); + const new_length = backups_new.length; + assert(original_length, new_length-1); + }); + + it('Check for missing files', async function() { + await db_api.removeAllRecords('files', {uid: 'test'}); + const test_missing_file = {uid: 'test', path: 'test/missing_file.mp4'}; + await db_api.insertRecordIntoTable('files', test_missing_file); + await tasks_api.executeTask('missing_files_check'); + const task_obj = await db_api.getRecord('tasks', {key: 'missing_files_check'}); + assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); + }); + + it('Check for duplicate files', async function() { + this.timeout(300000); + await db_api.removeAllRecords('files', {uid: 'test1'}); + await db_api.removeAllRecords('files', {uid: 'test2'}); + const test_duplicate_file1 = {uid: 'test1', path: 'test/missing_file.mp4'}; + const test_duplicate_file2 = {uid: 'test2', path: 'test/missing_file.mp4'}; + const test_duplicate_file3 = {uid: 'test3', path: 'test/missing_file.mp4'}; + await db_api.insertRecordIntoTable('files', test_duplicate_file1); + await db_api.insertRecordIntoTable('files', test_duplicate_file2); + await db_api.insertRecordIntoTable('files', test_duplicate_file3); + await tasks_api.executeTask('duplicate_files_check'); + const task_obj = await db_api.getRecord('tasks', {key: 'duplicate_files_check'}); + const duplicated_record_count = await db_api.getRecords('files', {path: 'test/missing_file.mp4'}, true); + assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); + assert(duplicated_record_count == 1, true); + }); + + it('Import unregistered files', async function() { + this.timeout(300000); + + // pre-test cleanup + await db_api.removeAllRecords('files', {title: 'Sample File'}); + if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); + if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + + // copies in files + fs.copyFileSync('test/sample.info.json', 'video/sample.info.json'); + fs.copyFileSync('test/sample.mp4', 'video/sample.mp4'); + await tasks_api.executeTask('missing_db_records'); + const imported_file = await db_api.getRecord('files', {title: 'Sample File'}); + assert(!!imported_file, true); + + // post-test cleanup + if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); + if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + }); +}); \ No newline at end of file diff --git a/backend/utils.js b/backend/utils.js index 137274d..340a214 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -266,6 +266,12 @@ function getCurrentDownloader() { return details_json['downloader']; } +async function backupLocalDB() { + const path_to_backups = path.join('appdata', 'db_backup'); + fs.ensureDir(path_to_backups); + await fs.copyFile('appdata/local_db.json', path.join(path_to_backups, `local_db.json.${Date.now()/1000}.bak`)); +} + async function recFindByExt(base,ext,files,result) { files = files || (await fs.readdir(base)) @@ -390,6 +396,7 @@ module.exports = { getMatchingCategoryFiles: getMatchingCategoryFiles, addUIDsToCategory: addUIDsToCategory, getCurrentDownloader: getCurrentDownloader, + backupLocalDB: backupLocalDB, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, formatDateString: formatDateString, From a4d421d398f19ab792341c53a5234bc57b9e38be Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 18 Apr 2022 05:54:01 +0200 Subject: [PATCH 103/212] add downloader script for JVS's ffmpeg master blds --- ffmpeg-from-master.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ffmpeg-from-master.sh diff --git a/ffmpeg-from-master.sh b/ffmpeg-from-master.sh new file mode 100644 index 0000000..ba8e304 --- /dev/null +++ b/ffmpeg-from-master.sh @@ -0,0 +1,15 @@ +#!/bin/sh +case $(uname -m) in + x86_64) + ARCH=amd64;; + aarch64) + ARCH=arm64;; + armv7) + ARCH=armel;; + armv7l) + ARCH=armel;; + *) + ARCH=$(uname -m);; +esac +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$ARCH-static.tar.xz" -O ffmpeg.txz +docker build \ No newline at end of file From f79b254040e6c9b4b414db602ebebb31292dd464 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 18 Apr 2022 07:29:28 +0200 Subject: [PATCH 104/212] using more recent ffmpeg + code cleanup --- .dockerignore | 7 +++++++ .gitignore | 8 ++++++++ Dockerfile | 8 +++++++- docker-build.sh | 30 ++++++++++++++++++++++++++++++ docker-compose.yml | 3 +++ ffmpeg-from-master.sh | 15 --------------- 6 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 .dockerignore create mode 100644 docker-build.sh delete mode 100644 ffmpeg-from-master.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3366092 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +db +appdata +audio +video +subscriptions +users \ No newline at end of file diff --git a/.gitignore b/.gitignore index 44fa9c2..e0af431 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,11 @@ backend/users/* backend/appdata/cookies.txt backend/public src/assets/i18n/*.json + +# User Files +db/ +appdata/ +audio/ +video/ +subscriptions/ +users/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ead755e..0452eed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,8 @@ +FROM alpine:latest AS ffmpeg + +COPY docker-build.sh . +RUN sh ./docker-build.sh + FROM alpine:latest as frontend RUN apk add --no-cache \ @@ -26,7 +31,6 @@ ENV NO_UPDATE_NOTIFIER=true RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID RUN apk add --no-cache \ - ffmpeg \ npm \ python2 \ python3 \ @@ -35,6 +39,8 @@ RUN apk add --no-cache \ atomicparsley WORKDIR /app +COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg +COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 RUN npm install pm2 -g diff --git a/docker-build.sh b/docker-build.sh new file mode 100644 index 0000000..63ff0c0 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# THANK YOU TALULAH (https://github.com/nottalulah) for your help in figuring this out +# and also optimizing some code with this commit. +# xoxo :D + +set -xeuo pipefail + +case $(uname -m) in + x86_64) + ARCH=amd64;; + aarch64) + ARCH=arm64;; + armhf) + ARCH=armhf;; + armv7) + ARCH=armel;; + armv7l) + ARCH=armel;; + *) + echo "Unsupported architecture: $(uname -m)" + exit 1 +esac + +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$ARCH-static.tar.xz" -O ffmpeg.txz +mkdir /tmp/ffmpeg +tar xf ffmpeg.txz -C /tmp/ffmpeg +cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg +cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe +rm -rf /tmp/ffmpeg ffmpeg.txz \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2d0d73e..60aef89 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,8 @@ services: ytdl_use_local_db: 'false' write_ytdl_config: 'true' restart: always + depends_on: + - ytdl-mongo-db volumes: - ./appdata:/app/appdata - ./audio:/app/audio @@ -23,5 +25,6 @@ services: logging: driver: "none" container_name: mongo-db + restart: always volumes: - ./db/:/data/db \ No newline at end of file diff --git a/ffmpeg-from-master.sh b/ffmpeg-from-master.sh deleted file mode 100644 index ba8e304..0000000 --- a/ffmpeg-from-master.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -case $(uname -m) in - x86_64) - ARCH=amd64;; - aarch64) - ARCH=arm64;; - armv7) - ARCH=armel;; - armv7l) - ARCH=armel;; - *) - ARCH=$(uname -m);; -esac -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$ARCH-static.tar.xz" -O ffmpeg.txz -docker build \ No newline at end of file From 16943847fc8d162c82a212bcb3671d89fcaeb609 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 18 Apr 2022 08:57:21 +0200 Subject: [PATCH 105/212] fix ffmpeg download with variable --- docker-build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index 63ff0c0..5876372 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -22,7 +22,8 @@ case $(uname -m) in exit 1 esac -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$ARCH-static.tar.xz" -O ffmpeg.txz +echo "Architecture: $ARCH" +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 5b4d4d5f813a78bb254986ea39560a54534260d9 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 19 Apr 2022 22:29:41 -0400 Subject: [PATCH 106/212] Added scheduler for tasks --- backend/db.js | 4 ++ backend/package-lock.json | 102 ++++++++++++++++++++++++++++++++++++++ backend/package.json | 1 + backend/tasks.js | 50 +++++++++++++++++-- backend/test/tests.js | 29 +++++++++++ 5 files changed, 181 insertions(+), 5 deletions(-) diff --git a/backend/db.js b/backend/db.js index af51a4e..07dc95d 100644 --- a/backend/db.js +++ b/backend/db.js @@ -54,6 +54,10 @@ const tables = { name: 'download_queue', primary_key: 'uid' }, + tasks: { + name: 'tasks', + primary_key: 'key' + }, test: { name: 'test' } diff --git a/backend/package-lock.json b/backend/package-lock.json index d8d0e37..76daecd 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -599,6 +599,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -909,6 +918,15 @@ "readable-stream": "^3.4.0" } }, + "cron-parser": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-3.5.0.tgz", + "integrity": "sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==", + "requires": { + "is-nan": "^1.3.2", + "luxon": "^1.26.0" + } + }, "cross-spawn": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", @@ -968,6 +986,15 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1358,11 +1385,26 @@ "rimraf": "2" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -1460,11 +1502,32 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -1635,6 +1698,15 @@ "is-path-inside": "^3.0.1" } }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -2034,6 +2106,11 @@ } } }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, "lowdb": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", @@ -2051,6 +2128,11 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2407,6 +2489,16 @@ "iconv-lite": "^0.4.15" } }, + "node-schedule": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.0.tgz", + "integrity": "sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==", + "requires": { + "cron-parser": "^3.5.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + } + }, "nodemon": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", @@ -2475,6 +2567,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3053,6 +3150,11 @@ "is-arrayish": "^0.3.1" } }, + "sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", diff --git a/backend/package.json b/backend/package.json index d30ded2..76db3a5 100644 --- a/backend/package.json +++ b/backend/package.json @@ -52,6 +52,7 @@ "multer": "^1.4.2", "node-fetch": "^2.6.7", "node-id3": "^0.1.14", + "node-schedule": "^2.1.0", "nodemon": "^2.0.7", "passport": "^0.4.1", "passport-http": "^0.3.0", diff --git a/backend/tasks.js b/backend/tasks.js index e928725..701cbff 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -3,34 +3,53 @@ const db_api = require('./db'); const fs = require('fs-extra'); const logger = require('./logger'); +const scheduler = require('node-schedule'); const TASKS = { backup_local_db: { run: utils.backupLocalDB, title: 'Backup Local DB', + job: null }, missing_files_check: { run: checkForMissingFiles, confirm: deleteMissingFiles, - title: 'Missing files check' + title: 'Missing files check', + job: null }, missing_db_records: { run: db_api.importUnregisteredFiles, - title: 'Import missing DB records' + title: 'Import missing DB records', + job: null }, duplicate_files_check: { run: checkForDuplicateFiles, confirm: removeDuplicates, - title: 'Find duplicate files in DB' + title: 'Find duplicate files in DB', + job: null } } +function scheduleJob(task_key, schedule) { + return scheduler.scheduleJob(schedule, async () => { + const task_state = await db_api.getRecord('tasks', {key: task_key}); + if (task_state['running'] || task_state['confirming']) { + logger.verbose(`Skipping running task ${task_state['key']} as it is already in progress.`); + return; + } + + // we're just "running" the task, any confirmation should be user-initiated + exports.executeRun(task_key); + }); +} + exports.initialize = async () => { const tasks_keys = Object.keys(TASKS); for (let i = 0; i < tasks_keys.length; i++) { const task_key = tasks_keys[i]; const task_in_db = await db_api.getRecord('tasks', {key: task_key}); if (!task_in_db) { + // insert task into table if missing await db_api.insertRecordIntoTable('tasks', { key: task_key, last_ran: null, @@ -38,8 +57,17 @@ exports.initialize = async () => { running: false, confirming: false, data: null, - error: null + error: null, + schedule: null }); + } else { + // reset task if necessary + await db_api.updateRecord('tasks', {key: task_key}, {running: false, confirming: false}); + + // schedule task and save job + if (task_in_db['schedule']) { + TASKS[task_key]['job'] = scheduleJob(task_key, task_in_db['schedule']); + } } } } @@ -73,6 +101,16 @@ exports.executeConfirm = async (task_key) => { await db_api.updateRecord('tasks', {key: task_key}, {confirming: false, last_confirmed: Date.now()/1000}); } +exports.updateTaskSchedule = async (task_key, schedule) => { + await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule}); + if (TASKS[task_key]['job']) { + TASKS[task_key]['job'].cancel(); + } + if (schedule) { + TASKS[task_key]['job'] = scheduleJob(task_key, schedule); + } +} + // missing files check async function checkForMissingFiles() { @@ -109,4 +147,6 @@ async function removeDuplicates(data) { for (let i = 0; i < data['uids'].length; i++) { await db_api.removeRecord('files', {uid: data['uids'][i]}); } -} \ No newline at end of file +} + +exports.TASKS = TASKS; \ No newline at end of file diff --git a/backend/test/tests.js b/backend/test/tests.js index 7856f28..0c26fdc 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -382,6 +382,15 @@ describe('Tasks', function() { beforeEach(async function() { await db_api.connectToDB(); await db_api.removeAllRecords('tasks'); + + const dummy_task = { + run: async () => { await utils.wait(500); return true; }, + confirm: async () => { await utils.wait(500); return true; }, + title: 'Dummy task', + job: null + }; + tasks_api.TASKS['dummy_task'] = dummy_task; + await tasks_api.initialize(); }); it('Backup local db', async function() { @@ -438,4 +447,24 @@ describe('Tasks', function() { if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); }); + + it('Schedule and cancel task', async function() { + const today_4_hours = new Date(); + today_4_hours.setHours(today_4_hours.getHours() + 4); + await tasks_api.updateTaskSchedule('dummy_task', today_4_hours); + assert(!!tasks_api.TASKS['dummy_task']['job'], true); + await tasks_api.updateTaskSchedule('dummy_task', null); + assert(!!tasks_api.TASKS['dummy_task']['job'], false); + }); + + it('Schedule and run task', async function() { + this.timeout(5000); + const today_1_second = new Date(); + today_1_second.setSeconds(today_1_second.getSeconds() + 1); + await tasks_api.updateTaskSchedule('dummy_task', today_1_second); + assert(!!tasks_api.TASKS['dummy_task']['job'], true); + await utils.wait(2000); + const dummy_task_obj = await db_api.getRecord('tasks', {key: 'dummy_task'}); + assert(dummy_task_obj['data'], true); + }); }); \ No newline at end of file From 091f81bb388a7c5e02e60fa17dd782a1bea331b2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 21 Apr 2022 03:01:49 -0400 Subject: [PATCH 107/212] Added UI for managing tasks Added ability to schedule tasks based on timestamp Fixed mismatched types between frontend and openapi yaml Simplified imports for several backend components --- Public API v1.yaml | 363 +++++++++++++++++- backend/app.js | 52 ++- backend/authentication/auth.js | 10 +- backend/categories.js | 11 +- backend/downloader.js | 21 +- backend/subscriptions.js | 12 +- backend/tasks.js | 36 +- src/api-types/index.ts | 6 + src/api-types/models/DownloadFileRequest.ts | 3 +- src/api-types/models/GetAllTasksResponse.ts | 9 + .../models/GetFullTwitchChatRequest.ts | 3 - src/api-types/models/GetTaskRequest.ts | 8 + src/api-types/models/GetTaskResponse.ts | 9 + src/api-types/models/Schedule.ts | 24 ++ src/api-types/models/Task.ts | 15 + .../models/UpdateTaskScheduleRequest.ts | 10 + src/app/app-routing.module.ts | 2 + src/app/app.component.html | 1 + src/app/app.module.ts | 8 +- src/app/components/tasks/tasks.component.html | 77 ++++ src/app/components/tasks/tasks.component.scss | 32 ++ .../components/tasks/tasks.component.spec.ts | 25 ++ src/app/components/tasks/tasks.component.ts | 109 ++++++ ...update-task-schedule-dialog.component.html | 53 +++ ...update-task-schedule-dialog.component.scss | 0 ...ate-task-schedule-dialog.component.spec.ts | 25 ++ .../update-task-schedule-dialog.component.ts | 83 ++++ src/app/player/player.component.ts | 2 +- src/app/posts.services.ts | 54 ++- 29 files changed, 996 insertions(+), 67 deletions(-) create mode 100644 src/api-types/models/GetAllTasksResponse.ts create mode 100644 src/api-types/models/GetTaskRequest.ts create mode 100644 src/api-types/models/GetTaskResponse.ts create mode 100644 src/api-types/models/Schedule.ts create mode 100644 src/api-types/models/Task.ts create mode 100644 src/api-types/models/UpdateTaskScheduleRequest.ts create mode 100644 src/app/components/tasks/tasks.component.html create mode 100644 src/app/components/tasks/tasks.component.scss create mode 100644 src/app/components/tasks/tasks.component.spec.ts create mode 100644 src/app/components/tasks/tasks.component.ts create mode 100644 src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html create mode 100644 src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.scss create mode 100644 src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts create mode 100644 src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts diff --git a/Public API v1.yaml b/Public API v1.yaml index ad43d48..fc63ef8 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -666,11 +666,287 @@ paths: schema: $ref: '#/components/schemas/GetDownloadRequest' description: '' - description: "Gets a single download using its download_id and session_id. session_id is the device fingerprint. If none was provided at the time of download, then set session_id is 'undeclared'." + description: "Gets a single download using its download_id." security: - Auth query parameter: [] tags: - downloader + /api/pauseDownload: + post: + summary: Pauses one download + operationId: post-api-pause-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Pause a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/pauseAllDownloads: + post: + tags: + - downloader + summary: Pauses all downloads + operationId: post-api-pause-all-downloads + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/resumeDownload: + post: + summary: Resume one download + operationId: post-api-resume-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Resume a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/resumeAllDownloads: + post: + tags: + - downloader + summary: Resumes all downloads + operationId: post-api-resume-all-downloads + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/restartDownload: + post: + summary: Restart one download + operationId: post-api-restart-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Restart a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/cancelDownload: + post: + summary: Cancel one download + operationId: post-api-cancel-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Cancel a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/clearDownload: + post: + summary: Clear one download + operationId: post-api-clear-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Clears a single download from the downloaded list using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/clearFinishedDownloads: + post: + tags: + - downloader + summary: Clear finished downloads + operationId: post-api-clear-finished-downloads + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/getTask: + post: + summary: Get info for one task + operationId: post-api-get-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + description: '' + description: "Gets a single task using its key." + security: + - Auth query parameter: [] + tags: + - tasks + /api/getTasks: + post: + tags: + - tasks + summary: Get tasks + operationId: post-api-get-tasks + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllTasksResponse' + security: + - Auth query parameter: [] + /api/runTask: + post: + summary: Runs one task + operationId: post-api-run-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/confirmTask: + post: + summary: Confirms a task + operationId: post-api-confirm-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/cancelTask: + post: + summary: Cancels a task + operationId: post-api-cancel-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/updateTaskSchedule: + post: + summary: Updates task schedule + operationId: post-api-update-task-schedule + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTaskScheduleRequest' /api/auth/login: post: summary: Login @@ -1231,6 +1507,35 @@ components: type: array items: $ref: '#/components/schemas/Download' + GetTaskRequest: + type: object + properties: + task_key: + type: string + required: + - task_key + UpdateTaskScheduleRequest: + type: object + properties: + task_key: + type: string + new_schedule: + $ref: '#/components/schemas/Schedule' + required: + - task_key + - new_schedule + GetTaskResponse: + type: object + properties: + task: + $ref: '#/components/schemas/Task' + GetAllTasksResponse: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' GetMp3sResponse: required: - mp3s @@ -1506,6 +1811,10 @@ components: type: string playlist_id: type: string + url: + type: string + type: + $ref: '#/components/schemas/FileType' DownloadArchiveRequest: required: - sub @@ -1967,6 +2276,58 @@ components: type: string sub_name: type: string + Task: + required: + - key + - last_ran + - last_confirmed + - running + - confirming + - data + - error + - schedule + type: object + properties: + key: + type: string + last_ran: + type: number + last_confirmed: + type: number + running: + type: boolean + confirming: + type: boolean + data: + type: object + error: + type: string + schedule: + type: object + Schedule: + required: + - type + - data + type: object + properties: + type: + type: string + enum: + - timestamp + - recurring + data: + type: object + properties: + dayOfWeek: + type: array + items: + type: number + hour: + type: number + minute: + type: number + timestamp: + type: number SubscriptionRequestData: required: - id diff --git a/backend/app.js b/backend/app.js index b12d502..8aa2696 100644 --- a/backend/app.js +++ b/backend/app.js @@ -28,6 +28,7 @@ const youtubedl = require('youtube-dl'); const logger = require('./logger'); const config_api = require('./config.js'); const downloader_api = require('./downloader'); +const tasks_api = require('./tasks'); const subscriptions_api = require('./subscriptions'); const categories_api = require('./categories'); const twitch_api = require('./twitch'); @@ -60,9 +61,6 @@ const admin_token = '4241b401-7236-493e-92b5-b72696b9d853'; config_api.initialize(); db_api.initialize(db, users_db); auth_api.initialize(db_api); -downloader_api.initialize(db_api); -subscriptions_api.initialize(db_api, downloader_api); -categories_api.initialize(db_api); // Set some defaults db.defaults( @@ -1878,6 +1876,54 @@ app.post('/api/cancelDownload', optionalJwt, async (req, res) => { res.send({success: success}); }); +// tasks + +app.post('/api/getTasks', optionalJwt, async (req, res) => { + const tasks = await db_api.getRecords('tasks'); + for (let task of tasks) { + if (task['schedule']) task['next_invocation'] = tasks_api.TASKS[task['key']]['job'].nextInvocation().getTime(); + } + res.send({tasks: tasks}); +}); + +app.post('/api/getTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + if (task['schedule']) task['next_invocation'] = tasks_api.TASKS[task_key]['job'].nextInvocation().getTime(); + res.send({task: task}); +}); + +app.post('/api/runTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + + let success = true; + if (task['running'] || task['confirming']) success = false; + else await tasks_api.executeRun(task_key); + + res.send({success: success}); +}); + +app.post('/api/confirmTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + + let success = true; + if (task['running'] || task['confirming'] || !task['data']) success = false; + else await tasks_api.executeConfirm(task_key); + + res.send({success: success}); +}); + +app.post('/api/updateTaskSchedule', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const new_schedule = req.body.new_schedule; + + await tasks_api.updateTaskSchedule(task_key, new_schedule); + + res.send({success: true}); +}); + // logs management app.post('/api/logs', optionalJwt, async function(req, res) { diff --git a/backend/authentication/auth.js b/backend/authentication/auth.js index 7aad070..de54a0b 100644 --- a/backend/authentication/auth.js +++ b/backend/authentication/auth.js @@ -1,6 +1,7 @@ const config_api = require('../config'); const consts = require('../consts'); const logger = require('../logger'); +const db_api = require('../db'); const jwt = require('jsonwebtoken'); const { uuid } = require('uuidv4'); @@ -12,15 +13,12 @@ var JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; // other required vars -let db_api = null; let SERVER_SECRET = null; let JWT_EXPIRATION = null; let opts = null; let saltRounds = null; -exports.initialize = function(db_api) { - setDB(db_api); - +exports.initialize = function() { /************************* * Authentication module ************************/ @@ -51,10 +49,6 @@ exports.initialize = function(db_api) { })); } -function setDB(input_db_api) { - db_api = input_db_api; -} - exports.passport = require('passport'); exports.passport.serializeUser(function(user, done) { diff --git a/backend/categories.js b/backend/categories.js index 269ae9c..2236d9f 100644 --- a/backend/categories.js +++ b/backend/categories.js @@ -1,14 +1,6 @@ const utils = require('./utils'); const logger = require('./logger'); - -var db_api = null; - -function setDB(input_db_api) { db_api = input_db_api } - -function initialize(input_db_api) { - setDB(input_db_api); -} - +const db_api = require('./db'); /* Categories: @@ -137,7 +129,6 @@ function applyCategoryRules(file_json, rules, category_name) { // } module.exports = { - initialize: initialize, categorize: categorize, getCategories: getCategories, getCategoriesAsPlaylists: getCategoriesAsPlaylists diff --git a/backend/downloader.js b/backend/downloader.js index e151f87..f139a1f 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -14,26 +14,19 @@ const twitch_api = require('./twitch'); const { create } = require('xmlbuilder2'); const categories_api = require('./categories'); const utils = require('./utils'); - -let db_api = null; +const db_api = require('./db'); const mutex = new Mutex(); let should_check_downloads = true; const archivePath = path.join(__dirname, 'appdata', 'archives'); -function setDB(input_db_api) { db_api = input_db_api } - -exports.initialize = (input_db_api) => { - setDB(input_db_api); - categories_api.initialize(db_api); - if (db_api.database_initialized) { - setupDownloads(); - } else { - db_api.database_initialized_bs.subscribe(init => { - if (init) setupDownloads(); - }); - } +if (db_api.database_initialized) { + setupDownloads(); +} else { + db_api.database_initialized_bs.subscribe(init => { + if (init) setupDownloads(); + }); } exports.createDownload = async (url, type, options, user_uid = null, sub_id = null, sub_name = null) => { diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 869cf76..1b35a4f 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -8,15 +8,8 @@ const logger = require('./logger'); const debugMode = process.env.YTDL_MODE === 'debug'; -let db_api = null; -let downloader_api = null; - -function setDB(input_db_api) { db_api = input_db_api } - -function initialize(input_db_api, input_downloader_api) { - setDB(input_db_api); - downloader_api = input_downloader_api; -} +const db_api = require('./db'); +const downloader_api = require('./downloader'); async function subscribe(sub, user_uid = null) { const result_obj = { @@ -542,7 +535,6 @@ module.exports = { unsubscribe : unsubscribe, deleteSubscriptionFile : deleteSubscriptionFile, getVideosForSub : getVideosForSub, - initialize : initialize, updateSubscriptionPropertyMultiple : updateSubscriptionPropertyMultiple, generateOptionsForSubscriptionDownload: generateOptionsForSubscriptionDownload } diff --git a/backend/tasks.js b/backend/tasks.js index 701cbff..c66b23a 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -31,7 +31,21 @@ const TASKS = { } function scheduleJob(task_key, schedule) { - return scheduler.scheduleJob(schedule, async () => { + // schedule has to be converted from our format to one node-schedule can consume + let converted_schedule = null; + if (schedule['type'] === 'timestamp') { + converted_schedule = new Date(schedule['data']['timestamp']); + } else if (schedule['type'] === 'recurring') { + const dayOfWeek = schedule['data']['dayOfWeek'] ? schedule['data']['dayOfWeek'] : null; + const hour = schedule['data']['hour'] ? schedule['data']['hour'] : null; + const minute = schedule['data']['minute'] ? schedule['data']['minute'] : null; + converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute); + } else { + logger.error(`Failed to schedule job '${task_key}' as the type '${schedule['type']}' is invalid.`) + return null; + } + + return scheduler.scheduleJob(converted_schedule, async () => { const task_state = await db_api.getRecord('tasks', {key: task_key}); if (task_state['running'] || task_state['confirming']) { logger.verbose(`Skipping running task ${task_state['key']} as it is already in progress.`); @@ -43,15 +57,24 @@ function scheduleJob(task_key, schedule) { }); } -exports.initialize = async () => { +if (db_api.database_initialized) { + setupTasks(); +} else { + db_api.database_initialized_bs.subscribe(init => { + if (init) setupTasks(); + }); +} + +const setupTasks = async () => { const tasks_keys = Object.keys(TASKS); for (let i = 0; i < tasks_keys.length; i++) { const task_key = tasks_keys[i]; const task_in_db = await db_api.getRecord('tasks', {key: task_key}); if (!task_in_db) { - // insert task into table if missing + // insert task metadata into table if missing await db_api.insertRecordIntoTable('tasks', { key: task_key, + title: TASKS[task_key]['title'], last_ran: null, last_confirmed: null, running: false, @@ -85,12 +108,15 @@ exports.executeTask = async (task_key) => { } exports.executeRun = async (task_key) => { + logger.verbose(`Running task ${task_key}`); await db_api.updateRecord('tasks', {key: task_key}, {running: true}); const data = await TASKS[task_key].run(); await db_api.updateRecord('tasks', {key: task_key}, {data: data, last_ran: Date.now()/1000, running: false}); + logger.verbose(`Finished running task ${task_key}`); } exports.executeConfirm = async (task_key) => { + logger.verbose(`Confirming task ${task_key}`); if (!TASKS[task_key]['confirm']) { return null; } @@ -98,10 +124,12 @@ exports.executeConfirm = async (task_key) => { const task_obj = await db_api.getRecord('tasks', {key: task_key}); const data = task_obj['data']; await TASKS[task_key].confirm(data); - await db_api.updateRecord('tasks', {key: task_key}, {confirming: false, last_confirmed: Date.now()/1000}); + await db_api.updateRecord('tasks', {key: task_key}, {confirming: false, last_confirmed: Date.now()/1000, data: null}); + logger.verbose(`Finished confirming task ${task_key}`); } exports.updateTaskSchedule = async (task_key, schedule) => { + logger.verbose(`Updating schedule for task ${task_key}`); await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule}); if (TASKS[task_key]['job']) { TASKS[task_key]['job'].cancel(); diff --git a/src/api-types/index.ts b/src/api-types/index.ts index c08044a..93d611f 100644 --- a/src/api-types/index.ts +++ b/src/api-types/index.ts @@ -44,6 +44,7 @@ export type { GetAllDownloadsRequest } from './models/GetAllDownloadsRequest'; export type { GetAllDownloadsResponse } from './models/GetAllDownloadsResponse'; export type { GetAllFilesResponse } from './models/GetAllFilesResponse'; export type { GetAllSubscriptionsResponse } from './models/GetAllSubscriptionsResponse'; +export type { GetAllTasksResponse } from './models/GetAllTasksResponse'; export type { GetDownloadRequest } from './models/GetDownloadRequest'; export type { GetDownloadResponse } from './models/GetDownloadResponse'; export type { GetFileFormatsRequest } from './models/GetFileFormatsRequest'; @@ -63,6 +64,8 @@ export type { GetPlaylistsResponse } from './models/GetPlaylistsResponse'; export type { GetRolesResponse } from './models/GetRolesResponse'; export type { GetSubscriptionRequest } from './models/GetSubscriptionRequest'; export type { GetSubscriptionResponse } from './models/GetSubscriptionResponse'; +export type { GetTaskRequest } from './models/GetTaskRequest'; +export type { GetTaskResponse } from './models/GetTaskResponse'; export type { GetUsersResponse } from './models/GetUsersResponse'; export type { IncrementViewCountRequest } from './models/IncrementViewCountRequest'; export type { inline_response_200_15 } from './models/inline_response_200_15'; @@ -71,6 +74,7 @@ export type { LoginResponse } from './models/LoginResponse'; export type { Playlist } from './models/Playlist'; export type { RegisterRequest } from './models/RegisterRequest'; export type { RegisterResponse } from './models/RegisterResponse'; +export { Schedule } from './models/Schedule'; export type { SetConfigRequest } from './models/SetConfigRequest'; export type { SharingToggle } from './models/SharingToggle'; export type { SubscribeRequest } from './models/SubscribeRequest'; @@ -79,6 +83,7 @@ export type { Subscription } from './models/Subscription'; export type { SubscriptionRequestData } from './models/SubscriptionRequestData'; export type { SuccessObject } from './models/SuccessObject'; export type { TableInfo } from './models/TableInfo'; +export type { Task } from './models/Task'; export type { TestConnectionStringRequest } from './models/TestConnectionStringRequest'; export type { TestConnectionStringResponse } from './models/TestConnectionStringResponse'; export type { TransferDBRequest } from './models/TransferDBRequest'; @@ -93,6 +98,7 @@ export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentSt export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdateServerRequest } from './models/UpdateServerRequest'; +export type { UpdateTaskScheduleRequest } from './models/UpdateTaskScheduleRequest'; export type { UpdateUserRequest } from './models/UpdateUserRequest'; export type { User } from './models/User'; export { UserPermission } from './models/UserPermission'; diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index 31ba393..a874a8c 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -2,6 +2,7 @@ /* tslint:disable */ /* eslint-disable */ +import { FileType } from './FileType'; export interface DownloadFileRequest { uid?: string; @@ -9,5 +10,5 @@ export interface DownloadFileRequest { sub_id?: string; playlist_id?: string; url?: string; - type?: string; + type?: FileType; } \ No newline at end of file diff --git a/src/api-types/models/GetAllTasksResponse.ts b/src/api-types/models/GetAllTasksResponse.ts new file mode 100644 index 0000000..221d44a --- /dev/null +++ b/src/api-types/models/GetAllTasksResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Task } from './Task'; + +export interface GetAllTasksResponse { + tasks?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatRequest.ts b/src/api-types/models/GetFullTwitchChatRequest.ts index 6d6a3a6..64a043d 100644 --- a/src/api-types/models/GetFullTwitchChatRequest.ts +++ b/src/api-types/models/GetFullTwitchChatRequest.ts @@ -15,8 +15,5 @@ export interface GetFullTwitchChatRequest { * User UID */ uuid?: string; - /** - * Subscription - */ sub?: Subscription; } \ No newline at end of file diff --git a/src/api-types/models/GetTaskRequest.ts b/src/api-types/models/GetTaskRequest.ts new file mode 100644 index 0000000..655a69f --- /dev/null +++ b/src/api-types/models/GetTaskRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetTaskRequest { + task_key: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetTaskResponse.ts b/src/api-types/models/GetTaskResponse.ts new file mode 100644 index 0000000..7f11c6e --- /dev/null +++ b/src/api-types/models/GetTaskResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Task } from './Task'; + +export interface GetTaskResponse { + task?: Task; +} \ No newline at end of file diff --git a/src/api-types/models/Schedule.ts b/src/api-types/models/Schedule.ts new file mode 100644 index 0000000..452202d --- /dev/null +++ b/src/api-types/models/Schedule.ts @@ -0,0 +1,24 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Schedule { + type: Schedule.type; + data: { +dayOfWeek?: Array, +hour?: number, +minute?: number, +timestamp?: number, +}; +} + +export namespace Schedule { + + export enum type { + TIMESTAMP = 'timestamp', + RECURRING = 'recurring', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/Task.ts b/src/api-types/models/Task.ts new file mode 100644 index 0000000..95c864a --- /dev/null +++ b/src/api-types/models/Task.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Task { + key: string; + last_ran: number; + last_confirmed: number; + running: boolean; + confirming: boolean; + data: any; + error: string; + schedule: any; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskScheduleRequest.ts b/src/api-types/models/UpdateTaskScheduleRequest.ts new file mode 100644 index 0000000..b9e61d6 --- /dev/null +++ b/src/api-types/models/UpdateTaskScheduleRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Schedule } from './Schedule'; + +export interface UpdateTaskScheduleRequest { + task_key: string; + new_schedule: Schedule; +} \ No newline at end of file diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 8620fcb..ab9c609 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -8,6 +8,7 @@ import { PostsService } from './posts.services'; import { LoginComponent } from './components/login/login.component'; import { DownloadsComponent } from './components/downloads/downloads.component'; import { SettingsComponent } from './settings/settings.component'; +import { TasksComponent } from './components/tasks/tasks.component'; const routes: Routes = [ { path: 'home', component: MainComponent, canActivate: [PostsService] }, @@ -17,6 +18,7 @@ const routes: Routes = [ { path: 'settings', component: SettingsComponent, canActivate: [PostsService] }, { path: 'login', component: LoginComponent }, { path: 'downloads', component: DownloadsComponent, canActivate: [PostsService] }, + { path: 'tasks', component: TasksComponent, canActivate: [PostsService] }, { path: '', redirectTo: '/home', pathMatch: 'full' } ]; diff --git a/src/app/app.component.html b/src/app/app.component.html index df61ad2..f1270c7 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -44,6 +44,7 @@ Login Subscriptions Downloads + Tasks Settings diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7b26e63..0da23ee 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -28,6 +28,7 @@ import { MatTabsModule } from '@angular/material/tabs'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; +import { MatDatepickerModule } from '@angular/material/datepicker'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { ClipboardModule } from '@angular/cdk/clipboard'; import { TextFieldModule } from '@angular/cdk/text-field'; @@ -87,6 +88,8 @@ import { LinkifyPipe, SeeMoreComponent } from './components/see-more/see-more.co import { H401Interceptor } from './http.interceptor'; import { ConcurrentStreamComponent } from './components/concurrent-stream/concurrent-stream.component'; import { SkipAdButtonComponent } from './components/skip-ad-button/skip-ad-button.component'; +import { TasksComponent } from './components/tasks/tasks.component'; +import { UpdateTaskScheduleDialogComponent } from './dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; registerLocaleData(es, 'es'); @@ -135,7 +138,9 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible TwitchChatComponent, SeeMoreComponent, ConcurrentStreamComponent, - SkipAdButtonComponent + SkipAdButtonComponent, + TasksComponent, + UpdateTaskScheduleDialogComponent ], imports: [ CommonModule, @@ -171,6 +176,7 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible MatPaginatorModule, MatSortModule, MatTableModule, + MatDatepickerModule, MatChipsModule, DragDropModule, ClipboardModule, diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html new file mode 100644 index 0000000..556ded4 --- /dev/null +++ b/src/app/components/tasks/tasks.component.html @@ -0,0 +1,77 @@ +
+
+ + + + Title + + + {{element.title}} + + + + + + + Last ran + + {{element.last_ran*1000 | date: 'short'}} + N/A + + + + + + Last confirmed + + {{element.last_confirmed*1000 | date: 'short'}} + N/A + + + + + + Status + + + + Scheduled for  + {{element.next_invocation | date: 'short'}}repeat + + + Not scheduled + + + + + + + Actions + +
+ + + + + +
+
+
+ + + +
+ + + +
+
+ +
+

No tasks available!

+
\ No newline at end of file diff --git a/src/app/components/tasks/tasks.component.scss b/src/app/components/tasks/tasks.component.scss new file mode 100644 index 0000000..ed84df9 --- /dev/null +++ b/src/app/components/tasks/tasks.component.scss @@ -0,0 +1,32 @@ +mat-header-cell, mat-cell { + justify-content: center; +} + +.one-line { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.icon-button-spinner { + position: absolute; + top: 7px; + left: 6px; +} + +.downloads-action-button-div { + margin-top: 10px; + margin-left: 5px; +} + +.rounded-top { + border-radius: 16px 16px 0px 0px !important; +} + +.rounded-bottom { + border-radius: 0px 0px 16px 16px !important; +} + +.rounded { + border-radius: 16px 16px 16px 16px !important; +} \ No newline at end of file diff --git a/src/app/components/tasks/tasks.component.spec.ts b/src/app/components/tasks/tasks.component.spec.ts new file mode 100644 index 0000000..d4ab7a5 --- /dev/null +++ b/src/app/components/tasks/tasks.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TasksComponent } from './tasks.component'; + +describe('TasksComponent', () => { + let component: TasksComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TasksComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TasksComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/tasks/tasks.component.ts b/src/app/components/tasks/tasks.component.ts new file mode 100644 index 0000000..a294b5b --- /dev/null +++ b/src/app/components/tasks/tasks.component.ts @@ -0,0 +1,109 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { UpdateTaskScheduleDialogComponent } from 'app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-tasks', + templateUrl: './tasks.component.html', + styleUrls: ['./tasks.component.scss'] +}) +export class TasksComponent implements OnInit { + + interval_id = null; + tasks_check_interval = 1500; + tasks = null; + tasks_retrieved = false; + + displayedColumns: string[] = ['title', 'last_ran', 'last_confirmed', 'status', 'actions']; + dataSource = null; + + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + constructor(private postsService: PostsService, private dialog: MatDialog) { } + + ngOnInit(): void { + if (this.postsService.initialized) { + this.getTasksRecurring(); + } else { + this.postsService.service_initialized.subscribe(init => { + if (init) { + this.getTasksRecurring(); + } + }); + } + } + + ngOnDestroy(): void { + if (this.interval_id) { clearInterval(this.interval_id) } + } + + getTasksRecurring(): void { + this.getTasks(); + this.interval_id = setInterval(() => { + this.getTasks(); + }, this.tasks_check_interval); + } + + getTasks(): void { + this.postsService.getTasks().subscribe(res => { + if (this.tasks) { + if (JSON.stringify(this.tasks) === JSON.stringify(res['tasks'])) return; + for (const task of res['tasks']) { + const task_index = this.tasks.map(t => t.key).indexOf(task['key']); + this.tasks[task_index] = task; + } + this.dataSource = new MatTableDataSource(this.tasks); + } else { + this.tasks = res['tasks']; + this.dataSource = new MatTableDataSource(this.tasks); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + }); + } + + runTask(task_key: string): void { + this.postsService.runTask(task_key).subscribe(res => { + this.getTasks(); + }); + } + + confirmTask(task_key: string): void { + this.postsService.confirmTask(task_key).subscribe(res => { + this.getTasks(); + }); + } + + scheduleTask(task: any): void { + // open dialog + const dialogRef = this.dialog.open(UpdateTaskScheduleDialogComponent, { + data: { + task: task + } + }); + dialogRef.afterClosed().subscribe(schedule => { + if (schedule || schedule === null) { + this.postsService.updateTaskSchedule(task['key'], schedule).subscribe(res => { + this.getTasks(); + console.log(res); + }); + } + }); + } + +} + +export interface Task { + key: string; + title: string; + last_ran: number; + last_confirmed: number; + running: boolean; + confirming: boolean; + data: unknown; +} \ No newline at end of file diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html new file mode 100644 index 0000000..7782e15 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html @@ -0,0 +1,53 @@ +

Update task schedule

+ + +
+
+
+ Enabled +
+
+ Recurring +
+
+ + + Weekly + Daily + + +
+
+ + Choose a date + + + + +
+
+ + + M + T + W + T + F + S + S + +
+
+ + Time + + +
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.scss b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts new file mode 100644 index 0000000..fe52670 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UpdateTaskScheduleDialogComponent } from './update-task-schedule-dialog.component'; + +describe('UpdateTaskScheduleDialogComponent', () => { + let component: UpdateTaskScheduleDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ UpdateTaskScheduleDialogComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(UpdateTaskScheduleDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts new file mode 100644 index 0000000..ef61cf4 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts @@ -0,0 +1,83 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Schedule } from 'api-types'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-update-task-schedule-dialog', + templateUrl: './update-task-schedule-dialog.component.html', + styleUrls: ['./update-task-schedule-dialog.component.scss'] +}) +export class UpdateTaskScheduleDialogComponent implements OnInit { + + enabled = true; + recurring = false; + days_of_week = []; + interval = 'daily'; + time = null; + date = null; + today = new Date(); + + constructor(@Inject(MAT_DIALOG_DATA) public data: any, private dialogRef: MatDialogRef, private postsService: PostsService) { + this.processTask(this.data.task); + this.postsService.getTask(this.data.task.key).subscribe(res => { + this.processTask(res['task']); + }); + } + + ngOnInit(): void { + } + + processTask(task) { + if (!task['schedule']) { + this.enabled = false; + return; + } + + const schedule: Schedule = task['schedule']; + + this.recurring = schedule['type'] === Schedule.type.RECURRING; + + if (this.recurring) { + this.time = `${schedule['data']['hour']}:${schedule['data']['minute']}`; + + if (schedule['data']['dayOfWeek']) { + this.days_of_week = schedule['data']['dayOfWeek']; + this.interval = 'weekly'; + } else { + this.interval = 'daily'; + } + } else { + const schedule_date = new Date(schedule['data']['timestamp']); + this.time = `${schedule_date.getHours()}:${schedule_date.getMinutes()}` + this.date = schedule_date; + } + } + + updateTaskSchedule(): void { + if (!this.enabled) { + this.dialogRef.close(null); + return; + } + + if (!this.time) { + // needs time! + } + + const hours = parseInt(this.time.split(':')[0]); + const minutes = parseInt(this.time.split(':')[1]); + + const schedule: Schedule = {type: this.recurring ? Schedule.type.RECURRING : Schedule.type.TIMESTAMP, data: null}; + if (this.recurring) { + schedule['data'] = {hour: hours, minute: minutes}; + if (this.interval === 'weekly') { + schedule['data']['dayOfWeek'] = this.days_of_week; + } + } else { + this.date.setHours(hours, minutes); + console.log(this.date); + schedule['data'] = {timestamp: this.date.getTime()}; + } + this.dialogRef.close(schedule); + } +} diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 5fe3936..1a4e0ca 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -318,7 +318,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { const type = this.playlist[0].type; const url = this.playlist[0].url; this.downloading = true; - this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id, url, type).subscribe(res => { + this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id, url, type as FileType).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, filename + ext); diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index f157d47..923210a 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -90,6 +90,9 @@ import { DBInfoResponse, GetFileFormatsRequest, GetFileFormatsResponse, + GetTaskRequest, + GetTaskResponse, + UpdateTaskScheduleRequest, } from '../api-types'; import { isoLangs } from './settings/locales_list'; import { Title } from '@angular/platform-browser'; @@ -351,7 +354,7 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); } - downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null, url: string = null, type: string = null) { + downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null, url: string = null, type: FileType = null) { const body: DownloadFileRequest = { uid: uid, uuid: uuid, @@ -544,38 +547,67 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'download', body, this.httpOptions); } - pauseDownload(download_uid) { - return this.http.post(this.path + 'pauseDownload', {download_uid: download_uid}, this.httpOptions); + pauseDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'pauseDownload', body, this.httpOptions); } pauseAllDownloads() { return this.http.post(this.path + 'pauseAllDownloads', {}, this.httpOptions); } - resumeDownload(download_uid) { - return this.http.post(this.path + 'resumeDownload', {download_uid: download_uid}, this.httpOptions); + resumeDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'resumeDownload', body, this.httpOptions); } resumeAllDownloads() { return this.http.post(this.path + 'resumeAllDownloads', {}, this.httpOptions); } - restartDownload(download_uid) { - return this.http.post(this.path + 'restartDownload', {download_uid: download_uid}, this.httpOptions); + restartDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'restartDownload', body, this.httpOptions); } - cancelDownload(download_uid) { - return this.http.post(this.path + 'cancelDownload', {download_uid: download_uid}, this.httpOptions); + cancelDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'cancelDownload', body, this.httpOptions); } - clearDownload(download_uid) { - return this.http.post(this.path + 'clearDownload', {download_uid: download_uid}, this.httpOptions); + clearDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'clearDownload', body, this.httpOptions); } clearFinishedDownloads() { return this.http.post(this.path + 'clearFinishedDownloads', {}, this.httpOptions); } + getTasks() { + return this.http.post(this.path + 'getTasks', {}, this.httpOptions); + } + + getTask(task_key) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'getTask', body, this.httpOptions); + } + + runTask(task_key) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'runTask', body, this.httpOptions); + } + + confirmTask(task_key) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'confirmTask', body, this.httpOptions); + } + + updateTaskSchedule(task_key, schedule) { + const body: UpdateTaskScheduleRequest = {task_key: task_key, new_schedule: schedule}; + return this.http.post(this.path + 'updateTaskSchedule', body, this.httpOptions); + } + getVersionInfo() { return this.http.get(this.path + 'versionInfo', this.httpOptions); } From c0081718507d99142085cc5def996e29609e9d03 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Thu, 21 Apr 2022 22:33:01 +0200 Subject: [PATCH 108/212] add color picker to WS recs --- .vscode/extensions.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..8184da3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "bierner.color-info" + ] +} \ No newline at end of file From a28816364413b44d3cc5ece25997b4ca9f9b9037 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 21 Apr 2022 19:29:50 -0400 Subject: [PATCH 109/212] Added ability to backup remote DB Added ability to restore DB --- Public API v1.yaml | 91 +++++++++++++++++++ backend/app.js | 39 ++++++++ backend/db.js | 51 ++++++++++- backend/tasks.js | 7 +- backend/test/tests.js | 13 ++- backend/utils.js | 10 +- src/api-types/index.ts | 4 + src/api-types/models/DBBackup.ts | 21 +++++ src/api-types/models/GetDBBackupsResponse.ts | 9 ++ .../models/RestoreDBBackupRequest.ts | 8 ++ src/api-types/models/UpdateTaskDataRequest.ts | 9 ++ src/app/app.module.ts | 4 +- src/app/components/tasks/tasks.component.html | 28 ++++-- src/app/components/tasks/tasks.component.ts | 29 ++++++ .../restore-db-dialog.component.html | 29 ++++++ .../restore-db-dialog.component.scss | 0 .../restore-db-dialog.component.spec.ts | 25 +++++ .../restore-db-dialog.component.ts | 47 ++++++++++ src/app/posts.services.ts | 25 ++++- 19 files changed, 420 insertions(+), 29 deletions(-) create mode 100644 src/api-types/models/DBBackup.ts create mode 100644 src/api-types/models/GetDBBackupsResponse.ts create mode 100644 src/api-types/models/RestoreDBBackupRequest.ts create mode 100644 src/api-types/models/UpdateTaskDataRequest.ts create mode 100644 src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html create mode 100644 src/app/dialogs/restore-db-dialog/restore-db-dialog.component.scss create mode 100644 src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts create mode 100644 src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts diff --git a/Public API v1.yaml b/Public API v1.yaml index fc63ef8..5be8869 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -947,6 +947,54 @@ paths: application/json: schema: $ref: '#/components/schemas/UpdateTaskScheduleRequest' + /api/updateTaskData: + post: + summary: Updates task data + operationId: post-api-update-task-data + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTaskDataRequest' + /api/getDBBackups: + post: + summary: Get database backups + operationId: post-api-get-database-backups + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDBBackupsResponse' + requestBody: + content: + application/json: + schema: + type: object + /api/restoreDBBackup: + post: + summary: Restore database backup + operationId: post-api-restore-database-backup + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RestoreDBBackupRequest' /api/auth/login: post: summary: Login @@ -1524,6 +1572,16 @@ components: required: - task_key - new_schedule + UpdateTaskDataRequest: + type: object + properties: + task_key: + type: string + new_data: + type: object + required: + - task_key + - new_data GetTaskResponse: type: object properties: @@ -1536,6 +1594,20 @@ components: type: array items: $ref: '#/components/schemas/Task' + GetDBBackupsResponse: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/DBBackup' + RestoreDBBackupRequest: + type: object + required: + - file_name + properties: + file_name: + type: string GetMp3sResponse: required: - mp3s @@ -2328,6 +2400,25 @@ components: type: number timestamp: type: number + DBBackup: + required: + - name + - timestamp + - size + - source + type: object + properties: + name: + type: string + timestamp: + type: number + size: + type: number + source: + type: string + enum: + - local + - remote SubscriptionRequestData: required: - id diff --git a/backend/app.js b/backend/app.js index 8aa2696..f596b8e 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1924,6 +1924,45 @@ app.post('/api/updateTaskSchedule', optionalJwt, async (req, res) => { res.send({success: true}); }); +app.post('/api/updateTaskData', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const new_data = req.body.new_data; + + const success = await db_api.updateRecord('tasks', {key: task_key}, {data: new_data}); + + res.send({success: success}); +}); + +app.post('/api/getDBBackups', optionalJwt, async (req, res) => { + const backup_dir = path.join('appdata', 'db_backup'); + const db_backups = []; + + const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false); + for (let i = 0; i < candidate_backups.length; i++) { + const candidate_backup = candidate_backups[i]; + + // must have specific format + if (candidate_backup.split('.').length - 1 !== 4) continue; + + const candidate_backup_path = candidate_backup; + const stats = fs.statSync(candidate_backup_path); + + db_backups.push({ name: path.basename(candidate_backup), timestamp: parseInt(candidate_backup.split('.')[2]), size: stats.size, source: candidate_backup.includes('local') ? 'local' : 'remote' }); + } + + db_backups.sort((a,b) => b.timestamp - a.timestamp); + + res.send({db_backups: db_backups}); +}); + +app.post('/api/restoreDBBackup', optionalJwt, async (req, res) => { + const file_name = req.body.file_name; + + const success = await db_api.restoreDB(file_name); + + res.send({success: success}); +}); + // logs management app.post('/api/logs', optionalJwt, async function(req, res) { diff --git a/backend/db.js b/backend/db.js index 07dc95d..591b92b 100644 --- a/backend/db.js +++ b/backend/db.js @@ -987,6 +987,52 @@ const createDownloadsRecords = (downloads) => { return new_downloads; } +exports.backupDB = async () => { + const backup_dir = path.join('appdata', 'db_backup'); + fs.ensureDirSync(backup_dir); + const backup_file_name = `${using_local_db ? 'local' : 'remote'}_db.json.${Date.now()/1000}.bak`; + const path_to_backups = path.join(backup_dir, backup_file_name); + + logger.verbose(`Backing up ${using_local_db ? 'local' : 'remote'} DB to ${path_to_backups}`); + + const table_to_records = {}; + for (let i = 0; i < tables_list.length; i++) { + const table = tables_list[i]; + table_to_records[table] = await exports.getRecords(table); + } + + fs.writeJsonSync(path_to_backups, table_to_records); + + return backup_file_name; +} + +exports.restoreDB = async (file_name) => { + const path_to_backup = path.join('appdata', 'db_backup', file_name); + + logger.debug('Reading database backup file.'); + const table_to_records = fs.readJSONSync(path_to_backup); + + if (!table_to_records) { + logger.error(`Failed to restore DB! Backup file '${path_to_backup}' could not be read.`); + return false; + } + + logger.debug('Clearing database.'); + await exports.removeAllRecords(); + + logger.debug('Database cleared! Beginning restore.'); + let success = true; + for (let i = 0; i < tables_list.length; i++) { + const table = tables_list[i]; + if (!table_to_records[table] || table_to_records[table].length === 0) continue; + success &= await exports.bulkInsertRecordsIntoTable(table, table_to_records[table]); + } + + logger.debug('Restore finished!'); + + return success; +} + exports.transferDB = async (local_to_remote) => { const table_to_records = {}; for (let i = 0; i < tables_list.length; i++) { @@ -996,9 +1042,8 @@ exports.transferDB = async (local_to_remote) => { using_local_db = !local_to_remote; if (local_to_remote) { - // backup local DB - logger.debug('Backup up Local DB...'); - await fs.copyFile('appdata/local_db.json', `appdata/local_db.json.${Date.now()/1000}.bak`); + logger.debug('Backup up DB...'); + await exports.backupDB(); const db_connected = await exports.connectToDB(5, true); if (!db_connected) { logger.error('Failed to transfer database - could not connect to MongoDB. Verify that your connection URL is valid.'); diff --git a/backend/tasks.js b/backend/tasks.js index c66b23a..9fdbad3 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -7,8 +7,8 @@ const scheduler = require('node-schedule'); const TASKS = { backup_local_db: { - run: utils.backupLocalDB, - title: 'Backup Local DB', + run: db_api.backupDB, + title: 'Backup DB', job: null }, missing_files_check: { @@ -81,7 +81,8 @@ const setupTasks = async () => { confirming: false, data: null, error: null, - schedule: null + schedule: null, + options: {} }); } else { // reset task if necessary diff --git a/backend/test/tests.js b/backend/test/tests.js index 0c26fdc..9ae95a8 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -70,6 +70,17 @@ describe('Database', async function() { const success = await db_api.getRecord('test', {test: 'test'}); assert(success); }); + + it('Restore db', async function() { + const db_stats = await db_api.getDBStats(); + + const file_name = await db_api.backupDB(); + await db_api.restoreDB(file_name); + + const new_db_stats = await db_api.getDBStats(); + + assert(JSON.stringify(db_stats), JSON.stringify(new_db_stats)); + }); }); describe('Export', function() { @@ -393,7 +404,7 @@ describe('Tasks', function() { await tasks_api.initialize(); }); - it('Backup local db', async function() { + it('Backup db', async function() { const backups_original = await utils.recFindByExt('appdata', 'bak'); const original_length = backups_original.length; await tasks_api.executeTask('backup_local_db'); diff --git a/backend/utils.js b/backend/utils.js index 340a214..4f94388 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -266,13 +266,7 @@ function getCurrentDownloader() { return details_json['downloader']; } -async function backupLocalDB() { - const path_to_backups = path.join('appdata', 'db_backup'); - fs.ensureDir(path_to_backups); - await fs.copyFile('appdata/local_db.json', path.join(path_to_backups, `local_db.json.${Date.now()/1000}.bak`)); -} - -async function recFindByExt(base,ext,files,result) +async function recFindByExt(base, ext, files, result, recursive = true) { files = files || (await fs.readdir(base)) result = result || [] @@ -281,6 +275,7 @@ async function recFindByExt(base,ext,files,result) var newbase = path.join(base,file) if ( (await fs.stat(newbase)).isDirectory() ) { + if (!recursive) continue; result = await recFindByExt(newbase,ext,await fs.readdir(newbase),result) } else @@ -396,7 +391,6 @@ module.exports = { getMatchingCategoryFiles: getMatchingCategoryFiles, addUIDsToCategory: addUIDsToCategory, getCurrentDownloader: getCurrentDownloader, - backupLocalDB: backupLocalDB, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, formatDateString: formatDateString, diff --git a/src/api-types/index.ts b/src/api-types/index.ts index 93d611f..43f0f06 100644 --- a/src/api-types/index.ts +++ b/src/api-types/index.ts @@ -21,6 +21,7 @@ export type { CreatePlaylistRequest } from './models/CreatePlaylistRequest'; export type { CreatePlaylistResponse } from './models/CreatePlaylistResponse'; export type { CropFileSettings } from './models/CropFileSettings'; export type { DatabaseFile } from './models/DatabaseFile'; +export { DBBackup } from './models/DBBackup'; export type { DBInfoResponse } from './models/DBInfoResponse'; export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest'; export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; @@ -45,6 +46,7 @@ export type { GetAllDownloadsResponse } from './models/GetAllDownloadsResponse'; export type { GetAllFilesResponse } from './models/GetAllFilesResponse'; export type { GetAllSubscriptionsResponse } from './models/GetAllSubscriptionsResponse'; export type { GetAllTasksResponse } from './models/GetAllTasksResponse'; +export type { GetDBBackupsResponse } from './models/GetDBBackupsResponse'; export type { GetDownloadRequest } from './models/GetDownloadRequest'; export type { GetDownloadResponse } from './models/GetDownloadResponse'; export type { GetFileFormatsRequest } from './models/GetFileFormatsRequest'; @@ -74,6 +76,7 @@ export type { LoginResponse } from './models/LoginResponse'; export type { Playlist } from './models/Playlist'; export type { RegisterRequest } from './models/RegisterRequest'; export type { RegisterResponse } from './models/RegisterResponse'; +export type { RestoreDBBackupRequest } from './models/RestoreDBBackupRequest'; export { Schedule } from './models/Schedule'; export type { SetConfigRequest } from './models/SetConfigRequest'; export type { SharingToggle } from './models/SharingToggle'; @@ -98,6 +101,7 @@ export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentSt export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdateServerRequest } from './models/UpdateServerRequest'; +export type { UpdateTaskDataRequest } from './models/UpdateTaskDataRequest'; export type { UpdateTaskScheduleRequest } from './models/UpdateTaskScheduleRequest'; export type { UpdateUserRequest } from './models/UpdateUserRequest'; export type { User } from './models/User'; diff --git a/src/api-types/models/DBBackup.ts b/src/api-types/models/DBBackup.ts new file mode 100644 index 0000000..710c591 --- /dev/null +++ b/src/api-types/models/DBBackup.ts @@ -0,0 +1,21 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DBBackup { + name: string; + timestamp: number; + size: number; + source: DBBackup.source; +} + +export namespace DBBackup { + + export enum source { + LOCAL = 'local', + REMOTE = 'remote', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/GetDBBackupsResponse.ts b/src/api-types/models/GetDBBackupsResponse.ts new file mode 100644 index 0000000..b02ced9 --- /dev/null +++ b/src/api-types/models/GetDBBackupsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DBBackup } from './DBBackup'; + +export interface GetDBBackupsResponse { + tasks?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/RestoreDBBackupRequest.ts b/src/api-types/models/RestoreDBBackupRequest.ts new file mode 100644 index 0000000..b5fde8a --- /dev/null +++ b/src/api-types/models/RestoreDBBackupRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface RestoreDBBackupRequest { + file_name: string; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskDataRequest.ts b/src/api-types/models/UpdateTaskDataRequest.ts new file mode 100644 index 0000000..7768eaa --- /dev/null +++ b/src/api-types/models/UpdateTaskDataRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateTaskDataRequest { + task_key: string; + new_data: any; +} \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 0da23ee..3d6d040 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -90,6 +90,7 @@ import { ConcurrentStreamComponent } from './components/concurrent-stream/concur import { SkipAdButtonComponent } from './components/skip-ad-button/skip-ad-button.component'; import { TasksComponent } from './components/tasks/tasks.component'; import { UpdateTaskScheduleDialogComponent } from './dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; +import { RestoreDbDialogComponent } from './dialogs/restore-db-dialog/restore-db-dialog.component'; registerLocaleData(es, 'es'); @@ -140,7 +141,8 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible ConcurrentStreamComponent, SkipAdButtonComponent, TasksComponent, - UpdateTaskScheduleDialogComponent + UpdateTaskScheduleDialogComponent, + RestoreDbDialogComponent ], imports: [ CommonModule, diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html index 556ded4..9baa503 100644 --- a/src/app/components/tasks/tasks.component.html +++ b/src/app/components/tasks/tasks.component.html @@ -48,15 +48,23 @@ Actions -
- - - - - +
+
+
+ + + +
+
+ +
+
+ +
+
@@ -70,6 +78,8 @@ aria-label="Select page of tasks">
+ +
diff --git a/src/app/components/tasks/tasks.component.ts b/src/app/components/tasks/tasks.component.ts index a294b5b..cc86909 100644 --- a/src/app/components/tasks/tasks.component.ts +++ b/src/app/components/tasks/tasks.component.ts @@ -3,6 +3,7 @@ import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; +import { RestoreDbDialogComponent } from 'app/dialogs/restore-db-dialog/restore-db-dialog.component'; import { UpdateTaskScheduleDialogComponent } from 'app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; import { PostsService } from 'app/posts.services'; @@ -21,6 +22,8 @@ export class TasksComponent implements OnInit { displayedColumns: string[] = ['title', 'last_ran', 'last_confirmed', 'status', 'actions']; dataSource = null; + db_backups = []; + @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @@ -70,12 +73,23 @@ export class TasksComponent implements OnInit { runTask(task_key: string): void { this.postsService.runTask(task_key).subscribe(res => { this.getTasks(); + this.getDBBackups(); + if (res['success']) this.postsService.openSnackBar($localize`Successfully ran task!`); + else this.postsService.openSnackBar($localize`Failed to run task!`); + }, err => { + this.postsService.openSnackBar($localize`Failed to run task!`); + console.error(err); }); } confirmTask(task_key: string): void { this.postsService.confirmTask(task_key).subscribe(res => { this.getTasks(); + if (res['success']) this.postsService.openSnackBar($localize`Successfully confirmed task!`); + else this.postsService.openSnackBar($localize`Failed to confirm task!`); + }, err => { + this.postsService.openSnackBar($localize`Failed to confirm task!`); + console.error(err); }); } @@ -96,6 +110,21 @@ export class TasksComponent implements OnInit { }); } + getDBBackups(): void { + this.postsService.getDBBackups().subscribe(res => { + this.db_backups = res['db_backups']; + }); + } + + openRestoreDBBackupDialog(): void { + this.dialog.open(RestoreDbDialogComponent, { + data: { + db_backups: this.db_backups + }, + width: '80vw' + }) + } + } export interface Task { diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html new file mode 100644 index 0000000..abcb1e7 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html @@ -0,0 +1,29 @@ +

Restore DB from backup

+ + + + +
+
+
+ {{db_backup.timestamp*1000 | date: 'short'}} +
+
+ {{(db_backup.size/1000).toFixed(2)}} kB +
+
+ {{db_backup.source}} +
+
+
+
+
+
+ + + + +
+ +
+
\ No newline at end of file diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.scss b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts new file mode 100644 index 0000000..422e482 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RestoreDbDialogComponent } from './restore-db-dialog.component'; + +describe('RestoreDbDialogComponent', () => { + let component: RestoreDbDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RestoreDbDialogComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RestoreDbDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts new file mode 100644 index 0000000..77df326 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts @@ -0,0 +1,47 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-restore-db-dialog', + templateUrl: './restore-db-dialog.component.html', + styleUrls: ['./restore-db-dialog.component.scss'] +}) +export class RestoreDbDialogComponent implements OnInit { + + db_backups = []; + selected_backup = null; + restoring = false; + + constructor(@Inject(MAT_DIALOG_DATA) public data: any, private dialogRef: MatDialogRef, private postsService: PostsService) { + if (this.data?.db_backups) { + this.db_backups = this.data.db_backups; + } + + this.getDBBackups(); + } + + ngOnInit(): void { + } + + getDBBackups(): void { + this.postsService.getDBBackups().subscribe(res => { + this.db_backups = res['db_backups']; + }); + } + + restoreClicked(): void { + if (this.selected_backup.length !== 1) return; + this.postsService.restoreDBBackup(this.selected_backup[0]).subscribe(res => { + if (res['success']) { + this.postsService.openSnackBar('Database successfully restored!'); + } else { + this.postsService.openSnackBar('Failed to restore database! See logs for more info.'); + } + }, err => { + this.postsService.openSnackBar('Failed to restore database! See browser console for more info.'); + console.error(err); + }); + } + +} diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 923210a..68f9890 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -93,6 +93,9 @@ import { GetTaskRequest, GetTaskResponse, UpdateTaskScheduleRequest, + UpdateTaskDataRequest, + RestoreDBBackupRequest, + Schedule, } from '../api-types'; import { isoLangs } from './settings/locales_list'; import { Title } from '@angular/platform-browser'; @@ -588,26 +591,40 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getTasks', {}, this.httpOptions); } - getTask(task_key) { + getTask(task_key: string) { const body: GetTaskRequest = {task_key: task_key}; return this.http.post(this.path + 'getTask', body, this.httpOptions); } - runTask(task_key) { + runTask(task_key: string) { const body: GetTaskRequest = {task_key: task_key}; return this.http.post(this.path + 'runTask', body, this.httpOptions); } - confirmTask(task_key) { + confirmTask(task_key: string) { const body: GetTaskRequest = {task_key: task_key}; return this.http.post(this.path + 'confirmTask', body, this.httpOptions); } - updateTaskSchedule(task_key, schedule) { + updateTaskSchedule(task_key: string, schedule: Schedule) { const body: UpdateTaskScheduleRequest = {task_key: task_key, new_schedule: schedule}; return this.http.post(this.path + 'updateTaskSchedule', body, this.httpOptions); } + updateTaskData(task_key: string, data: any) { + const body: UpdateTaskDataRequest = {task_key: task_key, new_data: data}; + return this.http.post(this.path + 'updateTaskData', body, this.httpOptions); + } + + getDBBackups() { + return this.http.post(this.path + 'getDBBackups', {}, this.httpOptions); + } + + restoreDBBackup(file_name: string) { + const body: RestoreDBBackupRequest = {file_name: file_name}; + return this.http.post(this.path + 'restoreDBBackup', body, this.httpOptions); + } + getVersionInfo() { return this.http.get(this.path + 'versionInfo', this.httpOptions); } From d2d125743e56b242cd628b2b3f2c01c6c032ce16 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 21 Apr 2022 19:56:09 -0400 Subject: [PATCH 110/212] Fixed issue where restoring a DB backup would cause backup_local_db task to be stuck running Slightly updated tasks UI --- backend/tasks.js | 3 ++- src/app/components/tasks/tasks.component.html | 8 ++++---- .../restore-db-dialog/restore-db-dialog.component.ts | 4 ++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/tasks.js b/backend/tasks.js index 9fdbad3..423f85a 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -110,7 +110,8 @@ exports.executeTask = async (task_key) => { exports.executeRun = async (task_key) => { logger.verbose(`Running task ${task_key}`); - await db_api.updateRecord('tasks', {key: task_key}, {running: true}); + // don't set running to true when backup up DB as it will be stick "running" if restored + if (task_key !== 'backup_local_db') await db_api.updateRecord('tasks', {key: task_key}, {running: true}); const data = await TASKS[task_key].run(); await db_api.updateRecord('tasks', {key: task_key}, {data: data, last_ran: Date.now()/1000, running: false}); logger.verbose(`Finished running task ${task_key}`); diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html index 9baa503..f883f54 100644 --- a/src/app/components/tasks/tasks.component.html +++ b/src/app/components/tasks/tasks.component.html @@ -34,9 +34,9 @@ Status - + Scheduled for  - {{element.next_invocation | date: 'short'}}repeat + {{element.next_invocation | date: 'short'}}repeat Not scheduled @@ -58,10 +58,10 @@
-
+
-
+
diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts index 77df326..204a8c1 100644 --- a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts @@ -31,14 +31,18 @@ export class RestoreDbDialogComponent implements OnInit { } restoreClicked(): void { + this.restoring = true; if (this.selected_backup.length !== 1) return; this.postsService.restoreDBBackup(this.selected_backup[0]).subscribe(res => { + this.restoring = false; if (res['success']) { this.postsService.openSnackBar('Database successfully restored!'); + this.dialogRef.close(); } else { this.postsService.openSnackBar('Failed to restore database! See logs for more info.'); } }, err => { + this.restoring = false; this.postsService.openSnackBar('Failed to restore database! See browser console for more info.'); console.error(err); }); From b53d9c9710dc1d1d86ecb22e34ddaa5abba8cbb0 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 21 Apr 2022 22:04:45 -0400 Subject: [PATCH 111/212] Added ability to reset tasks Refactored youtube-dl updating and added youtube-dl update task --- Public API v1.yaml | 32 +++ backend/app.js | 197 ++---------------- backend/tasks.js | 23 +- backend/utils.js | 69 +++++- backend/youtube-dl.js | 127 +++++++++++ src/app/components/tasks/tasks.component.html | 14 +- src/app/components/tasks/tasks.component.ts | 26 +++ src/app/posts.services.ts | 4 + 8 files changed, 298 insertions(+), 194 deletions(-) create mode 100644 backend/youtube-dl.js diff --git a/Public API v1.yaml b/Public API v1.yaml index 5be8869..0ca76da 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -881,10 +881,30 @@ paths: application/json: schema: $ref: '#/components/schemas/GetAllTasksResponse' + /api/resetTasks: + post: + tags: + - tasks + summary: Resets all tasks + operationId: post-api-reset-tasks + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/runTask: post: + tags: + - tasks summary: Runs one task operationId: post-api-run-task responses: @@ -901,6 +921,8 @@ paths: $ref: '#/components/schemas/GetTaskRequest' /api/confirmTask: post: + tags: + - tasks summary: Confirms a task operationId: post-api-confirm-task responses: @@ -917,6 +939,8 @@ paths: $ref: '#/components/schemas/GetTaskRequest' /api/cancelTask: post: + tags: + - tasks summary: Cancels a task operationId: post-api-cancel-task responses: @@ -933,6 +957,8 @@ paths: $ref: '#/components/schemas/GetTaskRequest' /api/updateTaskSchedule: post: + tags: + - tasks summary: Updates task schedule operationId: post-api-update-task-schedule responses: @@ -949,6 +975,8 @@ paths: $ref: '#/components/schemas/UpdateTaskScheduleRequest' /api/updateTaskData: post: + tags: + - tasks summary: Updates task data operationId: post-api-update-task-data responses: @@ -965,6 +993,8 @@ paths: $ref: '#/components/schemas/UpdateTaskDataRequest' /api/getDBBackups: post: + tags: + - tasks summary: Get database backups operationId: post-api-get-database-backups responses: @@ -981,6 +1011,8 @@ paths: type: object /api/restoreDBBackup: post: + tags: + - tasks summary: Restore database backup operationId: post-api-restore-database-backup responses: diff --git a/backend/app.js b/backend/app.js index f596b8e..ae71c15 100644 --- a/backend/app.js +++ b/backend/app.js @@ -13,7 +13,6 @@ const unzipper = require('unzipper'); const db_api = require('./db'); const utils = require('./utils') const low = require('lowdb') -const ProgressBar = require('progress'); const fetch = require('node-fetch'); const URL = require('url').URL; const CONSTS = require('./consts') @@ -32,8 +31,7 @@ const tasks_api = require('./tasks'); const subscriptions_api = require('./subscriptions'); const categories_api = require('./categories'); const twitch_api = require('./twitch'); - -const is_windows = process.platform === 'win32'; +const youtubedl_api = require('./youtube-dl'); var app = express(); @@ -357,34 +355,6 @@ async function downloadReleaseFiles(tag) { }); } -// helper function to download file using fetch -async function fetchFile(url, path, file_label) { - var len = null; - const res = await fetch(url); - - len = parseInt(res.headers.get("Content-Length"), 10); - - var bar = new ProgressBar(` Downloading ${file_label} [:bar] :percent :etas`, { - complete: '=', - incomplete: ' ', - width: 20, - total: len - }); - const fileStream = fs.createWriteStream(path); - await new Promise((resolve, reject) => { - res.body.pipe(fileStream); - res.body.on("error", (err) => { - reject(err); - }); - res.body.on('data', function (chunk) { - bar.tick(chunk.length); - }); - fileStream.on("finish", function() { - resolve(); - }); - }); - } - async function downloadReleaseZip(tag) { return new Promise(async resolve => { // get name of zip file, which depends on the version @@ -395,7 +365,7 @@ async function downloadReleaseZip(tag) { let output_path = path.join(__dirname, `youtubedl-material-release-${tag}.zip`); // download zip from release - await fetchFile(latest_zip_link, output_path, 'update ' + tag); + await utils.fetchFile(latest_zip_link, output_path, 'update ' + tag); resolve(true); }); @@ -708,156 +678,8 @@ async function getUrlInfos(url) { async function startYoutubeDL() { // auto update youtube-dl - await autoUpdateYoutubeDL(); -} - -// auto updates the underlying youtube-dl binary, not YoutubeDL-Material -async function autoUpdateYoutubeDL() { - const download_sources = { - 'youtube-dl': { - 'tags_url': 'https://api.github.com/repos/ytdl-org/youtube-dl/tags', - 'func': downloadLatestYoutubeDLBinary - }, - 'youtube-dlc': { - 'tags_url': 'https://api.github.com/repos/blackjack4494/yt-dlc/tags', - 'func': downloadLatestYoutubeDLCBinary - }, - 'yt-dlp': { - 'tags_url': 'https://api.github.com/repos/yt-dlp/yt-dlp/tags', - 'func': downloadLatestYoutubeDLPBinary - } - } - return new Promise(async resolve => { - const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); - const tags_url = download_sources[default_downloader]['tags_url']; - // get current version - let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); - if (!current_app_details_exists) { - logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); - } - let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); - let current_version = current_app_details['version']; - let current_downloader = current_app_details['downloader']; - let stored_binary_path = current_app_details['path']; - if (!stored_binary_path || typeof stored_binary_path !== 'string') { - // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${CONSTS.DETAILS_BIN_PATH}, attempting to guess actual path...`); - const guessed_base_path = 'node_modules/youtube-dl/bin/'; - const guessed_file_path = guessed_base_path + 'youtube-dl' + (is_windows ? '.exe' : ''); - if (fs.existsSync(guessed_file_path)) { - stored_binary_path = guessed_file_path; - // logger.info('INFO: Guess successful! Update process continuing...') - } else { - logger.error(`Guess '${guessed_file_path}' is not correct. Cancelling update check. Verify that your youtube-dl binaries exist by running npm install.`); - resolve(false); - return; - } - } - - // got version, now let's check the latest version from the youtube-dl API - - - fetch(tags_url, {method: 'Get'}) - .then(async res => res.json()) - .then(async (json) => { - // check if the versions are different - if (!json || !json[0]) { - logger.error(`Failed to check ${default_downloader} version for an update.`) - resolve(false); - return false; - } - const latest_update_version = json[0]['name']; - if (current_version !== latest_update_version || default_downloader !== current_downloader) { - // versions different or different downloader is being used, download new update - logger.info(`Found new update for ${default_downloader}. Updating binary...`); - try { - await checkExistsWithTimeout(stored_binary_path, 10000); - } catch(e) { - logger.error(`Failed to update ${default_downloader} - ${e}`); - } - - await download_sources[default_downloader]['func'](latest_update_version); - - resolve(true); - } else { - resolve(false); - } - }) - .catch(err => { - logger.error(`Failed to check ${default_downloader} version for an update.`) - logger.error(err); - resolve(false); - return false; - }); - }); -} - -async function downloadLatestYoutubeDLBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/ytdl-org/youtube-dl/releases/latest/download/youtube-dl${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `youtube-dl ${new_version}`); - - updateDetailsJSON(new_version, 'youtube-dl'); -} - -async function downloadLatestYoutubeDLCBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `youtube-dlc ${new_version}`); - - updateDetailsJSON(new_version, 'youtube-dlc'); -} - -async function downloadLatestYoutubeDLPBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `yt-dlp ${new_version}`); - - updateDetailsJSON(new_version, 'yt-dlp'); -} - -function updateDetailsJSON(new_version, downloader) { - const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); - if (new_version) details_json['version'] = new_version; - details_json['downloader'] = downloader; - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); -} - -async function checkExistsWithTimeout(filePath, timeout) { - return new Promise(function (resolve, reject) { - - var timer = setTimeout(function () { - if (watcher) watcher.close(); - reject(new Error('File did not exists and was not created during the timeout.')); - }, timeout); - - fs.access(filePath, fs.constants.R_OK, function (err) { - if (!err) { - clearTimeout(timer); - if (watcher) watcher.close(); - resolve(); - } - }); - - var dir = path.dirname(filePath); - var basename = path.basename(filePath); - var watcher = fs.watch(dir, function (eventType, filename) { - if (eventType === 'rename' && filename === basename) { - clearTimeout(timer); - if (watcher) watcher.close(); - resolve(); - } - }); - }); + const update_available = await youtubedl_api.checkForYoutubeDLUpdate(); + if (update_available) await youtubedl_api.updateYoutubeDL(update_available); } app.use(function(req, res, next) { @@ -1886,6 +1708,17 @@ app.post('/api/getTasks', optionalJwt, async (req, res) => { res.send({tasks: tasks}); }); +app.post('/api/resetTasks', optionalJwt, async (req, res) => { + const tasks_keys = Object.keys(tasks_api.TASKS); + for (let i = 0; i < tasks_keys.length; i++) { + const task_key = tasks_keys[i]; + tasks_api.TASKS[task_key]['job'] = null; + } + await db_api.removeAllRecords('tasks'); + await tasks_api.setupTasks(); + res.send({success: true}); +}); + app.post('/api/getTask', optionalJwt, async (req, res) => { const task_key = req.body.task_key; const task = await db_api.getRecord('tasks', {key: task_key}); diff --git a/backend/tasks.js b/backend/tasks.js index 423f85a..2014da3 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -1,5 +1,5 @@ -const utils = require('./utils'); const db_api = require('./db'); +const youtubedl_api = require('./youtube-dl'); const fs = require('fs-extra'); const logger = require('./logger'); @@ -27,6 +27,12 @@ const TASKS = { confirm: removeDuplicates, title: 'Find duplicate files in DB', job: null + }, + youtubedl_update_check: { + run: youtubedl_api.checkForYoutubeDLUpdate, + confirm: youtubedl_api.updateYoutubeDL, + title: 'Update youtube-dl', + job: null } } @@ -52,20 +58,22 @@ function scheduleJob(task_key, schedule) { return; } + // remove schedule if it's a one-time task + if (task_state['schedule']['type'] !== 'recurring') await db_api.updateRecord('tasks', {key: task_key}, {schedule: null}); // we're just "running" the task, any confirmation should be user-initiated exports.executeRun(task_key); }); } if (db_api.database_initialized) { - setupTasks(); + exports.setupTasks(); } else { db_api.database_initialized_bs.subscribe(init => { - if (init) setupTasks(); + if (init) exports.setupTasks(); }); } -const setupTasks = async () => { +exports.setupTasks = async () => { const tasks_keys = Object.keys(TASKS); for (let i = 0; i < tasks_keys.length; i++) { const task_key = tasks_keys[i]; @@ -90,6 +98,11 @@ const setupTasks = async () => { // schedule task and save job if (task_in_db['schedule']) { + // prevent timestamp schedules from being set to the past + if (task_in_db['schedule']['type'] === 'timestamp' && task_in_db['schedule']['data']['timestamp'] < Date.now()) { + await db_api.updateRecord('tasks', {key: task_key}, {schedule: null}); + continue; + } TASKS[task_key]['job'] = scheduleJob(task_key, task_in_db['schedule']); } } @@ -113,7 +126,7 @@ exports.executeRun = async (task_key) => { // don't set running to true when backup up DB as it will be stick "running" if restored if (task_key !== 'backup_local_db') await db_api.updateRecord('tasks', {key: task_key}, {running: true}); const data = await TASKS[task_key].run(); - await db_api.updateRecord('tasks', {key: task_key}, {data: data, last_ran: Date.now()/1000, running: false}); + await db_api.updateRecord('tasks', {key: task_key}, {data: TASKS[task_key]['confirm'] ? data : null, last_ran: Date.now()/1000, running: false}); logger.verbose(`Finished running task ${task_key}`); } diff --git a/backend/utils.js b/backend/utils.js index 4f94388..0271ed0 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -1,10 +1,13 @@ -const fs = require('fs-extra') -const path = require('path') +const fs = require('fs-extra'); +const path = require('path'); const ffmpeg = require('fluent-ffmpeg'); +const archiver = require('archiver'); +const fetch = require('node-fetch'); +const ProgressBar = require('progress'); + const config_api = require('./config'); const logger = require('./logger'); -const CONSTS = require('./consts') -const archiver = require('archiver'); +const CONSTS = require('./consts'); const is_windows = process.platform === 'win32'; @@ -356,6 +359,62 @@ async function cropFile(file_path, start, end, ext) { }); } +async function checkExistsWithTimeout(filePath, timeout) { + return new Promise(function (resolve, reject) { + + var timer = setTimeout(function () { + if (watcher) watcher.close(); + reject(new Error('File did not exists and was not created during the timeout.')); + }, timeout); + + fs.access(filePath, fs.constants.R_OK, function (err) { + if (!err) { + clearTimeout(timer); + if (watcher) watcher.close(); + resolve(); + } + }); + + var dir = path.dirname(filePath); + var basename = path.basename(filePath); + var watcher = fs.watch(dir, function (eventType, filename) { + if (eventType === 'rename' && filename === basename) { + clearTimeout(timer); + if (watcher) watcher.close(); + resolve(); + } + }); + }); +} + +// helper function to download file using fetch +async function fetchFile(url, path, file_label) { + var len = null; + const res = await fetch(url); + + len = parseInt(res.headers.get("Content-Length"), 10); + + var bar = new ProgressBar(` Downloading ${file_label} [:bar] :percent :etas`, { + complete: '=', + incomplete: ' ', + width: 20, + total: len + }); + const fileStream = fs.createWriteStream(path); + await new Promise((resolve, reject) => { + res.body.pipe(fileStream); + res.body.on("error", (err) => { + reject(err); + }); + res.body.on('data', function (chunk) { + bar.tick(chunk.length); + }); + fileStream.on("finish", function() { + resolve(); + }); + }); +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -397,5 +456,7 @@ module.exports = { cropFile: cropFile, createEdgeNGrams: createEdgeNGrams, wait: wait, + checkExistsWithTimeout: checkExistsWithTimeout, + fetchFile: fetchFile, File: File } diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js new file mode 100644 index 0000000..80432fb --- /dev/null +++ b/backend/youtube-dl.js @@ -0,0 +1,127 @@ +const fs = require('fs-extra'); +const fetch = require('node-fetch'); + +const logger = require('./logger'); +const utils = require('./utils'); +const CONSTS = require('./consts'); +const config_api = require('./config.js'); + +const is_windows = process.platform === 'win32'; + +const download_sources = { + 'youtube-dl': { + 'tags_url': 'https://api.github.com/repos/ytdl-org/youtube-dl/tags', + 'func': downloadLatestYoutubeDLBinary + }, + 'youtube-dlc': { + 'tags_url': 'https://api.github.com/repos/blackjack4494/yt-dlc/tags', + 'func': downloadLatestYoutubeDLCBinary + }, + 'yt-dlp': { + 'tags_url': 'https://api.github.com/repos/yt-dlp/yt-dlp/tags', + 'func': downloadLatestYoutubeDLPBinary + } +} + +exports.checkForYoutubeDLUpdate = async () => { + return new Promise(async resolve => { + const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); + const tags_url = download_sources[default_downloader]['tags_url']; + // get current version + let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); + if (!current_app_details_exists) { + logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); + } + let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); + let current_version = current_app_details['version']; + let current_downloader = current_app_details['downloader']; + let stored_binary_path = current_app_details['path']; + if (!stored_binary_path || typeof stored_binary_path !== 'string') { + // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${CONSTS.DETAILS_BIN_PATH}, attempting to guess actual path...`); + const guessed_base_path = 'node_modules/youtube-dl/bin/'; + const guessed_file_path = guessed_base_path + 'youtube-dl' + (is_windows ? '.exe' : ''); + if (fs.existsSync(guessed_file_path)) { + stored_binary_path = guessed_file_path; + // logger.info('INFO: Guess successful! Update process continuing...') + } else { + logger.error(`Guess '${guessed_file_path}' is not correct. Cancelling update check. Verify that your youtube-dl binaries exist by running npm install.`); + resolve(null); + return; + } + } + + // got version, now let's check the latest version from the youtube-dl API + + + fetch(tags_url, {method: 'Get'}) + .then(async res => res.json()) + .then(async (json) => { + // check if the versions are different + if (!json || !json[0]) { + logger.error(`Failed to check ${default_downloader} version for an update.`) + resolve(null); + return; + } + const latest_update_version = json[0]['name']; + if (current_version !== latest_update_version || default_downloader !== current_downloader) { + // versions different or different downloader is being used, download new update + resolve(latest_update_version); + } else { + resolve(null); + } + return; + }) + .catch(err => { + logger.error(`Failed to check ${default_downloader} version for an update.`) + logger.error(err); + resolve(null); + return; + }); + }); +} + +exports.updateYoutubeDL = async (latest_update_version) => { + const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); + await download_sources[default_downloader]['func'](latest_update_version); +} + +async function downloadLatestYoutubeDLBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/ytdl-org/youtube-dl/releases/latest/download/youtube-dl${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `youtube-dl ${new_version}`); + + updateDetailsJSON(new_version, 'youtube-dl'); +} + +async function downloadLatestYoutubeDLCBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `youtube-dlc ${new_version}`); + + updateDetailsJSON(new_version, 'youtube-dlc'); +} + +async function downloadLatestYoutubeDLPBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `yt-dlp ${new_version}`); + + updateDetailsJSON(new_version, 'yt-dlp'); +} + +function updateDetailsJSON(new_version, downloader) { + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); + if (new_version) details_json['version'] = new_version; + details_json['downloader'] = downloader; + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); +} diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html index f883f54..662e3be 100644 --- a/src/app/components/tasks/tasks.component.html +++ b/src/app/components/tasks/tasks.component.html @@ -50,11 +50,18 @@
-
+
@@ -80,6 +87,7 @@
+
diff --git a/src/app/components/tasks/tasks.component.ts b/src/app/components/tasks/tasks.component.ts index cc86909..8fec372 100644 --- a/src/app/components/tasks/tasks.component.ts +++ b/src/app/components/tasks/tasks.component.ts @@ -3,6 +3,7 @@ import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; +import { ConfirmDialogComponent } from 'app/dialogs/confirm-dialog/confirm-dialog.component'; import { RestoreDbDialogComponent } from 'app/dialogs/restore-db-dialog/restore-db-dialog.component'; import { UpdateTaskScheduleDialogComponent } from 'app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; import { PostsService } from 'app/posts.services'; @@ -125,6 +126,31 @@ export class TasksComponent implements OnInit { }) } + resetTasks(): void { + const dialogRef = this.dialog.open(ConfirmDialogComponent, { + data: { + dialogTitle: $localize`Reset tasks`, + dialogText: $localize`Would you like to reset your tasks? All your schedules will be removed as well.`, + submitText: $localize`Reset`, + warnSubmitColor: true + } + }); + dialogRef.afterClosed().subscribe(confirmed => { + if (confirmed) { + this.postsService.resetTasks().subscribe(res => { + if (res['success']) { + this.postsService.openSnackBar($localize`Tasks successfully reset!`); + } else { + this.postsService.openSnackBar($localize`Failed to reset tasks!`); + } + }, err => { + this.postsService.openSnackBar($localize`Failed to reset tasks!`); + console.error(err); + }); + } + }); + } + } export interface Task { diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 68f9890..6df00e5 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -591,6 +591,10 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getTasks', {}, this.httpOptions); } + resetTasks() { + return this.http.post(this.path + 'resetTasks', {}, this.httpOptions); + } + getTask(task_key: string) { const body: GetTaskRequest = {task_key: task_key}; return this.http.post(this.path + 'getTask', body, this.httpOptions); From 7a4d91cea0b04188993378e0e165e0137fd67112 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 21 Apr 2022 22:08:47 -0400 Subject: [PATCH 112/212] Removed import of unregistered files on startup as it's a task now --- backend/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/app.js b/backend/app.js index ae71c15..2882663 100644 --- a/backend/app.js +++ b/backend/app.js @@ -536,8 +536,6 @@ async function loadConfig() { watchSubscriptionsInterval(); } - db_api.importUnregisteredFiles(); - // start the server here startServer(); From df687263c52903893a9a97017ab411e56f3dca3b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 00:35:58 -0400 Subject: [PATCH 113/212] Fixed bug that prevented files from being downloaded from the server. Reverted some changes from #528 as they are not needed --- src/app/player/player.component.html | 3 +-- src/app/player/player.component.ts | 18 ------------------ src/app/posts.services.ts | 9 +++------ 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index 74c0b1b..0bf510f 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -33,8 +33,7 @@ - - + diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 1a4e0ca..2bf0d35 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -328,24 +328,6 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { }); } - downloadVideo() { - const filename = this.currentItem.label; - const ext = (this.currentItem.type === 'audio/mp3') ? '.mp3' : '.mp4'; - // const type = this.currentItem.type; - const url = this.currentItem.src; - this.downloading = true; - this.http.get(url, { - responseType: 'blob' - }).subscribe(res => { - const blob: Blob = res; - this.downloading = false; - saveAs(blob, filename + ext); - }, err => { - console.log(err); - this.downloading = false; - }) - } - playlistPostCreationHandler(playlistID) { // changes the route without moving from the current view or // triggering a navigation event diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 6df00e5..5674fec 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -357,15 +357,12 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); } - downloadFileFromServer(uid: string, uuid: string = null, sub_id: string = null, url: string = null, type: FileType = null) { + downloadFileFromServer(uid: string, uuid: string = null) { const body: DownloadFileRequest = { uid: uid, - uuid: uuid, - sub_id: sub_id, - url: url, - type: type + uuid: uuid }; - return this.http.post(this.path + 'downloadFile', body, {responseType: 'blob', params: this.httpOptions.params}); + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); } getFullTwitchChat(id, type, uuid = null, sub = null) { From 2c3813f302a6c876c257aa09bddfbaf6ec3166c3 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 00:40:34 -0400 Subject: [PATCH 114/212] Removed httpclient import from player component --- src/app/player/player.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 2bf0d35..7ad108e 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -9,7 +9,6 @@ import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-m import { FileType } from '../../api-types'; import { TwitchChatComponent } from 'app/components/twitch-chat/twitch-chat.component'; import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; -import { HttpClient, HttpParams } from '@angular/common/http'; export interface IMedia { title: string; @@ -110,7 +109,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { } constructor(public postsService: PostsService, private route: ActivatedRoute, private dialog: MatDialog, private router: Router, - public snackBar: MatSnackBar, private cdr: ChangeDetectorRef, private http: HttpClient) { + public snackBar: MatSnackBar, private cdr: ChangeDetectorRef) { } processConfig() { From d32df84e3a2b46fe2a18411387c52bc1ce8d350a Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 15:25:26 -0400 Subject: [PATCH 115/212] Fixed build error --- src/app/player/player.component.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 7ad108e..9c82d1a 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -314,10 +314,8 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { downloadFile() { const filename = this.playlist[0].title; const ext = (this.playlist[0].type === 'audio/mp3') ? '.mp3' : '.mp4'; - const type = this.playlist[0].type; - const url = this.playlist[0].url; this.downloading = true; - this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id, url, type as FileType).subscribe(res => { + this.postsService.downloadFileFromServer(this.uid, this.uuid).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, filename + ext); From 3df377a26063e343bc7de2ded317b7a8f03db71a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 19:47:28 +0000 Subject: [PATCH 116/212] Bump async from 3.2.0 to 3.2.2 in /backend Bumps [async](https://github.com/caolan/async) from 3.2.0 to 3.2.2. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v3.2.0...v3.2.2) --- updated-dependencies: - dependency-name: async dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 6 +++--- backend/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 76daecd..fcb40d6 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -325,9 +325,9 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" }, "async-mutex": { "version": "0.3.1", diff --git a/backend/package.json b/backend/package.json index 76db3a5..183ad4b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -31,7 +31,7 @@ "homepage": "", "dependencies": { "archiver": "^3.1.1", - "async": "^3.1.0", + "async": "^3.2.2", "async-mutex": "^0.3.1", "axios": "^0.21.2", "bcryptjs": "^2.4.0", From 1bd713fe176855dc98d22120c8ce22770c970a20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 19:47:54 +0000 Subject: [PATCH 117/212] Bump async from 2.6.3 to 2.6.4 Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd536f2..f14b7b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2721,9 +2721,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" From 468e7153e408a794b9053d29b4eeaa0452445494 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 17:28:15 -0400 Subject: [PATCH 118/212] Updated ngx-videogular --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd536f2..f62a2bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2200,9 +2200,9 @@ } }, "@videogular/ngx-videogular": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@videogular/ngx-videogular/-/ngx-videogular-2.1.0.tgz", - "integrity": "sha512-YVTutwUc5j1JN7x2FGlX4KR8t7E3h8bqDg1H9oqxk80nsjqIC/opY8zlKsKpULs0ZaSmTfsjKrzVAu6WdBXIzg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@videogular/ngx-videogular/-/ngx-videogular-5.0.1.tgz", + "integrity": "sha512-ITA3GZBzh0XoCAGQzucAX+q7h72z43kG8G9ZspLMAfyvl2Z2MEHMfC6ct6hzSWTfqr48x62Avl935dcdl/NgXQ==", "requires": { "tslib": "^1.11.1 || ^2.0.0" } diff --git a/package.json b/package.json index de0bb1a..b676315 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@angular/platform-browser-dynamic": "^11.0.4", "@angular/router": "^11.0.4", "@ngneat/content-loader": "^5.0.0", - "@videogular/ngx-videogular": "^2.1.0", + "@videogular/ngx-videogular": "^5.0.1", "core-js": "^2.4.1", "crypto-js": "^4.1.1", "file-saver": "^2.0.2", From ed5f910c33141949205fe70e2b3d71c6b0e0dbd4 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 17:40:53 -0400 Subject: [PATCH 119/212] Updated angular to v12 --- angular.json | 13 +- package-lock.json | 10208 ++++++++++++++++++++-------------------- package.json | 36 +- src/app/app.module.ts | 2 +- src/polyfills.ts | 2 +- 5 files changed, 5218 insertions(+), 5043 deletions(-) diff --git a/angular.json b/angular.json index 46e84ea..6e98ea7 100644 --- a/angular.json +++ b/angular.json @@ -17,7 +17,6 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "aot": true, "outputPath": "backend/public", "index": "src/index.html", "main": "src/main.ts", @@ -33,7 +32,13 @@ "styles": [ "src/styles.scss" ], - "scripts": [] + "scripts": [], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true }, "configurations": { "production": { @@ -46,7 +51,6 @@ "optimization": true, "outputHashing": "all", "namedChunks": false, - "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, @@ -60,7 +64,8 @@ "es": { "localize": ["es"] } - } + }, + "defaultConfiguration": "" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", diff --git a/package-lock.json b/package-lock.json index f62a2bf..9ba2a08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,171 +4,245 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", - "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", + "@ampproject/remapping": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", + "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" + "@jridgewell/resolve-uri": "1.0.0", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.17.tgz", + "integrity": "sha512-uUQcHcLbPvr9adALQSLU1MTDduVUR2kZAHi2e7SmL9ioel84pPVXBoD0WpSBeUMKwPiDs3TQDaxDB49hl0nBSQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.17", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular-devkit/build-angular": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1100.4.tgz", - "integrity": "sha512-qVkMbtOwlo+k8fvOBOwwfKWMx06k4I1qrdjpRYAoZCt3cdje4EBepSciLrHnTB+ouIqWxpEDfEXTYBS98tXbBg==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.17.tgz", + "integrity": "sha512-uc3HGHVQyatqQ/M53oxYBvhz0jx0hgdc7WT+L56GLHvgz7Ct2VEbpWaMfwHkFfE1F1iHkIgnTKHKWacJl1yQIg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/build-optimizer": "0.1100.4", - "@angular-devkit/build-webpack": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@babel/core": "7.12.3", - "@babel/generator": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/runtime": "7.12.1", - "@babel/template": "7.10.4", + "@ampproject/remapping": "1.0.1", + "@angular-devkit/architect": "0.1202.17", + "@angular-devkit/build-optimizer": "0.1202.17", + "@angular-devkit/build-webpack": "0.1202.17", + "@angular-devkit/core": "12.2.17", + "@babel/core": "7.14.8", + "@babel/generator": "7.14.8", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.8", + "@babel/runtime": "7.14.8", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "11.0.4", + "@ngtools/webpack": "12.2.17", "ansi-colors": "4.1.1", - "autoprefixer": "9.8.6", - "babel-loader": "8.1.0", + "babel-loader": "8.2.2", "browserslist": "^4.9.1", - "cacache": "15.0.5", + "cacache": "15.2.0", "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.0", - "copy-webpack-plugin": "6.2.1", - "core-js": "3.6.5", - "css-loader": "4.3.0", - "cssnano": "4.1.10", - "file-loader": "6.1.1", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "9.0.1", + "core-js": "3.16.0", + "critters": "0.0.12", + "css-loader": "6.2.0", + "css-minimizer-webpack-plugin": "3.0.2", + "esbuild": "0.13.8", + "esbuild-wasm": "0.13.8", "find-cache-dir": "3.3.1", - "glob": "7.1.6", - "inquirer": "7.3.3", - "jest-worker": "26.5.0", + "glob": "7.1.7", + "https-proxy-agent": "5.0.0", + "inquirer": "8.1.2", "karma-source-map-support": "1.4.0", - "less": "3.12.2", - "less-loader": "7.0.2", - "license-webpack-plugin": "2.3.1", + "less": "4.1.1", + "less-loader": "10.0.1", + "license-webpack-plugin": "2.3.20", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.2.1", + "mini-css-extract-plugin": "2.4.2", "minimatch": "3.0.4", - "open": "7.3.0", - "ora": "5.1.0", + "open": "8.2.1", + "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "pnp-webpack-plugin": "1.6.4", - "postcss": "7.0.32", - "postcss-import": "12.0.1", - "postcss-loader": "4.0.4", - "raw-loader": "4.0.2", - "regenerator-runtime": "0.13.7", - "resolve-url-loader": "3.1.2", - "rimraf": "3.0.2", - "rollup": "2.32.1", - "rxjs": "6.6.3", - "sass": "1.27.0", - "sass-loader": "10.0.5", - "semver": "7.3.2", - "source-map": "0.7.3", - "source-map-loader": "1.1.2", + "piscina": "3.1.0", + "postcss": "8.3.6", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.1", + "postcss-preset-env": "6.7.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.36.0", + "sass-loader": "12.1.0", + "semver": "7.3.5", + "source-map-loader": "3.0.0", "source-map-support": "0.5.19", - "speed-measure-webpack-plugin": "1.3.3", - "style-loader": "2.0.0", + "style-loader": "3.2.1", "stylus": "0.54.8", - "stylus-loader": "4.3.1", - "terser": "5.3.7", - "terser-webpack-plugin": "4.2.3", + "stylus-loader": "6.1.0", + "terser": "5.7.1", + "terser-webpack-plugin": "5.1.4", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "4.44.2", - "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.0", - "webpack-merge": "5.2.0", - "webpack-sources": "2.0.1", - "webpack-subresource-integrity": "1.5.1", - "worker-plugin": "5.0.0" + "tslib": "2.3.0", + "webpack": "5.50.0", + "webpack-dev-middleware": "5.0.0", + "webpack-dev-server": "3.11.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "1.5.2" }, "dependencies": { - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/highlight": "^7.16.7" + } + }, + "@babel/core": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", + "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", + "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.14.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", + "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", "dev": true }, + "esbuild": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", + "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.13.8", + "esbuild-darwin-64": "0.13.8", + "esbuild-darwin-arm64": "0.13.8", + "esbuild-freebsd-64": "0.13.8", + "esbuild-freebsd-arm64": "0.13.8", + "esbuild-linux-32": "0.13.8", + "esbuild-linux-64": "0.13.8", + "esbuild-linux-arm": "0.13.8", + "esbuild-linux-arm64": "0.13.8", + "esbuild-linux-mips64le": "0.13.8", + "esbuild-linux-ppc64le": "0.13.8", + "esbuild-netbsd-64": "0.13.8", + "esbuild-openbsd-64": "0.13.8", + "esbuild-sunos-64": "0.13.8", + "esbuild-windows-32": "0.13.8", + "esbuild-windows-64": "0.13.8", + "esbuild-windows-arm64": "0.13.8" + } + }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -179,87 +253,186 @@ "path-is-absolute": "^1.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true } } }, "@angular-devkit/build-optimizer": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz", - "integrity": "sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.17.tgz", + "integrity": "sha512-1qWGWw7cCNADB4LZ/zjiSK0GLmr2kebYyNG0KutCE8GNVxv2h6w6dJP6t1C/BgskRuBPCAhvE+lEKN8ljSutag==", "dev": true, "requires": { - "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "2.0.3", - "typescript": "4.0.5", - "webpack-sources": "2.0.1" + "tslib": "2.3.0", + "typescript": "4.3.5" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1100.4.tgz", - "integrity": "sha512-uxe8gNSej3KF1FgqNtJmuRDbbINh3yLtXanXhRxFQLUj8IiNR8IciIVvy6RfXC5gqxcWwy1cOefJLLnuN9AOxQ==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.17.tgz", + "integrity": "sha512-z7FW43DJ4p8UZwbFRmMrh2ohqhI2Wtdg3+FZiTnl4opb3zYheGiNxPlTuiyKjG21JUkGCdthkkBLCNfaUU0U/Q==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" + "@angular-devkit/architect": "0.1202.17", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", + "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", "requires": { - "ajv": "6.12.6", + "ajv": "8.6.2", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.6.3", + "rxjs": "6.6.7", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@angular-devkit/schematics": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", - "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.17.tgz", + "integrity": "sha512-c0eNu/nx1Mnu7KcZgYTYHP736H4Y9pSyLBSmLAHYZv3t3m0dIPbhifRcLQX7hHQ8fGT2ZFxmOpaQG5/DcIghSw==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "ora": "5.1.0", - "rxjs": "6.6.3" + "@angular-devkit/core": "12.2.17", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular/animations": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.0.4.tgz", - "integrity": "sha512-NI7UdLNdzTfLCDu0zVqwhdKq2z1flRsM2GCD9RHG/NRjlohh73uRTBW+BcYpfh+o+Wq4giiq8UkTIgS2ReqDGg==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.16.tgz", + "integrity": "sha512-Kf6C7Ta+fCMq5DvT9JNVhBkcECrqFa3wumiC6ssGo5sNaEzXz+tlep9ZgEbqfxSn7gAN7L1DgsbS9u0O6tbUkg==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -280,106 +453,108 @@ } }, "@angular/cli": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.0.4.tgz", - "integrity": "sha512-VkE/gx6P80EJHg13fG+gkZfd2DJmRaDAtnamcCGM4AThzoUN9XBdxc24uMLEzBb0/mJ4vpMK9+WTNIdMmzl+Tg==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.17.tgz", + "integrity": "sha512-mubRPp5hRIK/q0J8q6kVAqbYYuBUKMMBljUCqT4fHsl+qXYD27rgG3EqNzycKBMHUIlykotrDSdy47voD+atOg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "@schematics/angular": "11.0.4", - "@schematics/update": "0.1100.4", + "@angular-devkit/architect": "0.1202.17", + "@angular-devkit/core": "12.2.17", + "@angular-devkit/schematics": "12.2.17", + "@schematics/angular": "12.2.17", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "4.2.0", - "ini": "1.3.5", - "inquirer": "7.3.3", - "npm-package-arg": "8.1.0", - "npm-pick-manifest": "6.1.0", - "open": "7.3.0", - "pacote": "9.5.12", - "resolve": "1.18.1", - "rimraf": "3.0.2", - "semver": "7.3.2", - "symbol-observable": "2.0.3", - "universal-analytics": "0.4.23", - "uuid": "8.3.1" + "debug": "4.3.2", + "ini": "2.0.0", + "inquirer": "8.1.2", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.2.1", + "ora": "5.4.1", + "pacote": "12.0.2", + "resolve": "1.20.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" } }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true } } }, "@angular/common": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.0.4.tgz", - "integrity": "sha512-4R2ALj71J6EAHVCKNnHHCKL7wcosMsv3gcMXbMTE+Wpzo3khEhM0Tej+I1qmMbVmGXVlRb//4+rjE4gff6FvQw==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.16.tgz", + "integrity": "sha512-FEqTXTEsnbDInqV1yFlm97Tz1OFqZS5t0TUkm8gzXRgpIce/F/jLwAg0u1VQkgOsno6cNm0xTWPoZgu85NI4ug==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/compiler": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.0.4.tgz", - "integrity": "sha512-Smf8FKSjkqd522ZCdXjSnVv1lYA0b21AN3WC5L1mwtRwyl/VacqCA/YEklLneDGgI2FdSIC9+bzSQIV+CCVftA==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", + "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/compiler-cli": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.0.4.tgz", - "integrity": "sha512-FV010O6GAldRe5sr+qegHe7oLinTylES70NX+0PIp44/W4tPx75Zvop+FVT90I4xPcvFvteLemy8nFAnMK+x5g==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.16.tgz", + "integrity": "sha512-tlalh8SJvdCWbUPRUR5GamaP+wSc/GuCsoUZpSbcczGKgSlbaEVXUYtVXm8/wuT6Slk2sSEbRs7tXGF2i7qxVw==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -387,78 +562,97 @@ "canonical-path": "1.0.0", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", + "dependency-graph": "^0.11.0", "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", + "semver": "^7.0.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.1.1" + "tslib": "^2.2.0", + "yargs": "^17.0.0" }, "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", + "@jridgewell/trace-mapping": "^0.3.0" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/core": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "source-map": { "version": "0.6.1", @@ -466,58 +660,156 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true } } }, "@angular/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.0.4.tgz", - "integrity": "sha512-860cTMjdCHcvEsHOsTzpg5rThxwVgtnY4yT0SgboWiphrlzX+aNoyN/cCJHxWhmOTRlrl6/+hkeRq95E2BZkKw==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.16.tgz", + "integrity": "sha512-jsmvaRdAfng99z2a9mAmkfcsCE1wm+tBYVDxnc5JquSXznwtncjzcoc2X0J0dzrkCDvzFfpTsZ9vehylytBc+A==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/forms": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.0.4.tgz", - "integrity": "sha512-Fhfc4buwMZk0WumDvl/X7XBnOKFeTRTJrwKdi8LlhY6o1Og8H4e/f69u9iDJCF3YjU4qC6yGtPp9YpSVCPP7Ew==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.16.tgz", + "integrity": "sha512-sb+gpNun5aN7CZfHXS6X7vJcd/0A1P/gRBZpYtQTzBYnqEFCOFIvR62eb05aHQ4JhgKaSPpIXrbz/bAwY/njZw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/language-service": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.0.4.tgz", - "integrity": "sha512-KtQxVSlZi3SwZEN4E56KHkNTFEYa3FPZfLJFm6WD1dSobFyMwJgvztO08GWSaT4S0ht0NNRD2IRt0XzBYuZkag==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.2.16.tgz", + "integrity": "sha512-eDOd46Lu+4Nc/UA9q4G1xUTeIT2JXDdpedSRCk1fM+trYUZm7Xy2FZasP3pUSdtz04wt0kV9Mi5i3oCxfqU2Wg==", "dev": true }, "@angular/localize": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-11.0.4.tgz", - "integrity": "sha512-r0dWvwFvEqQJ/H94rr548S092Hq53RqyMANuFD09CpkWXS6yAWBfArB6mW77PARnicEC0zkbi5qMGACjtSyNtA==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.16.tgz", + "integrity": "sha512-peWauKtqy7XG5OiG9L4uLg/yIMw0b/ipKOiovzpuj+DCghmeuYzle5kjCLvWydFeQqBoIdf2kcJYeskrYCAHfQ==", "requires": { "@babel/core": "7.8.3", - "glob": "7.1.2", - "yargs": "^16.1.1" + "glob": "7.1.7", + "yargs": "^17.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + } } }, "@angular/material": { @@ -536,50 +828,56 @@ } }, "@angular/platform-browser": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.0.4.tgz", - "integrity": "sha512-+uUCKJgspSghJ3R6Fk0XHA0tolbaRBi8JFS2cY+hi9s27WKB88peGvtsK6RCOPJONY6JdOuhpcZqRN8dKfPi7w==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.16.tgz", + "integrity": "sha512-T855ppLeQO6hRHi7lGf5fwPoUVt+c0h2rgkV5jHElc3ylaGnhecmZc6fnWLX4pw82TMJUgUV88CY8JCFabJWwg==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/platform-browser-dynamic": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.4.tgz", - "integrity": "sha512-ZOWTZaFfZSHhMy7a0RIxipiZoiobHWrGlq8/YaMrIgzUb9Fv518FeFCCI68BP0/GuyxX74MJmzv4ZgQctKKxXw==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.16.tgz", + "integrity": "sha512-XGxoACAMW/bc3atiVRpaiYwU4LkobYwVzwlxTT/BxOfsdt8ILb5wU8Fx1TMKNECOQHSGdK0qqhch4pTBZ3cb2g==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/router": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.0.4.tgz", - "integrity": "sha512-B0sqv8zMM6j88+udEZzO8wKBw61pHgWZmLopnAqA65rRPrAvMsvAHUnYqX6w5pYqhJQxCVLVeKM+0QlQh1+WnA==", + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.16.tgz", + "integrity": "sha512-LuFXSMIvX/VrB4jbYhigG2Y2pGQ9ULsSBUwDWwQCf4kr0eVI37LBJ2Vr74GBEznjgQ0UmWE89E+XYI80UhERTw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -589,9 +887,9 @@ } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { @@ -624,11 +922,11 @@ } }, "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "requires": { - "@babel/types": "^7.12.5", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -641,235 +939,266 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.14.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" }, "dependencies": { - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true } } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz", - "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.17.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { @@ -878,31 +1207,31 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { @@ -916,141 +1245,188 @@ } }, "@babel/parser": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", - "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==" + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -1063,12 +1439,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1152,418 +1537,472 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", - "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", + "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.8", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1574,64 +2013,127 @@ } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "@babel/traverse": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", - "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } } } }, "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" } } }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true + }, "@electron/get": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", @@ -1748,11 +2250,41 @@ "dev": true }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", + "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + } + } + }, "@jsdevtools/coverage-istanbul-loader": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", @@ -1782,15 +2314,10 @@ } }, "@ngtools/webpack": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.0.4.tgz", - "integrity": "sha512-MAV7inQmsMISTnDcXwyRX5oJZx8F7K/tZRLJciQwkM0DqZyq8fI9KDRwBcmYeQ+J0mSJV9LUVdExmpulpkywqw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "enhanced-resolve": "5.3.1", - "webpack-sources": "2.0.1" - } + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz", + "integrity": "sha512-uaS+2YZgPDW3VmUuwh4/yfIFV1KRVGWefc6xLWIqKRKs6mlRYs65m3ib9dX7CTS4kQMCbhxkxMbpBO2yXlzfvA==", + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.3", @@ -1818,13 +2345,66 @@ "fastq": "^1.6.0" } }, - "@npmcli/move-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", "dev": true, "requires": { - "mkdirp": "^1.0.4" + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "dependencies": { "mkdirp": { @@ -1835,45 +2415,42 @@ } } }, - "@schematics/angular": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.0.4.tgz", - "integrity": "sha512-LwBD9TIoLy9XqqInJvlN4BHtPyJExyeorNiOp6rXb/wafuDbvZ+9kY9GWZTY1auVo5PNKqErfxr74ydA3FFb9g==", + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "jsonc-parser": "2.3.1" + "infer-owner": "^1.0.4" } }, - "@schematics/update": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1100.4.tgz", - "integrity": "sha512-YwFtgxCQQkYC89IC7dfshyGr0roE6bpp5HgpQLdS/AOjHeZKo7/SPdM0W4ddB+Fml1Fo6v4eFG/Ia9oR7qNv1A==", + "@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", - "npm-package-arg": "^8.0.0", - "pacote": "9.5.12", - "semver": "7.3.2", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@schematics/angular": { + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.17.tgz", + "integrity": "sha512-HM/4KkQu944KL5ebhIyy1Ot5OV6prHNW7kmGeMVeQefLSbbfMQCHLa1psB9UU9BoahwGhUBvleLylNSitOBCgg==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.17", + "@angular-devkit/schematics": "12.2.17", + "jsonc-parser": "3.0.0" } }, "@sindresorhus/is": { @@ -1897,6 +2474,18 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, "@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", @@ -1921,6 +2510,32 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", @@ -1928,9 +2543,9 @@ "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -1944,15 +2559,15 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/node": { @@ -1967,12 +2582,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, "@types/selenium-webdriver": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", @@ -1986,9 +2595,9 @@ "dev": true }, "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", "dev": true, "requires": { "@types/node": "*", @@ -2208,177 +2817,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -2400,20 +2980,16 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { @@ -2427,9 +3003,15 @@ } }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, "acorn-jsx": { @@ -2439,9 +3021,9 @@ "dev": true }, "adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -2464,11 +3046,13 @@ } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, @@ -2486,6 +3070,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2499,18 +3084,38 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2518,18 +3123,18 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { @@ -2546,9 +3151,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -2562,11 +3167,34 @@ "dev": true }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2586,12 +3214,6 @@ "commander": "^2.11.0" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2649,53 +3271,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -2721,9 +3296,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -2754,18 +3329,42 @@ "dev": true }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", "dev": true, "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "aws-sign2": { @@ -2790,29 +3389,17 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -2832,6 +3419,21 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -2844,6 +3446,44 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2943,6 +3583,40 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", @@ -2952,18 +3626,6 @@ "minimist": "^1.2.0" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -3050,115 +3712,17 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.15.0.tgz", - "integrity": "sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001164", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.612", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "browserstack": { @@ -3171,14 +3735,13 @@ } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { @@ -3199,24 +3762,12 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -3230,9 +3781,9 @@ "dev": true }, "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", "dev": true, "requires": { "@npmcli/move-file": "^1.0.1", @@ -3249,15 +3800,15 @@ "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.0", + "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3332,43 +3883,19 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-api": { @@ -3384,9 +3911,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", "dev": true }, "canonical-path": { @@ -3418,19 +3945,30 @@ "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "chownr": { @@ -3440,36 +3978,15 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true }, "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", "dev": true }, "class-utils": { @@ -3511,9 +4028,9 @@ } }, "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -3558,17 +4075,6 @@ "mimic-response": "^1.0.0" } }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, "codelyzer": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", @@ -3620,6 +4126,12 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "dev": true } } }, @@ -3633,16 +4145,6 @@ "object-visit": "^1.0.0" } }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3656,20 +4158,22 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "colors": { @@ -3705,15 +4209,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3818,25 +4313,27 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -3846,17 +4343,17 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cookie-signature": { @@ -3865,43 +4362,13 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "is-what": "^3.14.1" } }, "copy-descriptor": { @@ -3911,24 +4378,74 @@ "dev": true }, "copy-webpack-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz", - "integrity": "sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", + "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", "dev": true, "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", + "p-limit": "^3.1.0", "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "serialize-javascript": "^6.0.0" }, "dependencies": { + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + }, + "dependencies": { + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3938,31 +4455,21 @@ "yocto-queue": "^0.1.0" } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -3973,12 +4480,12 @@ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", + "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", "dev": true, "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.20.2", "semver": "7.0.0" }, "dependencies": { @@ -4007,62 +4514,100 @@ } }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "critters": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", + "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "chalk": "^4.1.0", + "css-select": "^4.1.3", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "postcss": { + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "dev": true, + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4076,25 +4621,6 @@ "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", @@ -4120,46 +4646,116 @@ } } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "dev": true, "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-declaration-sorter": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "dev": true + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", + "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", "dev": true, "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" + "semver": "^7.3.5" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -4167,6 +4763,49 @@ } } }, + "css-minimizer-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", + "dev": true, + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "p-limit": "^3.0.2", + "postcss": "^8.3.5", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "css-parse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", @@ -4176,24 +4815,52 @@ "css": "^2.0.0" } }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, "css-selector-tokenizer": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", @@ -4205,12 +4872,12 @@ } }, "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { - "mdn-data": "2.0.4", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { @@ -4223,9 +4890,9 @@ } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssauron": { @@ -4237,6 +4904,12 @@ "through": "X.X.X" } }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4244,80 +4917,57 @@ "dev": true }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "cssnano-preset-default": "^5.2.7", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "dev": true, "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.4", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "dev": true }, "csso": { @@ -4327,30 +4977,6 @@ "dev": true, "requires": { "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "custom-event": { @@ -4359,22 +4985,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -4470,6 +5080,12 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4581,9 +5197,9 @@ }, "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4604,6 +5220,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4611,21 +5233,11 @@ "dev": true }, "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -4650,25 +5262,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4685,9 +5278,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -4725,52 +5318,40 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "duplexer3": { @@ -4779,18 +5360,6 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4827,34 +5396,11 @@ } }, "electron-to-chromium": { - "version": "1.3.621", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.621.tgz", - "integrity": "sha512-FeIuBzArONbAmKmZIsZIFGu/Gc9AVGlVeVbhCq+G2YIl6QkT0TDn2HKN/FMf1btXEB9kEmIuQf3/lBTVAbmFOg==", + "version": "1.4.118", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz", + "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==", "dev": true }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4877,15 +5423,17 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "requires": { "iconv-lite": "^0.6.2" }, "dependencies": { "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -4952,19 +5500,19 @@ } }, "enhanced-resolve": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", - "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" }, "dependencies": { "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true } } @@ -4985,9 +5533,9 @@ "dev": true }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "env-paths": { @@ -4997,15 +5545,15 @@ "dev": true }, "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -5020,47 +5568,11 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true }, "es6-error": { "version": "4.1.1", @@ -5069,17 +5581,6 @@ "dev": true, "optional": true }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -5095,15 +5596,130 @@ "es6-promise": "^4.0.3" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "esbuild-android-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", + "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", + "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", + "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", + "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", + "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", + "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", + "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", + "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", + "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", + "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", + "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", + "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", + "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", + "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", + "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", + "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", + "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", + "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", + "dev": true, + "optional": true }, "escalade": { "version": "3.1.1", @@ -5365,12 +5981,12 @@ } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -5472,6 +6088,12 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -5479,30 +6101,20 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "requires": { "original": "^1.0.0" } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -5575,17 +6187,17 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -5599,25 +6211,59 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5627,27 +6273,80 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true } } @@ -5836,9 +6535,9 @@ } }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -5853,12 +6552,6 @@ "pend": "~1.2.0" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -5877,34 +6570,18 @@ "flat-cache": "^3.0.4" } }, - "file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, "file-saver": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filesize": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", @@ -5962,25 +6639,6 @@ "pkg-dir": "^4.1.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5990,30 +6648,6 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6023,12 +6657,13 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "fingerprintjs2": { @@ -6060,15 +6695,11 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true }, "follow-redirects": { "version": "1.14.9", @@ -6100,9 +6731,9 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "fragment-cache": { @@ -6120,16 +6751,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -6165,17 +6786,11 @@ "minipass": "^3.0.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true }, "fs.realpath": { "version": "1.0.0", @@ -6183,9 +6798,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -6201,12 +6816,56 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6218,9 +6877,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -6256,6 +6915,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6274,6 +6934,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -6330,17 +6996,63 @@ } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "dependencies": { + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + } } }, "got": { @@ -6421,9 +7133,24 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "has-value": { @@ -6478,67 +7205,27 @@ } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -6556,28 +7243,10 @@ "wbuf": "^1.1.0" } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "html-escaper": { @@ -6619,6 +7288,12 @@ } } }, + "http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -6631,29 +7306,24 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "debug": "4" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -6785,12 +7455,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -6831,13 +7495,10 @@ } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true }, "ieee754": { "version": "1.2.1", @@ -6845,12 +7506,6 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -6858,9 +7513,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -6880,13 +7535,13 @@ "dev": true }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "import-local": { @@ -6897,6 +7552,51 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -6944,21 +7644,22 @@ "dev": true }, "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", + "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.3.0", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.2.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -6974,9 +7675,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7004,11 +7705,14 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } }, "supports-color": { "version": "7.2.0", @@ -7018,6 +7722,12 @@ "requires": { "has-flag": "^4.0.0" } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true } } }, @@ -7050,9 +7760,9 @@ "dev": true }, "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, "is-accessor-descriptor": { @@ -7076,12 +7786,13 @@ } }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { @@ -7105,30 +7816,10 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -7155,10 +7846,13 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-descriptor": { "version": "0.1.6", @@ -7179,16 +7873,10 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-extendable": { @@ -7223,10 +7911,10 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", "dev": true }, "is-number": { @@ -7235,12 +7923,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -7275,55 +7957,39 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-retina": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", - "integrity": "sha1-10AbKGvqKuN/Ykd1iN5QTQuGR+M=" - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7539,14 +8205,14 @@ "dev": true }, "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -7556,9 +8222,9 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7619,7 +8285,8 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7633,24 +8300,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "dev": true }, "jsonfile": { @@ -7912,23 +8570,25 @@ "dev": true }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", "dev": true, "requires": { + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^1.10.0" }, @@ -7949,27 +8609,12 @@ } }, "less-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.0.2.tgz", - "integrity": "sha512-7MKlgjnkCf63E3Lv6w2FvAEgLMx3d/tNBExITcanAq7ys5U8VPWT3F6xcRjYmdNfkoQ9udoVFb1r2azSiTnD6w==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz", + "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==", "dev": true, "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "klona": "^2.0.4" } }, "levn": { @@ -7983,31 +8628,13 @@ } }, "license-webpack-plugin": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.1.tgz", - "integrity": "sha512-yhqTmlYIEpZWA122lf6E0G8+rkn0AzoQ1OpzUKKs/lXUqG1plmGnwmkuuPlfggzJR5y6DLOdot/Tv00CC51CeQ==", + "version": "2.3.20", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", + "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", "webpack-sources": "^1.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } } }, "lie": { @@ -8019,16 +8646,22 @@ "immediate": "~3.0.5" } }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { @@ -8043,13 +8676,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -8063,6 +8695,12 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8088,12 +8726,13 @@ "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { @@ -8106,9 +8745,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -8172,9 +8811,9 @@ } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "dev": true }, "lowercase-keys": { @@ -8217,114 +8856,59 @@ "dev": true }, "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "dev": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { + "agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "debug": "4" } }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } } } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -8364,21 +8948,10 @@ "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.5.4.tgz", "integrity": "sha512-5ycazkNmIOtV78Ff3WgvxQESoJuujdRm0cNbf18fmyJN20jHyqp9rpwi4EfQyGimag0ZLElxtVg3H9enIKdOOw==" }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "media-typer": { @@ -8387,6 +8960,33 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -8448,24 +9048,6 @@ "picomatch": "^2.0.5" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -8500,42 +9082,24 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz", - "integrity": "sha512-G3yw7/TQaPfkuiR73MDcyiqhyP8SnbmLhUbpC76H+wtQxA6wfKhMCQOCb6wnPK0dQbjORAeOILQqEesg4/wF7A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", + "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", "dev": true, "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^3.1.0" }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } } } }, @@ -8545,12 +9109,6 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -8562,12 +9120,13 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -8582,6 +9141,18 @@ "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -8591,6 +9162,16 @@ "minipass": "^3.0.0" } }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, "minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -8600,6 +9181,15 @@ "minipass": "^3.0.0" } }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -8610,24 +9200,6 @@ "yallist": "^4.0.0" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -8658,45 +9230,6 @@ "minimist": "^1.2.5" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8729,6 +9262,12 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -8748,19 +9287,36 @@ "to-regex": "^3.0.1" } }, - "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "dev": true, - "optional": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8773,24 +9329,30 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "ng-lazyload-image": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/ng-lazyload-image/-/ng-lazyload-image-7.1.0.tgz", "integrity": "sha512-1fip2FdPBDRnjGyBokI/DupBxOnrKh2lbtT8X8N1oPbE3KBZXXl82VIKcK2Sx+XQD67/+VtFzlISmrgsatzYuw==" }, - "ngx-avatar": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ngx-avatar/-/ngx-avatar-4.0.0.tgz", - "integrity": "sha512-Uk40UXl26RvDy1ori9NDsGFB+f84AaxMnsIwZA6JPJK0pLcbo3F4vZTmzLZeOusOw1Qtgk5IzF630jo06keXwQ==", + "ngx-avatars": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ngx-avatars/-/ngx-avatars-1.3.1.tgz", + "integrity": "sha512-8ciKom5hQrzqAQX8YDPk/cDBNmg14v3GC2kURPpqQ0AqgLIdvT72FoxUPyd8XsuulndHF7e4zx6C7Bh1tmJm3g==", "requires": { - "is-retina": "^1.0.3", - "ts-md5": "^1.2.4" + "ts-md5": "^1.2.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "ts-md5": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.11.tgz", + "integrity": "sha512-vAwy9rEuRE6a8xa1MavIVkLFyyU0ydk4CLMFA5vOVccmQKLOuGb/BHm3oEN7XHf2FoqS+z0pSvhaad/ombd1Vg==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "ngx-file-drop": { @@ -8798,22 +9360,29 @@ "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-9.0.1.tgz", "integrity": "sha512-xtUUjGMr9c8wwSfA4Cyy0iZMPLnBOg9i32A3tHOPfEivRrn9evULvxriCM45Qz6HpuuqA7vZGxGZZTCUIj/h3A==" }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } + "optional": true }, "node-forge": { "version": "0.10.0", @@ -8821,69 +9390,84 @@ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, + "node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "dev": true, + "optional": true + }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - } + "abbrev": "1" } }, "normalize-path": { @@ -8899,15 +9483,15 @@ "dev": true }, "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -8943,9 +9527,9 @@ }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8960,20 +9544,20 @@ "dev": true }, "npm-package-arg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", - "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", "dev": true, "requires": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8982,31 +9566,49 @@ } }, "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "npm-pick-manifest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", - "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", "dev": true, "requires": { "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9015,59 +9617,17 @@ } }, "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, "npm-run-path": { @@ -9079,13 +9639,25 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" } }, "num2fraction": { @@ -9137,19 +9709,13 @@ } } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -9180,17 +9746,6 @@ "object-keys": "^1.1.1" } }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -9200,18 +9755,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -9251,13 +9794,14 @@ } }, "open": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", - "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "openapi-typescript-codegen": { @@ -9362,17 +9906,18 @@ } }, "ora": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", - "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "requires": { + "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", + "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, @@ -9387,9 +9932,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9437,40 +9982,24 @@ "url-parse": "^1.4.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -9487,12 +10016,12 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -9520,195 +10049,36 @@ "dev": true }, "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", + "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } @@ -9719,17 +10089,6 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9747,28 +10106,23 @@ } } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true }, "parse5": { "version": "5.1.1", @@ -9794,6 +10148,23 @@ } } }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parse5-sax-parser": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", @@ -9850,12 +10221,6 @@ } } }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -9863,9 +10228,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { @@ -9902,19 +10267,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -9927,6 +10279,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -9954,22 +10312,25 @@ "pinkie": "^2.0.0" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "piscina": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", + "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", "dev": true, "requires": { - "find-up": "^3.0.0" + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" } }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "ts-pnp": "^1.1.6" + "find-up": "^4.0.0" } }, "portfinder": { @@ -9993,12 +10354,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -10010,208 +10371,782 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" }, "dependencies": { + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dev": true, "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" } }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "dev": true }, "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true }, "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true }, "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "postcss-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.4.tgz", - "integrity": "sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", + "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "semver": "^7.3.5" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10219,442 +11154,678 @@ } } }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "dev": true, "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-merge-longhand": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + } + }, "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "dev": true, "requires": { - "browserslist": "^4.0.0", + "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.5" } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true }, "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" } }, "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "postcss-selector-parser": "^6.0.5" } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10667,6 +11838,12 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -10692,21 +11869,13 @@ "dev": true }, "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - } + "err-code": "^2.0.2", + "retry": "^0.12.0" } }, "proto-list": { @@ -10716,15 +11885,6 @@ "dev": true, "optional": true }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -11085,12 +12245,12 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -11106,28 +12266,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -11138,40 +12276,11 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -11190,12 +12299,6 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -11211,16 +12314,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -11247,29 +12340,6 @@ } } }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11287,6 +12357,16 @@ } } }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -11303,9 +12383,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -11318,30 +12398,30 @@ "dev": true }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -11364,34 +12444,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -11400,16 +12460,30 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11430,9 +12504,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -11485,8 +12559,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -11515,12 +12588,20 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { @@ -11530,64 +12611,32 @@ "dev": true }, "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "dev": true, "requires": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", "source-map": "0.6.1" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" } }, "source-map": { @@ -11595,15 +12644,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -11644,48 +12684,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11711,16 +12715,6 @@ } } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -11745,15 +12739,6 @@ } } }, - "rollup": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", - "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - } - }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -11766,15 +12751,6 @@ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -11816,25 +12792,22 @@ "dev": true }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", + "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==", "dev": true, "requires": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0" } }, "sass-loader": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.5.tgz", - "integrity": "sha512-2LqoNPtKkZq/XbXNQ4C64GFEleSEHKv6NPSI+bMC/l+jpEXGJhiRYkAQToO24MR7NU4JRY2RpLpJ/gjo2Uf13w==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", "dev": true, "requires": { "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" }, "dependencies": { "neo-async": { @@ -11842,26 +12815,6 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -11943,9 +12896,9 @@ } }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -11972,19 +12925,10 @@ "semver": "^5.3.0" } }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - } - }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "requires": { "debug": "2.6.9", @@ -11994,9 +12938,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -12019,10 +12963,35 @@ } } }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true } } @@ -12047,9 +13016,9 @@ } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -12112,15 +13081,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -12158,28 +13127,12 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -12205,28 +13158,11 @@ "dev": true }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12271,9 +13207,9 @@ } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, "snapdragon": { @@ -12458,28 +13394,35 @@ } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", + "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", "dev": true, "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" }, "dependencies": { "debug": { @@ -12490,45 +13433,46 @@ "requires": { "ms": "^2.1.1" } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } } } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dev": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "dependencies": { "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" } } } @@ -12544,44 +13488,36 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.2.tgz", - "integrity": "sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", "dev": true, "requires": { "abab": "^2.0.5", "iconv-lite": "^0.6.2", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.6.1", - "whatwg-mimetype": "^2.3.0" + "source-map-js": "^0.6.2" }, "dependencies": { "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", "dev": true } } @@ -12618,9 +13554,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sourcemap-codec": { @@ -12628,38 +13564,6 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -12700,15 +13604,6 @@ } } }, - "speed-measure-webpack-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", - "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -12783,45 +13678,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "streamroller": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", @@ -12843,26 +13699,6 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -12893,50 +13729,19 @@ "dev": true }, "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", + "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", + "dev": true }, "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" } }, "stylus": { @@ -12965,9 +13770,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -12999,28 +13804,53 @@ } }, "stylus-loader": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.1.tgz", - "integrity": "sha512-apDYJEM5ZpOAWbWInWcsbtI8gHNr/XYVcSY/tWqOUPt7M5tqhtwXVsAkgyiVjhuvw2Yrjq474a9H+g4d047Ebw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", "dev": true, "requires": { - "fast-glob": "^3.2.4", + "fast-glob": "^3.2.5", "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" + "normalize-path": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true } } }, @@ -13042,30 +13872,32 @@ } }, "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } } }, "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, "table": { @@ -13103,15 +13935,15 @@ } }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -13131,9 +13963,9 @@ } }, "terser": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", - "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", + "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -13142,20 +13974,17 @@ } }, "terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", "dev": true, "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.0" }, "dependencies": { "p-limit": { @@ -13168,12 +13997,12 @@ } }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -13183,16 +14012,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } } } }, @@ -13208,37 +14027,12 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13248,12 +14042,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -13328,11 +14116,6 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "ts-md5": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.7.tgz", - "integrity": "sha512-emODogvKGWi1KO1l9c6YxLMBn6CEH3VrH5mVPIyOtxBG52BvV4jP3GWz6bOZCz61nLgBc3ffQYE4+EHfCD+V7w==" - }, "ts-node": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.0.6.tgz", @@ -13408,12 +14191,6 @@ } } }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true - }, "tsconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", @@ -13489,12 +14266,6 @@ } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -13517,12 +14288,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -13533,9 +14298,9 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "type-is": { @@ -13555,9 +14320,9 @@ "dev": true }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" }, "ua-parser-js": { "version": "0.7.31", @@ -13573,31 +14338,31 @@ "optional": true }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "union-value": { @@ -13618,12 +14383,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -13642,17 +14401,6 @@ "imurmurhash": "^0.1.4" } }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -13665,12 +14413,6 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -13780,62 +14522,12 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -13863,16 +14555,6 @@ "user-home": "^1.1.1" } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -13888,12 +14570,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -13905,12 +14581,6 @@ "extsprintf": "^1.2.0" } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -13918,244 +14588,13 @@ "dev": true }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "wbuf": { @@ -14192,381 +14631,117 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", + "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^3.0.0" }, "dependencies": { - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -14586,11 +14761,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -14663,12 +14838,6 @@ } } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -14701,9 +14870,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -14746,6 +14915,15 @@ } } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -14753,6 +14931,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -14777,12 +14956,6 @@ } } }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -14818,6 +14991,16 @@ } } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -14839,6 +15022,27 @@ "to-regex": "^3.0.2" } }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -14879,9 +15083,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -14923,6 +15127,19 @@ "repeat-string": "^1.6.1" } }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -14935,9 +15152,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -14952,9 +15169,9 @@ } }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yargs": { @@ -15006,9 +15223,9 @@ } }, "webpack-merge": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.2.0.tgz", - "integrity": "sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -15016,13 +15233,13 @@ } }, "webpack-sources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", - "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -15034,38 +15251,22 @@ } }, "webpack-subresource-integrity": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.1.tgz", - "integrity": "sha512-uekbQ93PZ9e7BFB8Hl9cFIVYQyQqiXp2ExKk9Zv+qZfH/zHXHrCFAfw1VW0+NqWbTWrs/HnuDrto3+tiPXh//Q==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", "dev": true, "requires": { "webpack-sources": "^1.3.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -15075,12 +15276,6 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -15096,6 +15291,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -15108,46 +15312,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", - "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -15187,9 +15351,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -15235,12 +15399,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", @@ -15253,15 +15411,16 @@ "dev": true }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15275,7 +15434,8 @@ "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yauzl": { "version": "2.10.0", @@ -15300,9 +15460,19 @@ "dev": true }, "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "requires": { + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } } } } diff --git a/package.json b/package.json index b676315..19544d6 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build --prod", + "build": "ng build --configuration production", "prebuild": "node src/postbuild.mjs", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", @@ -20,18 +20,18 @@ }, "private": true, "dependencies": { - "@angular-devkit/core": "^11.0.4", - "@angular/animations": "^11.0.4", + "@angular-devkit/core": "^12.2.17", + "@angular/animations": "^12.2.16", "@angular/cdk": "^11.0.2", - "@angular/common": "^11.0.4", - "@angular/compiler": "^11.0.4", - "@angular/core": "^11.0.4", - "@angular/forms": "^11.0.4", - "@angular/localize": "^11.0.4", + "@angular/common": "^12.2.16", + "@angular/compiler": "^12.2.16", + "@angular/core": "^12.2.16", + "@angular/forms": "^12.2.16", + "@angular/localize": "^12.2.16", "@angular/material": "^11.0.2", - "@angular/platform-browser": "^11.0.4", - "@angular/platform-browser-dynamic": "^11.0.4", - "@angular/router": "^11.0.4", + "@angular/platform-browser": "^12.2.16", + "@angular/platform-browser-dynamic": "^12.2.16", + "@angular/router": "^12.2.16", "@ngneat/content-loader": "^5.0.0", "@videogular/ngx-videogular": "^5.0.1", "core-js": "^2.4.1", @@ -43,21 +43,21 @@ "material-icons": "^0.5.4", "nan": "^2.14.1", "ng-lazyload-image": "^7.0.1", - "ngx-avatar": "^4.0.0", + "ngx-avatars": "^1.3.1", "ngx-file-drop": "^9.0.1", "rxjs": "^6.6.3", "rxjs-compat": "^6.0.0-rc.0", "tslib": "^2.0.0", - "typescript": "~4.0.5", + "typescript": "~4.3.5", "web-animations-js": "^2.3.2", "xliff-to-json": "^1.0.4", - "zone.js": "~0.10.2" + "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.1100.4", - "@angular/cli": "^11.0.4", - "@angular/compiler-cli": "^11.0.4", - "@angular/language-service": "^11.0.4", + "@angular-devkit/build-angular": "^12.2.17", + "@angular/cli": "^12.2.17", + "@angular/compiler-cli": "^12.2.16", + "@angular/language-service": "^12.2.16", "@types/core-js": "^2.5.2", "@types/file-saver": "^2.0.1", "@types/jasmine": "~3.6.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3d6d040..8b9c526 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -56,7 +56,7 @@ import { SubscriptionInfoDialogComponent } from './dialogs/subscription-info-dia import { SettingsComponent } from './settings/settings.component'; import { MatChipsModule } from '@angular/material/chips'; import { NgxFileDropModule } from 'ngx-file-drop'; -import { AvatarModule } from 'ngx-avatar'; +import { AvatarModule } from 'ngx-avatars'; import { ContentLoaderModule } from '@ngneat/content-loader'; import es from '@angular/common/locales/es'; diff --git a/src/polyfills.ts b/src/polyfills.ts index c81bace..c243237 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -57,7 +57,7 @@ import 'web-animations-js'; // Run `npm install --save web-animations-js`. /*************************************************************************************************** * Zone JS is required by Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js'; // Included with Angular CLI. From 2459403b22b909d4788db0bfe101d60fbf4d69ae Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 17:46:45 -0400 Subject: [PATCH 120/212] Updated angular material --- package-lock.json | 28 ++++++++++++++-------------- package.json | 4 ++-- src/styles.scss | 41 +++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ba2a08..0dc14bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,18 +437,18 @@ } }, "@angular/cdk": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.0.2.tgz", - "integrity": "sha512-hdZ9UJVGgCFhdOuB4RPS1Ku45VSG/WfRjbyxu/7teYyFKqAvcd3vawkeQfZf+lExmFaeW43+5hnpu/JIlGTrSA==", + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-12.2.13.tgz", + "integrity": "sha512-zSKRhECyFqhingIeyRInIyTvYErt4gWo+x5DQr0b7YLUbU8DZSwWnG4w76Ke2s4U8T7ry1jpJBHoX/e8YBpGMg==", "requires": { "parse5": "^5.0.0", - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -813,17 +813,17 @@ } }, "@angular/material": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-11.0.2.tgz", - "integrity": "sha512-qmLxrIcbbowXrE0+ZiGA/RXfaZTtVKtgLchn7GvI+R5DZ79g5IicTPxayzQavLJSTESX19JTjlByRSGiXJstgA==", + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-12.2.13.tgz", + "integrity": "sha512-6g2GyN4qp2D+DqY2AwrQuPB3cd9gybvQVXvNRbTPXEulHr+LgGei00ySdFHFp6RvdGSMZ4i3LM1Fq3VkFxhCfQ==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, diff --git a/package.json b/package.json index 19544d6..cc94736 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,13 @@ "dependencies": { "@angular-devkit/core": "^12.2.17", "@angular/animations": "^12.2.16", - "@angular/cdk": "^11.0.2", + "@angular/cdk": "^12.2.13", "@angular/common": "^12.2.16", "@angular/compiler": "^12.2.16", "@angular/core": "^12.2.16", "@angular/forms": "^12.2.16", "@angular/localize": "^12.2.16", - "@angular/material": "^11.0.2", + "@angular/material": "^12.2.13", "@angular/platform-browser": "^12.2.16", "@angular/platform-browser-dynamic": "^12.2.16", "@angular/router": "^12.2.16", diff --git a/src/styles.scss b/src/styles.scss index be060c8..b847a8b 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,4 +1,5 @@ /* You can add global styles to this file, and also import other style files */ +@use '~@angular/material' as mat; @import '~material-icons/iconfont/material-icons.css'; @@ -16,30 +17,30 @@ body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } // Plus imports for other components in your app. /*// Typography -$custom-typography: mat-typography-config( +$custom-typography: mat.define-typography-config( $font-family: Raleway, - $headline: mat-typography-level(24px, 48px, 400), - $body-1: mat-typography-level(16px, 24px, 400) + $headline: mat.define-typography-level(24px, 48px, 400), + $body-1: mat.define-typography-level(16px, 24px, 400) ); -@include angular-material-typography($custom-typography); +@include mat.all-component-typographies($custom-typography); */ // Default colors -$my-app-primary: mat-palette($mat-light-blue, 700, 100, 800); -$my-app-accent: mat-palette($mat-blue, 700, 100, 800); -$my-app-warn: mat-palette($mat-red, 700, 100, 800); +$my-app-primary: mat.define-palette(mat.$light-blue-palette, 700, 100, 800); +$my-app-accent: mat.define-palette(mat.$blue-palette, 700, 100, 800); +$my-app-warn: mat.define-palette(mat.$red-palette, 700, 100, 800); -$my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn); -@include angular-material-theme($my-app-theme); +$my-app-theme: mat.define-light-theme($my-app-primary, $my-app-accent, $my-app-warn); +@include mat.all-component-themes($my-app-theme); // Dark theme -$dark-primary: mat-palette($mat-light-blue, 700, 100, 800); -$dark-accent: mat-palette($mat-blue); -$dark-warn: mat-palette($mat-deep-orange); +$dark-primary: mat.define-palette(mat.$light-blue-palette, 700, 100, 800); +$dark-accent: mat.define-palette(mat.$blue-palette); +$dark-warn: mat.define-palette(mat.$deep-orange-palette); -$dark-theme: mat-dark-theme($dark-primary, $dark-accent, $dark-warn); +$dark-theme: mat.define-dark-theme($dark-primary, $dark-accent, $dark-warn); .dark-theme { - @include angular-material-theme($dark-theme); + @include mat.all-component-themes($dark-theme); } .mat-stroked-button, .mat-raised-button, .mat-flat-button { @@ -47,14 +48,14 @@ $dark-theme: mat-dark-theme($dark-primary, $dark-accent, $dark-warn); } // Light theme -$light-primary: mat-palette($mat-grey, 200, 500, 300); -$light-accent: mat-palette($mat-brown, 200); -$light-warn: mat-palette($mat-deep-orange, 200); +$light-primary: mat.define-palette(mat.$grey-palette, 200, 500, 300); +$light-accent: mat.define-palette(mat.$brown-palette, 200); +$light-warn: mat.define-palette(mat.$deep-orange-palette, 200); -$light-theme: mat-light-theme($light-primary, $light-accent, $light-warn); +$light-theme: mat.define-light-theme($light-primary, $light-accent, $light-warn); .light-theme { - @include angular-material-theme($light-theme); + @include mat.all-component-themes($light-theme); } .no-outline { @@ -65,7 +66,7 @@ $light-theme: mat-light-theme($light-primary, $light-accent, $light-warn); // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! -@include mat-core(); +@include mat.core(); // @import '../node_modules/@angular/material/theming'; From 55dfc17d621a297a4489a25c99918eb22800f322 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 17:51:20 -0400 Subject: [PATCH 121/212] Updated ngx-file-drop to support angular v13 --- package-lock.json | 9 ++++++--- package.json | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dc14bc..b3622c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9356,9 +9356,12 @@ } }, "ngx-file-drop": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-9.0.1.tgz", - "integrity": "sha512-xtUUjGMr9c8wwSfA4Cyy0iZMPLnBOg9i32A3tHOPfEivRrn9evULvxriCM45Qz6HpuuqA7vZGxGZZTCUIj/h3A==" + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-13.0.0.tgz", + "integrity": "sha512-1OF9ln2ZesfNxWEBXMpkkFpUuggejpZtNlGFuyaVAmXyYO4NlCHsOWrgfWB7d8SliHgePD/7s0e60IQs/zqr9g==", + "requires": { + "tslib": "^2.0.0" + } }, "nice-napi": { "version": "1.0.2", diff --git a/package.json b/package.json index cc94736..8cb36c2 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "nan": "^2.14.1", "ng-lazyload-image": "^7.0.1", "ngx-avatars": "^1.3.1", - "ngx-file-drop": "^9.0.1", + "ngx-file-drop": "^13.0.0", "rxjs": "^6.6.3", "rxjs-compat": "^6.0.0-rc.0", "tslib": "^2.0.0", From 5d540fc52acf5c2dfa70e2397225139241feafd6 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 18:55:11 -0400 Subject: [PATCH 122/212] Updated angular to v13 --- .gitignore | 1 + angular.json | 19 - package-lock.json | 6252 +++++------------ package.json | 31 +- src/app/app.module.ts | 215 +- .../see-more/see-more.component.html | 2 +- src/app/posts.services.ts | 1 - src/polyfills.ts | 32 +- src/test.ts | 4 +- 9 files changed, 1811 insertions(+), 4746 deletions(-) diff --git a/.gitignore b/.gitignore index e0af431..5adce06 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ !.vscode/extensions.json # misc +/.angular/cache /.sass-cache /connect.lock /coverage diff --git a/angular.json b/angular.json index 6e98ea7..f2f2707 100644 --- a/angular.json +++ b/angular.json @@ -157,16 +157,6 @@ "src/backend" ] } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [] - } } } }, @@ -181,15 +171,6 @@ "protractorConfig": "./protractor.conf.js", "devServerTarget": "youtube-dl-material:serve" } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "e2e/tsconfig.e2e.json" - ], - "exclude": [] - } } } } diff --git a/package-lock.json b/package-lock.json index b3622c1..8bfdac4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,22 +5,22 @@ "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", - "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "1.0.0", + "@jridgewell/resolve-uri": "^3.0.3", "sourcemap-codec": "1.4.8" } }, "@angular-devkit/architect": { - "version": "0.1202.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.17.tgz", - "integrity": "sha512-uUQcHcLbPvr9adALQSLU1MTDduVUR2kZAHi2e7SmL9ioel84pPVXBoD0WpSBeUMKwPiDs3TQDaxDB49hl0nBSQ==", + "version": "0.1303.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.3.tgz", + "integrity": "sha512-WRVVBCzLlMqRZVhZXGASHzNJK/OCAvl/DTGhlLuJDIjF7lVGnXHjtwNM8ilYZq949OnC3fly5Z61TfhbN/OHCg==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.17", + "@angular-devkit/core": "13.3.3", "rxjs": "6.6.7" }, "dependencies": { @@ -42,81 +42,76 @@ } }, "@angular-devkit/build-angular": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.17.tgz", - "integrity": "sha512-uc3HGHVQyatqQ/M53oxYBvhz0jx0hgdc7WT+L56GLHvgz7Ct2VEbpWaMfwHkFfE1F1iHkIgnTKHKWacJl1yQIg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.3.tgz", + "integrity": "sha512-iEpNF3tF+9Gw+qQKL63fPFHIvWokJdrgVU4GzENQ5QeL8zk8iYTEbH3jWogq5tWy5+VmNP/mKkasq9i78lRiYw==", "dev": true, "requires": { - "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.17", - "@angular-devkit/build-optimizer": "0.1202.17", - "@angular-devkit/build-webpack": "0.1202.17", - "@angular-devkit/core": "12.2.17", - "@babel/core": "7.14.8", - "@babel/generator": "7.14.8", - "@babel/helper-annotate-as-pure": "7.14.5", - "@babel/plugin-proposal-async-generator-functions": "7.14.7", - "@babel/plugin-transform-async-to-generator": "7.14.5", - "@babel/plugin-transform-runtime": "7.14.5", - "@babel/preset-env": "7.14.8", - "@babel/runtime": "7.14.8", - "@babel/template": "7.14.5", - "@discoveryjs/json-ext": "0.5.3", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.17", + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1303.3", + "@angular-devkit/build-webpack": "0.1303.3", + "@angular-devkit/core": "13.3.3", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.3.3", "ansi-colors": "4.1.1", - "babel-loader": "8.2.2", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", - "cacache": "15.2.0", - "caniuse-lite": "^1.0.30001032", + "cacache": "15.3.0", "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "9.0.1", - "core-js": "3.16.0", - "critters": "0.0.12", - "css-loader": "6.2.0", - "css-minimizer-webpack-plugin": "3.0.2", - "esbuild": "0.13.8", - "esbuild-wasm": "0.13.8", - "find-cache-dir": "3.3.1", - "glob": "7.1.7", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild": "0.14.22", + "esbuild-wasm": "0.14.22", + "glob": "7.2.0", "https-proxy-agent": "5.0.0", - "inquirer": "8.1.2", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", "karma-source-map-support": "1.4.0", - "less": "4.1.1", - "less-loader": "10.0.1", - "license-webpack-plugin": "2.3.20", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "2.4.2", - "minimatch": "3.0.4", - "open": "8.2.1", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.5", + "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.3.6", + "piscina": "3.2.0", + "postcss": "8.4.5", "postcss-import": "14.0.2", - "postcss-loader": "6.1.1", - "postcss-preset-env": "6.7.0", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", + "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.36.0", - "sass-loader": "12.1.0", + "sass": "1.49.9", + "sass-loader": "12.4.0", "semver": "7.3.5", - "source-map-loader": "3.0.0", - "source-map-support": "0.5.19", - "style-loader": "3.2.1", - "stylus": "0.54.8", - "stylus-loader": "6.1.0", - "terser": "5.7.1", - "terser-webpack-plugin": "5.1.4", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.11.0", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.3.0", - "webpack": "5.50.0", - "webpack-dev-middleware": "5.0.0", - "webpack-dev-server": "3.11.3", + "tslib": "2.3.1", + "webpack": "5.70.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "1.5.2" + "webpack-subresource-integrity": "5.1.0" }, "dependencies": { "@babel/code-frame": { @@ -129,20 +124,20 @@ } }, "@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -160,12 +155,12 @@ } }, "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dev": true, "requires": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -187,17 +182,6 @@ "js-tokens": "^4.0.0" } }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -208,41 +192,43 @@ } }, "core-js": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", - "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", "dev": true }, "esbuild": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", - "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz", + "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==", "dev": true, "optional": true, "requires": { - "esbuild-android-arm64": "0.13.8", - "esbuild-darwin-64": "0.13.8", - "esbuild-darwin-arm64": "0.13.8", - "esbuild-freebsd-64": "0.13.8", - "esbuild-freebsd-arm64": "0.13.8", - "esbuild-linux-32": "0.13.8", - "esbuild-linux-64": "0.13.8", - "esbuild-linux-arm": "0.13.8", - "esbuild-linux-arm64": "0.13.8", - "esbuild-linux-mips64le": "0.13.8", - "esbuild-linux-ppc64le": "0.13.8", - "esbuild-netbsd-64": "0.13.8", - "esbuild-openbsd-64": "0.13.8", - "esbuild-sunos-64": "0.13.8", - "esbuild-windows-32": "0.13.8", - "esbuild-windows-64": "0.13.8", - "esbuild-windows-arm64": "0.13.8" + "esbuild-android-arm64": "0.14.22", + "esbuild-darwin-64": "0.14.22", + "esbuild-darwin-arm64": "0.14.22", + "esbuild-freebsd-64": "0.14.22", + "esbuild-freebsd-arm64": "0.14.22", + "esbuild-linux-32": "0.14.22", + "esbuild-linux-64": "0.14.22", + "esbuild-linux-arm": "0.14.22", + "esbuild-linux-arm64": "0.14.22", + "esbuild-linux-mips64le": "0.14.22", + "esbuild-linux-ppc64le": "0.14.22", + "esbuild-linux-riscv64": "0.14.22", + "esbuild-linux-s390x": "0.14.22", + "esbuild-netbsd-64": "0.14.22", + "esbuild-openbsd-64": "0.14.22", + "esbuild-sunos-64": "0.14.22", + "esbuild-windows-32": "0.14.22", + "esbuild-windows-64": "0.14.22", + "esbuild-windows-arm64": "0.14.22" } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -263,6 +249,15 @@ "debug": "4" } }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -296,39 +291,20 @@ "dev": true }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.1202.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.17.tgz", - "integrity": "sha512-1qWGWw7cCNADB4LZ/zjiSK0GLmr2kebYyNG0KutCE8GNVxv2h6w6dJP6t1C/BgskRuBPCAhvE+lEKN8ljSutag==", - "dev": true, - "requires": { - "source-map": "0.7.3", - "tslib": "2.3.0", - "typescript": "4.3.5" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1202.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.17.tgz", - "integrity": "sha512-z7FW43DJ4p8UZwbFRmMrh2ohqhI2Wtdg3+FZiTnl4opb3zYheGiNxPlTuiyKjG21JUkGCdthkkBLCNfaUU0U/Q==", + "version": "0.1303.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.3.tgz", + "integrity": "sha512-v/z/YgwrAzYn1LfN9OHNxqcThyyg4LLx28hmHzDs5gyDShAK189y34EoT9uQ+lCyQrPVhP7UKACCxCdSwOEJiA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.17", + "@angular-devkit/architect": "0.1303.3", "rxjs": "6.6.7" }, "dependencies": { @@ -350,12 +326,12 @@ } }, "@angular-devkit/core": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", - "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.3.tgz", + "integrity": "sha512-lfQwY9LuVRwcNVzGmyPcwOpb3CAobP4T+c3joR1LLIPS5lzcM0oeCE2bon9N52Ktn4Q/pH98dVtjWL+jSrUADw==", "requires": { - "ajv": "8.6.2", - "ajv-formats": "2.1.0", + "ajv": "8.9.0", + "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", @@ -363,9 +339,9 @@ }, "dependencies": { "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -394,12 +370,14 @@ } }, "@angular-devkit/schematics": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.17.tgz", - "integrity": "sha512-c0eNu/nx1Mnu7KcZgYTYHP736H4Y9pSyLBSmLAHYZv3t3m0dIPbhifRcLQX7hHQ8fGT2ZFxmOpaQG5/DcIghSw==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.3.tgz", + "integrity": "sha512-S8UNlw6IoR/kxBYbiwesuA7oJGSnFkD6bJwVLhpHdT6Sqrz2/IrjHcNgTJRAvhsOKIbfDtMtXRzl/PUdWEfgyw==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.17", + "@angular-devkit/core": "13.3.3", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", "ora": "5.4.1", "rxjs": "6.6.7" }, @@ -422,11 +400,11 @@ } }, "@angular/animations": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.16.tgz", - "integrity": "sha512-Kf6C7Ta+fCMq5DvT9JNVhBkcECrqFa3wumiC6ssGo5sNaEzXz+tlep9ZgEbqfxSn7gAN7L1DgsbS9u0O6tbUkg==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.4.tgz", + "integrity": "sha512-cXjjbzYR2hda9BDAu0teJUVbbA03jJTK53vIYnDLIAvN20YRPo9LqINxpUlbAzH6hE8v5xF2LLnAXcaQROVpIw==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -453,36 +431,36 @@ } }, "@angular/cli": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.17.tgz", - "integrity": "sha512-mubRPp5hRIK/q0J8q6kVAqbYYuBUKMMBljUCqT4fHsl+qXYD27rgG3EqNzycKBMHUIlykotrDSdy47voD+atOg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.3.tgz", + "integrity": "sha512-a+nnzFP1FfnypXpAhrHbIBaJcxzegWLZUvVzJQwt6P2z60IoHdvTVmyNbY89qI0LE1SrAokEUO1zW3Yjmu7fUw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.17", - "@angular-devkit/core": "12.2.17", - "@angular-devkit/schematics": "12.2.17", - "@schematics/angular": "12.2.17", + "@angular-devkit/architect": "0.1303.3", + "@angular-devkit/core": "13.3.3", + "@angular-devkit/schematics": "13.3.3", + "@schematics/angular": "13.3.3", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "4.3.2", + "debug": "4.3.3", "ini": "2.0.0", - "inquirer": "8.1.2", + "inquirer": "8.2.0", "jsonc-parser": "3.0.0", "npm-package-arg": "8.1.5", "npm-pick-manifest": "6.1.1", - "open": "8.2.1", + "open": "8.4.0", "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", + "pacote": "12.0.3", + "resolve": "1.22.0", "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -494,14 +472,21 @@ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "semver": { @@ -522,11 +507,11 @@ } }, "@angular/common": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.16.tgz", - "integrity": "sha512-FEqTXTEsnbDInqV1yFlm97Tz1OFqZS5t0TUkm8gzXRgpIce/F/jLwAg0u1VQkgOsno6cNm0xTWPoZgu85NI4ug==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.4.tgz", + "integrity": "sha512-vPZuUGWMXz6r30obBqH+iIG4Feq4YEK/4wUks7PEYGke8MXFPYsNKuHMhKCgYEhabD/4Mo4GEp3i18/3Kk72Mw==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -537,11 +522,11 @@ } }, "@angular/compiler": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", - "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.4.tgz", + "integrity": "sha512-Yf1Dv2BVytjmv5Nnv05hUciUOH/UpKgXG1Ql5XwQG/qGV4eEs33PJBtGsUJTPuddxfRm72JMsbZcoRjVADqbcw==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -552,99 +537,38 @@ } }, "@angular/compiler-cli": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.16.tgz", - "integrity": "sha512-tlalh8SJvdCWbUPRUR5GamaP+wSc/GuCsoUZpSbcczGKgSlbaEVXUYtVXm8/wuT6Slk2sSEbRs7tXGF2i7qxVw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.4.tgz", + "integrity": "sha512-wCnt2YOS5EiwWCEv8oCqIfiwUtifs+COhcYH6fpmf/3X9w1yKO1ZMA+OsFQ0IVS4d0YYavm5DTPQ2ep2c0sF5w==", "dev": true, "requires": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "tslib": "^2.2.0", - "yargs": "^17.0.0" + "tslib": "^2.3.0", + "yargs": "^17.2.1" }, "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -654,12 +578,6 @@ "lru-cache": "^6.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -710,11 +628,11 @@ } }, "@angular/core": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.16.tgz", - "integrity": "sha512-jsmvaRdAfng99z2a9mAmkfcsCE1wm+tBYVDxnc5JquSXznwtncjzcoc2X0J0dzrkCDvzFfpTsZ9vehylytBc+A==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.4.tgz", + "integrity": "sha512-PqPwx9oaV0Bh0m0fdI2jtXUC6s04jfD4vyzB4sjEuRI9pRUnZ6M5hZ5Vn/KJVZyt411MevbJfqzUVf0W+GDZew==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -725,11 +643,11 @@ } }, "@angular/forms": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.16.tgz", - "integrity": "sha512-sb+gpNun5aN7CZfHXS6X7vJcd/0A1P/gRBZpYtQTzBYnqEFCOFIvR62eb05aHQ4JhgKaSPpIXrbz/bAwY/njZw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.4.tgz", + "integrity": "sha512-QHyUXOKYITysaJJ4VnmBacE69oz0rw4G7Y2lhPb2V3a1XsWeO61SZEeGMfAWo7sLoDvi2MCEWNEhl1du4dK14A==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -740,19 +658,19 @@ } }, "@angular/language-service": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.2.16.tgz", - "integrity": "sha512-eDOd46Lu+4Nc/UA9q4G1xUTeIT2JXDdpedSRCk1fM+trYUZm7Xy2FZasP3pUSdtz04wt0kV9Mi5i3oCxfqU2Wg==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.3.4.tgz", + "integrity": "sha512-9k2q9TJaTG2QgIDNLUVOPCdzYRXLOw4aKiHTeMeIJOw4Zhp2dV7I4oX/aC/a1AN86JIO6m5nujeVf4SkK95WSw==", "dev": true }, "@angular/localize": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.16.tgz", - "integrity": "sha512-peWauKtqy7XG5OiG9L4uLg/yIMw0b/ipKOiovzpuj+DCghmeuYzle5kjCLvWydFeQqBoIdf2kcJYeskrYCAHfQ==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-13.3.4.tgz", + "integrity": "sha512-T55072wuH4jFweHA0cYhKaomitjxEpyVMro3QA9+SaBMy10yAP2Z1h1vA16A/vXxqVy8oSrmuda4UwMOwZv3Aw==", "requires": { - "@babel/core": "7.8.3", - "glob": "7.1.7", - "yargs": "^17.0.0" + "@babel/core": "7.17.2", + "glob": "7.2.0", + "yargs": "^17.2.1" }, "dependencies": { "ansi-regex": { @@ -761,9 +679,9 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -828,11 +746,11 @@ } }, "@angular/platform-browser": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.16.tgz", - "integrity": "sha512-T855ppLeQO6hRHi7lGf5fwPoUVt+c0h2rgkV5jHElc3ylaGnhecmZc6fnWLX4pw82TMJUgUV88CY8JCFabJWwg==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.4.tgz", + "integrity": "sha512-IjBOkjrIVIbbZCDQJRdel0FSDcExSLDgMxcCSQ6pKa6oR/t59BJpSpOhB1W9nRwLtvMmGYkS/oyLFsKk65UoYA==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -843,11 +761,11 @@ } }, "@angular/platform-browser-dynamic": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.16.tgz", - "integrity": "sha512-XGxoACAMW/bc3atiVRpaiYwU4LkobYwVzwlxTT/BxOfsdt8ILb5wU8Fx1TMKNECOQHSGdK0qqhch4pTBZ3cb2g==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.4.tgz", + "integrity": "sha512-UApjgrL6B3QTdSYoCOPzMvFDmSewAHrLpreLYEmADutMWkD0ZcTPux4MJp8awT4P3l6wKzBeGJIKLlk8zsXmGQ==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -858,11 +776,11 @@ } }, "@angular/router": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.16.tgz", - "integrity": "sha512-LuFXSMIvX/VrB4jbYhigG2Y2pGQ9ULsSBUwDWwQCf4kr0eVI37LBJ2Vr74GBEznjgQ0UmWE89E+XYI80UhERTw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.4.tgz", + "integrity": "sha512-UuMAjWHoFKF8b9gFOiqL7fpVXjIr89BtxVES3yXReVq/IZJz9gWup6lYK3KMja+F8HZB8LBUMYgtqjS9iyLV/Q==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -882,6 +800,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -889,35 +808,65 @@ "@babel/compat-data": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", + "@ampproject/remapping": "^2.0.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -939,12 +888,12 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -961,7 +910,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", @@ -972,8 +920,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -990,17 +937,6 @@ "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@babel/helper-create-regexp-features-plugin": { @@ -1011,23 +947,12 @@ "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -1078,7 +1003,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1096,7 +1020,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1105,7 +1028,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -1120,8 +1042,7 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" } } }, @@ -1149,17 +1070,6 @@ "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", "@babel/types": "^7.16.8" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@babel/helper-replace-supers": { @@ -1179,7 +1089,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "requires": { "@babel/types": "^7.17.0" } @@ -1204,13 +1113,13 @@ "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { "version": "7.16.8", @@ -1238,6 +1147,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", @@ -1249,6 +1159,15 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", @@ -1261,13 +1180,13 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -1406,17 +1325,6 @@ "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -1565,14 +1473,14 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -1607,17 +1515,6 @@ "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - } } }, "@babel/plugin-transform-computed-properties": { @@ -1824,16 +1721,16 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { @@ -1911,31 +1808,32 @@ } }, "@babel/preset-env": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", - "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -1950,44 +1848,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.8", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" }, "dependencies": { @@ -2013,9 +1911,9 @@ } }, "@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -2081,14 +1979,6 @@ "@babel/highlight": "^7.16.7" } }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -2122,16 +2012,19 @@ } } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } }, "@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, "@electron/get": { @@ -2232,6 +2125,12 @@ } } }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -2249,6 +2148,19 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2256,22 +2168,20 @@ "dev": true }, "@jridgewell/resolve-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", - "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", "dev": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2280,24 +2190,10 @@ "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" } } }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", - "dev": true, - "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" - } - }, "@ngneat/content-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@ngneat/content-loader/-/content-loader-5.0.0.tgz", @@ -2314,9 +2210,9 @@ } }, "@ngtools/webpack": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz", - "integrity": "sha512-uaS+2YZgPDW3VmUuwh4/yfIFV1KRVGWefc6xLWIqKRKs6mlRYs65m3ib9dX7CTS4kQMCbhxkxMbpBO2yXlzfvA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.3.tgz", + "integrity": "sha512-O6EzafKfFuvI3Ju941u7ANs0mT7YDdChbVRhVECCPWOTm3Klr73js3bnCDzaJlxZNjzlG/KeUu5ghrhbMrHjSw==", "dev": true }, "@nodelib/fs.scandir": { @@ -2345,6 +2241,27 @@ "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@npmcli/git": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", @@ -2443,13 +2360,13 @@ } }, "@schematics/angular": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.17.tgz", - "integrity": "sha512-HM/4KkQu944KL5ebhIyy1Ot5OV6prHNW7kmGeMVeQefLSbbfMQCHLa1psB9UU9BoahwGhUBvleLylNSitOBCgg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.3.tgz", + "integrity": "sha512-kX5ghVCmWHcMN+g0pUaFuIJzwrXsVnK4bfid8DckU4EEtfFSv3UA5I1QNJRgpCPxTPhNEAk+3ePN8nzDSjdU+w==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.17", - "@angular-devkit/schematics": "12.2.17", + "@angular-devkit/core": "13.3.3", + "@angular-devkit/schematics": "13.3.3", "jsonc-parser": "3.0.0" } }, @@ -2480,11 +2397,24 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/component-emitter": { "version": "1.2.11", @@ -2492,6 +2422,25 @@ "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", "dev": true }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -2531,24 +2480,46 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==", "dev": true }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "requires": { - "@types/minimatch": "*", "@types/node": "*" } }, @@ -2564,10 +2535,10 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, "@types/node": { @@ -2582,35 +2553,65 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, "@types/selenium-webdriver": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/webpack-sources": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", - "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { @@ -3028,6 +3029,19 @@ "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } } }, "adm-zip": { @@ -3078,16 +3092,10 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, "ajv-formats": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", - "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { "ajv": "^8.0.0" }, @@ -3214,24 +3222,6 @@ "commander": "^2.11.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -3250,12 +3240,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -3277,12 +3261,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3304,18 +3282,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3329,42 +3295,17 @@ "dev": true }, "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" } }, "aws-sign2": { @@ -3389,9 +3330,9 @@ } }, "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", @@ -3446,14 +3387,27 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "dependencies": { @@ -3466,22 +3420,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "balanced-match": { @@ -3489,61 +3443,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3583,16 +3482,6 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -3716,7 +3605,6 @@ "version": "4.20.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001317", "electron-to-chromium": "^1.4.84", @@ -3781,11 +3669,12 @@ "dev": true }, "cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, "requires": { + "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3827,23 +3716,6 @@ } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -3898,29 +3770,10 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "caniuse-lite": { "version": "1.0.30001332", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" }, "caseless": { "version": "0.12.0", @@ -3989,29 +3842,6 @@ "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -4135,16 +3965,6 @@ } } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -4164,16 +3984,10 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true - }, "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "colors": { @@ -4371,27 +4185,41 @@ "is-what": "^3.14.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", "dev": true, "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -4436,6 +4264,12 @@ } } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -4446,15 +4280,6 @@ "picomatch": "^2.3.1" } }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4462,14 +4287,15 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -4527,13 +4353,13 @@ } }, "critters": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", - "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "dev": true, "requires": { "chalk": "^4.1.0", - "css-select": "^4.1.3", + "css-select": "^4.2.0", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "postcss": "^8.3.7", @@ -4586,17 +4412,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "dev": true, - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4609,16 +4424,25 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "crypto-js": { @@ -4627,15 +4451,14 @@ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "dev": true, "requires": { - "inherits": "^2.0.3", + "inherits": "^2.0.4", "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "source-map-resolve": "^0.6.0" }, "dependencies": { "source-map": { @@ -4647,99 +4470,27 @@ } }, "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.9" } }, - "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true - }, "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.9" } }, "css-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", - "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -4763,90 +4514,11 @@ } } }, - "css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", - "dev": true, - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", - "postcss": "^8.3.5", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true }, "css-select": { "version": "4.3.0", @@ -4871,24 +4543,6 @@ "fastparse": "^1.1.2" } }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -4905,9 +4559,9 @@ } }, "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", "dev": true }, "cssesc": { @@ -4916,69 +4570,6 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.7", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.2.2", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -5056,13 +4647,12 @@ "dev": true }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, "defaults": { @@ -5095,122 +4685,85 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true } } }, @@ -5398,8 +4951,7 @@ "electron-to-chromium": { "version": "1.4.118", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz", - "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==", - "dev": true + "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==" }, "emoji-regex": { "version": "8.0.0", @@ -5555,6 +5107,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "optional": true, "requires": { "prr": "~1.0.1" } @@ -5569,9 +5122,9 @@ } }, "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, "es6-error": { @@ -5597,127 +5150,141 @@ } }, "esbuild-android-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", - "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz", + "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", - "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz", + "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", - "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz", + "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", - "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz", + "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", - "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz", + "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", - "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz", + "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", - "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz", + "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", - "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz", + "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", - "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz", + "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", - "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz", + "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", - "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz", + "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz", + "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz", + "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", - "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz", + "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", - "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz", + "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", - "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz", + "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==", "dev": true, "optional": true }, "esbuild-wasm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", - "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz", + "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==", "dev": true }, "esbuild-windows-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", - "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz", + "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", - "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz", + "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", - "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz", + "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==", "dev": true, "optional": true }, @@ -6106,28 +5673,29 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } } }, "exit": { @@ -6136,56 +5704,6 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "express": { "version": "4.17.3", "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", @@ -6357,27 +5875,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6389,71 +5886,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -6575,13 +6007,6 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "filesize": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", @@ -6629,9 +6054,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -6695,24 +6120,12 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, "follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6736,14 +6149,11 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true }, "fresh": { "version": "0.5.2", @@ -6887,6 +6297,12 @@ "has-symbols": "^1.0.1" } }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -6896,12 +6312,6 @@ "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -6996,19 +6406,25 @@ } }, "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, "requires": { - "array-union": "^2.1.0", + "array-union": "^3.0.1", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", "merge2": "^1.4.1", - "slash": "^3.0.0" + "slash": "^4.0.0" }, "dependencies": { + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -7052,6 +6468,12 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true } } }, @@ -7153,58 +6575,6 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hdr-histogram-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", @@ -7244,9 +6614,9 @@ } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-escaper": { @@ -7328,120 +6698,16 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" } }, "http-signature": { @@ -7476,6 +6742,12 @@ } } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -7534,6 +6806,12 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7542,60 +6820,13 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } } } }, @@ -7611,12 +6842,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -7644,9 +6869,9 @@ "dev": true }, "inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -7657,7 +6882,7 @@ "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", - "ora": "^5.3.0", + "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.2.0", "string-width": "^4.1.0", @@ -7731,60 +6956,18 @@ } } }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -7810,12 +6993,6 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -7825,26 +7002,6 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -7854,37 +7011,12 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7929,23 +7061,17 @@ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -7967,9 +7093,9 @@ } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-typedarray": { @@ -7990,12 +7116,6 @@ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8042,17 +7162,24 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "dependencies": { + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -8557,12 +7684,6 @@ "json-buffer": "3.0.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8576,9 +7697,9 @@ "dev": true }, "less": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", - "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -8590,7 +7711,7 @@ "needle": "^2.5.2", "parse-node-version": "^1.0.1", "source-map": "~0.6.0", - "tslib": "^1.10.0" + "tslib": "^2.3.0" }, "dependencies": { "source-map": { @@ -8601,17 +7722,17 @@ "optional": true }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } }, "less-loader": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz", - "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", "dev": true, "requires": { "klona": "^2.0.4" @@ -8628,13 +7749,12 @@ } }, "license-webpack-plugin": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", - "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" + "webpack-sources": "^3.0.0" } }, "lie": { @@ -8646,12 +7766,6 @@ "immediate": "~3.0.5" } }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8665,15 +7779,10 @@ "dev": true }, "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true }, "locate-path": { "version": "5.0.0", @@ -8687,7 +7796,8 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.clonedeep": { "version": "4.5.0", @@ -8701,12 +7811,6 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -8719,12 +7823,6 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8810,12 +7908,6 @@ } } }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -8900,30 +7992,6 @@ } } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -8948,36 +8016,12 @@ "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.5.4.tgz", "integrity": "sha512-5ycazkNmIOtV78Ff3WgvxQESoJuujdRm0cNbf18fmyJN20jHyqp9rpwi4EfQyGimag0ZLElxtVg3H9enIKdOOw==" }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } - } - }, "memfs": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", @@ -8987,39 +8031,12 @@ "fs-monkey": "1.0.3" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9082,23 +8099,51 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", - "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", "dev": true, "requires": { - "schema-utils": "^3.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -9200,27 +8245,6 @@ "yallist": "^4.0.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", @@ -9268,25 +8292,6 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -9374,12 +8379,6 @@ "node-gyp-build": "^4.2.2" } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -9388,9 +8387,9 @@ "optional": true }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, "node-gyp": { @@ -9461,8 +8460,7 @@ "node-releases": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" }, "nopt": { "version": "5.0.0", @@ -9485,12 +8483,6 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, "npm-bundled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", @@ -9620,26 +8612,227 @@ } }, "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", "dev": true, "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.6.tgz", + "integrity": "sha512-9a/MLxGaw3LEGes0HaPez2RgZWDV6X0jrgChsuxfEh8xoDoYGxaGrkMe7Dlyjrb655tA/b8fX0qlUg6Ii5MBvw==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", + "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz", + "integrity": "sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.2", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^9.0.0" + }, + "dependencies": { + "minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + } + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "ssri": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", + "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } } }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "npmlog": { @@ -9663,12 +8856,6 @@ "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9681,37 +8868,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -9728,15 +8884,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -9749,15 +8896,6 @@ "object-keys": "^1.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -9797,9 +8935,9 @@ } }, "open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -9877,23 +9015,6 @@ } } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - } - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -9976,15 +9097,6 @@ } } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9997,18 +9109,6 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -10037,12 +9137,13 @@ } }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" } }, "p-try": { @@ -10052,9 +9153,9 @@ "dev": true }, "pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", "dev": true, "requires": { "@npmcli/git": "^2.1.0", @@ -10070,7 +9171,7 @@ "npm-package-arg": "^8.0.1", "npm-packlist": "^3.0.0", "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "npm-registry-fetch": "^12.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", @@ -10191,12 +9292,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", @@ -10224,12 +9319,6 @@ } } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10248,15 +9337,16 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -10285,8 +9375,7 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.2.2", @@ -10316,9 +9405,9 @@ } }, "piscina": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", - "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -10367,693 +9456,142 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "postcss": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - }, - "dependencies": { - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true - } + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" } }, "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dev": true, "requires": { - "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" } }, "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, - "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true }, "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", + "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", "dev": true, "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.4" } }, "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.9" } }, - "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", "dev": true, "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.9" } }, "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.9" } }, "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true }, "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true }, "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, "postcss-import": { @@ -11068,81 +9606,29 @@ } }, "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true }, "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", - "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", + "klona": "^2.0.5", "semver": "^7.3.5" }, "dependencies": { @@ -11158,132 +9644,16 @@ } }, "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true }, "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true }, "postcss-modules-extract-imports": { "version": "3.0.0", @@ -11321,466 +9691,98 @@ } }, "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.0.10" } }, "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true }, "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true }, "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" } }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "postcss-pseudo-class-any-link": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "postcss-selector-parser": "^6.0.10" } }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true + }, "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "balanced-match": "^1.0.0" } }, "postcss-selector-parser": { @@ -11793,42 +9795,12 @@ "util-deprecate": "^1.0.2" } }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11879,6 +9851,14 @@ "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } } }, "proto-list": { @@ -12255,13 +10235,22 @@ "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "dev": true, + "optional": true }, "psl": { "version": "1.8.0", @@ -12296,18 +10285,6 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12430,16 +10407,6 @@ "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", @@ -12500,24 +10467,6 @@ } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -12580,66 +10529,39 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "requires": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", "loader-utils": "^2.0.0", - "postcss": "^7.0.35", + "postcss": "^8.2.14", "source-map": "0.6.1" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "source-map": { @@ -12669,16 +10591,10 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { @@ -12779,15 +10695,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12795,18 +10702,20 @@ "dev": true }, "sass": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", - "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==", + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sass-loader": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", - "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -12899,18 +10808,19 @@ } }, "selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -13107,29 +11017,6 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -13146,18 +11033,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { @@ -13215,134 +11102,6 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "socket.io": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", @@ -13415,30 +11174,6 @@ } } }, - "sockjs-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", - "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "eventsource": "^1.1.0", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "socks": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", @@ -13480,12 +11215,6 @@ } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -13498,14 +11227,14 @@ "dev": true }, "source-map-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", - "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dev": true, "requires": { "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "source-map-js": "^0.6.2" + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" }, "dependencies": { "iconv-lite": { @@ -13516,32 +11245,23 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } - }, - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true } } }, "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "decode-uri-component": "^0.2.0" } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -13556,12 +11276,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -13607,15 +11321,6 @@ } } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13648,33 +11353,6 @@ "minipass": "^3.1.1" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -13719,10 +11397,10 @@ "ansi-regex": "^5.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { @@ -13731,45 +11409,27 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "style-loader": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", - "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", "dev": true, "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", + "css": "^3.0.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "glob": { @@ -13785,34 +11445,16 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, "stylus-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", - "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", "dev": true, "requires": { - "fast-glob": "^3.2.5", + "fast-glob": "^3.2.7", "klona": "^2.0.4", "normalize-path": "^3.0.0" }, @@ -13874,28 +11516,11 @@ "has-flag": "^3.0.0" } }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, "symbol-observable": { "version": "4.0.0", @@ -13966,39 +11591,30 @@ } }, "terser": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", - "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.7.0" + "terser": "^5.7.2" }, "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -14018,6 +11634,33 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -14050,44 +11693,12 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14316,6 +11927,12 @@ "mime-types": "~2.1.24" } }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -14323,9 +11940,9 @@ "dev": true }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" }, "ua-parser-js": { "version": "0.7.31", @@ -14368,24 +11985,6 @@ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -14416,52 +12015,6 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -14470,40 +12023,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -14513,12 +12032,6 @@ "prepend-http": "^2.0.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", @@ -14618,11 +12131,6 @@ "defaults": "^1.0.3" } }, - "web-animations-js": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", - "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" - }, "webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", @@ -14634,13 +12142,13 @@ } }, "webpack": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", - "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -14648,12 +12156,12 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -14661,8 +12169,8 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { "graceful-fs": { @@ -14687,29 +12195,49 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true } } }, "webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dev": true, "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", + "colorette": "^2.0.10", "memfs": "^3.2.2", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -14726,502 +12254,115 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, "webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dev": true, "requires": { - "ansi-html-community": "0.0.8", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "default-gateway": "^6.0.3", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^6.0.1" } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true } } }, @@ -15236,30 +12377,18 @@ } }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true }, "webpack-subresource-integrity": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", - "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "requires": { - "webpack-sources": "^1.3.0" + "typed-assert": "^1.0.8" } }, "websocket-driver": { @@ -15354,13 +12483,10 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true }, "xliff": { "version": "4.4.0", @@ -15456,12 +12582,6 @@ "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, "zone.js": { "version": "0.11.5", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", diff --git a/package.json b/package.json index 8cb36c2..8215d3b 100644 --- a/package.json +++ b/package.json @@ -20,18 +20,18 @@ }, "private": true, "dependencies": { - "@angular-devkit/core": "^12.2.17", - "@angular/animations": "^12.2.16", + "@angular-devkit/core": "^13.3.3", + "@angular/animations": "^13.3.4", "@angular/cdk": "^12.2.13", - "@angular/common": "^12.2.16", - "@angular/compiler": "^12.2.16", - "@angular/core": "^12.2.16", - "@angular/forms": "^12.2.16", - "@angular/localize": "^12.2.16", + "@angular/common": "^13.3.4", + "@angular/compiler": "^13.3.4", + "@angular/core": "^13.3.4", + "@angular/forms": "^13.3.4", + "@angular/localize": "^13.3.4", "@angular/material": "^12.2.13", - "@angular/platform-browser": "^12.2.16", - "@angular/platform-browser-dynamic": "^12.2.16", - "@angular/router": "^12.2.16", + "@angular/platform-browser": "^13.3.4", + "@angular/platform-browser-dynamic": "^13.3.4", + "@angular/router": "^13.3.4", "@ngneat/content-loader": "^5.0.0", "@videogular/ngx-videogular": "^5.0.1", "core-js": "^2.4.1", @@ -48,16 +48,15 @@ "rxjs": "^6.6.3", "rxjs-compat": "^6.0.0-rc.0", "tslib": "^2.0.0", - "typescript": "~4.3.5", - "web-animations-js": "^2.3.2", + "typescript": "~4.6.3", "xliff-to-json": "^1.0.4", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^12.2.17", - "@angular/cli": "^12.2.17", - "@angular/compiler-cli": "^12.2.16", - "@angular/language-service": "^12.2.16", + "@angular-devkit/build-angular": "^13.3.3", + "@angular/cli": "^13.3.3", + "@angular/compiler-cli": "^13.3.4", + "@angular/language-service": "^13.3.4", "@types/core-js": "^2.5.2", "@types/file-saver": "^2.0.1", "@types/jasmine": "~3.6.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8b9c526..ed65ec6 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -99,117 +99,110 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible } @NgModule({ - declarations: [ - AppComponent, - MainComponent, - PlayerComponent, - InputDialogComponent, - CreatePlaylistComponent, - SubscriptionsComponent, - SubscribeDialogComponent, - SubscriptionComponent, - SubscriptionFileCardComponent, - SubscriptionInfoDialogComponent, - SettingsComponent, - AboutDialogComponent, - VideoInfoDialogComponent, - ArgModifierDialogComponent, - HighlightPipe, - LinkifyPipe, - UpdaterComponent, - UpdateProgressDialogComponent, - ShareMediaDialogComponent, - LoginComponent, - DownloadsComponent, - UserProfileDialogComponent, - SetDefaultAdminDialogComponent, - ModifyUsersComponent, - AddUserDialogComponent, - ManageUserComponent, - ManageRoleComponent, - CookiesUploaderDialogComponent, - LogsViewerComponent, - ModifyPlaylistComponent, - ConfirmDialogComponent, - UnifiedFileCardComponent, - RecentVideosComponent, - EditSubscriptionDialogComponent, - CustomPlaylistsComponent, - EditCategoryDialogComponent, - TwitchChatComponent, - SeeMoreComponent, - ConcurrentStreamComponent, - SkipAdButtonComponent, - TasksComponent, - UpdateTaskScheduleDialogComponent, - RestoreDbDialogComponent - ], - imports: [ - CommonModule, - BrowserModule, - BrowserAnimationsModule, - MatNativeDateModule, - MatRadioModule, - FormsModule, - MatInputModule, - MatSelectModule, - ReactiveFormsModule, - HttpClientModule, - MatToolbarModule, - MatCardModule, - MatSnackBarModule, - MatButtonModule, - MatCheckboxModule, - MatSidenavModule, - MatIconModule, - MatListModule, - MatGridListModule, - MatExpansionModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatButtonToggleModule, - MatRippleModule, - MatMenuModule, - MatDialogModule, - MatSlideToggleModule, - MatAutocompleteModule, - MatTabsModule, - MatTooltipModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - MatDatepickerModule, - MatChipsModule, - DragDropModule, - ClipboardModule, - TextFieldModule, - NgxFileDropModule, - AvatarModule, - ContentLoaderModule, - VgCoreModule, - VgControlsModule, - VgOverlayPlayModule, - VgBufferingModule, - LazyLoadImageModule.forRoot({ isVisible }), - RouterModule, - AppRoutingModule, - ], - entryComponents: [ - InputDialogComponent, - CreatePlaylistComponent, - SubscribeDialogComponent, - SubscriptionInfoDialogComponent, - SettingsComponent - ], - providers: [ - PostsService, - { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true } - ], - exports: [ - HighlightPipe, - LinkifyPipe - ], - bootstrap: [AppComponent] + declarations: [ + AppComponent, + MainComponent, + PlayerComponent, + InputDialogComponent, + CreatePlaylistComponent, + SubscriptionsComponent, + SubscribeDialogComponent, + SubscriptionComponent, + SubscriptionFileCardComponent, + SubscriptionInfoDialogComponent, + SettingsComponent, + AboutDialogComponent, + VideoInfoDialogComponent, + ArgModifierDialogComponent, + HighlightPipe, + LinkifyPipe, + UpdaterComponent, + UpdateProgressDialogComponent, + ShareMediaDialogComponent, + LoginComponent, + DownloadsComponent, + UserProfileDialogComponent, + SetDefaultAdminDialogComponent, + ModifyUsersComponent, + AddUserDialogComponent, + ManageUserComponent, + ManageRoleComponent, + CookiesUploaderDialogComponent, + LogsViewerComponent, + ModifyPlaylistComponent, + ConfirmDialogComponent, + UnifiedFileCardComponent, + RecentVideosComponent, + EditSubscriptionDialogComponent, + CustomPlaylistsComponent, + EditCategoryDialogComponent, + TwitchChatComponent, + SeeMoreComponent, + ConcurrentStreamComponent, + SkipAdButtonComponent, + TasksComponent, + UpdateTaskScheduleDialogComponent, + RestoreDbDialogComponent + ], + imports: [ + CommonModule, + BrowserModule, + BrowserAnimationsModule, + MatNativeDateModule, + MatRadioModule, + FormsModule, + MatInputModule, + MatSelectModule, + ReactiveFormsModule, + HttpClientModule, + MatToolbarModule, + MatCardModule, + MatSnackBarModule, + MatButtonModule, + MatCheckboxModule, + MatSidenavModule, + MatIconModule, + MatListModule, + MatGridListModule, + MatExpansionModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatButtonToggleModule, + MatRippleModule, + MatMenuModule, + MatDialogModule, + MatSlideToggleModule, + MatAutocompleteModule, + MatTabsModule, + MatTooltipModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + MatDatepickerModule, + MatChipsModule, + DragDropModule, + ClipboardModule, + TextFieldModule, + NgxFileDropModule, + AvatarModule, + ContentLoaderModule, + VgCoreModule, + VgControlsModule, + VgOverlayPlayModule, + VgBufferingModule, + LazyLoadImageModule.forRoot({ isVisible }), + RouterModule, + AppRoutingModule, + ], + providers: [ + PostsService, + { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true } + ], + exports: [ + HighlightPipe, + LinkifyPipe + ], + bootstrap: [AppComponent] }) export class AppModule { } diff --git a/src/app/components/see-more/see-more.component.html b/src/app/components/see-more/see-more.component.html index 297d820..724b05c 100644 --- a/src/app/components/see-more/see-more.component.html +++ b/src/app/components/see-more/see-more.component.html @@ -1,6 +1,6 @@ - + See more. diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 5674fec..3fc5c2c 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -1,7 +1,6 @@ import {Injectable, isDevMode, Inject} from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; import 'rxjs/add/observable/throw'; import { THEMES_CONFIG } from '../themes'; diff --git a/src/polyfills.ts b/src/polyfills.ts index c243237..85b03e5 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -20,37 +20,7 @@ import '@angular/localize/init'; /*************************************************************************************************** * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** IE10 and IE11 requires the following to support `@angular/animation`. */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - -/** Evergreen browsers require these. **/ -// import 'core-js/es6/reflect'; - - -/** ALL Firefox browsers require the following to support `@angular/animation`. **/ -import 'web-animations-js'; // Run `npm install --save web-animations-js`. + */ // Run `npm install --save web-animations-js`. diff --git a/src/test.ts b/src/test.ts index cd612ee..4738de2 100644 --- a/src/test.ts +++ b/src/test.ts @@ -22,7 +22,9 @@ __karma__.loaded = function () {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: false } +} ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); From 5025b235b7110836d8ba74bf8f99b1b82f9bbe4e Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 19:03:55 -0400 Subject: [PATCH 123/212] Updated angular material to v13 --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bfdac4..20ad1c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -415,12 +415,12 @@ } }, "@angular/cdk": { - "version": "12.2.13", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-12.2.13.tgz", - "integrity": "sha512-zSKRhECyFqhingIeyRInIyTvYErt4gWo+x5DQr0b7YLUbU8DZSwWnG4w76Ke2s4U8T7ry1jpJBHoX/e8YBpGMg==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.4.tgz", + "integrity": "sha512-im4LKxJaIuqFVzmtf650PoiYsn/SZlvBV2zEgzusK8HwQ24C1Lya7NQSApwl8k43h4eKO1OvUKBjqL5uDgEQag==", "requires": { "parse5": "^5.0.0", - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { @@ -731,11 +731,11 @@ } }, "@angular/material": { - "version": "12.2.13", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-12.2.13.tgz", - "integrity": "sha512-6g2GyN4qp2D+DqY2AwrQuPB3cd9gybvQVXvNRbTPXEulHr+LgGei00ySdFHFp6RvdGSMZ4i3LM1Fq3VkFxhCfQ==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.4.tgz", + "integrity": "sha512-jK9rWmBaPrE+3re6uIdyvG5DCzc47VUvnP1DqblNnpaa8GCKllb1cFRGqa5GPYB1/96d3wO+RPwzhC06qqV+yw==", "requires": { - "tslib": "^2.2.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { diff --git a/package.json b/package.json index 8215d3b..551a319 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,13 @@ "dependencies": { "@angular-devkit/core": "^13.3.3", "@angular/animations": "^13.3.4", - "@angular/cdk": "^12.2.13", + "@angular/cdk": "^13.3.4", "@angular/common": "^13.3.4", "@angular/compiler": "^13.3.4", "@angular/core": "^13.3.4", "@angular/forms": "^13.3.4", "@angular/localize": "^13.3.4", - "@angular/material": "^12.2.13", + "@angular/material": "^13.3.4", "@angular/platform-browser": "^13.3.4", "@angular/platform-browser-dynamic": "^13.3.4", "@angular/router": "^13.3.4", From 5a44229e24e061d0565511c376612d87cf297f86 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 22:07:50 -0400 Subject: [PATCH 124/212] Fixed styles.scss --- src/styles.scss | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/styles.scss b/src/styles.scss index b847a8b..8456541 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,7 +1,4 @@ /* You can add global styles to this file, and also import other style files */ -@use '~@angular/material' as mat; - -@import '~material-icons/iconfont/material-icons.css'; @import '@angular/material/prebuilt-themes/indigo-pink.css'; @@ -17,45 +14,41 @@ body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } // Plus imports for other components in your app. /*// Typography -$custom-typography: mat.define-typography-config( +$custom-typography: mat-typography-config( $font-family: Raleway, - $headline: mat.define-typography-level(24px, 48px, 400), - $body-1: mat.define-typography-level(16px, 24px, 400) + $headline: mat-typography-level(24px, 48px, 400), + $body-1: mat-typography-level(16px, 24px, 400) ); -@include mat.all-component-typographies($custom-typography); +@include angular-material-typography($custom-typography); */ // Default colors -$my-app-primary: mat.define-palette(mat.$light-blue-palette, 700, 100, 800); -$my-app-accent: mat.define-palette(mat.$blue-palette, 700, 100, 800); -$my-app-warn: mat.define-palette(mat.$red-palette, 700, 100, 800); +$my-app-primary: mat-palette($mat-light-blue, 700, 100, 800); +$my-app-accent: mat-palette($mat-blue, 700, 100, 800); +$my-app-warn: mat-palette($mat-red, 700, 100, 800); -$my-app-theme: mat.define-light-theme($my-app-primary, $my-app-accent, $my-app-warn); -@include mat.all-component-themes($my-app-theme); +$my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn); +@include angular-material-theme($my-app-theme); // Dark theme -$dark-primary: mat.define-palette(mat.$light-blue-palette, 700, 100, 800); -$dark-accent: mat.define-palette(mat.$blue-palette); -$dark-warn: mat.define-palette(mat.$deep-orange-palette); +$dark-primary: mat-palette($mat-indigo); +$dark-accent: mat-palette($mat-blue); +$dark-warn: mat-palette($mat-deep-orange); -$dark-theme: mat.define-dark-theme($dark-primary, $dark-accent, $dark-warn); +$dark-theme: mat-dark-theme($dark-primary, $dark-accent, $dark-warn); .dark-theme { - @include mat.all-component-themes($dark-theme); -} - -.mat-stroked-button, .mat-raised-button, .mat-flat-button { - border-radius: 24px !important + @include angular-material-theme($dark-theme); } // Light theme -$light-primary: mat.define-palette(mat.$grey-palette, 200, 500, 300); -$light-accent: mat.define-palette(mat.$brown-palette, 200); -$light-warn: mat.define-palette(mat.$deep-orange-palette, 200); +$light-primary: mat-palette($mat-grey, 200, 500, 300); +$light-accent: mat-palette($mat-brown, 200); +$light-warn: mat-palette($mat-deep-orange, 200); -$light-theme: mat.define-light-theme($light-primary, $light-accent, $light-warn); +$light-theme: mat-light-theme($light-primary, $light-accent, $light-warn); .light-theme { - @include mat.all-component-themes($light-theme); + @include angular-material-theme($light-theme) } .no-outline { @@ -66,7 +59,7 @@ $light-theme: mat.define-light-theme($light-primary, $light-accent, $light-warn) // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! -@include mat.core(); +@include mat-core(); // @import '../node_modules/@angular/material/theming'; From 63e2e6dd3cf155d12bf13ffeca3c1153b30acd9b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 22:14:21 -0400 Subject: [PATCH 125/212] Fixed build warnings --- angular.json | 6 +++++- src/_palette.scss | 10 +++++----- .../skip-ad-button/skip-ad-button.component.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/angular.json b/angular.json index f2f2707..613cfa8 100644 --- a/angular.json +++ b/angular.json @@ -38,7 +38,11 @@ "buildOptimizer": false, "sourceMap": true, "optimization": false, - "namedChunks": true + "namedChunks": true, + "allowedCommonJsDependencies": [ + "rxjs", + "crypto-js" + ] }, "configurations": { "production": { diff --git a/src/_palette.scss b/src/_palette.scss index 90bc8bd..ee0753b 100644 --- a/src/_palette.scss +++ b/src/_palette.scss @@ -1,11 +1,11 @@ /* Coolors Exported Palette - coolors.co/e8aeb7-b8e1ff-a9fff7-94fbab-82aba1 */ /* HSL */ -$color1: hsla(351%, 56%, 80%, 1); -$softblue: hsla(205%, 100%, 86%, 1); -$color3: hsla(174%, 100%, 83%, 1); -$color4: hsla(133%, 93%, 78%, 1); -$color5: hsla(165%, 20%, 59%, 1); +$color1: hsla(351, 56%, 80%, 1); +$softblue: hsla(205, 100%, 86%, 1); +$color3: hsla(174, 100%, 83%, 1); +$color4: hsla(133, 93%, 78%, 1); +$color5: hsla(165, 20%, 59%, 1); /* RGB */ $color1: rgba(232, 174, 183, 1); diff --git a/src/app/components/skip-ad-button/skip-ad-button.component.ts b/src/app/components/skip-ad-button/skip-ad-button.component.ts index 9f8cd74..6a98811 100644 --- a/src/app/components/skip-ad-button/skip-ad-button.component.ts +++ b/src/app/components/skip-ad-button/skip-ad-button.component.ts @@ -62,7 +62,7 @@ export class SkipAdButtonComponent implements OnInit { getVideoIDHashFromURL(video_id) { if (!video_id) return null; - return CryptoJS.SHA256(video_id).toString(CryptoJS.enc.Hex);; + return CryptoJS.SHA256(video_id).toString(CryptoJS.enc.Hex); } getVideoIDFromURL(url) { From a4cfafe63cd7a03a026df499324a9a216137e83b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 22:34:29 -0400 Subject: [PATCH 126/212] Updated frontend and backend dependencies, fixed some security issues --- backend/package-lock.json | 946 ++++++++++++++++---------------------- backend/package.json | 15 +- package-lock.json | 236 +++++----- package.json | 2 +- 4 files changed, 526 insertions(+), 673 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 76daecd..4bcad45 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -4,10 +4,15 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "requires": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -59,89 +64,19 @@ "defer-to-connect": "^1.0.1" } }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", - "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.9", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz", - "integrity": "sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "@types/ldapjs": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.9.tgz", - "integrity": "sha512-3PvY7Drp1zoLbcGlothCAkoc5o6Jp9KvUPwHadlHyKp3yPvyeIh7w2zQc9UXMzgDRkoeGXUEODtbEs5XCh9ZyA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-2.2.2.tgz", + "integrity": "sha512-U5HdnwIZ5uZa+f3usxdqgyfNmOROxOxXvQdQtsu6sKo8fte5vej9br2csHxPvXreAbAO1bs8/rdEzvCLpi67nQ==", "requires": { "@types/node": "*" } }, - "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" - }, "@types/node": { "version": "14.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" }, - "@types/passport": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.4.tgz", - "integrity": "sha512-h5OfAbfBBYSzjeU0GTuuqYEk9McTgWeGQql9g3gUw2/NNCfD7VgExVRYJVVeU13Twn202Mvk9BT0bUrl30sEgA==", - "requires": { - "@types/express": "*" - } - }, - "@types/qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/serve-static": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", - "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -152,6 +87,11 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -198,9 +138,9 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -245,27 +185,17 @@ "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "requires": { "archiver-utils": "^2.1.0", - "async": "^2.6.3", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - } + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" } }, "archiver-utils": { @@ -325,9 +255,9 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "async-mutex": { "version": "0.3.1", @@ -379,9 +309,9 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -431,26 +361,26 @@ "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -497,12 +427,12 @@ "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" }, "buffer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", - "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { @@ -530,17 +460,6 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, - "bunyan": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.14.tgz", - "integrity": "sha512-LlahJUxXzZLuw/hetUQJmRgZ1LF6+cr5TPpRj6jf327AsiIq2jhYEH4oqUUkVKTor+9w2BT3oxVwhzE5lw9tcg==", - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, "busboy": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", @@ -690,17 +609,12 @@ "wrap-ansi": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -714,12 +628,12 @@ } }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -736,25 +650,20 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -767,30 +676,14 @@ } }, "compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "requires": { "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", + "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "readable-stream": "^3.6.0" } }, "compressible": { @@ -874,11 +767,18 @@ "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -887,9 +787,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", @@ -901,20 +801,17 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { - "buffer": "^5.1.0" - } + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "requires": { - "crc": "^3.4.4", + "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, @@ -1001,9 +898,9 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depd": { "version": "1.1.2", @@ -1060,15 +957,6 @@ "is-obj": "^2.0.0" } }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -1173,11 +1061,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "exe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/exe/-/exe-1.0.2.tgz", - "integrity": "sha1-9iUYQLKJ1kJe5fpotZ7hUYH6pC8=" - }, "execa": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz", @@ -1196,16 +1079,16 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -1219,17 +1102,51 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "extend": { @@ -1253,9 +1170,9 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "fill-range": { "version": "7.0.1", @@ -1338,9 +1255,9 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", @@ -1560,22 +1477,15 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "toidentifier": "1.0.1" } }, "http-signature": { @@ -1602,9 +1512,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore-by-default": { "version": "1.0.1", @@ -1747,6 +1657,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -1768,9 +1683,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { "argparse": "^2.0.1" } @@ -1785,11 +1700,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1842,14 +1752,21 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + } } }, "jwa": { @@ -1893,9 +1810,9 @@ } }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" }, @@ -1917,69 +1834,37 @@ } }, "ldap-filter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", - "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", "requires": { - "assert-plus": "0.1.5" - }, - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - } + "assert-plus": "^1.0.0" } }, "ldapauth-fork": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.3.3.tgz", - "integrity": "sha512-x76VpQ5ZqkwAJmqwcD6KIwDiNEbgIGIPGwC/eA17e1dxWhlTx36w0DlLOFwjTuZ2iuaLTsZsUprlVqvSlwc/1Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-5.0.2.tgz", + "integrity": "sha512-fWrrBwJ162rzQIIqfPsfCHy/861kEalQNIu16gmwOMr5cmdfjNkw7XfTlzCTJHybnFg9oW9WaX4DGXa0xiGPmA==", "requires": { - "@types/ldapjs": "^1.0.0", - "@types/node": "*", + "@types/ldapjs": "^2.2.2", "bcryptjs": "^2.4.0", - "ldapjs": "^1.0.2", - "lru-cache": "^5.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } + "ldapjs": "^2.2.1", + "lru-cache": "^6.0.0" } }, "ldapjs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", - "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", + "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", "requires": { - "asn1": "0.2.3", + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", "assert-plus": "^1.0.0", "backoff": "^2.5.0", - "bunyan": "^1.8.3", - "dashdash": "^1.14.0", - "dtrace-provider": "~0.8", - "ldap-filter": "0.2.2", + "ldap-filter": "^0.3.3", "once": "^1.4.0", - "vasync": "^1.6.4", + "vasync": "^2.2.0", "verror": "^1.8.1" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - } } }, "listenercount": { @@ -2056,17 +1941,18 @@ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2088,14 +1974,14 @@ } }, "logform": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", - "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", "requires": { - "colors": "^1.2.1", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", - "safe-stable-stringify": "^1.1.0", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" }, "dependencies": { @@ -2128,6 +2014,14 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "luxon": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", @@ -2242,41 +2136,55 @@ } }, "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" }, @@ -2288,20 +2196,59 @@ } } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } }, "strip-json-comments": { "version": "3.1.1", @@ -2324,14 +2271,14 @@ "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" }, "mongodb": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.9.tgz", - "integrity": "sha512-1nSCKgSunzn/CXwgOWgbPHUWOO5OfERcuOWISmqd610jn0s8BU9K4879iJVabqgpPPbA6hO7rG48eq+fGED3Mg==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.0.3", + "optional-require": "^1.1.8", "safe-buffer": "^5.1.2", "saslprep": "^1.0.0" }, @@ -2406,41 +2353,6 @@ } } }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -2451,23 +2363,11 @@ "thenify-all": "^1.0.0" } }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "optional": true - }, "nanoid": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -2610,9 +2510,12 @@ } }, "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } }, "p-cancelable": { "version": "1.1.0", @@ -2664,9 +2567,9 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz", + "integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==", "requires": { "passport-strategy": "1.x.x", "pause": "0.0.1" @@ -2714,13 +2617,11 @@ } }, "passport-ldapauth": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.4.tgz", - "integrity": "sha512-VeVL69ZK+cpJe0DKMSGuwcf7k+V4dr0U0Y7ZhXL785pcRb5gRA6qYZfIH+XTsAzwqTK9l0Dn3Ds4weOZ1jKkLQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-3.0.1.tgz", + "integrity": "sha512-TRRx3BHi8GC8MfCT9wmghjde/EGeKjll7zqHRRfGRxXbLcaDce2OftbQrFG7/AWaeFhR6zpZHtBQ/IkINdLVjQ==", "requires": { - "@types/node": "*", - "@types/passport": "^1.0.0", - "ldapauth-fork": "^4.3.2", + "ldapauth-fork": "^5.0.1", "passport-strategy": "^1.0.0" } }, @@ -2798,11 +2699,11 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -2847,9 +2748,9 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "randombytes": { "version": "2.1.0", @@ -2865,20 +2766,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -2911,6 +2812,14 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -2974,6 +2883,11 @@ } } }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3015,16 +2929,10 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, "safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" }, "safer-buffer": { "version": "2.1.2", @@ -3061,9 +2969,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -3072,38 +2980,38 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "requires": { "randombytes": "^2.1.0" } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "setimmediate": { @@ -3112,9 +3020,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -3301,11 +3209,11 @@ } }, "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { - "bl": "^4.0.1", + "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", @@ -3352,9 +3260,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -3557,26 +3465,11 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", "requires": { - "verror": "1.6.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" - }, - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", - "requires": { - "extsprintf": "1.2.0" - } - } + "verror": "1.10.0" } }, "verror": { @@ -3611,33 +3504,6 @@ "isexe": "^2.0.0" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -3647,50 +3513,36 @@ } }, "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz", + "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==", "requires": { "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "winston-transport": "^4.5.0" } }, "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" } }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" }, "wrap-ansi": { "version": "7.0.0", @@ -3702,17 +3554,12 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -3779,6 +3626,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3810,9 +3662,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" } } }, @@ -3861,13 +3713,13 @@ "integrity": "sha1-o97wa6XjmuZEhQu0yirUEStIVek=" }, "zip-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", - "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" } } } diff --git a/backend/package.json b/backend/package.json index 76db3a5..4c0b024 100644 --- a/backend/package.json +++ b/backend/package.json @@ -30,15 +30,14 @@ }, "homepage": "", "dependencies": { - "archiver": "^3.1.1", - "async": "^3.1.0", + "archiver": "^5.3.1", + "async": "^3.2.3", "async-mutex": "^0.3.1", "axios": "^0.21.2", "bcryptjs": "^2.4.0", "compression": "^1.7.4", "config": "^3.2.3", - "exe": "^1.0.2", - "express": "^4.17.1", + "express": "^4.17.3", "fluent-ffmpeg": "^2.1.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", @@ -46,7 +45,7 @@ "lowdb": "^1.0.0", "md5": "^2.2.1", "merge-files": "^0.1.2", - "mocha": "^8.4.0", + "mocha": "^9.2.2", "moment": "^2.29.2", "mongodb": "^3.6.9", "multer": "^1.4.2", @@ -54,10 +53,10 @@ "node-id3": "^0.1.14", "node-schedule": "^2.1.0", "nodemon": "^2.0.7", - "passport": "^0.4.1", + "passport": "^0.5.2", "passport-http": "^0.3.0", "passport-jwt": "^4.0.0", - "passport-ldapauth": "^2.1.4", + "passport-ldapauth": "^3.0.1", "passport-local": "^1.0.0", "progress": "^2.0.3", "ps-node": "^0.1.6", @@ -66,7 +65,7 @@ "shortid": "^2.2.15", "unzipper": "^0.10.10", "uuidv4": "^6.0.6", - "winston": "^3.3.3", + "winston": "^3.7.2", "xmlbuilder2": "^3.0.2", "youtube-dl": "^3.0.2" } diff --git a/package-lock.json b/package-lock.json index 20ad1c2..ff53ce7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -790,6 +790,35 @@ } } }, + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, "@assemblyscript/loader": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", @@ -2194,6 +2223,12 @@ } } }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, "@ngneat/content-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@ngneat/content-loader/-/content-loader-5.0.0.tgz", @@ -3146,9 +3181,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -3764,6 +3799,12 @@ "get-intrinsic": "^1.0.2" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -6336,9 +6377,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -6507,6 +6548,27 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7403,11 +7465,14 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", + "dev": true, + "requires": { + "@apidevtools/json-schema-ref-parser": "9.0.9" + } }, "json-schema-traverse": { "version": "0.4.1", @@ -7454,21 +7519,29 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + } } }, "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.9.1.tgz", + "integrity": "sha512-H9A60xPqJ1CuC4Ka6qxzXZeU8aNmgOeP5IFqwJbQQwtu2EUYxota3LdsiZWplF7Wgd9tkAd0mdu36nceSaPuYw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -8329,9 +8402,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "ng-lazyload-image": { @@ -8946,71 +9019,27 @@ } }, "openapi-typescript-codegen": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.4.11.tgz", - "integrity": "sha512-KWhJE4xlFXDd7sNyEiJeUx7+H1hqQ+WETzwrcXCE+CNR+pmfKkOH87fjPRUPu1TY3hSgDgZ6ex7F3lWLbirvMQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.21.0.tgz", + "integrity": "sha512-wohx5b03jNfPVKocNoyzu7zVscPoRjyq/G/P5Bdtsjeze2BkXiLxd8uwkVCESQx6Sid4xihohKUgDy4MO09nsg==", "dev": true, "requires": { - "camelcase": "6.0.0", - "commander": "6.1.0", - "handlebars": "4.7.6", - "js-yaml": "3.14.0", - "mkdirp": "1.0.4", - "path": "0.12.7", - "rimraf": "3.0.2" + "camelcase": "^6.3.0", + "commander": "^9.0.0", + "handlebars": "^4.7.7", + "json-schema-ref-parser": "^9.0.9" }, "dependencies": { "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "commander": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", - "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", - "dev": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", "dev": true } } @@ -9292,33 +9321,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9343,9 +9345,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -9819,12 +9821,6 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -11951,9 +11947,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", "dev": true, "optional": true }, @@ -12444,6 +12440,12 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 551a319..af17d55 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "openapi-typescript-codegen": "^0.4.11", + "openapi-typescript-codegen": "^0.21.0", "protractor": "~7.0.0", "ts-node": "~3.0.4", "tslint": "~6.1.0" From 02e90fe81882d8de87845eced3f662cfa8edaf80 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 22:43:25 -0400 Subject: [PATCH 127/212] Fixed issue where icons would not render properly --- package-lock.json | 11 ++++++++--- package.json | 3 ++- src/styles.scss | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff53ce7..eab9318 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2154,6 +2154,11 @@ } } }, + "@fontsource/material-icons": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@fontsource/material-icons/-/material-icons-4.5.4.tgz", + "integrity": "sha512-YGmXkkEdu6EIgpFKNmB/nIXzZocwSmbI01Ninpmml8x8BT0M6RR++V1KqOfpzZ6Cw/FQ2/KYonQ3x4IY/4VRRA==" + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -8085,9 +8090,9 @@ } }, "material-icons": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.5.4.tgz", - "integrity": "sha512-5ycazkNmIOtV78Ff3WgvxQESoJuujdRm0cNbf18fmyJN20jHyqp9rpwi4EfQyGimag0ZLElxtVg3H9enIKdOOw==" + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.10.8.tgz", + "integrity": "sha512-CbtQXCmC9MXIIkz/0CmEfxELosxKxLegrjoa0mxM0zPA+GgAuhnWX6ITo/5oON/JFaCi/bh4MydEUNu0erbaxw==" }, "media-typer": { "version": "0.3.0", diff --git a/package.json b/package.json index af17d55..43dd6cb 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@angular/platform-browser": "^13.3.4", "@angular/platform-browser-dynamic": "^13.3.4", "@angular/router": "^13.3.4", + "@fontsource/material-icons": "^4.5.4", "@ngneat/content-loader": "^5.0.0", "@videogular/ngx-videogular": "^5.0.1", "core-js": "^2.4.1", @@ -40,7 +41,7 @@ "filesize": "^6.1.0", "fingerprintjs2": "^2.1.0", "fs-extra": "^10.0.0", - "material-icons": "^0.5.4", + "material-icons": "^1.10.8", "nan": "^2.14.1", "ng-lazyload-image": "^7.0.1", "ngx-avatars": "^1.3.1", diff --git a/src/styles.scss b/src/styles.scss index 8456541..fe883c6 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,6 +1,7 @@ /* You can add global styles to this file, and also import other style files */ @import '@angular/material/prebuilt-themes/indigo-pink.css'; +@import 'material-icons/iconfont/material-icons.css'; //@import './app-theme'; /* You can add global styles to this file, and also import other style files */ From feebe3e2ba566782a9d3b651a38275cd92bbb717 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 22:49:05 -0400 Subject: [PATCH 128/212] Fixed accidental reversion of styles.scss to much older version --- src/styles.scss | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/styles.scss b/src/styles.scss index fe883c6..be060c8 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,7 +1,8 @@ /* You can add global styles to this file, and also import other style files */ +@import '~material-icons/iconfont/material-icons.css'; + @import '@angular/material/prebuilt-themes/indigo-pink.css'; -@import 'material-icons/iconfont/material-icons.css'; //@import './app-theme'; /* You can add global styles to this file, and also import other style files */ @@ -31,7 +32,7 @@ $my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn); @include angular-material-theme($my-app-theme); // Dark theme -$dark-primary: mat-palette($mat-indigo); +$dark-primary: mat-palette($mat-light-blue, 700, 100, 800); $dark-accent: mat-palette($mat-blue); $dark-warn: mat-palette($mat-deep-orange); @@ -41,6 +42,10 @@ $dark-theme: mat-dark-theme($dark-primary, $dark-accent, $dark-warn); @include angular-material-theme($dark-theme); } +.mat-stroked-button, .mat-raised-button, .mat-flat-button { + border-radius: 24px !important +} + // Light theme $light-primary: mat-palette($mat-grey, 200, 500, 300); $light-accent: mat-palette($mat-brown, 200); @@ -49,7 +54,7 @@ $light-warn: mat-palette($mat-deep-orange, 200); $light-theme: mat-light-theme($light-primary, $light-accent, $light-warn); .light-theme { - @include angular-material-theme($light-theme) + @include angular-material-theme($light-theme); } .no-outline { From aa616af1184efd8523b09369509530741eb15b42 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Fri, 22 Apr 2022 23:09:06 -0400 Subject: [PATCH 129/212] Fixed issue where navigating from one sub to another didn't cause the new one to load Fixed subscription downloading as zip Minor code cleanuip --- backend/app.js | 12 ++++-------- backend/utils.js | 4 ++-- src/app/app.module.ts | 7 ------- .../subscription/subscription.component.ts | 6 +++--- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/backend/app.js b/backend/app.js index 2882663..3820cb9 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1456,18 +1456,14 @@ app.post('/api/downloadFileFromServer', optionalJwt, async (req, res) => { } // generate zip - file_path_to_download = await utils.createContainerZipFile(playlist, playlist_files_to_download); + file_path_to_download = await utils.createContainerZipFile(playlist['name'], playlist_files_to_download); } else if (sub_id && !uid) { zip_file_generated = true; - const sub_files_to_download = []; - const sub = subscriptions_api.getSubscription(sub_id, uuid); - for (let i = 0; i < sub['videos'].length; i++) { - const sub_file = sub['videos'][i]; - sub_files_to_download.push(sub_file); - } + const sub = await db_api.getRecord('subscriptions', {id: sub_id}); + const sub_files_to_download = await db_api.getRecords('files', {sub_id: sub_id}); // generate zip - file_path_to_download = await utils.createContainerZipFile(sub, sub_files_to_download); + file_path_to_download = await utils.createContainerZipFile(sub['name'], sub_files_to_download); } else { const file_obj = await db_api.getVideo(uid, uuid, sub_id) file_path_to_download = file_obj.path; diff --git a/backend/utils.js b/backend/utils.js index 0271ed0..a6eaf7e 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -58,13 +58,13 @@ async function getDownloadedFilesByType(basePath, type, full_metadata = false) { return files; } -async function createContainerZipFile(container_obj, container_file_objs) { +async function createContainerZipFile(file_name, container_file_objs) { const container_files_to_download = []; for (let i = 0; i < container_file_objs.length; i++) { const container_file_obj = container_file_objs[i]; container_files_to_download.push(container_file_obj.path); } - return await createZipFile(path.join('appdata', container_obj.name + '.zip'), container_files_to_download); + return await createZipFile(path.join('appdata', file_name + '.zip'), container_files_to_download); } async function createZipFile(zip_file_path, file_paths) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ed65ec6..0e9bf59 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -45,8 +45,6 @@ import { VgBufferingModule } from '@videogular/ngx-videogular/buffering'; import { VgOverlayPlayModule } from '@videogular/ngx-videogular/overlay-play'; import { VgCoreModule } from '@videogular/ngx-videogular/core'; import { InputDialogComponent } from './input-dialog/input-dialog.component'; -import { LazyLoadImageModule, IsVisibleProps } from 'ng-lazyload-image'; -import { audioFilesMouseHovering, videoFilesMouseHovering, audioFilesOpened, videoFilesOpened } from './main/main.component'; import { CreatePlaylistComponent } from './create-playlist/create-playlist.component'; import { SubscriptionsComponent } from './subscriptions/subscriptions.component'; import { SubscribeDialogComponent } from './dialogs/subscribe-dialog/subscribe-dialog.component'; @@ -94,10 +92,6 @@ import { RestoreDbDialogComponent } from './dialogs/restore-db-dialog/restore-db registerLocaleData(es, 'es'); -export function isVisible({ event, element, scrollContainer, offset }: IsVisibleProps) { - return (element.id === 'video' ? videoFilesMouseHovering || videoFilesOpened : audioFilesMouseHovering || audioFilesOpened); -} - @NgModule({ declarations: [ AppComponent, @@ -190,7 +184,6 @@ export function isVisible({ event, element, scrollContainer, offset }: IsVisible VgControlsModule, VgOverlayPlayModule, VgBufferingModule, - LazyLoadImageModule.forRoot({ isVisible }), RouterModule, AppRoutingModule, ], diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index e86789f..dcb6c5c 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -49,8 +49,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy { constructor(private postsService: PostsService, private route: ActivatedRoute, private router: Router, private dialog: MatDialog) { } ngOnInit() { - if (this.route.snapshot.paramMap.get('id')) { - this.id = this.route.snapshot.paramMap.get('id'); + this.route.params.subscribe(params => { + this.id = params['id']; this.postsService.service_initialized.subscribe(init => { if (init) { @@ -59,7 +59,7 @@ export class SubscriptionComponent implements OnInit, OnDestroy { this.sub_interval = setInterval(() => this.getSubscription(true), 1000); } }); - } + }); // set filter property to cached const cached_filter_property = localStorage.getItem('filter_property'); From abb80b33f389541c24160acbff6dfa52fa3596b8 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sat, 23 Apr 2022 23:53:15 +0200 Subject: [PATCH 130/212] Revert "Bump async from 2.6.3 to 2.6.4" --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e1ea66..06f052e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3367,9 +3367,9 @@ "dev": true }, "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { "lodash": "^4.17.14" From d94857b0a5396068c2c19b49c94d482ca5df12a6 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sat, 23 Apr 2022 18:14:44 -0400 Subject: [PATCH 131/212] Rolled back passport update --- backend/package-lock.json | 6 +++--- backend/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 4bcad45..421898c 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -2567,9 +2567,9 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "passport": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz", - "integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", "requires": { "passport-strategy": "1.x.x", "pause": "0.0.1" diff --git a/backend/package.json b/backend/package.json index 4c0b024..7d19c55 100644 --- a/backend/package.json +++ b/backend/package.json @@ -53,7 +53,7 @@ "node-id3": "^0.1.14", "node-schedule": "^2.1.0", "nodemon": "^2.0.7", - "passport": "^0.5.2", + "passport": "^0.4.1", "passport-http": "^0.3.0", "passport-jwt": "^4.0.0", "passport-ldapauth": "^3.0.1", From 0bc2193f2512ec7bdb3ebdc5be5006802cbd121d Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sat, 23 Apr 2022 21:41:39 -0400 Subject: [PATCH 132/212] Updated downloadFile API request --- Public API v1.yaml | 4 ++-- backend/app.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Public API v1.yaml b/Public API v1.yaml index 10c5e3e..b1bccb7 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -16,7 +16,7 @@ paths: - downloader summary: Download video file description: |- - Downloads a video file with the given URL. Will include global args if they exist. + Downloads a file with the given URL. Will include global args if they exist. HTTP requests will return once the video file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status. @@ -41,7 +41,7 @@ paths: post: tags: - downloader - summary: Download video file + summary: Generates arguments used to download file description: Generates args, used for checking what args would run if you ran downloadFile operationId: post-generateArgs requestBody: diff --git a/backend/app.js b/backend/app.js index 5881a56..2ec7f98 100644 --- a/backend/app.js +++ b/backend/app.js @@ -803,7 +803,7 @@ app.post('/api/testConnectionString', optionalJwt, async (req, res) => { app.post('/api/downloadFile', optionalJwt, async function(req, res) { req.setTimeout(0); // remove timeout in case of long videos const url = req.body.url; - const type = req.body.type; + const type = req.body.type ? req.body.type : 'video'; const user_uid = req.isAuthenticated() ? req.user.uid : null; const options = { customArgs: req.body.customArgs, From 0585943d67f09a93ac9bf0def42aabfc927e848f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 04:10:27 -0400 Subject: [PATCH 133/212] Fixed bug where task time was not properly set with values of 0 Fixed issue where time field was not properly populated in the schedule dialog --- backend/tasks.js | 6 +++--- .../update-task-schedule-dialog.component.ts | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/tasks.js b/backend/tasks.js index 2014da3..ba6379c 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -42,9 +42,9 @@ function scheduleJob(task_key, schedule) { if (schedule['type'] === 'timestamp') { converted_schedule = new Date(schedule['data']['timestamp']); } else if (schedule['type'] === 'recurring') { - const dayOfWeek = schedule['data']['dayOfWeek'] ? schedule['data']['dayOfWeek'] : null; - const hour = schedule['data']['hour'] ? schedule['data']['hour'] : null; - const minute = schedule['data']['minute'] ? schedule['data']['minute'] : null; + const dayOfWeek = schedule['data']['dayOfWeek'] != null ? schedule['data']['dayOfWeek'] : null; + const hour = schedule['data']['hour'] != null ? schedule['data']['hour'] : null; + const minute = schedule['data']['minute'] != null ? schedule['data']['minute'] : null; converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute); } else { logger.error(`Failed to schedule job '${task_key}' as the type '${schedule['type']}' is invalid.`) diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts index ef61cf4..2d31782 100644 --- a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, OnInit } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { Schedule } from 'api-types'; +import { Schedule, Task } from 'api-types'; import { PostsService } from 'app/posts.services'; @Component({ @@ -18,7 +18,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit { date = null; today = new Date(); - constructor(@Inject(MAT_DIALOG_DATA) public data: any, private dialogRef: MatDialogRef, private postsService: PostsService) { + constructor(@Inject(MAT_DIALOG_DATA) public data: {task: Task}, private dialogRef: MatDialogRef, private postsService: PostsService) { this.processTask(this.data.task); this.postsService.getTask(this.data.task.key).subscribe(res => { this.processTask(res['task']); @@ -28,7 +28,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit { ngOnInit(): void { } - processTask(task) { + processTask(task: Task): void { if (!task['schedule']) { this.enabled = false; return; @@ -39,7 +39,11 @@ export class UpdateTaskScheduleDialogComponent implements OnInit { this.recurring = schedule['type'] === Schedule.type.RECURRING; if (this.recurring) { - this.time = `${schedule['data']['hour']}:${schedule['data']['minute']}`; + const hour = schedule['data']['hour']; + const minute = schedule['data']['minute']; + + // add padding 0s if necessary to hours and minutes + this.time = (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute; if (schedule['data']['dayOfWeek']) { this.days_of_week = schedule['data']['dayOfWeek']; @@ -75,7 +79,6 @@ export class UpdateTaskScheduleDialogComponent implements OnInit { } } else { this.date.setHours(hours, minutes); - console.log(this.date); schedule['data'] = {timestamp: this.date.getTime()}; } this.dialogRef.close(schedule); From 21507ee36dc560064129505f4b78c64a360a2c77 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 04:15:38 -0400 Subject: [PATCH 134/212] Updated methodology of calculating download progress to rely on fs.readdir instead of glob --- backend/downloader.js | 31 ++++++++++++++++++------------- backend/package.json | 1 - 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/backend/downloader.js b/backend/downloader.js index f139a1f..108501b 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -3,7 +3,6 @@ const { uuid } = require('uuidv4'); const path = require('path'); const mergeFiles = require('merge-files'); const NodeID3 = require('node-id3') -const glob = require('glob') const Mutex = require('async-mutex').Mutex; const youtubedl = require('youtube-dl'); @@ -583,20 +582,26 @@ async function checkDownloadPercent(download_uid) { if (!resulting_file_size) return; let sum_size = 0; - glob(`{${files_to_check_for_progress.join(',')}, }*`, async (err, files) => { - files.forEach(async file => { - try { - const file_stats = fs.statSync(file); - if (file_stats && file_stats.size) { - sum_size += file_stats.size; - } - } catch (e) { - + for (let i = 0; i < files_to_check_for_progress.length; i++) { + const file_to_check_for_progress = files_to_check_for_progress[i]; + const dir = path.dirname(file_to_check_for_progress); + if (!fs.existsSync(dir)) continue; + fs.readdir(dir, async (err, files) => { + for (let j = 0; j < files.length; j++) { + const file = files[j]; + if (!file.includes(path.basename(file_to_check_for_progress))) continue; + try { + const file_stats = fs.statSync(path.join(dir, file)); + if (file_stats && file_stats.size) { + sum_size += file_stats.size; + } + } catch (e) {} } + + const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2); + await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete}); }); - const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2); - await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete}); - }); + } } exports.generateNFOFile = (info, output_path) => { diff --git a/backend/package.json b/backend/package.json index 7d19c55..bf926a1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -40,7 +40,6 @@ "express": "^4.17.3", "fluent-ffmpeg": "^2.1.2", "fs-extra": "^9.0.0", - "glob": "^7.1.6", "jsonwebtoken": "^8.5.1", "lowdb": "^1.0.0", "md5": "^2.2.1", From 901a96aada207a20d53292c4e78656d032858e31 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 05:01:45 -0400 Subject: [PATCH 135/212] Fixed issue where use_local_db may be out of sync when first starting youtubedl-material --- backend/db.js | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/db.js b/backend/db.js index 591b92b..7cab07d 100644 --- a/backend/db.js +++ b/backend/db.js @@ -85,6 +85,7 @@ exports.initialize = (input_db, input_users_db) => { } exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => { + using_local_db = config_api.getConfigItem('ytdl_use_local_db'); // verify if (using_local_db && !custom_connection_string) return; const success = await exports._connectToDB(custom_connection_string); if (success) return true; From d5c1361e64a207973ff82e92811c884d1fa3ed7c Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 05:02:02 -0400 Subject: [PATCH 136/212] Fixed issue where roles were not properly initialized --- backend/authentication/auth.js | 46 +++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/backend/authentication/auth.js b/backend/authentication/auth.js index de54a0b..7607c9b 100644 --- a/backend/authentication/auth.js +++ b/backend/authentication/auth.js @@ -18,10 +18,19 @@ let JWT_EXPIRATION = null; let opts = null; let saltRounds = null; -exports.initialize = function() { +exports.initialize = function () { /************************* * Authentication module ************************/ + + if (db_api.database_initialized) { + setupRoles(); + } else { + db_api.database_initialized_bs.subscribe(init => { + if (init) setupRoles(); + }); + } + saltRounds = 10; JWT_EXPIRATION = config_api.getConfigItem('ytdl_jwt_expiration'); @@ -49,6 +58,41 @@ exports.initialize = function() { })); } +const setupRoles = async () => { + const required_roles = { + admin: { + permissions: [ + 'filemanager', + 'settings', + 'subscriptions', + 'sharing', + 'advanced_download', + 'downloads_manager' + ] + }, + user: { + permissions: [ + 'filemanager', + 'subscriptions', + 'sharing' + ] + } + } + + const role_keys = Object.keys(required_roles); + for (let i = 0; i < role_keys.length; i++) { + const role_key = role_keys[i]; + const role_in_db = await db_api.getRecord('roles', {key: role_key}); + if (!role_in_db) { + // insert task metadata into table if missing + await db_api.insertRecordIntoTable('roles', { + key: role_key, + permissions: required_roles[role_key]['permissions'] + }); + } + } +} + exports.passport = require('passport'); exports.passport.serializeUser(function(user, done) { From aa8f6028565847da8d2dbfe9c0b47c69512221f9 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sun, 24 Apr 2022 11:12:22 +0200 Subject: [PATCH 137/212] Added Security Policy --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..18daadb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Currently all work on this project goes into the nightly builds. +4.2's RELEASE build is now quite old and should be considered legacy. +We urge users to use the nightly releases, because the project +constantly sees fixes. + +| Version | Supported | +| ------------- | ------------------ | +| 4.2 Nightlies | :white_check_mark: | +| 4.2 Release | :x: | +| < 4.2 | :x: | + +## Reporting a Vulnerability + +Please file an issue in our GitHub's repo, because this app +isn't meant to be safe to run as public instance yet, but rather as a LAN facing app. + +We welcome PRs and help in general in making YTDL-M more secure, but it's not a priority as of now. From 768ec59f30df81f7d2e81e7fb696409e234c0dc3 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 05:49:09 -0400 Subject: [PATCH 138/212] Updated ffmpeg link in docker-build.sh to use release builds --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index 5876372..1c0fe93 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,7 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 48e46db071448005c6c7b65030ed6fafaf5e7194 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 05:51:04 -0400 Subject: [PATCH 139/212] Fixed mangled ffmpeg link --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index 1c0fe93..9aa80e0 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,7 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz +wget "https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From ebb7f6a2b0e49e21c9e1f1795ea38c2c543f5e42 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 06:16:02 -0400 Subject: [PATCH 140/212] Revert "Fixed mangled ffmpeg link" This reverts commit 48e46db071448005c6c7b65030ed6fafaf5e7194. --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index 9aa80e0..1c0fe93 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,7 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 37c858f950592c37bf4b60679802ff51513a386c Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 24 Apr 2022 06:16:43 -0400 Subject: [PATCH 141/212] Revert "Updated ffmpeg link in docker-build.sh to use release builds" This reverts commit 768ec59f30df81f7d2e81e7fb696409e234c0dc3. --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index 1c0fe93..5876372 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,7 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-release-${ARCH}-static.tar.xz" -O ffmpeg.txz +wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 4f227ca4425d48fa9e0c49be8bb841706a93d67d Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Tue, 26 Apr 2022 04:28:47 +0200 Subject: [PATCH 142/212] Delete extensions.json --- .vscode/extensions.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 8184da3..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "bierner.color-info" - ] -} \ No newline at end of file From 7f61ccb5f59f43bd2d7ab590053af3467e987a8b Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 26 Apr 2022 04:46:05 +0200 Subject: [PATCH 143/212] Use fixed version of musl to fix DNS errors --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0452eed..3a9d9e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,9 @@ RUN apk add --no-cache \ python3 \ su-exec \ && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley + atomicparsley \ + && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main/ \ + musl WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg From 5e3eb68b03f780dfc3b605cc1a5bfb6c9ab1e630 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sat, 30 Apr 2022 00:58:12 -0400 Subject: [PATCH 144/212] Fixed issue where setting sub downloads as 'fresh' was not working properly (#567) --- backend/subscriptions.js | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 1b35a4f..dcad973 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -266,11 +266,17 @@ async function getVideosForSub(sub, user_uid = null) { } resolve(false); } else if (output) { + if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) { + await setFreshUploads(sub, user_uid); + checkVideosForFreshUploads(sub, user_uid); + } + if (output.length === 0 || (output.length === 1 && output[0] === '')) { logger.verbose('No additional videos to download for ' + sub.name); resolve(true); return; } + const output_jsons = []; for (let i = 0; i < output.length; i++) { let output_json = null; @@ -294,14 +300,7 @@ async function getVideosForSub(sub, user_uid = null) { } resolve(files_to_download); - - if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) { - await setFreshUploads(sub, user_uid); - checkVideosForFreshUploads(sub, user_uid); - } - - resolve(true); - } + } }); }, err => { logger.error(err); @@ -473,22 +472,24 @@ async function updateSubscriptionProperty(sub, assignment_obj) { return true; } -async function setFreshUploads(sub, user_uid) { +async function setFreshUploads(sub) { + const sub_files = await db_api.getRecords('files', {sub_id: sub.id}); const current_date = new Date().toISOString().split('T')[0].replace(/-/g, ''); - sub.videos.forEach(async video => { - if (current_date === video['upload_date'].replace(/-/g, '')) { + sub_files.forEach(async file => { + if (current_date === file['upload_date'].replace(/-/g, '')) { // set upload as fresh - const video_uid = video['uid']; - await db_api.setVideoProperty(video_uid, {'fresh_upload': true}, user_uid, sub['id']); + const file_uid = file['uid']; + await db_api.setVideoProperty(file_uid, {'fresh_upload': true}); } }); } async function checkVideosForFreshUploads(sub, user_uid) { + const sub_files = await db_api.getRecords('files', {sub_id: sub.id}); const current_date = new Date().toISOString().split('T')[0].replace(/-/g, ''); - sub.videos.forEach(async video => { - if (video['fresh_upload'] && current_date > video['upload_date'].replace(/-/g, '')) { - await checkVideoIfBetterExists(video, sub, user_uid) + sub_files.forEach(async file => { + if (file['fresh_upload'] && current_date > file['upload_date'].replace(/-/g, '')) { + await checkVideoIfBetterExists(file, sub, user_uid) } }); } @@ -510,13 +511,13 @@ async function checkVideoIfBetterExists(file_obj, sub, user_uid) { logger.verbose(`Failed to download better version of video ${file_obj['id']}`); } else if (output) { logger.verbose(`Successfully upgraded video ${file_obj['id']}'s ${metric_to_compare} from ${file_obj[metric_to_compare]} to ${output[metric_to_compare]}`); - await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]}, user_uid, sub['id']); + await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]}); } }); } } }); - await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false}, user_uid, sub['id']); + await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false}); } // helper functions From 960c545f375077f7f37491409b7e3e84fd9bbe1d Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 05:14:31 +0200 Subject: [PATCH 145/212] Dockerfile uses Ubuntu 20.04, fix obtain ffmpeg --- Dockerfile | 41 +++++++++++++++++++++-------------------- docker-build.sh | 7 ++++++- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3a9d9e3..bd9166f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,19 @@ -FROM alpine:latest AS ffmpeg +FROM ubuntu:20.04 AS ffmpeg COPY docker-build.sh . RUN sh ./docker-build.sh -FROM alpine:latest as frontend +FROM ubuntu:20.04 as frontend -RUN apk add --no-cache \ - npm - -RUN npm install -g @angular/cli +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get -y install \ + wget \ + gnupg && \ + curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ + apt-get -y install \ + nodejs \ + npm && \ + npm install -g @angular/cli WORKDIR /build COPY [ "package.json", "package-lock.json", "/build/" ] @@ -20,37 +25,33 @@ RUN npm run build #--------------# -FROM alpine:latest +FROM ubuntu:20.04 ENV UID=1000 \ GID=1000 \ - USER=youtube + USER=youtube \ + NO_UPDATE_NOTIFIER=true -ENV NO_UPDATE_NOTIFIER=true +RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ + apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main/ \ - musl + atomicparsley WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 -RUN npm install pm2 -g -RUN npm install && chown -R $UID:$GID ./ +RUN npm install pm2 -g && \ + npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] +# ENTRYPOINT [ "/app/entrypoint.sh" ] CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/docker-build.sh b/docker-build.sh index 5876372..e7ca0ed 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,12 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz +curl --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + --retry-delay 0 \ + --retry-max-time 40 \ + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 7874f1b71ab113b2e3a6d2a3091ec21cc6df75e5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 06:29:54 +0200 Subject: [PATCH 146/212] curl is in fact missing in focal, my bad --- Dockerfile | 1 + docker-build.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index bd9166f..3f7dcf8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ wget \ + curl \ gnupg && \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ diff --git a/docker-build.sh b/docker-build.sh index e7ca0ed..a492c69 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,12 +23,14 @@ case $(uname -m) in esac echo "Architecture: $ARCH" +apt-get -y install curl curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz +apt-get remove curl mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 5ac5fca48268382998719642284f7f1d62f184ef Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 06:37:12 +0200 Subject: [PATCH 147/212] adapt postbuild.mjs to postbuild.js --- package.json | 2 +- src/{postbuild.mjs => postbuild.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{postbuild.mjs => postbuild.js} (100%) diff --git a/package.json b/package.json index 43dd6cb..990a4d0 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "ng": "ng", "start": "ng serve", "build": "ng build --configuration production", - "prebuild": "node src/postbuild.mjs", + "prebuild": "node src/postbuild.js", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", diff --git a/src/postbuild.mjs b/src/postbuild.js similarity index 100% rename from src/postbuild.mjs rename to src/postbuild.js From aea4f522673cdc1a11bc255d096debdb59c007e7 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 07:12:00 +0200 Subject: [PATCH 148/212] revert postbuild.mjs file-extension change --- package.json | 2 +- src/{postbuild.js => postbuild.mjs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{postbuild.js => postbuild.mjs} (100%) diff --git a/package.json b/package.json index 990a4d0..43dd6cb 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "ng": "ng", "start": "ng serve", "build": "ng build --configuration production", - "prebuild": "node src/postbuild.js", + "prebuild": "node src/postbuild.mjs", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", diff --git a/src/postbuild.js b/src/postbuild.mjs similarity index 100% rename from src/postbuild.js rename to src/postbuild.mjs From 0a8aba54d238937874f57c34760127dc71df120f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 09:17:23 +0200 Subject: [PATCH 149/212] Fix for #480 - existing DLs still getting queued --- backend/subscriptions.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/subscriptions.js b/backend/subscriptions.js index dcad973..e14f121 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -141,6 +141,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) { if (sub.archive && (await fs.pathExists(sub.archive))) { const archive_file_path = path.join(sub.archive, 'archive.txt'); // deletes archive if it exists + // TODO: Keep entries in blacklist_video.txt by moving them to a global blacklist if (await fs.pathExists(archive_file_path)) { await fs.unlink(archive_file_path); } @@ -379,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de if (useArchive && !redownload) { if (sub.archive) { archive_dir = sub.archive; - archive_path = path.join(archive_dir, 'archive.txt') + if (sub.type && sub.type === 'audio') { + archive_path = path.join(archive_dir, 'merged_audio.txt'); + } else { + archive_path = path.join(archive_dir, 'merged_video.txt'); + } } downloadConfig.push('--download-archive', archive_path); } From 2527051eab74bfd2ed29dddc1383a737e55c9ee4 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 09:35:04 +0200 Subject: [PATCH 150/212] fix pipefail MIA in ubuntu without specifying bash --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index a492c69..62b8832 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -4,7 +4,7 @@ # and also optimizing some code with this commit. # xoxo :D -set -xeuo pipefail +bash | set -xeuo pipefail case $(uname -m) in x86_64) From c0fb838931f80a5eab7cbef0ea94262d7ff7c918 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:11:32 +0200 Subject: [PATCH 151/212] fix docker-build.sh for ubuntu, what a ride --- docker-build.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docker-build.sh b/docker-build.sh index 62b8832..dd195a5 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -4,8 +4,6 @@ # and also optimizing some code with this commit. # xoxo :D -bash | set -xeuo pipefail - case $(uname -m) in x86_64) ARCH=amd64;; @@ -22,17 +20,24 @@ case $(uname -m) in exit 1 esac -echo "Architecture: $ARCH" -apt-get -y install curl -curl --connect-timeout 5 \ +echo "(INFO) Architecture detected: $ARCH" +echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" +apt-get -y install curl xz-utils +echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" +curl -o ffmpeg.txz \ + --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ - "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz -apt-get remove curl + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg +echo "(3/5) CLEANUP - Remove temp dependencies from ffmpeg obtain layer" +apt-get -y remove curl xz-utils +apt-get -y autoremove +echo "(4/5) PROVISION - Provide ffmpeg and ffprobe from ffmpeg obtain layer" cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe +echo "(5/5) CLEANUP - Remove temporary downloads from ffmpeg obtain layer" rm -rf /tmp/ffmpeg ffmpeg.txz \ No newline at end of file From fe91484f2418ea4c3cc441d4e5319831340ee745 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:40:19 +0200 Subject: [PATCH 152/212] I did warn you I will test docker builds this way --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index dd195a5..2a81d43 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -22,7 +22,7 @@ esac echo "(INFO) Architecture detected: $ARCH" echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" -apt-get -y install curl xz-utils +apt-get update && apt-get -y install curl xz-utils echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" curl -o ffmpeg.txz \ --connect-timeout 5 \ From 493e876a97c6bac0430480da85256bc009bd4e12 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:48:27 +0200 Subject: [PATCH 153/212] syntax fixes are fun --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3f7dcf8..9f3b9b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,8 +35,8 @@ ENV UID=1000 \ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ - apt-get update && apt-get -y install \ +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - +RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ From 0329cd97184d756f34b42598bf6af7d3163e5bfb Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:51:20 +0200 Subject: [PATCH 154/212] don't think we need to install curl twice lol --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9f3b9b9..dbe5558 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,6 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm \ python2 \ python3 \ atomicparsley From 80fcecdaeafc922f6cb03a9753c5479258a8e177 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:57:21 +0200 Subject: [PATCH 155/212] it's a learning experience --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index dbe5558..9f3b9b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,6 +37,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ + npm \ python2 \ python3 \ atomicparsley From 3bcbe0d3e7e0f226ea96554e918f0f6c78398e0c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:04:59 +0200 Subject: [PATCH 156/212] fix dependency node-gyp (>= 3.6.2~) needed --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 9f3b9b9..d1c8e99 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,7 @@ RUN apt-get update && apt-get -y install \ apt-get -y install \ nodejs \ npm && \ + node-gyp && \ npm install -g @angular/cli WORKDIR /build From 7aa5c1bf7f9009bac98fe9a595ab835857e7cc6c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:21:45 +0200 Subject: [PATCH 157/212] syyyyntax --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d1c8e99..5c84989 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm && \ + npm \ node-gyp && \ npm install -g @angular/cli From 958f80e20003f92ac36e6347018019ce9d6f20f9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:28:34 +0200 Subject: [PATCH 158/212] the good? I learn a lot about Docker building --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5c84989..2cab91a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,8 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm \ - node-gyp && \ + npm && \ + apt-get install -f && \ npm install -g @angular/cli WORKDIR /build @@ -38,7 +38,6 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm \ python2 \ python3 \ atomicparsley From 60f2ab449f42733c1210ba996a77bd9725f7cbe5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:31:53 +0200 Subject: [PATCH 159/212] yea --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 2cab91a..e84d95c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ + npm\ python2 \ python3 \ atomicparsley From 39ddefab5c0ce5f1c257cceba9a18f34432526d5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:37:39 +0200 Subject: [PATCH 160/212] fix dependencies needed for our apt packages --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e84d95c..2f89e6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,8 @@ RUN apt-get update && apt-get -y install \ npm\ python2 \ python3 \ - atomicparsley + atomicparsley && \ + apt-get install -f WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg From efaecaa059662c1e4f7a730e0fa63629aeb2366e Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:48:12 +0200 Subject: [PATCH 161/212] use yarn in apt installs instead of npm --- Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2f89e6f..492891e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,9 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm && \ + # YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + yarn && \ apt-get install -f && \ npm install -g @angular/cli @@ -38,7 +40,9 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm\ + # YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + yarn\ python2 \ python3 \ atomicparsley && \ From 777aebe5082cde8e4d71eff74decc07eb3a938a8 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:52:35 +0200 Subject: [PATCH 162/212] apparently we still need npm in the last stretch.. --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 492891e..e060a28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,9 +40,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - # YARN: brings along npm, solves dependency conflicts, - # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 - yarn\ + npm python2 \ python3 \ atomicparsley && \ From d5ab0d7b9614d154195479f1b4780e38243edfdb Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:54:19 +0200 Subject: [PATCH 163/212] I'm getting sleepy, why am I still pushing through --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e060a28..f06e28b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,7 +40,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm + npm \ python2 \ python3 \ atomicparsley && \ From bd1ed2b7056212d332ae7076ce1f028d6de65cf0 Mon Sep 17 00:00:00 2001 From: "dejan.petrov@dapmn.com" Date: Sun, 1 May 2022 18:02:46 +0200 Subject: [PATCH 164/212] Clean up docker image Added some commands to clean up the image after apt-get does its thing. It should shave off a couple of megabytes, nothing to big though. --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f06e28b..2b62a15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,7 +44,11 @@ RUN apt-get update && apt-get -y install \ python2 \ python3 \ atomicparsley && \ - apt-get install -f + apt-get install -f && \ + apt autoremove --purge && \ + apt autoremove && \ + apt clean && \ + rm -rf /var/lib/apt WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg From 2cdc1cee98fcb831ce74ef377846de16809ca5ca Mon Sep 17 00:00:00 2001 From: "dejan.petrov@dapmn.com" Date: Sun, 1 May 2022 18:14:27 +0200 Subject: [PATCH 165/212] Fix for #585 Added the DEBIAN_FRONTEND=noninteractive variable to all stages. This should stop the build from failing. Also added --no-install-recommends to install only the requested packages. This might break stuff, but I'm not sure though. --- Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2b62a15..209e986 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,14 @@ FROM ubuntu:20.04 AS ffmpeg +ENV DEBIAN_FRONTEND=noninteractive + COPY docker-build.sh . RUN sh ./docker-build.sh FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get -y install \ +RUN apt-get update && apt-get --no-install-recommends -y install \ wget \ curl \ gnupg && \ @@ -36,10 +38,12 @@ ENV UID=1000 \ USER=youtube \ NO_UPDATE_NOTIFIER=true +ENV DEBIAN_FRONTEND=noninteractive + RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - -RUN apt-get update && apt-get -y install \ +RUN apt-get update && apt-get --no-install-recommends -y install \ npm \ python2 \ python3 \ From 2a4102825378f6b889c231a47b4e0b34b2ac58f8 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sun, 1 May 2022 20:42:45 +0200 Subject: [PATCH 166/212] Update Dockerfile --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 209e986..9521c9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN sh ./docker-build.sh FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get --no-install-recommends -y install \ +RUN apt-get update && apt-get -y install \ wget \ curl \ gnupg && \ @@ -43,15 +43,15 @@ ENV DEBIAN_FRONTEND=noninteractive RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - -RUN apt-get update && apt-get --no-install-recommends -y install \ +RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ atomicparsley && \ apt-get install -f && \ - apt autoremove --purge && \ - apt autoremove && \ - apt clean && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ rm -rf /var/lib/apt WORKDIR /app From 9c0733453a86c9ea5c60e8833fb03f557f9d42df Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 23:00:01 +0200 Subject: [PATCH 167/212] removing strict SSL from npm config --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9521c9a..c108068 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,7 @@ RUN apt-get update && apt-get -y install \ # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 yarn && \ apt-get install -f && \ + npm config set strict-ssl false && \ npm install -g @angular/cli WORKDIR /build @@ -59,7 +60,8 @@ COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 -RUN npm install pm2 -g && \ +RUN npm config set strict-ssl false && \ + npm install pm2 -g && \ npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] From d5626f1dae295dd20891f8a6be5375f530abcf5e Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sun, 1 May 2022 23:29:51 +0200 Subject: [PATCH 168/212] Dockerfile: wget not needed --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c108068..3b8ec2c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,6 @@ FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ - wget \ curl \ gnupg && \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ From 754d8370595b523f794a521a0ee0de8238094ad1 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:09:37 +0200 Subject: [PATCH 169/212] adding docker-pr-check.yml --- .github/workflows/docker-pr-check.yml | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/docker-pr-check.yml diff --git a/.github/workflows/docker-pr-check.yml b/.github/workflows/docker-pr-check.yml new file mode 100644 index 0000000..54e618d --- /dev/null +++ b/.github/workflows/docker-pr-check.yml @@ -0,0 +1,42 @@ +name: docker-pr-check + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: setup platform emulator + uses: docker/setup-qemu-action@v1 + - name: setup multi-arch docker build + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: build & push images + uses: docker/build-push-action@v2 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm,linux/arm64/v8 + push: false + tags: tzahi12345/youtubedl-material:nightly-pr From f5f00e1732c6a507a9f39added542c7877b338fc Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:12:10 +0200 Subject: [PATCH 170/212] fix name --- .github/workflows/{docker-pr-check.yml => docker-pr.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{docker-pr-check.yml => docker-pr.yml} (98%) diff --git a/.github/workflows/docker-pr-check.yml b/.github/workflows/docker-pr.yml similarity index 98% rename from .github/workflows/docker-pr-check.yml rename to .github/workflows/docker-pr.yml index 54e618d..1a2c5ab 100644 --- a/.github/workflows/docker-pr-check.yml +++ b/.github/workflows/docker-pr.yml @@ -1,4 +1,4 @@ -name: docker-pr-check +name: docker-pr on: pull_request: From 0abe252d1e24d5b46749238dfd1fd966ba29e53a Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:59:25 +0200 Subject: [PATCH 171/212] we need to find a different build check solution --- .github/workflows/docker-pr.yml | 42 --------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/docker-pr.yml diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml deleted file mode 100644 index 1a2c5ab..0000000 --- a/.github/workflows/docker-pr.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: docker-pr - -on: - pull_request: - branches: [master] - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: checkout code - uses: actions/checkout@v2 - - name: Set hash - id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - - name: Get current date - id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - name: create-json - id: create-json - uses: jsdaniell/create-json@1.1.2 - with: - name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' - dir: 'backend/' - - name: setup platform emulator - uses: docker/setup-qemu-action@v1 - - name: setup multi-arch docker build - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: build & push images - uses: docker/build-push-action@v2 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm,linux/arm64/v8 - push: false - tags: tzahi12345/youtubedl-material:nightly-pr From 3a48ff2d50db08ce20a19b701bdee4cca48c90f4 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:11:01 -0400 Subject: [PATCH 172/212] docker build and push action now uses secrets for DockerHub username, repo, and tag --- .github/workflows/docker.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3fd4ab2..0782193 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -21,7 +21,7 @@ jobs: uses: jsdaniell/create-json@1.1.2 with: name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + json: '{"type": "docker", "tag": "${{secrets.DOCKERHUB_MASTER_TAG}}", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: setup platform emulator uses: docker/setup-qemu-action@v1 @@ -39,4 +39,8 @@ jobs: file: ./Dockerfile platforms: linux/amd64,linux/arm,linux/arm64/v8 push: true - tags: tzahi12345/youtubedl-material:nightly + # Defaults: + # DOCKERHUB_USERNAME : tzahi12345 + # DOCKERHUB_REPO : youtubedl-material + # DOCKERHUB_MASTER_TAG: nightly + tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} From 2981f843c3356fa4a98e59587da607013004b084 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:11:21 -0400 Subject: [PATCH 173/212] Added docker build PR check --- .github/workflows/docker-pr.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/docker-pr.yml diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml new file mode 100644 index 0000000..9aebc2b --- /dev/null +++ b/.github/workflows/docker-pr.yml @@ -0,0 +1,27 @@ +name: docker-pr + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: Build docker images + run: docker-compose build \ No newline at end of file From 4c06c430eb702fc05b9fa27c11baf45d69ee2eb6 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:21:39 -0400 Subject: [PATCH 174/212] Converted docker-compose build to docker build for docker-pr GH action --- .github/workflows/docker-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 9aebc2b..0e566ea 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -24,4 +24,4 @@ jobs: json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: Build docker images - run: docker-compose build \ No newline at end of file + run: docker build . -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} \ No newline at end of file From 77e8cbc6b5ca5d7b6b3dee49b20949436f43b50b Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 04:21:12 +0200 Subject: [PATCH 175/212] Adding ignore parameters to docker build-and-push --- .github/workflows/docker.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3fd4ab2..abf93a5 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,6 +3,16 @@ name: docker on: push: branches: [master] + paths-ignore: + - '.github/**' + - '.vscode/**' + - 'chrome-extension/**' + - 'releases/**' + - '**.crx' + - '**.pem' + - '**.md' + - '.dockerignore' + - '.gitignore' jobs: build-and-push: From 9f9054ed9df364e66059b924214cd684849163ee Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 22:59:55 -0400 Subject: [PATCH 176/212] Removed secrets from docker-pr.yml --- .github/workflows/docker-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 0e566ea..2fcf807 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -24,4 +24,4 @@ jobs: json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: Build docker images - run: docker build . -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} \ No newline at end of file + run: docker build . -t tzahi12345/youtubedl-material:nightly-pr \ No newline at end of file From dab0b7a8b62b57c9440ca8d22bdd5d92058db4f2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:13:00 -0400 Subject: [PATCH 177/212] Updated Angular version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15b12b8..bf4c4f2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub issues badge](https://img.shields.io/github/issues/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/issues) [![License badge](https://img.shields.io/github/license/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/blob/master/LICENSE.md) -YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 11](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. +YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 13](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. Now with [Docker](#Docker) support! From a68726e7cbf087a1784aecaee33bfb6f7bb2ddd9 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:13:11 -0400 Subject: [PATCH 178/212] Removed deprecated armhf.Dockerfile --- armhf.Dockerfile | 49 ------------------------------------------------ 1 file changed, 49 deletions(-) delete mode 100644 armhf.Dockerfile diff --git a/armhf.Dockerfile b/armhf.Dockerfile deleted file mode 100644 index 7f192be..0000000 --- a/armhf.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM alpine:3.12 as frontend - -RUN apk add --no-cache \ - npm \ - curl - -RUN npm install -g @angular/cli - -WORKDIR /build - -RUN curl -L https://github.com/balena-io/qemu/releases/download/v3.0.0%2Bresin/qemu-3.0.0+resin-arm.tar.gz | tar zxvf - -C . && mv qemu-3.0.0+resin-arm/qemu-arm-static . - -COPY [ "package.json", "package-lock.json", "/build/" ] -RUN npm install - -COPY [ "angular.json", "tsconfig.json", "/build/" ] -COPY [ "src/", "/build/src/" ] -RUN ng build --prod - -#--------------# - -FROM arm32v7/alpine:3.12 - -COPY --from=frontend /build/qemu-arm-static /usr/bin - -ENV UID=1000 \ - GID=1000 \ - USER=youtube - -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ - ffmpeg \ - npm \ - python2 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley - -WORKDIR /app -COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install && chown -R $UID:$GID ./ - -COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] -COPY --chown=$UID:$GID [ "/backend/", "/app/" ] - -EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "node", "app.js" ] From 8a323f028da2aa460ff89dd929fca58955690ea2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:15:09 -0400 Subject: [PATCH 179/212] Fixed bug where subscription avatars were missing --- src/app/app.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app.component.html b/src/app/app.component.html index f1270c7..278b8fe 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -51,7 +51,7 @@ - {{subscription.name}} + {{subscription.name}} From 88c16d71953b6a82d9736ce2d8227359d126403f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:23:19 -0400 Subject: [PATCH 180/212] All setIntervals on the frontend are now properly destroyed --- .../concurrent-stream/concurrent-stream.component.ts | 5 +++++ src/app/components/twitch-chat/twitch-chat.component.ts | 3 ++- src/app/subscription/subscription/subscription.component.ts | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/components/concurrent-stream/concurrent-stream.component.ts b/src/app/components/concurrent-stream/concurrent-stream.component.ts index 6c2cc67..e99108b 100644 --- a/src/app/components/concurrent-stream/concurrent-stream.component.ts +++ b/src/app/components/concurrent-stream/concurrent-stream.component.ts @@ -42,6 +42,11 @@ export class ConcurrentStreamComponent implements OnInit { } + ngOnDestroy(): void { + if (this.check_timeout) { clearInterval(this.check_timeout); } + if (this.update_timeout) { clearInterval(this.update_timeout); } + } + startServer() { this.started = true; this.server_started = true; diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index d2e0aa0..e4ec4c7 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit { this.getFullChat(); } - ngAfterViewInit() { + ngOnDestroy(): void { + if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); } } private isUserNearBottom(): boolean { diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index dcb6c5c..967b5bd 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -52,6 +52,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy { this.route.params.subscribe(params => { this.id = params['id']; + if (this.sub_interval) { clearInterval(this.sub_interval); } + this.postsService.service_initialized.subscribe(init => { if (init) { this.getConfig(); From a36761e96a3da59c28accc6022f6bcd6198cae64 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:24:15 -0400 Subject: [PATCH 181/212] Fixed frontend build error --- src/app/components/twitch-chat/twitch-chat.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index e4ec4c7..bbeb7de 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { PostsService } from 'app/posts.services'; @Component({ @@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services'; templateUrl: './twitch-chat.component.html', styleUrls: ['./twitch-chat.component.scss'] }) -export class TwitchChatComponent implements OnInit, AfterViewInit { +export class TwitchChatComponent implements OnInit, OnDestroy { full_chat = null; visible_chat = null; From 1bb4d9dbf63ca1ba3a27c25057a88080d9bed228 Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Mon, 2 May 2022 07:22:05 +0200 Subject: [PATCH 182/212] Deleted translation using Weblate (Basa (Cameroon)) --- src/assets/i18n/messages.bas.xlf | 2634 ------------------------------ 1 file changed, 2634 deletions(-) delete mode 100644 src/assets/i18n/messages.bas.xlf diff --git a/src/assets/i18n/messages.bas.xlf b/src/assets/i18n/messages.bas.xlf deleted file mode 100644 index 1e080e4..0000000 --- a/src/assets/i18n/messages.bas.xlf +++ /dev/null @@ -1,2634 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 75 - - Dark mode toggle label - - - Settings - - - src/app/app.component.html - 28 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 15 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Multi-download Mode - - - src/app/main/main.component.html - 70,71 - - Multi-download Mode checkbox - - - Cancel - - - src/app/main/main.component.html - 84,85 - - Cancel download button - - - Advanced - - - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Custom args - - - src/app/main/main.component.html - 115 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - - src/app/main/main.component.html - 118,119 - - Custom Args input hint - - - Use custom output - - - src/app/main/main.component.html - 126,127 - - Use custom output checkbox - - - Custom output - - - src/app/main/main.component.html - 130 - - Custom output placeholder - - - Documentation - - - src/app/main/main.component.html - 132 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 125 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 133 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint - - - Crop file - - - src/app/main/main.component.html - 155,156 - - Crop video checkbox - - - Crop from (seconds) - - - src/app/main/main.component.html - 159 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 164 - - Crop to placeholder - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 140,141 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 144 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 149 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 10 - - YT Password placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - src/app/create-playlist/create-playlist.component.html - 6 - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 5 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 18 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - Subscription custom name placeholder - - - Download all uploads - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - - - Subscribe - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - Subscribe button - - - Download videos uploaded in the last - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - - - Type: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 13 - - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - - Subscription ID property - - - Close - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 17 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 59 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 1 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 31 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - Name: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 6 - - Video name property - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - Register a user - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 - - Register user dialog title - - - User name - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 - - User name placeholder - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 35 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 - - Cookies upload warning - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 464 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - Normal order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 - - Normal order - - - Reverse order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - No videos found. - - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - Playlist edit button - - - Delete - - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 33 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - Delete playlist - - - Info - - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - Delete and blacklist video button - - - views - - - src/app/player/player.component.html - 15 - - View count label - - - The download was successful - - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - - src/app/subscriptions/subscriptions.component.html - 27 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 24 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 33 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 43 - - No playlist subscriptions text - - - Main - - - src/app/settings/settings.component.html - 12 - - Main settings label - - - Downloader - - - src/app/settings/settings.component.html - 102 - - Downloader settings label - - - Extra - - - src/app/settings/settings.component.html - 185 - - Extra settings label - - - Database - - - src/app/settings/settings.component.html - 284 - - Database settings label - - - Advanced - - - src/app/settings/settings.component.html - 320 - - Host settings label - - - Users - - - src/app/settings/settings.component.html - 403 - - - src/app/settings/settings.component.html - 403 - - Users settings label - - - Logs - - - src/app/settings/settings.component.html - 451 - - - src/app/settings/settings.component.html - 451 - - Logs settings label - - - {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - - - src/app/settings/settings.component.html - 467 - - Settings cancel and close button - - - URL this app will be accessed from, without the port. - - - src/app/settings/settings.component.html - 19 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 24 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 25 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 34 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 38 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 39 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 48 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 52 - - Subscriptions base path input setting placeholder - - - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 53 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 58 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 59 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 72 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 74 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 80 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 89 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 109 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 110 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 116 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 117 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 123 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 126 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 133 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 134 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 144 - - Categories - - - With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 166 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 170 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 174 - - Include metadata setting - - - Kill all downloads - - - src/app/settings/settings.component.html - 178 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 191 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 196 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 199 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 202 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 205 - - Download only mode setting - - - Allow multi-download mode - - - src/app/settings/settings.component.html - 208 - - Allow multi-download mode setting - - - Enable Public API - - - src/app/settings/settings.component.html - 216 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 221 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 222 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 226 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 226 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 235 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 239 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 240 - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 244 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 251 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 252 - - Twitch API Key setting hint AKA preamble - - - Auto-download Twitch Chat - - - src/app/settings/settings.component.html - 247 - - Auto download Twitch Chat setting - - - Click here - - - src/app/settings/settings.component.html - 262 - - - src/app/settings/settings.component.html - 268 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Chrome ext click here - - - to download the official YoutubeDL-Material Chrome extension manually. - - - src/app/settings/settings.component.html - 262 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 263 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 268 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 269 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 269 - - Firefox setup suffix - - - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - - - src/app/settings/settings.component.html - 274 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 275 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 290 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 291 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 299 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 300 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 304 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 308 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 312 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 326 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 335 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 339 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 353 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 365 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 376 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 384 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 385 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 397 - - Restart server button - - - Allow user registration - - - src/app/settings/settings.component.html - 407 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 411 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 413 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 416 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 423 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 428 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 433 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 438 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 443 - - Search Filter - - - About YoutubeDL-Material - - - src/app/dialogs/about-dialog/about-dialog.component.html - 1 - - About dialog title - - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 12 - - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Found a bug or have a suggestion? - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - About bug prefix - - - to create an issue! - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - About bug suffix - - - Checking for updates... - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Select a version: - - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Session ID: - - - src/app/components/downloads/downloads.component.html - 5 - - Session ID - - - Clear all downloads - - - src/app/components/downloads/downloads.component.html - 18 - - clear all downloads action button - - - (current) - - - src/app/components/downloads/downloads.component.html - 6 - - Current session - - - No downloads available! - - - src/app/components/downloads/downloads.component.html - 25 - - No downloads label - - - Your Profile - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Delete and redownload - - - src/app/components/unified-file-card/unified-file-card.component.html - 28 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - - src/app/components/unified-file-card/unified-file-card.component.html - 31 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Length: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - From 01fd2fb99076d984c4ad83a3fd5e2cdc8d19cd76 Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Mon, 2 May 2022 07:24:10 +0200 Subject: [PATCH 183/212] Deleted translation using Weblate (Hindi) --- src/assets/i18n/messages.hi.xlf | 3040 ------------------------------- 1 file changed, 3040 deletions(-) delete mode 100644 src/assets/i18n/messages.hi.xlf diff --git a/src/assets/i18n/messages.hi.xlf b/src/assets/i18n/messages.hi.xlf deleted file mode 100644 index 29f68db..0000000 --- a/src/assets/i18n/messages.hi.xlf +++ /dev/null @@ -1,3040 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 67 - - Dark mode toggle label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 34 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Settings - - - src/app/app.component.html - 49 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Download for has been queued! - - - src/app/main/main.component.ts - 469 - - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Autoplay - - - src/app/main/main.component.html - 70,71 - - Autoplay checkbox - - - Cancel - - - src/app/main/main.component.html - 84,85 - - Cancel download button - - - Advanced - - - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Replace args - - - src/app/main/main.component.html - 116,117 - - Replace args - - - Custom args - - - src/app/main/main.component.html - 120 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - - src/app/main/main.component.html - 123,124 - - Custom Args input hint - - - Use custom output - - - src/app/main/main.component.html - 131,132 - - Use custom output checkbox - - - Custom output - - - src/app/main/main.component.html - 135 - - Custom output placeholder - - - Documentation - - - src/app/main/main.component.html - 137 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 117 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 138 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint - - - Crop file - - - src/app/main/main.component.html - 160,161 - - Crop video checkbox - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 145,146 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 149 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 154 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 10 - - YT Password placeholder - - - Crop from (seconds) - - - src/app/main/main.component.html - 164 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 169 - - Crop to placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - src/app/create-playlist/create-playlist.component.html - 6 - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 5 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 10 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - Subscription custom name placeholder - - - Download all uploads - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/confirm-dialog/confirm-dialog.component.html - 16 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/settings/settings.component.html - 490 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - - - Subscribe - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - Subscribe button - - - Download videos uploaded in the last - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - - - Type: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 13 - - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - - Subscription ID property - - - Close - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 17 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 70 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 1 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 34 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - Name: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 6 - - Video name property - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - Register a user - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 - - Register user dialog title - - - User name - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 - - User name placeholder - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 38 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 - - Cookies upload warning - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 487 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - Normal order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 - - Normal order - - - Reverse order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - File type - - - src/app/components/recent-videos/recent-videos.component.html - 52 - - File type - - - Both - - - src/app/components/recent-videos/recent-videos.component.html - 54 - - Both - - - Video only - - - src/app/components/recent-videos/recent-videos.component.html - 55 - - Video only - - - Audio only - - - src/app/components/recent-videos/recent-videos.component.html - 56 - - Audio only - - - No videos found. - - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 43 - - Playlist edit button - - - Delete - - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - - src/app/components/unified-file-card/unified-file-card.component.html - 45 - - Delete playlist - - - Info - - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 40 - - Delete and blacklist video button - - - views - - - src/app/player/player.component.html - 16 - - View count label - - - The download was successful - - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - - src/app/subscriptions/subscriptions.component.html - 30 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 27 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 36 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 46 - - No playlist subscriptions text - - - You must enable multi-user mode to access this tab. - - - src/app/settings/settings.component.ts - 48 - - - - Main - - - src/app/settings/settings.component.html - 4 - - Main settings label - - - Downloader - - - src/app/settings/settings.component.html - 94 - - Downloader settings label - - - Extra - - - src/app/settings/settings.component.html - 198 - - Extra settings label - - - Database - - - src/app/settings/settings.component.html - 303 - - Database settings label - - - Advanced - - - src/app/settings/settings.component.html - 339 - - Host settings label - - - Logs - - - src/app/settings/settings.component.html - 476 - - - src/app/settings/settings.component.html - 476 - - Logs settings label - - - URL this app will be accessed from, without the port. - - - src/app/settings/settings.component.html - 11 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 16 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 17 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 26 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 30 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 31 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 40 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 44 - - Subscriptions base path input setting placeholder - - - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 45 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 50 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 51 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 64 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 66 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 72 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 81 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 101 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 102 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 108 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 109 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 115 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 118 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 125 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 126 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 136 - - Categories - - - With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - - - src/app/settings/settings.component.html - 150 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 150 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 158 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 162 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 166 - - Include metadata setting - - - Max concurrent downloads - - - src/app/settings/settings.component.html - 175 - - Max concurrent downloads - - - Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. - - - src/app/settings/settings.component.html - 176 - - Max concurrent downloads input hint - - - Download rate limit - - - src/app/settings/settings.component.html - 181 - - Download rate limit input placeholder - - - Rate limits your downloads to the specified amount. Ex: 200K - - - src/app/settings/settings.component.html - 182 - - Download rate limit input hint - - - Kill all downloads - - - src/app/settings/settings.component.html - 191 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 204 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 209 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 212 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 215 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 218 - - Download only mode setting - - - Allow autoplay - - - src/app/settings/settings.component.html - 221 - - Allow autoplay setting - - - Enable Public API - - - src/app/settings/settings.component.html - 229 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 234 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 235 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 239 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 239 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 248 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 253 - - - src/app/settings/settings.component.html - 265 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 257 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 264 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 265 - - Twitch API Key setting hint AKA preamble - - - Enables a button to skip ads when viewing supported videos. - - - src/app/settings/settings.component.html - 269 - - SponsorBlock API tooltip - - - Use SponsorBlock API - - - src/app/settings/settings.component.html - 269 - - Use SponsorBlock API setting - - - Generates NFO files with every download, primarily used by Kodi. - - - src/app/settings/settings.component.html - 272 - - Generate NFO files tooltip - - - Generate NFO files - - - src/app/settings/settings.component.html - 272 - - Generate NFO files setting - - - Auto-download Twitch Chat - - - src/app/settings/settings.component.html - 260 - - Auto download Twitch Chat setting - - - Click here - - - src/app/settings/settings.component.html - 281 - - - src/app/settings/settings.component.html - 287 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - Chrome ext click here - - - to download the official YoutubeDL-Material Chrome extension manually. - - - src/app/settings/settings.component.html - 281 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 282 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 287 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 288 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 288 - - Firefox setup suffix - - - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - - - src/app/settings/settings.component.html - 293 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 294 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 309 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 310 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 318 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 319 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 323 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 327 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 331 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 345 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 354 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 358 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 372 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 384 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 395 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 403 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 404 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 416 - - Restart server button - - - Users - - - src/app/settings/settings.component.html - 425 - - Users settings label - - - Allow user registration - - - src/app/settings/settings.component.html - 431 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 435 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 437 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 440 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 447 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 452 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 457 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 462 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 467 - - Search Filter - - - About YoutubeDL-Material - - - src/app/dialogs/about-dialog/about-dialog.component.html - 1 - - About dialog title - - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 12 - - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Installation type: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Installation type - - - Commit hash: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 31 - - Commit hash - - - Build date: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 33 - - Build date - - - Found a bug or have a suggestion? - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug prefix - - - to create an issue! - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug suffix - - - Checking for updates... - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Docker tag: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 28 - - Docker tag - - - Select a version: - - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Creating download - - - src/app/components/downloads/downloads.component.ts - 58 - - - - Getting info - - - src/app/components/downloads/downloads.component.ts - 59 - - - - Downloading file - - - src/app/components/downloads/downloads.component.ts - 60 - - - - Complete - - - src/app/components/downloads/downloads.component.ts - 61 - - - - Clear finished downloads - - - src/app/components/downloads/downloads.component.ts - 129 - - - - Would you like to clear your finished downloads? - - - src/app/components/downloads/downloads.component.ts - 130 - - - - Clear - - - src/app/components/downloads/downloads.component.ts - 131 - - - - Error for - - - src/app/components/downloads/downloads.component.ts - 238 - - - - Copy to clipboard - - - src/app/components/downloads/downloads.component.ts - 240 - - - - Close - - - src/app/components/downloads/downloads.component.ts - 241 - - - - Copied to clipboard! - - - src/app/components/downloads/downloads.component.ts - 249 - - - - Date - - - src/app/components/downloads/downloads.component.html - 7 - - Date - - - Title - - - src/app/components/downloads/downloads.component.html - 13 - - Title - - - Subscription - - - src/app/components/downloads/downloads.component.html - 23 - - Subscription - - - Stage - - - src/app/components/downloads/downloads.component.html - 36 - - Stage - - - Progress - - - src/app/components/downloads/downloads.component.html - 42 - - Progress - - - Actions - - - src/app/components/downloads/downloads.component.html - 55 - - Actions - - - Clear - - - src/app/components/downloads/downloads.component.html - 68 - - - src/app/components/downloads/downloads.component.html - 68 - - Clear - - - Pause - - - src/app/components/downloads/downloads.component.html - 59 - - - src/app/components/downloads/downloads.component.html - 59 - - Pause - - - Resume - - - src/app/components/downloads/downloads.component.html - 60 - - - src/app/components/downloads/downloads.component.html - 60 - - Resume - - - Watch content - - - src/app/components/downloads/downloads.component.html - 64 - - - src/app/components/downloads/downloads.component.html - 64 - - Watch content - - - Show error - - - src/app/components/downloads/downloads.component.html - 65 - - - src/app/components/downloads/downloads.component.html - 65 - - Show error - - - Restart - - - src/app/components/downloads/downloads.component.html - 66 - - Restart - - - Pause all downloads - - - src/app/components/downloads/downloads.component.html - 83 - - Pause all downloads - - - Resume all downloads - - - src/app/components/downloads/downloads.component.html - 84 - - Resume all downloads - - - Clear finished downloads - - - src/app/components/downloads/downloads.component.html - 85 - - Clear finished downloads - - - No downloads available! - - - src/app/components/downloads/downloads.component.html - 90 - - No downloads label - - - Your Profile - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Add to playlist - - - src/app/components/unified-file-card/unified-file-card.component.html - 26 - - Add to playlist menu item - - - Delete and redownload - - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Skip ad - - - src/app/components/skip-ad-button/skip-ad-button.component.html - 1 - - Skip ad button - - - Length: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - From 7bfb441a0040c22b6990fad7fc91250b5e11611b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Mon, 2 May 2022 01:44:43 -0400 Subject: [PATCH 184/212] Fixed bug where files couldn't be deleted with archive mode enabled fixes #487 --- backend/db.js | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/db.js b/backend/db.js index 7cab07d..64d2a64 100644 --- a/backend/db.js +++ b/backend/db.js @@ -497,6 +497,7 @@ exports.deleteFile = async (uid, uuid = null, blacklistMode = false) => { let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { + const usersFileFolder = config_api.getConfigItem('ytdl_users_base_path'); const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`); // get ID from JSON From b3342d89c1d344f9a3da6e7f856fb9bd5df4c51f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Mon, 2 May 2022 01:46:25 -0400 Subject: [PATCH 185/212] Fixed #563 where empty languages existed in language select --- src/app/settings/locales_list.ts | 2 +- src/assets/i18n/messages.nb.json | 222 ------------------------------- src/postbuild.mjs | 13 +- 3 files changed, 13 insertions(+), 224 deletions(-) delete mode 100644 src/assets/i18n/messages.nb.json diff --git a/src/app/settings/locales_list.ts b/src/app/settings/locales_list.ts index 9235937..7d5687a 100644 --- a/src/app/settings/locales_list.ts +++ b/src/app/settings/locales_list.ts @@ -445,7 +445,7 @@ export const isoLangs = { 'name': 'Navajo, Navaho', 'nativeName': 'Diné bizaad, Dinékʼehǰí' }, - 'nb': { + 'nb-NO': { 'name': 'Norwegian Bokmål', 'nativeName': 'Norsk bokmål', 'ngID': 'nb' diff --git a/src/assets/i18n/messages.nb.json b/src/assets/i18n/messages.nb.json deleted file mode 100644 index 120f171..0000000 --- a/src/assets/i18n/messages.nb.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Opprett en spilleliste", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Navn", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Lyd", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Lydfiler", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videoer", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Endre youtube-dl-argumenter", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulerte nye argumenter", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Legg til argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Søk etter kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Bruk argument-verdi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-verdi", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Legg til argument", - "d7b35c384aecd25a516200d6921836374613dfe7": "Avbryt", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Endre", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalitet", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Bruk nettadresse", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Vis", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Kun lyd", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-nedlastingsmodus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Last ned", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Avbryt", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avansert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulert kommando:", - "4e4c721129466be9c3862294dc40241b64045998": "Bruk egendefinerte argumenter:", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Egendefinerte argumenter", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter skilles ved bruk av to komma, slik: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Bruk defendefinert utdata", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Egendefinert utdata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasjon", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Sti er relativ til oppsettsnedlastingsstien. Ikke inkluder utvidelse.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Bruk identitetsbekreftelse", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Brukernavn", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passord", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Navn:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Nettadresse:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Opplaster:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Filstørrelse:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Sti:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Opplastingsdato:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Lukk", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Endre spilleliste", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Legg til mer innhold", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Lagre", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Antall:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Rediger", - "826b25211922a1b46436589233cb6f1a163d89b7": "Slett", - "321e4419a943044e674beb55b8039f42a9761ca5": "Info", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Slett og svartelist", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Last opp nye kaker", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Dra og slipp", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Merk: Oppasting av nye kaker overskriver tidligere. Merk deg også at kaker gjelder for hele instansen, ikke per bruker.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Innstillinger", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Nettadresse", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "Nettadressen dette programmet nås fra, uten porten.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Ønsket port. Forvalet er 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-brukermodus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Bruker-basissti", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basissti for brukere og deres nedlastede videoer.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Tillat abonnementer", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements-basissti", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basissti for videoer fra dine abonnementskanaler og spillelister. Den er relativ til YTDL-Material sin rotmappe.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Sjekkintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "I sekunder, kun tall.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Drakt", - "ff7cee38a2259526c519f878e71b964f41db4348": "Forvalg", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Mørk", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Tillat draktendring", - "fe46ccaae902ce974e2441abe752399288298619": "Språk", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Generelt", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Lydmappe", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Sti for lydbaserte nedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomappe", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Sti for videonedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Egendefinerte argumenter for nedlastninger på hjemmesiden for hele programmet. Argumenter skilles med to komma, slik: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Bruk youtube-dl-arktivet", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inkluder miniatyrbilde", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inkluder metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Drep alle nedlastinger", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Nedlaster", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Topptittel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Filbehandler påskrudd", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Nedlastingsbehandler påskrudd", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Tillat kvalitetsvalg", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modus kun for nedlasting", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Tillat multi-nedlastingsmodus", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Skru på offentlig API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Offentlig API-nøkkel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Vis dokumentasjon", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generer", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dette vil slette din gamle API-nøkkel!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Bruk YouTube-API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-API-nøkkel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Å generere en nøkkel er lett!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikk her", - "7f09776373995003161235c0c8d02b7f91dbc4df": "for å laste ned den offisielle Chrome-utvidelsen for YouTubeDL-Material selv.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Du må manuelt laste ned utvidelsen og endre dens innstillinger for å sette skjermflate-nettadresse.", - "9a2ec6da48771128384887525bdcac992632c863": "for å installere den offisielle Firefox-utvidelsen for YouTubeDL-Material rett fra Firefox sin utvidelsesside.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaljert oppsettsinstruks", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Ikke mye kreves annet enn å endre utvidelses innstillinger for å sette skjermflate-nettadresse.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Dra lenken nedenfor til bokmerker. Naviger til YouTube-videoen du ønsker å laste ned og klikk på bokmerket.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genrer \"kun lyd\"-bookmerke", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Bruk forvalgt nedlastingsagent", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Velg en nedlaster", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Loggingsnivå", - "db6c192032f4cab809aad35215f0aa4765761897": "Innloggingsutløp", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Tillat avansert nedlasting", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Bruk kaker", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Sett kaker", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avansert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Tillat brukerregistrering", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentiseringsmetode", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-nettadresse", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "BIND-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "BIND-identitetsdetaljer", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Søkebase", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Søkefilter", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Brukere", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logger", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Om YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "er en fri YouTube-nedlaster bygd i henhold til Google sine Materielle spesifikasjoner. Du kan sømløst laste ned dine favorittvideoer som video- eller lydfiler, og tilogmed abonnere på dine favorittkanaler og spillelister for å holde deg oppdatert med nye videoer.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "har noen flotte funksjoner inkludert. Et vidtfavnende API, Docker-støtte, og lokalisering (oversettelser)-støtte. Les om alle støttede funksjoner ved å klikke på GitHub-ikonet ovenfor.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installert versjon:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Ser etter oppdateringer …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Oppdatering tilgjengelig", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Du kan oppdatere fra innstillingsmenyen.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Funnet en feil eller har et forslag å komme med?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "for å opprette en feilrapport.", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Din profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Opprettet:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Du er ikke innlogget.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Logg inn", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Logg ut", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Opprett administratorkonto", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Fant ingen administratorkonto. Dette vil opprette og sette passord for en slik konto med brukernavn som «admin».", - "70a67e04629f6d412db0a12d51820b480788d795": "Opprett", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Om", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Hjem", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementer", - "822fab38216f64e8166d368b59fe756ca39d301b": "Nedlastinger", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Del spilleliste", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Del video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Del lyd", - "1f6d14a780a37a97899dc611881e6bc971268285": "Skru på deling", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Bruk tidsstempel", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunder", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopier til utklippstavle", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Lagre endringer", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Nedlastet", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "En feil inntraff", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detaljer", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "En feil har inntruffet:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Nedlastingsstart:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Nedlastingsslutt:", - "ad127117f9471612f47d01eae09709da444a36a4": "Filsti(er):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonner på en spilleliste eller kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Spilleliste- eller kanal-nettadressen", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Egendefinert navn", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Last ned alle opplastinger", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Last ned videoer oppdatert siste", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Kun lyd-modus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Kun strømming-modus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Disse legges til etter standard-argumentene.", - "98b6ec9ec138186d663e64770267b67334353d63": "Egendefinert filutdata", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arkiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Eksporter arkiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Opphev abonnement", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Dine abonnementer", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanaler", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Navn ikke tilgjengelig. Henter kanal …", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Du har ingen kanalabonnementer.", - "47546e45bbb476baaaad38244db444c427ddc502": "Spillelister", - "2e0a410652cb07d069f576b61eab32586a18320d": "Navn ikke tilgjengelig. Henter spilleliste …", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Du har ingen spillelisteabonnement.", - "3697f8583ea42868aa269489ad366103d94aece7": "Redigering", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Søk", - "2054791b822475aeaea95c0119113de3200f5e1c": "Lengde:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Slett og last ned igjen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Slett for alltid", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Oppdaterer", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Velg en versjon:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Regustrer", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Økt-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(nåværende)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Tøm alle nedlastinger", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Ingen nedlastninger tilgjengelige!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrer en bruker", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Brukernavn", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Håndter bruker", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Bruker-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nytt passord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Sett nytt passord", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Bruk rolle-forvalg", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nei", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Håndter rolle", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Brukernavn", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Handlinger", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Rediger bruker", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Slett bruker", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Legg til brukere", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rediger rolle", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linjer:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Tøm logger", - "ccf5ea825526ac490974336cb5c24352886abc07": "Åpne fil", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Åpne fil i ny fane", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Gå til abonnement", - "d02888c485d3aeab6de628508f4a00312a722894": "Mine videoer" -} \ No newline at end of file diff --git a/src/postbuild.mjs b/src/postbuild.mjs index ff20b87..8bc6d71 100644 --- a/src/postbuild.mjs +++ b/src/postbuild.mjs @@ -33,7 +33,18 @@ async function createLocalizationJSON() { for (let i = 0; i < files.length; i++) { const file = path.basename(files[i]); const file_parts = file.split('.'); - locales.push(file_parts[1]); + if (file_parts.length !== 3 || file_parts[1] === 'en') continue; + try { + const locale_json = fs.readJSONSync(files[i]); + const locale_json_keys = Object.keys(locale_json); + let has_defined_keys = false; + for (let i = 0; i < locale_json_keys.length; i++) { + if (locale_json[locale_json_keys[i]] !== '') has_defined_keys = true; + } + if (has_defined_keys) locales.push(file_parts[1]); + } catch (err) { + console.error(err); + } } fs.unlinkSync('src/assets/i18n/messages.en.json'); From 93ce498e94ca56d7007b1af15fb08b2f796b1368 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 08:20:48 +0200 Subject: [PATCH 186/212] switch to ubuntu 21.10 as we wait for nodesource --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3b8ec2c..24ac0d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM ubuntu:20.04 AS ffmpeg +FROM ubuntu:21.10 AS ffmpeg ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh -FROM ubuntu:20.04 as frontend +FROM ubuntu:21.10 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ @@ -31,7 +31,7 @@ RUN npm run build #--------------# -FROM ubuntu:20.04 +FROM ubuntu:21.10 ENV UID=1000 \ GID=1000 \ From 4d4bc765491589b54363543533a0414d781afbf9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 12:59:34 +0200 Subject: [PATCH 187/212] Use Ubuntu 22.04, use nodejs from ubuntu repo --- Dockerfile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24ac0d0..24b7185 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,25 @@ -FROM ubuntu:21.10 AS ffmpeg +FROM ubuntu:22.04 AS ffmpeg ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh -FROM ubuntu:21.10 as frontend +FROM ubuntu:22.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ curl \ - gnupg && \ - curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ - apt-get -y install \ + gnupg \ + # Ubuntu 22.04 ships Node.JS 12 by default :) nodejs \ # YARN: brings along npm, solves dependency conflicts, # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 yarn && \ apt-get install -f && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ npm config set strict-ssl false && \ npm install -g @angular/cli @@ -31,7 +33,7 @@ RUN npm run build #--------------# -FROM ubuntu:21.10 +FROM ubuntu:22.04 ENV UID=1000 \ GID=1000 \ @@ -42,7 +44,6 @@ ENV DEBIAN_FRONTEND=noninteractive RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ npm \ python2 \ From 9f740020af9611bd6e98d260492afc04c284cd6f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 13:14:57 +0200 Subject: [PATCH 188/212] possible fix --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24b7185..038a57d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,9 +13,9 @@ RUN apt-get update && apt-get -y install \ gnupg \ # Ubuntu 22.04 ships Node.JS 12 by default :) nodejs \ - # YARN: brings along npm, solves dependency conflicts, + # needed on 21.10 and before, maybe not on 22.04 YARN: brings along npm, solves dependency conflicts, # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 - yarn && \ + npm && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 44c1a34c67eee21cfb8b19e432caa9382f754e77 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 13:33:20 +0200 Subject: [PATCH 189/212] Permissions fix for ffmpeg executable --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 038a57d..6fb263b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ FROM ubuntu:22.04 AS ffmpeg -ENV DEBIAN_FRONTEND=noninteractive +ENV UID=1000 \ + GID=1000 \ + USER=youtube \ + DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh From 8e4a3119ab0ebc1cff470bcd663ca8b6d69c3e43 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:25:38 +0200 Subject: [PATCH 190/212] =?UTF-8?q?=F0=9F=9A=80=20bye=20unnecessary=20buil?= =?UTF-8?q?d=20cleanups=20(not=20last=20stage)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6fb263b..343dba0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,9 +20,6 @@ RUN apt-get update && apt-get -y install \ # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 npm && \ apt-get install -f && \ - apt-get autoremove --purge && \ - apt-get autoremove && \ - apt-get clean && \ npm config set strict-ssl false && \ npm install -g @angular/cli From 06ca9cbe76af1deecc4f51679b834f4a9405d636 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:26:37 +0200 Subject: [PATCH 191/212] build excludes: now matches ANY *.md :) --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 165b51b..6cd9cc6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,9 +8,9 @@ on: - '.vscode/**' - 'chrome-extension/**' - 'releases/**' + - '**/**.md' - '**.crx' - '**.pem' - - '**.md' - '.dockerignore' - '.gitignore' From 849c1927d336aac0a89d542861002823c01650dd Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:27:42 +0200 Subject: [PATCH 192/212] Add fix script for interactive permission fixing. --- fix-scripts/001 - fix_download_permissions.sh | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 fix-scripts/001 - fix_download_permissions.sh diff --git a/fix-scripts/001 - fix_download_permissions.sh b/fix-scripts/001 - fix_download_permissions.sh new file mode 100644 index 0000000..6f7bad1 --- /dev/null +++ b/fix-scripts/001 - fix_download_permissions.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M +# Date: 2022-05-03 + +# If you want to run this script on a bare-metal installation instead of within Docker +# make sure that the paths configured below match your paths! (it's wise to use the full paths) + +# User defines / Docker env defaults +PATH_SUBS=/app/subscriptions +PATH_AUDIO=/app/audio +PATH_VIDS=/app/video + +echo "\n" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." +echo "This script will set YTDL-M's download paths' owner to ${USER} (${UID}:${GID})" +echo "and permissions to the default of 644." +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "\n" + +# check whether dirs exist +i=0 +[ -d $PATH_SUBS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Subscriptions directory at ${PATH_SUBS}" +[ -d $PATH_AUDIO ] && i=$((i+1)) && echo "✔ (${i}/3) Found Audio directory at ${PATH_AUDIO}" +[ -d $PATH_VIDS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Video directory at ${PATH_VIDS}" + +# Ask to proceed or cancel, exit on missing paths +case $i in + 0) + echo "\nCouldn't find any download path to fix permissions for! \nPlease edit this script to configure!" + exit 2;; + 3) + echo "\nFound all download paths to fix permissions for. \nProceed? (Y/N)";; + *) + echo "\nOnly found ${i} out of 3 download paths! Something about this script's config must be wrong. \nProceed anyways? (Y/N)";; +esac +old_stty_cfg=$(stty -g) +stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty +if echo "$answer" | grep -iq "^y" ;then + echo "\n Running jobs now... (this may take a while)\n" + [ -d $PATH_SUBS ] && chown "$UID:$GID" -R $PATH_SUBS && echo "✔ Set owner of ${PATH_SUBS} to ${USER}." + [ -d $PATH_SUBS ] && chmod 644 -R $PATH_SUBS && echo "✔ Set permissions of ${PATH_SUBS} to 644." + [ -d $PATH_AUDIO ] && chown "$UID:$GID" -R $PATH_AUDIO && echo "✔ Set owner of ${PATH_AUDIO} to ${USER}." + [ -d $PATH_AUDIO ] && chmod 644 -R $PATH_AUDIO && echo "✔ Set permissions of ${PATH_AUDIO} to 644." + [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." + [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." + echo "\n✔ Done." + exit +else + echo "\nOkay, bye." +fi From 713a97f75ab92f29dedc8954b353d4af8551cf88 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:44:55 +0200 Subject: [PATCH 193/212] reintegrate suexec --- Dockerfile | 2 +- backend/entrypoint.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 343dba0..26f1d76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,5 +68,5 @@ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/ COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 -# ENTRYPOINT [ "/app/entrypoint.sh" ] +ENTRYPOINT [ "/app/entrypoint.sh" ] CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 5074353..e563fb9 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -11,7 +11,7 @@ fi # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec su-exec "$UID:$GID" "$0" "$@" + exec /usr/lib/apache2/suexec-custom "$UID:$GID" "$0" "$@" fi exec "$@" From d0f5518d31e84ce571c8668719599277e87038c2 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 09:44:43 +0200 Subject: [PATCH 194/212] suexec needs to be installed --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 26f1d76..fedfe72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,8 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - atomicparsley && \ + atomicparsley \ + apache2-suexec-custom && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 726824269179993f6958eeade42de229a6e06c03 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 2 May 2022 05:26:43 +0000 Subject: [PATCH 195/212] Translated using Weblate (Chinese (Simplified)) Currently translated at 83.7% (253 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/zh_Hans/ --- src/assets/i18n/messages.zh.xlf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/i18n/messages.zh.xlf b/src/assets/i18n/messages.zh.xlf index 7de9a79..be003db 100644 --- a/src/assets/i18n/messages.zh.xlf +++ b/src/assets/i18n/messages.zh.xlf @@ -1,4 +1,4 @@ - + @@ -902,8 +902,8 @@ Video path setting input hint - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - 开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + 开始页面上用于下载的全局自定义参数。(单独为每个订阅设置订阅参数!) 参数由两个逗号分隔:,, app/settings/settings.component.html 146 From c5eacbb70ccb77e5729c7f13b06ce732e2dae6c1 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Mon, 2 May 2022 09:24:13 +0000 Subject: [PATCH 196/212] Translated using Weblate (Dutch) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nl/ --- src/assets/i18n/messages.nl.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 3d6b59f..03cb155 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -1545,8 +1545,8 @@ Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + Algemene aanvullende opties voor downloads op de overzichtspagina. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,, src/app/settings/settings.component.html 134 From 8cc5c4f733dcf6195af6415e62a752d6e5185f0c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 10:16:49 +0200 Subject: [PATCH 197/212] no need for suexec anymore apparently --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index fedfe72..26f1d76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,8 +48,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - atomicparsley \ - apache2-suexec-custom && \ + atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 7aca8ab060fb954ca65138feda466b1bfb485eaa Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 10:18:06 +0200 Subject: [PATCH 198/212] entrypoint updated for su --- backend/entrypoint.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index e563fb9..b804e66 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -3,15 +3,10 @@ set -eu CMD="pm2-runtime pm2.config.js" -# if the first arg starts with "-" pass it to program -if [ "${1#-}" != "$1" ]; then - set -- "$CMD" "$@" -fi - # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec /usr/lib/apache2/suexec-custom "$UID:$GID" "$0" "$@" + su -c "$0" "$(id -un $UID)" "$@" fi exec "$@" From 6a56b5b065cf7a205e61e6f566a2880ecfdc248c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 11:59:45 +0200 Subject: [PATCH 199/212] add fix-scripts to docker image --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 26f1d76..2977041 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,6 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] +COPY --chown=$UID:$GID [ "/fix-scripts/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 8336d886e98bbe72ca5a2e5bb806bd24e8a6b78e Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 12:16:58 +0200 Subject: [PATCH 200/212] fix-scripts need to be owned and run by root --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2977041..5cb2ac6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID [ "/fix-scripts/", "/app/" ] +COPY --chown=root:root [ "/fix-scripts/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From a54f07e93a34ebf0e6939c278f5c4fff39f8d4bf Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 12:19:05 +0200 Subject: [PATCH 201/212] remove white spaces from script & add usage instr. --- ...download_permissions.sh => 001-fix_download_permissions.sh} | 3 +++ 1 file changed, 3 insertions(+) rename fix-scripts/{001 - fix_download_permissions.sh => 001-fix_download_permissions.sh} (95%) diff --git a/fix-scripts/001 - fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh similarity index 95% rename from fix-scripts/001 - fix_download_permissions.sh rename to fix-scripts/001-fix_download_permissions.sh index 6f7bad1..c64ab05 100644 --- a/fix-scripts/001 - fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -5,6 +5,9 @@ # If you want to run this script on a bare-metal installation instead of within Docker # make sure that the paths configured below match your paths! (it's wise to use the full paths) +# USAGE: within your container's bash shell: +# su root +# ./fix-scripts/001-fix_download_permissions.sh # User defines / Docker env defaults PATH_SUBS=/app/subscriptions From e290dc0a25cc4f24e0599acc44fec7f4604363af Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Wed, 4 May 2022 15:11:35 +0200 Subject: [PATCH 202/212] Fixing permissions of ffmpeg and ffprobe Since we didn't specify UID and GID in copy command before, they were run as root causing permissions conflicts The ffmpeg stage doesn't need the env variables henceforth --- Dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5cb2ac6..769f72d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,12 @@ FROM ubuntu:22.04 AS ffmpeg -ENV UID=1000 \ - GID=1000 \ - USER=youtube \ - DEBIAN_FRONTEND=noninteractive +ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh +#--------------# Stage 2 + FROM ubuntu:22.04 as frontend ENV DEBIAN_FRONTEND=noninteractive @@ -31,7 +30,7 @@ COPY [ "angular.json", "tsconfig.json", "/build/" ] COPY [ "src/", "/build/src/" ] RUN npm run build -#--------------# +#--------------# Final Stage FROM ubuntu:22.04 @@ -56,8 +55,8 @@ RUN apt-get update && apt-get -y install \ rm -rf /var/lib/apt WORKDIR /app -COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg -COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffmpeg", "/usr/local/bin/ffmpeg" ] +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffprobe", "/usr/local/bin/ffprobe" ] COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 RUN npm config set strict-ssl false && \ From 5b919b2b189e435fe6e5896e5f78fbf72bb8d053 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 16:55:22 +0200 Subject: [PATCH 203/212] Fix scripts folder: copy content AND parent folder --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5cb2ac6..c8fd040 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=root:root [ "/fix-scripts/", "/app/" ] +COPY --chown=root:root [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 84d33b0f8227aba87788a50fcae6fdd963693c20 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:21:06 +0200 Subject: [PATCH 204/212] fix missing execution permission for fix scripts --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 05a5bed..3869435 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=root:root [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID --chmod=+x [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From a94b8f376e7a8b3242826fd9f99f44105e4cab86 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:22:21 +0200 Subject: [PATCH 205/212] permission needs to be set with octal notation --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3869435..bbb424e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID --chmod=+x [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID --chmod=755 [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 7c31a104981bd7d873d6ac96e734bf46ee75def5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:23:04 +0200 Subject: [PATCH 206/212] ux/guidance improvements --- fix-scripts/001-fix_download_permissions.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fix-scripts/001-fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh index c64ab05..45a96aa 100644 --- a/fix-scripts/001-fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -14,6 +14,7 @@ PATH_SUBS=/app/subscriptions PATH_AUDIO=/app/audio PATH_VIDS=/app/video +clear -x echo "\n" printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." @@ -49,6 +50,8 @@ if echo "$answer" | grep -iq "^y" ;then [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." echo "\n✔ Done." + echo "\n If you noticed file access errors those MAY be due to currently running downloads." + echo " Feel free to re-run this script, however download parts should have correct file permissions anyhow. :)" exit else echo "\nOkay, bye." From 336d7a09bddac5c13b57bdc4d3afed69ffb3d029 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 18:31:28 +0200 Subject: [PATCH 207/212] set fix-scripts folder permissions more reliably --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index bbb424e..6922d0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,8 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID --chmod=755 [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] +RUN chmod -R +x /app/fix-scripts EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 31b4fcb9fcf32204d85aea0636e52bb62b887af6 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 19:58:00 +0200 Subject: [PATCH 208/212] We're now using gosu to switch our user down :) --- Dockerfile | 1 + backend/entrypoint.sh | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6922d0b..a6f2838 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,6 +47,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ + gosu &\ atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index b804e66..59ffdb6 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -3,10 +3,15 @@ set -eu CMD="pm2-runtime pm2.config.js" +# if the first arg starts with "-" pass it to program +if [ "${1#-}" != "$1" ]; then + set -- "$CMD" "$@" +fi + # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - su -c "$0" "$(id -un $UID)" "$@" + exec gosu "$UID:$GID" "$0" "$@" fi exec "$@" From acca2d0de2470d48f631ea49f03c02b89e9982c9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:19:52 +0200 Subject: [PATCH 209/212] syntax devil struck again --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a6f2838..2420d4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,7 +47,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - gosu &\ + gosu \ atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ @@ -67,7 +67,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] -RUN chmod -R +x /app/fix-scripts +RUN chmod -R 755 /app/fix-scripts/ EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From ce3e6451294be3a7ac4a62e5b3a594f634f1148b Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:54:21 +0200 Subject: [PATCH 210/212] for now: user has to DIY chmod +x fix-scripts --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2420d4b..1dddfde 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,7 +67,6 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] -RUN chmod -R 755 /app/fix-scripts/ EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 17fdd0d788b10b2ae6ab41bced01b5615494f932 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:57:13 +0200 Subject: [PATCH 211/212] update usage instr. for fix-script in comment --- fix-scripts/001-fix_download_permissions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fix-scripts/001-fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh index 45a96aa..cd6cc42 100644 --- a/fix-scripts/001-fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -6,7 +6,7 @@ # If you want to run this script on a bare-metal installation instead of within Docker # make sure that the paths configured below match your paths! (it's wise to use the full paths) # USAGE: within your container's bash shell: -# su root +# chmod -R +x ./fix-scripts/ # ./fix-scripts/001-fix_download_permissions.sh # User defines / Docker env defaults From 3e7ef766dee3b459be2464aa518bf3e9b133574f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 23:40:42 +0200 Subject: [PATCH 212/212] =?UTF-8?q?Best=20to=20just=20put=20fix-scripts=20?= =?UTF-8?q?in=20/backend=20=F0=9F=91=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 1 - .../fix-scripts}/001-fix_download_permissions.sh | 0 2 files changed, 1 deletion(-) rename {fix-scripts => backend/fix-scripts}/001-fix_download_permissions.sh (100%) diff --git a/Dockerfile b/Dockerfile index 1dddfde..73112d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,6 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/fix-scripts/001-fix_download_permissions.sh b/backend/fix-scripts/001-fix_download_permissions.sh similarity index 100% rename from fix-scripts/001-fix_download_permissions.sh rename to backend/fix-scripts/001-fix_download_permissions.sh