diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.md b/.github/ISSUE_TEMPLATE/01_bug-report.md index 019f8c739d..8734fc0c36 100644 --- a/.github/ISSUE_TEMPLATE/01_bug-report.md +++ b/.github/ISSUE_TEMPLATE/01_bug-report.md @@ -16,11 +16,11 @@ First, in order to avoid duplicate Issues, please search to see if the problem y -## 🙂 Expected Behavior +## đŸĨ° Expected Behavior -## â˜šī¸ Actual Behavior +## đŸ¤Ŧ Actual Behavior @@ -33,3 +33,7 @@ First, in order to avoid duplicate Issues, please search to see if the problem y ## 📌 Environment + +Misskey version: +Your OS: +Your browser: diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f5e01947..b60a85cf1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,46 @@ ## 12.x.x (unreleased) ### Improvements +- ### Bugfixes +- +You should also include the user name that made the change. --> +## 12.104.0 (2022/02/09) + +### Note +こぎãƒĒãƒĒãƒŧ゚はマイグãƒŦãƒŧã‚ˇãƒ§ãƒŗãŽčĻæ¨ĄãŒå¤§ãã„ãŸã‚ã€ã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šãĢã‚ˆãŖãĻはマイグãƒŦãƒŧã‚ˇãƒ§ãƒŗãĢ時間がかかる可čƒŊ性がありぞす。 +マイグãƒŦãƒŧã‚ˇãƒ§ãƒŗãŒįĩ‚わらãĒã„å ´åˆã¯ã€ãƒãƒŖãƒŧãƒˆãŽæƒ…å ąã¯ãƒĒã‚ģットされãĻしぞいぞすが`__chart__`で始ぞるテãƒŧブãƒĢぎ**ãƒŦã‚ŗãƒŧド**を全ãĻ削除(テãƒŧブãƒĢč‡ĒäŊ“はæļˆã•ãĒいでください)しãĻから再åēĻčŠĻã™æ–šæŗ•ã‚‚ã‚ã‚Šãžã™ã€‚ + +### Improvements +- ãƒãƒŖãƒŧãƒˆã‚¨ãƒŗã‚¸ãƒŗãŽåŧˇåŒ– @syuilo + - テãƒŧブãƒĢã‚ĩイã‚ēぎ削減 + - notes/instance/perUserNotesãƒãƒŖãƒŧトãĢæˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢäģ˜ããƒŽãƒŧトぎ数をčŋŊ加 + - activeUsersãƒãƒŖãƒŧトãĢæ–°ã—ã„é …į›Žã‚’čŋŊ加 + - federationãƒãƒŖãƒŧトãĢæ–°ã—ã„é …į›Žã‚’čŋŊ加 + - apRequestãƒãƒŖãƒŧトをčŋŊ加 + - networkãƒãƒŖãƒŧトå샿­ĸ +- クナイã‚ĸãƒŗãƒˆ: č‡Ēã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šæƒ…å ąãƒšãƒŧã‚¸ã§ãƒãƒŖãƒŧトをčĻ‹ã‚Œã‚‹ã‚ˆã†ãĢ @syuilo +- クナイã‚ĸãƒŗãƒˆ: ãƒ‡ãƒã‚¤ã‚šãŽį¨ŽéĄžã‚’æ‰‹å‹•æŒ‡åŽšã§ãã‚‹ã‚ˆã†ãĢ @syuilo +- クナイã‚ĸãƒŗãƒˆ: UIぎã‚ĸã‚¤ã‚ŗãƒŗã‚’æ›´æ–° @syuilo +- クナイã‚ĸãƒŗãƒˆ: UIぎã‚ĸã‚¤ã‚ŗãƒŗã‚’ã‚ģãƒĢãƒ•ãƒ›ã‚šãƒ†ã‚Ŗãƒŗã‚°ã™ã‚‹ã‚ˆã†ãĢ @syuilo +- NodeInfo ぎãƒĻãƒŧã‚ļãƒŧ数と投į¨ŋ数ぎ内厚をčĻ‹į›´ã™ @xianonn + +### Bugfixes +- Client: ã‚ŋã‚¤ãƒ ãƒŠã‚¤ãƒŗį¨ŽåˆĨを切りæ›ŋえると「新しいノãƒŧãƒˆãŒã‚ã‚Šãžã™ã€ãŽčĄ¨į¤ēãŒæŽ‹į•™ã—ãĻしぞうぎをäŋŽæ­Ŗ @tamaina +- Client: UIぎã‚ĩイã‚ēがおかしくãĒã‚‹å•éĄŒãŽäŋŽæ­Ŗ @tamaina +- Client: Setting instance information of notes to always show breaks the timeline @Johann150 +- Client: į’°åĸƒãĢäžãŖãĻはčŋ”äŋĄã™ã‚‹éš›ãŽã‚Ģãƒŧã‚ŊãƒĢäŊįŊŽãŒæ­Ŗã—くãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo +- Client: ã‚ŗãƒŗãƒˆãƒ­ãƒŧãƒĢパネãƒĢぎãƒĻãƒŧã‚ļãƒŧã€ãƒ•ã‚Ąã‚¤ãƒĢãĢãĻã€ã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šãŽčĄ¨į¤ēį¯„å›˛åˆ‡ã‚Šæ›ŋえが抟čƒŊしãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo +- Client: ã‚ĸップデãƒŧトおįŸĨらせダイã‚ĸログがå‡ēãĒいぎをäŋŽæ­Ŗ @syuilo +- Client: Follows/Followers Visibility changes won't be saved unless clicking on an other checkbox @Johann150 +- API: Fix API cast @mei23 +- add instance favicon where it's missing @solfisher +- ãƒãƒŖãƒŧトぎ厚期resyncが動äŊœã—ãĻいãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo + ## 12.103.1 (2022/02/02) ### Bugfixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 662fa709b5..6e0f500be5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,6 +16,9 @@ Before creating an issue, please check the following: ## Before implementation When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented. +At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them. +PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review. + Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work. ## Well-known branches @@ -39,6 +42,23 @@ Thank you for your PR! Before creating a PR, please check the following: Thanks for your cooperation 🤗 +## Reviewers guide +Be willing to comment on the good points and not just the things you want fixed đŸ’¯ + +### Review perspective +- Scope + - Are the goals of the PR clear? + - Is the granularity of the PR appropriate? +- Security + - Does merging this PR create a vulnerability? +- Performance + - Will merging this PR cause unexpected performance degradation? + - Is there a more efficient way? +- Testing + - Does the test ensure the expected behavior? + - Are there any omissions or gaps? + - Does it check for anomalies? + ## Localization (l10n) Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management. You can improve our translations with your Crowdin account. diff --git a/gulpfile.js b/gulpfile.js index 3bc0b23bee..b7aa4e328e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,6 +19,10 @@ gulp.task('copy:client:fonts', () => gulp.src('./packages/client/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/')) ); +gulp.task('copy:client:fontawesome', () => + gulp.src('./packages/client/node_modules/@fortawesome/fontawesome-free/**/*').pipe(gulp.dest('./built/_client_dist_/fontawesome/')) +); + gulp.task('copy:client:locales', cb => { fs.mkdirSync('./built/_client_dist_/locales', { recursive: true }); @@ -50,7 +54,7 @@ gulp.task('build:backend:style', () => { }); gulp.task('build', gulp.parallel( - 'copy:client:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:client:fonts' + 'copy:client:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:client:fonts', 'copy:client:fontawesome' )); gulp.task('default', gulp.task('build')); diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index 5a053cdee9..914a16bb2f 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -1110,6 +1110,8 @@ _exportOrImport: blockingList: "Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲˆŲ† Ø§Ų„Ų…Ø­ØŦŲˆØ¨ŲˆŲ†" userLists: "Ø§Ų„Ų‚ŲˆØ§ØĻŲ…" _charts: + federation: "Ø§Ų„ŲØ¯ŲŠØąØ§Ų„ŲŠØŠ" + apRequest: "Ø§Ų„ØˇŲ„Ø¨Ø§ØĒ" usersIncDec: "ا؎ØĒŲ„Ø§Ų ؚدد Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ†" usersTotal: "Ų…ØŦŲ…ŲˆØš ؚدد Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† ŲˆØ§Ų„Ų…ØŗØĒØŽØ¯Ų…Ø§ØĒ" activeUsers: "Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲˆŲ† Ø§Ų„Ų†Ø´ØˇŲˆŲ†" diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml index 02f18cd1e9..fa18a8b3d0 100644 --- a/locales/bn-BD.yml +++ b/locales/bn-BD.yml @@ -141,6 +141,8 @@ flagAsBot: "āĻŦāϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" flagAsBotDescription: "āĻāχ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•āĻļāĻžāύ āĻšā§‡āχāύāĻŋāĻ‚ āϰ⧋āϧ āĻ•āϰāϤ⧇, āĻŽāĻŋāĻ¸ā§āĻ•āĻŋāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϕ⧇ āĻŦāϟ-āĻŦāĻžāĻ¨ā§āϧāĻŦ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āφāĻĒāύāĻžāϰ āĻŦāϟ āĻ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ⧎" flagAsCat: "āĻŦāĻŋ⧜āĻžāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" flagAsCatDescription: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋāϕ⧇ āĻŦāĻŋ⧜āĻžāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤" +flagShowTimelineReplies: "āϟāĻžāχāĻŽāϞāĻžāχāύ⧇ āύ⧋āϟāϗ⧁āϞāĻŋāϰ āϰāĻŋāĻĒā§āϞāĻžāχ āĻĻ⧇āĻ–āĻžāύ" +flagShowTimelineRepliesDescription: "āϚāĻžāϞ⧁ āĻ•āϰāϞ⧇, āϟāĻžāχāĻŽāϞāĻžāχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύ⧋āϟ āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āύ⧋āĻŸā§‡āϰ āϜāĻŦāĻžāĻŦāϗ⧁āϞ⧋ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤" autoAcceptFollowed: "āφāĻĒāύāĻŋ āϝ⧇āϏāĻŦ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύ, āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āϤāĻžāĻĻ⧇āϰ āĻ…āύ⧁āϏāϰāϪ⧇āϰ āĻ…āύ⧁āϰāϧ āĻ¸ā§āĻŦā§€āĻ•āĻžāϰ āĻ•āϰ⧁āύ" addAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϝ⧋āĻ— āĻ•āϰ⧁āύ" loginFailed: "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋ" @@ -297,8 +299,8 @@ disconnectedFromServer: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āϏāĻ‚āϝ⧋āĻ— āĻŦ reload: "āφāĻŦāĻžāϰ āϞ⧋āĻĄ āĻ•āϰ⧁āύ" doNothing: "āĻ•āĻŋāϛ⧁ āĻ•āϰāĻŦ⧇āύ āύāĻž" reloadConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āϰāĻŋāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āϚāĻžāύ?" -watch: "āĻĻ⧇āϖ⧁āύ" -unwatch: "āĻĻ⧇āĻ–āĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ " +watch: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāύ" +unwatch: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ“ā§ŸāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ " accept: "āĻ…āύ⧁āĻŽā§‹āĻĻāύ" reject: "āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ" normal: "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" @@ -345,6 +347,8 @@ hcaptchaSecretKey: "āϏāĻŋāĻ•ā§āϰ⧇āϟ āϕ⧀" recaptcha: "reCAPTCHA" enableRecaptcha: "reCAPTCHA āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" recaptchaSiteKey: "āϏāĻžāχāϟ āϕ⧀" +recaptchaSecretKey: "āϏāĻŋāĻ•ā§āϰ⧇āϟ āϕ⧀" +avoidMultiCaptchaConfirm: "āĻāĻ•āĻžāϧāĻŋāĻ• Captcha āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āϤāĻžāϰāĻž āĻĒāϰāĻ¸ā§āĻĒāϰ⧇āϰ āĻ•āĻžāĻœā§‡ āĻŦāĻžāϧāĻž āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ Captcha āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāϤ⧇ āϚāĻžāύ? āφāĻĒāύāĻŋ 'āĻŦāĻžāϤāĻŋāϞ' āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāĻ•āĻžāϧāĻŋāĻ• Captcha āϚāĻžāϞ⧁ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" antennas: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž" manageAntennas: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž" name: "āύāĻžāĻŽ" @@ -396,8 +400,56 @@ uploadFolder: "āφāĻĒāϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻĢā§‹āϞ cacheClear: "āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" markAsReadAllNotifications: "āϏāĻŽāĻ¸ā§āϤ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϗ⧁āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" markAsReadAllUnreadNotes: "āϏāĻŽāĻ¸ā§āϤ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +markAsReadAllTalkMessages: "āϏāĻŽāĻ¸ā§āϤ āĻŽā§‡āϏ⧇āϜ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +help: "āϏāĻšāĻžāϝāĻŧāϤāĻž" +inputMessageHere: "āĻāĻ–āĻžāύ⧇ āĻŽā§‡āϏ⧇āϜ āϞāĻŋāϖ⧁āύ" +close: "āĻŦāĻ¨ā§āϧ" +group: "āĻ—ā§āϰ⧁āĻĒ" +groups: "āĻ—ā§āϰ⧁āĻĒāϏāĻŽā§‚āĻš" +createGroup: "āĻ—ā§āϰ⧁āĻĒ āϤ⧈āϰ⧀ āĻ•āϰ⧁āύ" +ownedGroups: "āφāĻĒāύāĻžāϰ āĻ—ā§āϰ⧁āĻĒāϗ⧁āϞāĻŋ" +joinedGroups: "āϝ⧇āϏāĻŦ āĻ—ā§āϰ⧁āĻĒ⧇ āφāĻĒāύāĻŋ āφāϛ⧇āύ" invites: "āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ" +groupName: "āĻ—ā§āϰ⧁āĻĒ⧇āϰ āύāĻžāĻŽ" +members: "āϏāĻĻāĻ¸ā§āϝāĻŦ⧃āĻ¨ā§āĻĻ" +transfer: "āĻšāĻ¸ā§āϤāĻžāĻ¨ā§āϤāϰ" +messagingWithUser: "āĻĒā§āϰāĻžāχāϭ⧇āϟ āĻšā§āϝāĻžāϟ" +messagingWithGroup: "āĻ—ā§āϰ⧁āĻĒ āĻšā§āϝāĻžāϟ" +title: "āĻļāĻŋāϰ⧋āύāĻžāĻŽ" +text: "āĻĒāĻžāĻ ā§āϝ" +enable: "āϏāĻ•ā§āϰāĻŋ⧟" +next: "āĻĒāϰāĻŦāĻ°ā§āϤ⧀" +retype: "āĻĒ⧁āύāσ āĻĒā§āϰāĻŦ⧇āĻļ" +noteOf: "{user} āĻāϰ āύ⧋āϟ" +inviteToGroup: "āĻ—ā§āϰ⧁āĻĒ⧇ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ āϜāĻžāύāĻžāύ" +maxNoteTextLength: "āύ⧋āϟ āĻāϰ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ" +quoteAttached: "āωāĻĻā§āϧ⧃āϤ" +quoteQuestion: "āωāĻĻā§āϧ⧃āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ⧇āύ?" +noMessagesYet: "āϕ⧋āύ āĻŽā§‡āϏ⧇āϜ āύ⧇āχ" +newMessageExists: "āύāϤ⧁āύ āĻŽā§‡āϏ⧇āϜ āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +onlyOneFileCanBeAttached: "āφāĻĒāύāĻŋ āĻŽā§‡āϏ⧇āĻœā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ" +signinRequired: "āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āϞāĻ— āχāύ āĻ•āϰ⧁āύ" invitations: "āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ" +invitationCode: "āχāύāĻ­āĻžāχāϟ āϕ⧋āĻĄ" +checking: "āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇..." +available: "āωāĻĒāϞāĻŦā§āϧ" +unavailable: "āĻ…āύ⧁āĻĒāϞāĻŦā§āϧ" +usernameInvalidFormat: "āφāĻĒāύāĻŋ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ a-z, A-Z, 0-9, _ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ" +tooShort: "āϖ⧁āĻŦ āϛ⧋āϟ" +tooLong: "āϖ⧁āĻŦ āĻŦ⧜" +weakPassword: "āĻĻ⧁āĻ°ā§āĻŦāϞ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +normalPassword: "āϏāĻžāϧāĻžāϰāĻŖ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +strongPassword: "āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +passwordMatched: "āĻŽāĻŋāϞ⧇āϛ⧇" +passwordNotMatched: "āĻŽāĻŋāϞ⧇āύāĻŋ" +signinWith: "{x} āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ" +signinFailed: "āϞāĻ— āχāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻšā§‡āĻ• āĻ•āϰ⧁āύ." +tapSecurityKey: "āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧀ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ•āϰ⧁āύ" +or: "āĻ…āĻĨāĻŦāĻž" +language: "āĻ­āĻžāώāĻž" +uiLanguage: "UI āĻāϰ āĻ­āĻžāώāĻž" +groupInvited: "āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ—ā§āϰ⧁āĻĒ⧇ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇āύ" +aboutX: "{x} āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇" useOsNativeEmojis: "āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āύ⧇āϟāĻŋāĻ­ āχāĻŽā§‹āϜāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" disableDrawer: "āĻĄā§āϰāϝāĻŧāĻžāϰ āĻŽā§‡āύ⧁ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻŦ⧇āύ āύāĻž" youHaveNoGroups: "āφāĻĒāύāĻžāϰ āϕ⧋āύ āĻ—ā§āϰ⧁āĻĒ āύ⧇āχ " @@ -428,37 +480,704 @@ promotion: "āĻĒā§āϰāĻŽā§‹āĻļāύ" promote: "āĻĒā§āϰāϚāĻžāϰ āĻ•āϰ⧁āύ" numberOfDays: "āĻĻāĻŋāύ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" hideThisNote: "āύ⧋āϟāϟāĻŋ āϞ⧁āĻ•āĻžāύ" +showFeaturedNotesInTimeline: "āϟāĻžāχāĻŽāϞāĻžāχāύ⧇ āϏ⧁āĻĒāĻžāϰāĻŋāĻļāĻ•ā§ƒāϤ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻžāύ" +objectStorage: "āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ" +useObjectStorage: "āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ URLāĨ¤ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ CDN āĻŦāĻž āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ URL, S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/'āĨ¤" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ bucket āĻāϰ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύāĨ¤ " +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "āĻĢāĻžāχāϞāϏāĻŽā§‚āĻš āĻāχ prefix āϝ⧁āĻ•ā§āϤ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇āϰ āĻ…āϧ⧀āύ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" +objectStorageEndpoint: "āĻāĻ¨ā§āĻĄāĻĒā§Ÿā§‡āĻ¨ā§āϟ" +objectStorageEndpointDesc: "S3 āĻāϰ āϜāĻ¨ā§āϝ āĻĢāĻžāρāĻ•āĻž āϰāĻžāϖ⧁āύ, āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻāĻ¨ā§āĻĄāĻĒā§Ÿā§‡āĻ¨ā§āϟ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύāĨ¤ ''āĻŦāĻž': ' āĻšāĻŋāϏ⧇āĻŦ⧇ āϞāĻŋāϖ⧁āύāĨ¤" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'-āĻāϰ āĻŽāϤ⧋ āĻāĻ•āϟāĻŋ region āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ region āĻāϰ āϧāĻžāϰāĻŖāĻž āύāĻž āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻāϟāĻŋ āĻ–āĻžāϞāĻŋ āĻŦāĻž 'us-east-1' āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤" +objectStorageUseSSL: "SSL āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +objectStorageUseSSLDesc: "API āĻ•āĻžāύ⧇āĻ•āĻļāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϝāĻĻāĻŋ https āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +objectStorageUseProxy: "Proxy āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +objectStorageUseProxyDesc: "āφāĻĒāύāĻŋ API āϏāĻ‚āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ proxy āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰāϞ⧇, āĻāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύāĨ¤" +objectStorageSetPublicRead: "āφāĻĒāϞ⧋āĻĄā§‡āϰ āωāĻĒāϰ ''public-read' āϏ⧇āϟ āĻ•āϰ⧁āύ" +serverLogs: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϞāĻ—" +deleteAll: "āϏāĻŦ āĻŽā§āϛ⧁āύ" +showFixedPostForm: "āϟāĻžāχāĻŽāϞāĻžāχāύ⧇āϰ āĻļā§€āĻ°ā§āώ⧇ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāĻžāϰ āĻĢāĻ°ā§āĻŽāϟāĻŋ āĻĻ⧇āĻ–āĻžāύ" +newNoteRecived: "āύāϤ⧁āύ āύ⧋āϟ āφāϛ⧇" +sounds: "āĻļāĻŦā§āĻĻ" +listen: "āĻļ⧁āύ⧁āύ" +none: "āĻ•āĻŋāϛ⧁āχ āύāĻž" +showInPage: "āĻĒ⧇āĻœā§‡ āĻĻ⧇āĻ–āĻžāύ" +popout: "āĻĒāĻĒ-āφāωāϟ" +volume: "āφāĻ“ā§ŸāĻžāĻœā§‡āϰ āĻŽāĻžāĻ¤ā§āϰāĻž" +masterVolume: "āĻŽāĻžāĻ¸ā§āϟāĻžāϰ āφāĻ“ā§ŸāĻžāĻœā§‡āϰ āĻŽāĻžāĻ¤ā§āϰāĻž" +details: "āφāϰāĻ“ āϜāĻžāύ⧁āύ" +chooseEmoji: "āχāĻŽā§‹āϜāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +unableToProcess: "āĻ•āĻžāϜāϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋ" +recentUsed: "āϏāĻŽā§āĻĒā§āϰāϤāĻŋ āĻŦā§āϝāĻŦāĻšā§ƒāϤ" +install: "āχāĻ¨ā§āϏāϟāϞ" +uninstall: "āφāύāχāĻ¨ā§āϏāϟāϞ" +installedApps: "āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻĒāϏāĻŽā§‚āĻš" +nothing: "āĻāĻ–āĻžāύ⧇ āĻ•āĻŋāϛ⧁āχ āύāĻžāχ" +installedDate: "āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻžāϰ āϤāĻžāϰāĻŋāĻ–" +lastUsedDate: "āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻŦā§āϝāĻžāĻŦāĻšā§ƒāϤ" +state: "āĻ…āĻŦāĻ¸ā§āĻĨāĻž" +sort: "āϏāĻžāϜāĻžāύ" +ascendingOrder: "āϊāĻ°ā§āĻ§ā§āĻŦāĻ•ā§āϰāĻŽā§‡" +descendingOrder: "āύāĻŋāĻŽā§āύāĻ•ā§āϰāĻŽā§‡" +scratchpad: "āĻ¸ā§āĻ•ā§āĻ°ā§āϝāĻžāϚāĻĒā§āϝāĻžāĻĄ" +scratchpadDescription: "āĻ¸ā§āĻ•ā§āĻ°ā§āϝāĻžāϚāĻĒā§āϝāĻžāĻĄ AiScript-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻŽāĻŋāĻ¸ā§āĻ•āĻŋāϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰ⧇ āĻāĻŽāύ āϕ⧋āĻĄ āϞāĻŋāĻ–āϤ⧇, āϚāĻžāϞāĻžāϤ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" +output: "āφāωāϟāĻĒ⧁āϟ" +script: "āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ" +disablePagesScript: "āĻĒ⧇āϜāϗ⧁āϞ⧋āϤ⧇ AiScript āĻ…āĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ" +updateRemoteUser: "āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ" +deleteAllFiles: "āϏāĻ•āϞ āĻĢāĻžāχāϞ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧁āύ" +deleteAllFilesConfirm: "āϏāĻ•āϞ āĻĢāĻžāχāϞ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +removeAllFollowing: "āϏāĻ•āϞ āĻ…āύ⧁āϏāϰāĻŖ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧁āύ" +removeAllFollowingDescription: "{host} āĻāϰ āϏāĻ•āϞ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āφāϰ āĻĢāϞ⧋āĻ“ āĻ•āϰāĻŦ⧇āύ āύāĻž āĨ¤ āϝāĻĻāĻŋ āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏāϟāĻŋāϰ āϕ⧋āύ āϏāĻŽāĻ¸ā§āϝāĻž (āϝ⧇āĻŽāύāσ āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏāϟāĻŋ āφāϰ āύ⧇āχ) āĻšā§Ÿā§‡ āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĨ¤ " +userSuspended: "āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰāĻŋāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +userSilenced: "āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰāĻŋāϕ⧇ āĻŽāĻŋāωāϟ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +yourAccountSuspendedTitle: "āĻāχ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +yourAccountSuspendedDescription: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻļāĻ°ā§āϤāĻžāĻŦāϞ⧀ āϞāĻ™ā§āϘāύ⧇āϰ āĻŽāϤ⧋ āĻ•āĻžāϰāϪ⧇ āĻāχ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻļāĻžāϏāϕ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ āĨ¤ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇āύ āύāĻž āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āĨ¤" +menu: "āĻŽā§‡āύ⧁" +divider: "āĻ–āĻ¨ā§āĻĄāĻ•" +addItem: "āφāχāĻŸā§‡āĻŽ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +relays: "āϰāĻŋāϞ⧇āϗ⧁āϞāĻŋ" +addRelay: "āϰāĻŋāϞ⧇ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +inboxUrl: "inbox āĻāϰ URL" +addedRelays: "āϝ⧋āĻ—āĻ•ā§ƒāϤ āϰāĻŋāϞ⧇āϗ⧁āϞāĻŋ" +serviceworkerInfo: "āĻĒ⧁āĻļ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āϜāĻ¨ā§āϝ āϚāĻžāϞ⧁ āĻ•āϰāĻž āϞāĻžāĻ—āĻŦ⧇āĨ¤" +deletedNote: "āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻž āύ⧋āϟ" +invisibleNote: "āĻ…āĻĻ⧃āĻļā§āϝ āύ⧋āϟ" +enableInfiniteScroll: "āχāύāĻĢāĻŋāύāĻŋāϟ āĻ¸ā§āĻ•ā§āϰāϞ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +visibility: "āĻĻ⧃āĻļā§āϝāĻŽāĻžāύāϤāĻž" +poll: "āϜāϰāĻŋāĻĒ" +useCw: "āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āϞ⧁āĻ•āĻžāύ" +enablePlayer: "āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āĻ˛ā§‡ā§ŸāĻžāϰ āϖ⧁āϞ⧁āύ" +disablePlayer: "āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āĻ˛ā§‡ā§ŸāĻžāϰ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +expandTweet: "āϟ⧁āχāϟ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻ•āϰ⧁āύ" +themeEditor: "āĻĨāĻŋāĻŽ āϏāĻŽā§āĻĒāĻžāĻĻāĻ•" +description: "āĻŦāĻ°ā§āĻŖāύāĻž" +describeFile: "āĻ•ā§āϝāĻžāĻĒāĻļāύ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +enterFileDescription: "āĻ•ā§āϝāĻžāĻĒāĻļāύ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +author: "āϞ⧇āĻ–āĻ•" +leaveConfirm: "āĻ•āĻŋāϛ⧁ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϏ⧇āĻ­ āĻ•āϰāĻž āĻšā§ŸāύāĻŋāĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āϚāϞ⧇ āϝ⧇āϤ⧇ āϚāĻžāύ?" +manage: "āĻĒāϰāĻŋāϚāĻžāϞāύāĻž" +plugins: "āĻĒā§āϞāĻžāĻ—āχāύāϏāĻŽā§‚āĻš" +deck: "āĻĄā§‡āĻ•" +undeck: "āĻĄā§‡āĻ•āĻŽā§āĻ•ā§āϤ āĻ•āϰ⧁āύ" +useBlurEffectForModal: "āĻŽā§‹āĻĄāĻžāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϞāĻžāϰ āχāĻĢ⧇āĻ•ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +useFullReactionPicker: "āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϝ⧁āĻ•ā§āϤ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻŋāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +width: "āĻĒā§āϰāĻ¸ā§āĻĨ" +height: "āωāĻšā§āϚāϤāĻž" +large: "āĻŦ⧜" +medium: "āĻŽāĻžāĻāĻžāϰāĻŋ" +small: "āϛ⧋āϟ" +generateAccessToken: "āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŸā§‹āϕ⧇āύ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +permission: "āĻ…āύ⧁āĻŽāϤāĻŋ" +enableAll: "āϏāĻŦāϗ⧁āϞāĻŋ āϏāĻ•ā§āϰāĻŋ⧟ āĻ•āϰ⧁āύ" +disableAll: "āϏāĻŦāϗ⧁āϞāĻŋ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋ⧟ āĻ•āϰ⧁āύ" +tokenRequested: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻŦ⧇āύ" +pluginTokenRequestedDescription: "āĻāχ āĻĒā§āϞāĻžāĻ—āχāύāϟāĻŋ āĻāĻ–āĻžāύ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻ…āύ⧁āĻŽā§āϤāĻŋāϏāĻŽā§‚āĻš āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇" +notificationType: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āϧāϰāύ" +edit: "āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž" +useStarForReactionFallback: "āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āχāĻŽā§‹āϜāĻŋ āύāĻž āϜāĻžāύāϞ⧇ ★ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +emailServer: "āχāĻŽā§‡āχāϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ" +enableEmail: "āχāĻŽā§‡āχāϞ āĻŦāĻŋāϤāϰāĻŖ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +emailConfigInfo: "āφāĻĒāύāĻžāϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ" +email: "āχāĻŽā§‡āχāϞ" +emailAddress: "āχāĻŽā§‡āχāϞ āĻ āĻŋāĻ•āĻžāύāĻž" +smtpConfig: "SMTP āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ" smtpHost: "āĻšā§‹āĻ¸ā§āϟ" +smtpPort: "āĻĒā§‹āĻ°ā§āϟ" smtpUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ" smtpPass: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ" +emptyToDisableSmtpAuth: "āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĢāĻžāρāĻ•āĻž āϰ⧇āϖ⧇ SMTP āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" +smtpSecure: "SMTP āϏāĻ‚āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ SSL/TLS āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +smtpSecureInfo: "STARTTLS āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύāĨ¤" +testEmail: "āχāĻŽā§‡āϞ āĻŦāĻŋāϤāϰāĻŖ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ" +wordMute: "āĻŦāĻŋāĻļ⧇āώ āϕ⧋āύ āĻļāĻŦā§āĻĻāϕ⧇ āĻŽāĻŋāωāϟ āĻ•āϰ⧁āύ" +instanceMute: "āĻŽāĻŋāωāϟ āĻ•āϰāĻž āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏāϗ⧁āϞāĻŋ" +userSaysSomething: "{name} āĻ•āĻŋāϛ⧁ āĻŦāϞ⧇āϛ⧇" +makeActive: "āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž" +display: "āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ" +copy: "āĻ…āύ⧁āϞāĻŋāĻĒāĻŋ" +metrics: "āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ" +overview: "āϏāĻžāϰāĻžāĻ‚āĻļ" +logs: "āϞāĻ—" +delayed: "āĻĻ⧇āϰāĻŋ āĻ•āϰ⧁āύ" +database: "āĻĄā§‡āϟāĻžāĻŦ⧇āϜ" +channel: "āĻšā§āϝāĻžāύ⧇āϞāϗ⧁āϞāĻŋ" +create: "āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +notificationSetting: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āϏ⧇āϟāĻŋāĻ‚āϏ" +notificationSettingDesc: "āĻ•āĻŋ āϧāϰāύ⧇āϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻŦ⧇āύ āϤāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ" +useGlobalSetting: "āĻ—ā§āϞ⧋āĻŦāĻžāϞ āϏ⧇āϟāĻŋāĻ‚āϏ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +useGlobalSettingDesc: "āϚāĻžāϞ⧁ āĻ•āϰāϞ⧇, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āϏ⧇āϟāĻŋāĻ‚āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇, āĻāϟāĻŋ āĻĒ⧃āĻĨāĻ•āĻ­āĻžāĻŦ⧇ āϏ⧇āϟ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" +other: "āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ" +regenerateLoginToken: "āϞāĻ—āχāύ āĻŸā§‹āϕ⧇āύ āφāĻŦāĻžāϰ āĻŦāĻžāύāĻžāύ" +regenerateLoginTokenDescription: "āϞāĻ— āχāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻŸā§‹āϕ⧇āύ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āφāĻĒāύāĻžāϰ āĻāϟāĻŋ āĻ•āϰāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχāĨ¤ āĻāϟāĻŋ āĻ•āϰāϞ⧇, āφāĻĒāύāĻŋ āϏāĻŽāĻ¸ā§āϤ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϞāĻ— āφāωāϟ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āύ⧎" +setMultipleBySeparatingWithSpace: "āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒ⧇āϏ āĻĻāĻŋāϝāĻŧ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" +fileIdOrUrl: "āĻĢāĻžāχāϞ ID āĻ…āĻĨāĻŦāĻž URL" +behavior: "āφāϚāϰāĻŖ" +sample: "āωāĻĻāĻžāĻšāϰāĻŖ" +abuseReports: "āĻ…āĻ­āĻŋāϝ⧋āĻ—" +reportAbuse: "āĻ…āĻ­āĻŋāϝ⧋āĻ—" +reportAbuseOf: "{name} āĻ āĻ…āĻ­āĻŋāϝ⧋āĻ— āĻ•āϰ⧁āύ" +fillAbuseReportDescription: "āϰāĻŋāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āĻ•āĻžāϰāĻŖ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧁āύ. āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āύ⧋āϟ āĻāϰ āϜāĻ¨ā§āϝ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāϟāĻŋ āĻšā§Ÿā§‡ āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āϤāĻžāϰ URL āϟāĻŋ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤ " +abuseReported: "āφāĻĒāύāĻžāϰ āĻ…āĻ­āĻŋāϝ⧋āĻ—āϟāĻŋ āĻĻāĻžāĻ–āĻŋāϞ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻāĨ¤" +reporter: "āĻ…āĻ­āĻŋāϝ⧋āĻ—āĻ•āĻžāϰ⧀" +reporteeOrigin: "āĻ…āĻ­āĻŋāϝ⧋āĻ—āϟāĻŋāϰ āĻ‰ā§ŽāϏ" +reporterOrigin: "āĻ…āĻ­āĻŋāϝ⧋āĻ—āĻ•āĻžāϰ⧀āϰ āĻ‰ā§ŽāϏ" +forwardReport: "āϰāĻŋāĻŽā§‹āϟ āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏ⧇ āĻ…āĻ­āĻŋāϝ⧋āĻ—āϟāĻŋ āĻĒāĻžāĻ āĻžāύ" +forwardReportIsAnonymous: "āφāĻĒāύāĻžāϰ āϤāĻĨā§āϝ āϰāĻŋāĻŽā§‹āϟ āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāĻŦ⧇āĨ¤" +send: "āĻĒāĻžāĻ āĻžāύ" +abuseMarkAsResolved: "āĻ…āĻ­āĻŋāϝ⧋āĻ—āϟāĻŋāϕ⧇ āϏāĻŽāĻžāϧāĻžāĻ•ā§ƒāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +openInNewTab: "āύāϤ⧁āύ āĻŸā§āϝāĻžāĻŦ⧇ āϖ⧁āϞ⧁āύ" +openInSideView: "āϏāĻžāχāĻĄ āĻ­āĻŋāωāϤ⧇ āϖ⧁āϞ⧁āύ" +defaultNavigationBehaviour: "āĻĄāĻŋāĻĢāĻ˛ā§āϟ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ" +editTheseSettingsMayBreakAccount: "āĻāϏāĻŦ āϏ⧇āϟāĻŋāĻ‚āϏ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāϞ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āĻ•ā§āώāϤāĻŋ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ " +instanceTicker: "āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏ⧇ āύ⧋āĻŸā§‡āϰ āϤāĻĨā§āϝ" +waitingFor: "{x} āĻāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" +random: "āĻ°â€ā§āϝāĻžāĻ¨ā§āĻĄāĻŽ" +system: "āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ" +switchUi: "UI āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ" +desktop: "āĻĄā§‡āĻ¸ā§āĻ•āϟāĻĒ" +clip: "āĻ•ā§āϞāĻŋāĻĒ" +createNew: "āύāϤ⧁āύ" +optional: "āĻĒā§āϰāϝāĻŧā§‹āϜāĻ¨ā§€ā§Ÿ āύ⧟" +createNewClip: "āύāϤ⧁āύ āĻ•ā§āϞāĻŋāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +public: "āϏāĻ°ā§āĻŦāϜāύ⧀āύ" +i18nInfo: "Misskey āĻ¸ā§āĻŦ⧇āĻšā§āĻ›āĻžāϏ⧇āĻŦāĻ•āĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ­āĻžāώāĻžāϝāĻŧ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇āĨ¤ āφāĻĒāύāĻŋ {link} āĻ āĻ—āĻŋā§Ÿā§‡ āĻ…āύ⧁āĻŦāĻžāĻĻ⧇ āϏāĻšāϝ⧋āĻ—āĻŋāϤāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" +manageAccessTokens: "āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŸā§‹āϕ⧇āύ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ" +accountInfo: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϤāĻĨā§āϝ" +notesCount: "āύ⧋āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +repliesCount: "āϜāĻŦāĻžāĻŦ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +renotesCount: "āϰāĻŋāύ⧋āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +repliedCount: "āϜāĻŦāĻžāĻŦ āĻ—ā§āϰāĻšāύ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +renotedCount: "āϰāĻŋāύ⧋āϟ āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +followingCount: "āϝāĻžāĻĻ⧇āϰāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύ, āϤāĻžāĻĻ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +followersCount: "āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +sentReactionsCount: "āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻžāĻ āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇" +receivedReactionsCount: "āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +pollVotesCount: "āĻĒā§‹āϞ āĻ­ā§‹āϟ āĻĻāĻŋā§Ÿā§‡āϛ⧇āύ" +pollVotedCount: "āĻĒā§‹āϞ āĻ­ā§‹āϟ āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +yes: "āĻšā§āϝāĻžāρ" +no: "āύāĻž" +driveFilesCount: "āĻĄā§āϰāĻžāχāϭ⧇ āĻĢāĻžāχāϞ āĻāϰ āϏāĻ‚āĻ–ā§āϝāĻž" +driveUsage: "āĻĄā§āϰāĻžāχāĻ­ āĻāϰ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ" +noCrawle: "āĻ•ā§āϰāϞāĻžāϰ āχāĻ¨ā§āĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +noCrawleDescription: "āϏāĻžāĻ°ā§āϚ āχāĻžā§āϜāĻŋāύāϗ⧁āϞāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ, āύ⧋āϟ, āĻĒ⧇āϜ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āχāύāĻĄā§‡āĻ•ā§āϏ āĻ•āϰāϤ⧇ āύāĻŋāώ⧇āϧ āĻ•āϰ⧁āύāĨ¤ " +lockedAccountInfo: "āĻāĻŽāύāĻ•āĻŋ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻŦ⧇āϛ⧇ āĻŦ⧇āϛ⧇ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻ•āϰāϞ⧇āĻ“, āϝ⧇ āϕ⧇āω āφāĻĒāύāĻžāϰ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇, āϝāϤāĻ•ā§āώāĻŖ āύāĻž āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āύ⧋āϟāϗ⧁āϞāĻŋāϕ⧇ \"āĻ…āύ⧁āϏāĻžāϰ⧀āĻĻ⧇āϰ āϜāĻ¨ā§āϝ\" āĻšāĻŋāϏāĻžāĻŦ⧇ āϏ⧇āϟ āύāĻž āĻ•āϰ⧇āύ⧎" +alwaysMarkSensitive: "āϏāĻ°ā§āĻŦāĻĻāĻž āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāϤāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +loadRawImages: "āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ›āĻŦāĻŋāϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞāϟāĻŋ āĻĻ⧇āĻ–āĻžāύāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āφāϏāϞ āĻ›āĻŦāĻŋ āĻĻ⧇āĻ–āĻžāύ" +disableShowingAnimatedImages: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻŸā§‡āĻĄ āϚāĻŋāĻ¤ā§āϰ āĻĻ⧇āĻ–āĻžāύ⧋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +verificationEmailSent: "āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ āχāĻŽā§‡āϞ āĻĒāĻžāĻ āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇āĨ¤ āϏ⧇āϟāφāĻĒ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰāϤ⧇ āχāĻŽā§‡āϞ āĻāϰ āϞāĻŋāĻ™ā§āĻ• āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύāĨ¤" +notSet: "āϏ⧇āϟ āĻ•āϰāĻž āĻšā§ŸāύāĻŋ" +emailVerified: "āχāĻŽā§‡āχāϞ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +noteFavoritesCount: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž āύ⧋āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +pageLikesCount: "āĻĒ⧇āϜ āϞāĻžāχāĻ• āĻ•āϰ⧇āϛ⧇āύ" +pageLikedCount: "āĻĒ⧇āϜ āϞāĻžāχāĻ• āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +contact: "āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ āϏāĻŽā§‚āĻš" +useSystemFont: "āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĢāĻ¨ā§āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +clips: "āĻ•ā§āϞāĻŋāĻĒāϗ⧁āϞāĻŋ " +experimentalFeatures: "āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϗ⧁āϞāĻŋ" +developer: "āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ" +makeExplorable: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ \"āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ\" āĻĒ⧃āĻˇā§āĻ āĻžā§Ÿ āĻĻ⧇āĻ–āĻžāύ" +makeExplorableDescription: "āφāĻĒāύāĻŋ āĻāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ \"āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ\" āĻĒ⧃āĻˇā§āĻ āĻžā§Ÿ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāĻŦ⧇ āύāĻžāĨ¤" +showGapBetweenNotesInTimeline: "āϟāĻžāχāĻŽāϞāĻžāχāύ āĻāĻŦāĻ‚ āύ⧋āĻŸā§‡āϰ āĻŽāĻžāĻā§‡ āĻĢāĻžāĻ•āĻž āϜāĻžā§ŸāĻ—āĻž āϰāĻžāϖ⧁āύ" +duplicate: "āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ" +left: "āĻŦāĻžāĻŽ" +center: "āĻŽāĻžāĻāĻ–āĻžāύ" +wide: "āϚāĻ“ā§œāĻž" +narrow: "āϏāĻ‚āϕ⧀āĻ°ā§āĻŖ" +reloadToApplySetting: "āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āϰāĻŋāϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒāϰ āϏ⧇āϟāĻŋāĻ‚āϏāϟāĻŋ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāĻ–āύ āϰāĻŋāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +needReloadToApply: "āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āϰāĻŋāϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒāϰ āϏ⧇āϟāĻŋāĻ‚āϏāϟāĻŋ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" +showTitlebar: "āϟāĻžāχāĻŸā§‡āϞ āĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāύ" clearCache: "āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +onlineUsersCount: "{n} āϜāύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…āύāϞāĻžāχāύ" +nUsers: "{n} āϜāύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀" +nNotes: "{n} āϟāĻŋ āύ⧋āϟ" +sendErrorReports: "āĻ•ā§āϰ⧁āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ āĻĒāĻžāĻ āĻžāύ" +sendErrorReportsDescription: "āϚāĻžāϞ⧁ āĻĨāĻžāĻ•āϞ⧇, āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϤāĻĨā§āϝ Misskey-āĻāϰ āϏāĻžāĻĨ⧇ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϝāĻž āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰāϟāĻŋāϰ āϗ⧁āĻŖāĻŽāĻžāύ āωāĻ¨ā§āύāϤ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇āĨ¤ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϤāĻĨā§āϝ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ OS āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ, āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇āϰ āϧāϰāύ, āĻ•āĻ°ā§āĻŽā§‡āϰ āχāϤāĻŋāĻšāĻžāϏ āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤" +myTheme: "āφāĻŽāĻžāϰ āĻĨāĻŋāĻŽ" +backgroundColor: "āĻĒāϟāĻ­ā§‚āĻŽāĻŋāϰ āϰāĻ‚" +accentColor: "āĻāĻ•ā§āϏ⧇āĻ¨ā§āĻŸā§‡āϰ āϰāĻ‚" +textColor: "āϞ⧇āĻ–āĻžāϰ āϰāĻ‚" +saveAs: "āĻāχāϰ⧂āĻĒ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ" +advanced: "āωāĻ¨ā§āύāϤ" +value: "āĻŽāĻžāύ" +createdAt: "āϤ⧈āϰāĻŋ āĻšā§Ÿā§‡āϛ⧇" +updatedAt: "āĻļ⧇āώ āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻ āĻšāϝāĻŧ⧇āϛ⧇" +saveConfirm: "āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +deleteConfirm: "āφāϏāϞ⧇āχ āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āϚāĻžāύ?" +invalidValue: "āĻ…āĻ—ā§āϰāĻšāĻŖāϝ⧋āĻ—ā§āϝ āĻŽāĻžāύ" +registry: "āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ" +closeAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +currentVersion: "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ" +latestVersion: "āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ" +youAreRunningUpToDateClient: "āφāĻĒāύāĻŋ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āύāϤ⧁āύ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύ" +newVersionOfClientAvailable: "āφāĻĒāύāĻžāϰ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ­āĻžāĻ°ā§āϏāύ āϚāϞ⧇ āĻāϏ⧇āϛ⧇" +usageAmount: "āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ" +capacity: "āϧāĻžāϰāĻŖāĻ•ā§āώāĻŽāϤāĻž" +inUse: "āĻŦā§āϝāĻŦāĻšā§ƒāϤ" +editCode: "āϕ⧋āĻĄ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ" +apply: "āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ" +receiveAnnouncementFromInstance: "āĻāχ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻĨ⧇āϕ⧇ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāύ" +emailNotification: "āχāĻŽā§‡āχāϞ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" +publish: "āĻĒā§āϰāĻ•āĻžāĻļ" +inChannelSearch: "āĻšā§āϝāĻžāύ⧇āϞ⧇ āϖ⧁āρāϜ⧁āύ" +useReactionPickerForContextMenu: "āϰāĻžāχāϟ āĻ•ā§āϞāĻŋāϕ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻŋāĻ•āĻžāϰ āϖ⧁āϞ⧁āύ" +typingUsers: "{users} āϞ⧇āĻ–āϛ⧇" +jumpToSpecifiedDate: "āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϤāĻžāϰāĻŋāϖ⧇ āϝāĻžāύ" +showingPastTimeline: "āĻ…āϤ⧀āϤ⧇āϰ āϟāĻžāχāĻŽāϞāĻžāχāύ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇" +clear: "āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ" +markAllAsRead: "āϏāĻŦ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +goBack: "āĻĒāĻŋāĻ›āύ⧇" +unlikeConfirm: "āφāϏāϞ⧇āχ āϞāĻžāχāĻ• āϏāϰāĻŋā§Ÿā§‡ āύāĻŋāĻŦ⧇āύ?" +fullView: "āĻĢ⧁āϞ āĻ­āĻŋāω" +quitFullView: "āĻĢ⧁āϞ āĻ­āĻŋāω āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +addDescription: "āĻŦāĻ°ā§āĻŖāύāĻž āϝ⧋āĻ— āĻ•āϰ⧁āύ" +userPagePinTip: "āφāĻĒāύāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āύ⧋āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻŽā§‡āύ⧁ āĻĨ⧇āϕ⧇ \"āĻĒā§āϰ⧋āĻĢāĻžāχāϞ⧇ āĻĒāĻŋāύ āĻ•āϰ⧁āύ\" āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āύ⧋āϟāϗ⧁āϞāĻŋ āĻāĻ–āĻžāύ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" +notSpecifiedMentionWarning: "āĻĒā§āϰāĻžāĻĒāĻ• āĻ›āĻžā§œāĻžāĻ“ āĻāχ āύ⧋āĻŸā§‡ āĻ…āĻ¨ā§āϝ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āωāĻ˛ā§āϞ⧇āĻ–ā§āϝ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" info: "āφāĻĒāύāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇" +userInfo: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ" +unknown: "āĻ…āϜāĻžāύāĻž" +onlineStatus: "āĻ…āύāϞāĻžāχāύ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ" +hideOnlineStatus: "āĻ…āύāϞāĻžāχāύ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϞ⧁āĻ•āĻžāύ" +hideOnlineStatusDescription: "āĻ…āύāϞāĻžāχāύ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϞ⧁āĻ•āĻŋāϝāĻŧ⧇ āϰāĻžāĻ–āϞ⧇ āϏāĻžāĻ°ā§āĻšā§‡āϰ āĻŽāϤ⧋ āĻ•āĻŋāϛ⧁ āĻĢāĻžāĻ‚āĻļāύ⧇āϰ āϏ⧁āĻŦāĻŋāϧāĻž āĻ•āĻŽā§‡ āϝāĻžā§ŸāĨ¤" +online: "āĻ…āύāϞāĻžāχāύ" +active: "āĻ…ā§āϝāĻžāĻ•āϟāĻŋāĻ­" +offline: "āĻ…āĻĢāϞāĻžāχāύ" +notRecommended: "āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž" +botProtection: "āĻŦāϟ āĻĒā§āϰ⧋āĻŸā§‡āĻ•āĻļāύ" +instanceBlocking: "āĻŦā§āϞāĻ• āĻ•āϰāĻž āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏāϗ⧁āϞāĻŋ" +selectAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ" +switchAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĒāĻžāĻ˛ā§āϟāĻžāύ" +enabled: "āϚāĻžāϞ⧁" +disabled: "āĻŦāĻ¨ā§āϧ" +quickAction: "āϕ⧁āχāĻ• āĻ…ā§āϝāĻžāĻ•āĻļāύ" user: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āĻŖ" +administration: "āĻĒāϰāĻŋāϚāĻžāϞāύāĻž" +accounts: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋ" +switch: "āĻĒāĻžāĻ˛ā§āϟāĻžāύ" +noMaintainerInformationWarning: "āĻĒā§āϰāĻļāĻžāϏāϕ⧇āϰ āϤāĻĨā§āϝ āϏ⧇āϟ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤" +noBotProtectionWarning: "āĻŦāϟ āĻĒā§āϰ⧋āĻŸā§‡āĻ•āĻļāύ āϏ⧇āϟ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤" +configure: "āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ" +postToGallery: "āĻ—ā§āϝāĻžāϞāĻžāϰ⧀ āĻĒā§‹āĻ¸ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +gallery: "āĻ—ā§āϝāĻžāϞāĻžāϰ⧀" +recentPosts: "āύāϤ⧁āύ āĻĒā§‹āĻ¸ā§āϟ" +popularPosts: "āϜāύāĻĒā§āϰāĻŋ⧟ āĻĒā§‹āĻ¸ā§āϟ" +shareWithNote: "āύ⧋āĻŸā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰ⧁āύ" +ads: "āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāύ" +expiration: "āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž" +memo: "āĻŽā§‡āĻŽā§‹" +priority: "āĻ…āĻ—ā§āϰāĻžāϧāĻŋāĻ•āĻžāϰ" +high: "āωāĻšā§āϚ" +middle: "āĻŽāĻžāĻāĻžāϰāĻŋ" +low: "āύāĻŋāĻŽā§āύ" +emailNotConfiguredWarning: "āχāĻŽā§‡āχāϞ āĻ…ā§āϝāĻžāĻĄā§āϰ⧇āϏ āϏ⧇āϟ āĻ•āϰāĻž āĻšā§ŸāύāĻŋāĨ¤" +ratio: "āĻ…āύ⧁āĻĒāĻžāϤ" +previewNoteText: "āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻĻ⧇āĻ–āĻžāύ" +customCss: "āĻ•āĻžāĻ¸ā§āϟāĻŽ CSS" +customCssWarn: "āĻāχ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āύāĻž āĻĨāĻžāĻ•āϞ⧇ āĻāχ āϏ⧇āϟāĻŋāĻ‚āϟāĻŋ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤ āĻ…āύ⧁āĻĒāϝ⧁āĻ•ā§āϤ āϏ⧇āϟāĻŋāĻ‚āϏ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϕ⧇ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻŦāĻžāϧāĻž āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" +global: "āĻ—ā§āϞ⧋āĻŦāĻžāϞ" +squareAvatars: "āϚāĻžāϰāϕ⧋āύāĻž āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĒāĻŋāĻ•āϚāĻžāϰ āĻĻ⧇āĻ–āĻžāύ " +sent: "āĻĒāĻžāĻ āĻžāύ" +received: "āĻĒā§āϰāĻžāĻĒā§āϤ" +searchResult: "āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ⧇āϰ āĻĢāϞāĻžāĻĢāϞ" +hashtags: "āĻšā§āϝāĻžāĻļāĻŸā§āϝāĻžāĻ—" +troubleshooting: "āĻŸā§āϰāĻžāĻŦāϞāĻļ⧁āϟāĻŋāĻ‚" +useBlurEffect: "UI āϤ⧇ āĻŦā§āϞāĻžāϰ āχāĻĢ⧇āĻ•ā§āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +learnMore: "āφāϰāĻ“ āϜāĻžāύ⧁āύ" +misskeyUpdated: "Misskey āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇īŧ" +whatIsNew: "āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻžāύ" +translate: "āĻ…āύ⧁āĻŦāĻžāĻĻ" +translatedFrom: "{x} āĻšāϤ⧇ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰāĻž" +accountDeletionInProgress: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻšā§āϛ⧇" +usernameInfo: "āĻāĻ•āϟāĻŋ āύāĻžāĻŽ āϝāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋāϕ⧇ āĻ…āύāĻ¨ā§āϝāĻ­āĻžāĻŦ⧇ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻŦāĻ°ā§āĻŖāĻŽāĻžāϞāĻž (a ~ z, A ~ Z), āϏāĻ‚āĻ–ā§āϝāĻž (0 ~ 9), āĻāĻŦāĻ‚ āφāĻ¨ā§āĻĄāĻžāϰāĻ¸ā§āϕ⧋āϰ (_) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻĒāϰ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤" +aiChanMode: "Ai āĻŽā§‹āĻĄ" +keepCw: "CW āϰāĻžāϖ⧁āύ" +pubSub: "Pub/Sub āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞ⧋" +lastCommunication: "āĻļ⧇āώ āϝ⧋āĻ—āĻžāϝ⧋āĻ—" +resolved: "āϏāĻŽāĻžāϧāĻžāύ āĻšāϝāĻŧ⧇āϛ⧇" +unresolved: "āϏāĻŽāĻžāϧāĻžāύ āĻšāϝāĻŧāύāĻŋ" +breakFollow: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻŦāĻ¨ā§āϧ" +itsOn: "āϚāĻžāϞ⧁" +itsOff: "āĻŦāĻ¨ā§āϧ" +emailRequiredForSignup: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋāϰ āϜāĻ¨ā§āϝ āχāĻŽā§‡āχāϞ āĻāϰ āĻĻāϰāĻ•āĻžāϰ āĻĒ⧜āĻŦ⧇" +unread: "āĻ…āĻĒāĻ āĻŋāϤ" +filter: "āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ" controlPanel: "āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāύ āϕ⧇āĻ¨ā§āĻĻā§āϰ" +manageAccounts: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ" +makeReactionsPublic: "āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āχāϤāĻŋāĻšāĻžāϏ āωāĻ¨ā§āĻŽā§āĻ•ā§āϤ āĻ•āϰ⧁āύ" +makeReactionsPublicDescription: "āφāĻĒāύāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύāϗ⧁āϞāĻŋāϰ āϤāĻžāϞāĻŋāĻ•āĻž āϝ⧇ āĻ•āĻžāϰāĻ“ āĻ•āĻžāϛ⧇ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻšāĻŦ⧇āĨ¤" +classic: "āĻ•ā§āϞāĻžāϏāĻŋāĻ•" +muteThread: "āĻĨā§āϰ⧇āĻĄ āĻŽāĻŋāωāϟ āĻ•āϰ⧁āύ" +unmuteThread: "āĻĨā§āϰ⧇āĻĄ āφāύāĻŽāĻŋāωāϟ āĻ•āϰ⧁āύ" +ffVisibility: "āĻ…āύ⧁āϏāϰāĻŖ/āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĻ⧃āĻļā§āϝāĻŽāĻžāĻ¨ā§āϝāϤāĻž" +ffVisibilityDescription: "āφāĻĒāύāĻŋ āĻ•āĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύ āĻāĻŦāĻ‚ āϕ⧇ āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇, āϏ⧇āϟāĻž āĻ•āĻžāϰāĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇ āϤāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤" +continueThread: "āφāϰ⧋ āĻĨā§āϰ⧇āĻĄ āĻĻ⧇āϖ⧁āύ" +deleteAccountConfirm: "āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇āĨ¤ āĻ āĻŋāĻ• āφāϛ⧇?" +incorrectPassword: "āφāĻĒāύāĻžāϰ āĻĻ⧇āĻ“ā§ŸāĻž āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ āϭ⧁āϞāĨ¤" +voteConfirm: "\"{choice}\" āĻ āĻ­ā§‹āϟ āĻĻāĻŋāϤ⧇ āϚāĻžāύīŧŸ" +hide: "āϞ⧁āĻ•āĻžāύ" +leaveGroup: "āĻ—ā§āϰ⧁āĻĒ āĻ›ā§‡ā§œā§‡ āϚāϞ⧇ āϝāĻžāύ" +leaveGroupConfirm: "\"{name}\" āĻ—ā§āϰ⧁āĻĒ āĻ›ā§‡ā§œā§‡ āϚāϞ⧇ āϝ⧇āϤ⧇ āϚāĻžāύ?" +useDrawerReactionPickerForMobile: "āĻŽā§‹āĻŦāĻžāχāϞ⧇ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻŋāĻ•āĻžāϰāϕ⧇ āĻĄā§āϰāϝāĻŧāĻžāϰ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧁āύ" +welcomeBackWithName: "āφāĻŦāĻžāϰ āĻ¸ā§āĻŦāĻžāĻ—āϤāĻŽ, {name}" +clickToFinishEmailVerification: " [{ok}] āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύāĨ¤" +_emailUnavailable: + used: "āĻāχ āχāĻŽā§‡āχāϞ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻŋ āχāϤ⧋āĻŽāĻ§ā§āϝ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§Ÿā§‡āϛ⧇" + format: "āĻāχ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻŋ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϞāĻŋāĻ–āĻž āĻšā§ŸāύāĻŋ" + disposable: "āĻ…āĻ¸ā§āĻĨāĻžā§Ÿā§€ āχāĻŽā§‡āχāϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻž" + mx: "āχāĻŽā§‡āχāϞ ​​āϏāĻžāĻ°ā§āĻ­āĻžāϰāϟāĻŋ āĻ āĻŋāĻ• āύāĻžāχ" + smtp: "āχāĻŽā§‡āχāϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϟāĻŋ āϏāĻžā§œāĻž āĻĻāĻŋāĻšā§āϛ⧇ āύāĻž" +_ffVisibility: + public: "āĻĒā§āϰāĻ•āĻžāĻļ" + followers: "āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ" + private: "āĻŦā§āϝāĻžāĻ•ā§āϤāĻŋāĻ—āϤ" +_signup: + almostThere: "āĻĒā§āϰāĻžāϝāĻŧ āĻļ⧇āώ" + emailAddressInfo: "āφāĻĒāύāĻŋ āϝ⧇ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϏ⧇āϟāĻŋ āϞāĻŋāϖ⧁āύāĨ¤ āφāĻĒāύāĻžāϰ āχāĻŽā§‡āχāϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻžāĨ¤" + emailSent: "āφāĻĒāύāĻžāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ ({email}) āĻāĻ•āϟāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ āχāĻŽā§‡āϞ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰāϤ⧇ āχāĻŽā§‡āϞ⧇āϰ āϞāĻŋāĻ™ā§āĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰ⧁āύāĨ¤" +_accountDelete: + accountDelete: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞ⧁āύ" + mayTakeTime: "āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻāĻ•āϟāĻŋ āĻĻā§€āĻ°ā§āϘ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒā§āϰāϚ⧁āϰ āĻĒāϰāĻŋāĻŽāĻžāϪ⧇ āϏāĻžāĻŽāĻ—ā§āϰ⧀ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻĨāĻžāϕ⧇āύ āĻŦāĻž āĻĢāĻžāχāϞ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇āύ āϤāĻŦ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϤ⧇ āĻĻā§€āĻ°ā§āϘ āϏāĻŽāϝāĻŧ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" + sendEmail: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϞ⧇, āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāĻŦ⧇āĨ¤" + requestAccountDelete: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧁āύ" + started: "āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ⧇āϛ⧇āĨ¤" + inProgress: "āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻ•āĻžāϜ āϚāϞāϛ⧇" +_ad: + back: "āĻĒāĻŋāĻ›āύ⧇" + reduceFrequencyOfThisAd: "āĻāχ āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāύāϟāĻŋ āĻ•āĻŽ āĻĻ⧇āĻ–āĻžāύ" +_forgotPassword: + enterEmail: "āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϞāĻŋāϖ⧁āύ. āϏ⧇āχ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāϏ⧇āϟ āϞāĻŋāĻ™ā§āĻ• āĻĒāĻžāĻ āĻžāύ⧋ āĻšāĻŦ⧇āĨ¤" + ifNoEmail: "āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧāύ⧇āϰ āϏāĻŽā§Ÿ āχ-āĻŽā§‡āχāϞ āĻ āĻŋāĻ•āĻžāύāĻž āύāĻž āĻĻāĻŋā§Ÿā§‡ āĻĨāĻžāϕ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ āĻĒā§āϰāĻļāĻžāϏāϕ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤" + contactAdmin: "āĻāχ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏāϟāĻŋ āχāĻŽā§‡āχāϞ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāĻž, āϤāĻžāχ āφāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĒā§āϰāĻļāĻžāϏāϕ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ⧎" +_gallery: + my: "āφāĻŽāĻžāϰ āĻ—ā§āϝāĻžāϞāĻžāϰ⧀" + liked: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž āĻĒā§‹āĻ¸ā§āϟ" + like: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž" + unlike: "āĻĒāĻ›āĻ¨ā§āĻĻ āϏāϰāĻžāύ" _email: _follow: title: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇" + _receiveFollowRequest: + title: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻĒā§‡ā§Ÿā§‡āϛ⧇āύ" +_plugin: + install: "āĻĒā§āϞāĻžāĻ—āχāύ āχāĻ¨ā§āϏāϟāϞ āĻ•āϰ⧁āύ" + installWarn: "āĻ…āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āϤ āĻĒā§āϞāĻžāĻ—āχāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤" + manage: "āĻĒā§āϞāĻžāĻ—āχāύ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰ⧁āύ" +_registry: + scope: "āĻ¸ā§āϕ⧋āĻĒ" + key: "āϕ⧀" + keys: "āϕ⧀ - āϏāĻŽā§‚āĻš" + domain: "āĻĄā§‹āĻŽā§‡āύ" + createKey: "āϕ⧀ āĻŦāĻžāύāĻžāύ" +_aboutMisskey: + about: "Misskey, āĻāĻ•āϟāĻŋ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ āϝāĻž 2014 āϏāĻžāϞ āĻĨ⧇āϕ⧇ syuilo āϤ⧈āϰāĻŋ āĻ•āϰāϛ⧇āύāĨ¤" + contributors: "āĻĒā§āϰāϧāĻžāύ āĻ•āĻ¨ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāϟāĻžāϰāĻ—āĻŖ" + allContributors: "āϏāĻ•āϞ āĻ•āĻ¨ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāϟāĻžāϰāĻ—āĻŖ" + source: "āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ" + translation: "Misskey āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰ⧁āύ" + donate: "Misskey āϤ⧇ āĻĻāĻžāύ āĻ•āϰ⧁āύ" + morePatrons: "āφāϰāĻ“ āĻ…āύ⧇āϕ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϛ⧇āύāĨ¤ āϤāĻžāĻĻ⧇āϰ āϏāĻŦāĻžāχāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ đŸĨ°" + patrons: "āϏāĻŽāĻ°ā§āĻĨāύāĻ•āĻžāϰ⧀" +_nsfw: + respect: "āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāϤāϰ āĻŽāĻŋāĻĄāĻŋ⧟āĻž āϞ⧁āĻ•āĻžāύ" + ignore: "āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāϤāϰ āĻŽāĻŋāĻĄāĻŋ⧟āĻž āϞ⧁āĻ•āĻžāĻŦ⧇āύ āύāĻž" + force: "āϏāĻ•āϞ āĻŽāĻŋāĻĄāĻŋ⧟āĻž āϞ⧁āĻ•āĻžāύ" _mfm: + cheatSheet: "MFM āϚāĻŋāϟāĻļāĻŋāϟ" + intro: "MFM āĻāĻ•āϟāĻŋ āĻŽāĻžāĻ°ā§āĻ•āφāĻĒ āĻ­āĻžāώāĻž āϝāĻž Misskey-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ MFM-āĻāϰ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤" + dummy: "āĻŽāĻŋāϏāĻ•āĻŋ āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ⧇āϰ āĻŦāĻŋāĻļā§āĻŦāϕ⧇ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰ⧇" mention: "āωāĻ˛ā§āϞ⧇āĻ–" + mentionDescription: "@ āϚāĻŋāĻšā§āύ + āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤" + hashtag: "āĻšā§āϝāĻžāĻļāĻŸā§āϝāĻžāĻ—" + hashtagDescription: "āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ # āϚāĻŋāĻšā§āύ + āĻŸā§āϝāĻžāĻ— āϏāĻš āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāĻļāĻŸā§āϝāĻžāĻ— āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" + url: "URL" + urlDescription: "URL āĻĻ⧇āĻ–āĻžāύ⧋ āϏāĻŽā§āĻ­āĻŦāĨ¤" + link: "āϞāĻŋāĻ‚āĻ•" + linkDescription: "āφāĻĒāύāĻŋ āĻĒāĻžāĻ ā§āϝ⧇āϰ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻ‚āĻļāϕ⧇ URL āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎" + bold: "āĻ—āĻžā§" + boldDescription: "āĻ…āĻ•ā§āώāϰāϗ⧁āϞāĻŋāϕ⧇ āĻŽā§‹āϟāĻžāĻ•āϰ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" + small: "āϛ⧋āϟ" + smallDescription: "āϞ⧇āĻ–āĻž āϛ⧋āϟ āĻāĻŦāĻ‚ āĻĒāĻžāϤāϞāĻž āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇āĨ¤" + center: "āϏ⧇āĻ¨ā§āϟāĻžāϰ" + centerDescription: "āϞ⧇āĻ–āĻž āĻŽāĻžāĻ āĻŦāϰāĻžāĻŦāϰ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇" + inlineCode: "āϕ⧋āĻĄ (āχāύāϞāĻžāχāύ)" + inlineCodeDescription: " āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϕ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āχāύāϞāĻžāχāύ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āĻšāĻžāχāϞāĻžāχāϟāĻŋāĻ‚ āĻ•āϰāĻž āĻšāĻŦ⧇" + blockCode: "āϕ⧋āĻĄ (āĻŦā§āϞāĻ•)" + blockCodeDescription: "āĻŽāĻžāĻ˛ā§āϟāĻŋ-āϞāĻžāχāύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϕ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āĻšāĻžāχāϞāĻžāχāϟ āĻ•āϰ⧇āĨ¤" + inlineMath: "āĻ—āĻžāĻŖāĻŋāϤāĻŋāĻ• āϏ⧂āĻ¤ā§āϰ (āχāύāϞāĻžāχāύ)" + inlineMathDescription: "āĻ—āĻžāĻŖāĻŋāϤāĻŋāĻ• āϏ⧂āĻ¤ā§āϰ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧁āύ (KaTeX) āχāύāϞāĻžāχāύāĨ¤" + blockMath: "āĻ—āĻžāĻŖāĻŋāϤāĻŋāĻ• āϏ⧂āĻ¤ā§āϰ (āĻŦā§āϞāĻ•)" + blockMathDescription: "āĻāĻ•āϟāĻŋ āĻŦā§āϞāϕ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āϞāĻžāχāύ⧇āϰ āĻ—āĻžāĻŖāĻŋāϤāĻŋāĻ• āϏ⧂āĻ¤ā§āϰ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧁āύ (KaTeX)āĨ¤" quote: "āωāĻĻā§āϧ⧃āϤāĻŋ" + quoteDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁āϕ⧇ āĻāĻ•āϟāĻŋ āωāĻĻā§āϧ⧃āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇āĨ¤" emoji: "āĻ¸ā§āĻŦāύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āχāĻŽā§‹āϜāĻŋāϗ⧁āϞāĻŋ" + emojiDescription: "āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āχāĻŽā§‹āϜāĻŋāϰ āύāĻžāĻŽ āϕ⧋āϞāύ⧇ āφāĻŦāĻĻā§āϧ āĻ•āϰ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ āχāĻŽā§‹āϜāĻŋāϟāĻŋ āĻĻ⧇āĻ–āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎" search: "āϖ⧁āρāϜ⧁āύ" + searchDescription: "āĻĒā§‚āĻ°ā§āĻŦ-āϟāĻžāχāĻĒ āĻ•āϰāĻž āĻĒāĻžāĻ ā§āϝ āϏāĻš āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻŦāĻžāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧇āĨ¤" + flip: "āωāĻ˛ā§āϟāĻžāύ" + flipDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āωāĻĒāϰ⧇/āύ⧀āĻšā§‡ āĻŦāĻž āĻŦāĻžāĻŽ/āĻĄāĻžāύ⧇ āωāĻ˛ā§āϟāĻžāύāĨ¤" + jelly: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āĻœā§‡āϞāĻŋ)" + jellyDescription: "āĻœā§‡āϞāĻŋāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + tada: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āϟāĻžāĻĄāĻž)" + tadaDescription: "\"āϟāĻžāĻĄāĻž!\" āĻāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + jump: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āϞāĻžāĻĢ)" + jumpDescription: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁āϤ⧇ āϞāĻžāĻĢ āĻŽāĻžāϰāĻžāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + bounce: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āϤāĻŋ⧜āĻŋāĻ‚ āĻŦāĻŋ⧜āĻŋāĻ‚)" + bounceDescription: "āϤāĻŋ⧜āĻŋāĻ‚ āĻŦāĻŋ⧜āĻŋāĻ‚ āĻ•āϰāĻžāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + shake: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āĻāĻžāρāĻ•āĻŋ)" + shakeDescription: "āĻāĻžāρāĻ•āĻŋāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + twitch: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āĻŽā§‹āϚāĻĄāĻŧāĻžāύ⧋)" + twitchDescription: "āĻŽā§‹āϚāĻĄāĻŧāĻžāύ⧋āϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + spin: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ (āϘ⧁āϰāĻž)" + spinDescription: "āϘ⧁āϰāĻžāϰ āĻŽāϤ āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + x2: "āĻŦ⧜" + x2Description: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁ āĻŦ⧜ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + x3: "āĻ…āύ⧇āĻ• āĻŦ⧜" + x3Description: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁ āφāϰāĻ“ āĻŦ⧜ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + x4: "āĻ…āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻŦ⧜" + x4Description: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁āϕ⧇ āφāϗ⧇āϰ āĻĨ⧇āϕ⧇āĻ“ āφāϰāĻ“ āĻŦ⧜ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžā§ŸāĨ¤" + blur: "āĻŦā§āϞāĻžāϰ" + blurDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁āϕ⧇ āĻŦā§āϞāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāĻĒāύāĻŋ āĻāϰ āωāĻĒāϰ āĻŽāĻžāωāϏ āĻ•āĻžāĻ°ā§āϏāĻžāϰ āϰāĻžāĻ–āϞ⧇, āĻāϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύāĨ¤" + font: "āĻĢāĻ¨ā§āϟ" + fontDescription: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁āϕ⧇ āϕ⧋āύ āĻĢāĻ¨ā§āĻŸā§‡ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇ āϤāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤" + rainbow: "āϰ⧇āχāύāĻŦā§‹" + rainbowDescription: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁āϕ⧇ āϰāĻ‚āϧāύ⧁āϰ āϰāĻ‚ āϗ⧁āϞāĻŋāϤ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧇āĨ¤" + sparkle: "āϚāĻŋāĻ• āϚāĻŋāĻ•" + sparkleDescription: "āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁āϕ⧇ āĻāĻ•āϟāĻŋ āϚāĻŋāĻ•āϚāĻŋāϕ⧇ āĻ•āĻŖāĻž āĻĒā§āϰāĻ­āĻžāĻŦ āĻĻ⧇āϝāĻŧāĨ¤" + rotate: "āϘ⧁āϰāĻžāύ" + rotateDescription: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁āϕ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϕ⧋āύ⧇ āϘ⧁āϰāĻžā§ŸāĨ¤" +_instanceTicker: + none: "āĻĻ⧇āĻ–āĻžāĻŦ⧇āύ āύāĻž" + remote: "āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻĻ⧇āĻ–āĻžāύ" + always: "āϏāĻ°ā§āĻŦāĻĻāĻž āĻĻ⧇āĻ–āĻžāύ" +_serverDisconnectedBehavior: + reload: "āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āϰāĻŋāϞ⧋āĻĄ" + dialog: "āϏāϤāĻ°ā§āĻ•āϤāĻž āĻĄāĻžā§ŸāĻžāϞāĻ— āĻĻ⧇āĻ–āĻžāύ" + quiet: "āĻ…āĻ—āϚāϰ⧀ āϏāϤāĻ°ā§āĻ•āϤāĻž āĻĻ⧇āĻ–āĻžāύ" +_channel: + create: "āĻšā§āϝāĻžāύ⧇āϞ āĻŦāĻžāύāĻžāύ" + edit: "āĻšā§āϝāĻžāύ⧇āϞ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ" + setBanner: "āĻŦā§āϝāĻžāύāĻžāϰ āϏ⧇āϟ āĻ•āϰ⧁āύ" + removeBanner: "āĻŦā§āϝāĻžāύāĻžāϰ āϏāϰāĻžāύ" + featured: "āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āϜāύāĻĒā§āϰāĻŋ⧟" + owned: "āύāĻŋāĻœā§‡āϰ" + following: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" + usersCount: "{n} āϜāύ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀" + notesCount: "{n} āϟāĻŋ āύ⧋āϟ" +_menuDisplay: + sideFull: "āĻĒāĻžāĻļ⧇" + sideIcon: "āĻĒāĻžāĻļ⧇ (āφāχāĻ•āύ)" + top: "āĻļā§€āĻ°ā§āώ⧇" + hide: "āϞ⧁āĻ•āĻžāύ" +_wordMute: + muteWords: "āύāĻŋāσāĻļāĻŦā§āĻĻ āĻ•āϰāĻž āĻļāĻŦā§āĻĻāϗ⧁āϞāĻŋ" + muteWordsDescription: "āĻ¸ā§āĻĒ⧇āϏ āĻĻāĻŋāϝāĻŧ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰāϞ⧇ AND āĻļāĻ°ā§āϤ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāĻ–āϞ⧇ OR āĻļāĻ°ā§āϤ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇āĨ¤" + muteWordsDescription2: "āϰ⧇āϗ⧁āϞāĻžāϰ āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻ¸ā§āĻ˛ā§āϝāĻžāĻļ āĻĻāĻŋāϝāĻŧ⧇ āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϕ⧇ āϘāĻŋāϰ⧇ āϰāĻžāϖ⧁āύāĨ¤" + softDescription: "āϟāĻžāχāĻŽāϞāĻžāχāύ āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤāĻžāύ⧁āϝāĻžā§Ÿā§€ āύ⧋āϟ āϞ⧁āĻ•āĻŋāϝāĻŧ⧇ āϰāĻžāϖ⧇āĨ¤" + hardDescription: "āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤāĻžāύ⧁āϝāĻžā§Ÿā§€ āύ⧋āϟāϗ⧁āϞāĻŋāϕ⧇ āϟāĻžāχāĻŽāϞāĻžāχāύ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻĻ āĻĻā§‡ā§ŸāĨ¤ āφāĻĒāύāĻŋ āĻļāĻ°ā§āϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϞ⧇āĻ“ āϝ⧇ āύ⧋āϟāϗ⧁āϞāĻŋ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋ āϏ⧇āϗ⧁āϞāĻŋ āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻŦ⧇āĨ¤" + soft: "āύāĻŽāĻ¨ā§€ā§Ÿ" + hard: "āĻ•āĻ ā§‹āϰ" + mutedNotes: "āĻŽāĻŋāωāϟ āĻ•āϰāĻž āύ⧋āϟāϗ⧁āϞāĻŋ" +_instanceMute: + instanceMuteDescription: "āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϏāĻŦ āύ⧋āϟ āĻāĻŦāĻ‚ āϰāĻŋāύ⧋āϟ āĻŽāĻŋāωāϟ āĻ•āϰ⧁āύ, āĻŽāĻŋāωāϟ āĻ•āϰāĻž āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āωāĻ¤ā§āϤāϰ āϏāĻšāĨ¤" + instanceMuteDescription2: "āĻĒā§āϰāϤāĻŋāϟāĻŋāϕ⧇ āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāϖ⧁āύ" + title: "āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āύ⧋āϟāϗ⧁āϞāĻŋāϕ⧇ āϞ⧁āĻ•āĻŋāϝāĻŧ⧇ āϰāĻžāϖ⧇āĨ¤" + heading: "āĻŽāĻŋāωāϟ āĻ•āϰāĻž āχāĻ¨ā§āϏāĻ¤ā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻž" _theme: + explore: "āĻĨāĻŋāĻŽāϗ⧁āϞāĻŋ āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ" + install: "āĻĨāĻŋāĻŽ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ" + manage: "āĻĨāĻŋāĻŽ āĻŦā§āϝāĻžāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž" + code: "āĻĨāĻŋāĻŽ āϕ⧋āĻĄ" + description: "āĻŦāĻ°ā§āĻŖāύāĻž" + installed: "{name} āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" + installedThemes: "āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž āĻĨāĻŋāĻŽāϏāĻŽā§‚āĻš" + builtinThemes: "āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āĻĨāĻŋāĻŽāϏāĻŽā§‚āĻš" + alreadyInstalled: "āĻāχ āĻĨāĻŋāĻŽāϟāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" + invalid: "āĻĨāĻŋāĻŽāϟāĻŋāϰ āĻĢāϰāĻŽā§āϝāĻžāϟ āϏāĻ āĻŋāĻ• āύ⧟" + make: "āĻĨāĻŋāĻŽ āĻŦāĻžāύāĻžāύ" + base: "āĻŦ⧇āϏ" + addConstant: "āĻ§ā§āϰ⧁āĻŦāĻ• āϝ⧋āĻ— āĻ•āϰ⧁āύ" + constant: "āĻ§ā§āϰ⧁āĻŦāĻ•" + defaultValue: "āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŽāĻžāύ" + color: "āϰāĻ‚" + refProp: "āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āϰ⧁āύ" + refConst: "āĻ§ā§āϰ⧁āĻŦāĻ• āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āϰ⧁āύ" + key: "āϕ⧀" + func: "āĻĢāĻžāĻ‚āĻļāύ" + funcKind: "āĻĢāĻžāĻ‚āĻļāύ⧇āϰ āϧāϰāύ" + argument: "āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ" + basedProp: "āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āϰāĻž āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋ" + alpha: "āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›āϤāĻž" + darken: "āĻ…āĻ¨ā§āϧāĻ•āĻžāϰ āĻ•āϰ⧁āύ" + lighten: "āωāĻœā§āĻœā§āĻŦāϞ āĻ•āϰ⧁āύ" + inputConstantName: "āĻ§ā§āϰ⧁āĻŦāĻ•āϟāĻŋāϰ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" + importInfo: "āφāĻĒāύāĻŋ āĻāĻ–āĻžāύ⧇ āĻĨāĻŋāĻŽ āϕ⧋āĻĄ āĻĒ⧇āĻ¸ā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āϏ⧇āϟāĻŋāϕ⧇ āĻāĻĄāĻŋāϟāϰ⧇ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ" + deleteConstantConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻ§ā§āϰ⧁āĻŦāĻ• {const} āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āϚāĻžāύīŧŸ" keys: + accent: "āĻ…ā§āϝāĻžāĻ•āϏ⧇āĻ¨ā§āϟ" + bg: "āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + fg: "āϞ⧇āĻ–āĻž" + focus: "āĻĢā§‹āĻ•āĻžāϏ" + indicator: "āχāύāĻĄāĻŋāϕ⧇āϟāϰ" + panel: "āĻĒā§āϝāĻžāύ⧇āϞ" + shadow: "āĻ›āĻžā§ŸāĻž" + header: "āĻšā§‡āĻĄāĻžāϰ" + navBg: "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + navFg: "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇āϰ āĻĒāĻžāĻ ā§āϝ" + navHoverFg: "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇āϰ āĻĒāĻžāĻ ā§āϝ (āĻšāĻ­āĻžāϰ)" + navActive: "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇āϰ āĻĒāĻžāĻ ā§āϝ (āĻ…ā§āϝāĻžāĻ•āϟāĻŋāĻ­)" + navIndicator: "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇āϰ āχāύāĻĄāĻŋāϕ⧇āϟāϰ" + link: "āϞāĻŋāĻ‚āĻ•" + hashtag: "āĻšā§āϝāĻžāĻļāĻŸā§āϝāĻžāĻ—" mention: "āωāĻ˛ā§āϞ⧇āĻ–" + mentionMe: "āφāĻĒāύāĻžāϕ⧇ āωāĻ˛ā§āϞ⧇āĻ–ā§āϝ āĻ•āϰāĻž" renote: "āϰāĻŋāύ⧋āϟ" + modalBg: "āĻŽā§‹āĻĄāĻžāϞ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + divider: "āĻ–āĻ¨ā§āĻĄāĻ•" + scrollbarHandle: "āĻ¸ā§āĻ•ā§āϰāϞāĻŦāĻžāϰ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ" + scrollbarHandleHover: "āĻ¸ā§āĻ•ā§āϰāϞāĻŦāĻžāϰ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ (āĻšāĻ­āĻžāϰ)" + dateLabelFg: "āϤāĻžāϰāĻŋāĻ– āϞ⧇āĻŦ⧇āϞ⧇āϰ āĻĒāĻžāĻ ā§āϝ" + infoBg: "āϤāĻĨā§āϝ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + infoFg: "āϤāĻĨā§āϝ⧇āϰ āĻĒāĻžāĻ ā§āϝ" + infoWarnBg: "āĻ“ā§ŸāĻžāĻ°ā§āύāĻŋāĻ‚ āĻāϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + infoWarnFg: "āĻ“ā§ŸāĻžāĻ°ā§āύāĻŋāĻ‚ āĻāϰ āĻĒāĻžāĻ ā§āϝ" + cwBg: "CW āĻŦāĻžāϟāύ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + cwFg: "CW āĻŦāĻžāϟāύ⧇āϰ āĻĒāĻžāĻ ā§āϝ" + cwHoverBg: "CW āĻŦāĻžāϟāύ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ (āĻšāĻ­āĻžāϰ)" + toastBg: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + toastFg: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āĻĒāĻžāĻ ā§āϝ" + buttonBg: "āĻŦāĻžāϟāύ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + buttonHoverBg: "āĻŦāĻžāϟāύ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ (āĻšāĻ­āĻžāϰ)" + inputBorder: "āχāύāĻĒ⧁āϟ āĻĢāĻŋāĻ˛ā§āĻĄā§‡āϰ āĻŦāĻ°ā§āĻĄāĻžāϰ" + listItemHoverBg: "āϞāĻŋāĻ¸ā§āϟ āφāχāĻŸā§‡āĻŽā§‡āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ (āĻšā§‹āĻ­āĻžāϰ)" + driveFolderBg: "āĻĄā§āϰāĻžāχāĻ­ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + wallpaperOverlay: "āĻ“āϝāĻŧāĻžāϞāĻĒ⧇āĻĒāĻžāϰ āĻ“āĻ­āĻžāϰāϞ⧇" + badge: "āĻŦā§āϝāĻžāϜ" + messageBg: "āĻšā§āϝāĻžāĻŸā§‡āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ" + accentDarken: "āĻ…ā§āϝāĻžāĻ•āϏ⧇āĻ¨ā§āϟ (āĻ—āĻžā§)" + accentLighten: "āĻ…ā§āϝāĻžāĻ•āϏ⧇āĻ¨ā§āϟ (āĻšāĻžāĻ˛ā§āĻ•āĻž)" + fgHighlighted: "āĻšāĻžāχāϞāĻžāχāϟ āĻ•āϰāĻž āĻĒāĻžāĻ ā§āϝ" _sfx: note: "āύ⧋āϟāϗ⧁āϞāĻŋ" + noteMy: "āύ⧋āϟ (āφāĻĒāύāĻžāϰ)" notification: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" chat: "āĻšā§āϝāĻžāϟ" + chatBg: "āĻšā§āϝāĻžāϟ (āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ)" + antenna: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻžāϗ⧁āϞāĻŋ" + channel: "āĻšā§āϝāĻžāύ⧇āϞ⧇āϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" +_ago: + unknown: "āĻ…āϜāĻžāύāĻž" + future: "āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž" + justNow: "āĻāχāĻŽāĻžāĻ¤ā§āϰ" + secondsAgo: "{n} āϏ⧇āϕ⧇āĻ¨ā§āĻĄ āφāϗ⧇" + minutesAgo: "{n} āĻŽāĻŋāύāĻŋāϟ āφāϗ⧇" + hoursAgo: "{n} āϘāĻŖā§āϟāĻž āφāϗ⧇" + daysAgo: "{n} āĻĻāĻŋāύ āφāϗ⧇" + weeksAgo: "{n} āϏāĻĒā§āϤāĻžāĻš āφāϗ⧇" + monthsAgo: "{n} āĻŽāĻžāϏ āφāϗ⧇" + yearsAgo: "{n} āĻŦāĻ›āϰ āφāϗ⧇" +_time: + second: "āϏ⧇āϕ⧇āĻ¨ā§āĻĄ" + minute: "āĻŽāĻŋāύāĻŋāϟ" + hour: "āϘāĻŖā§āϟāĻž" + day: "āĻĻāĻŋāύ" +_tutorial: + title: "Misskey āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ" + step1_1: "āĻ¸ā§āĻŦāĻžāĻ—āϤāĻŽ!" + step1_2: "āĻāχ āĻ¸ā§āĻ•ā§āϰ⧀āύāϟāĻŋāϕ⧇ \"āϟāĻžāχāĻŽāϞāĻžāχāύ\" āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻ•āĻžāϞāĻžāύ⧁āĻ•ā§āϰāĻŽāĻŋāĻ• āĻ•ā§āϰāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āϝāĻžāĻĻ⧇āϰ \"āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύ\" āϤāĻžāĻĻ⧇āϰ \"āύ⧋āϟāϗ⧁āϞāĻŋ\" āĻĻ⧇āĻ–āĻžāϝāĻŧ⧎" + step1_3: "āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āϟāĻžāχāĻŽāϞāĻžāχāύ⧇ āĻ•āĻŋāϛ⧁ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύ āύāĻž āĻ•āĻžāϰāĻŖ āφāĻĒāύāĻŋ āĻāĻ–āύāĻ“ āϕ⧋āύ⧋ āύ⧋āϟ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰ⧇āύāύāĻŋ āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āĻ•āĻžāωāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇āύ āύāĻžā§ˇ" + step2_1: "āύ⧋āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻŦāĻž āĻ•āĻžāωāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻĒā§āϰāĻĨāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰ⧁āύāĨ¤" + step2_2: "āφāĻĒāύāĻŋ āϕ⧇ āϤāĻž āϜāĻžāύāĻž āĻ…āύ⧇āĻ• āϞ⧋āϕ⧇āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻž āĻāĻŦāĻ‚ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϕ⧇ āϏāĻšāϜ āĻ•āϰ⧇ āϤ⧋āϞ⧇⧎" + step3_1: "āφāĻĒāύāĻŋ āĻ•āĻŋ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧇āϛ⧇āύ?" + step3_2: "āĻāĻ–āύ, āĻ•āĻŋāϛ⧁ āύ⧋āϟ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ āĻĒā§‹āĻ¸ā§āϟ āĻĢāĻ°ā§āĻŽ āϖ⧁āϞāϤ⧇ āĻĒ⧇āĻ¨ā§āϏāĻŋāϞ āϚāĻŋāĻšā§āύāϝ⧁āĻ•ā§āϤ āĻŦāĻžāϟāύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤" + step3_3: "āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āϞ⧇āĻ–āĻžāϰ āĻĒāϰ⧇, āφāĻĒāύāĻŋ āĻĢāĻ°ā§āĻŽā§‡āϰ āωāĻĒāϰ⧇āϰ āĻĄāĻžāύāĻĻāĻŋāϕ⧇āϰ āĻŦāĻžāϟāύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧇ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" + step3_4: "āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāĻžāϰ āĻŽāϤ āĻ•āĻŋāϛ⧁ āĻŽāύ⧇ āĻĒāϰāϛ⧇ āύāĻž? \"āφāĻŽāĻŋ āĻŽāĻŋāϏāĻ•āĻŋ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻ›āĻŋ\" āĻŦāϞāϞ⧇ āϕ⧇āĻŽāύ āĻšāϝāĻŧ?" + step4_1: "āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰ⧇āϛ⧇āύ?" + step4_2: "āϏāĻžāĻŦāĻžāĻļ! āĻāĻ–āύ āφāĻĒāύāĻžāϰ āύ⧋āϟ āϟāĻžāχāĻŽāϞāĻžāχāύ⧇ āĻĻ⧇āĻ–āĻž āϝāĻžāĻŦ⧇āĨ¤" + step5_1: "āĻāĻ–āύ āĻ…āĻ¨ā§āϝāĻĻ⧇āϰāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āϟāĻžāχāĻŽāϞāĻžāχāύāϕ⧇ āĻĒā§āϰāĻžāĻŖāĻŦāĻ¨ā§āϤ āĻ•āϰ⧇ āϤ⧁āϞ⧁āύāĨ¤" + step5_2: "āφāĻĒāύāĻŋ {featured}-āĻ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύ, āϝāĻžāϤ⧇ āφāĻĒāύāĻŋ āϝ⧇ āĻŦā§āϝāĻ•ā§āϤāĻŋāϕ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇āύ āϤāĻžāϕ⧇ āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻāĻŦāĻ‚ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻ…āĻĨāĻŦāĻž {explore}-āĻ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύ⧎" + step5_3: "āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āφāχāĻ•āύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒ⧃āĻˇā§āĻ āĻžāϤ⧇ \"āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ\" āĻŦāĻžāϟāύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤" + step5_4: "āϝāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽā§‡āϰ āĻĒāĻžāĻļ⧇ āĻāĻ•āϟāĻŋ āϞāĻ• āφāχāĻ•āύ āĻĨāĻžāϕ⧇ āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āϏāϰāϪ⧇āϰ āĻ…āύ⧁āϰ⧋āϧ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϤāĻžāϰāĻž āĻ•āĻŋāϛ⧁ āϏāĻŽāϝāĻŧ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" + step6_1: "āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ āĻŋāĻ• āĻĨāĻžāĻ•āϞ⧇ āφāĻĒāύāĻŋ āϟāĻžāχāĻŽāϞāĻžāχāύ⧇ āĻ…āĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āύ⧋āϟ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύāĨ¤" + step6_2: "āφāĻĒāύāĻŋ āϏāĻšāĻœā§‡āχ āφāĻĒāύāĻžāϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϜāĻžāύāĻžāϤ⧇ āĻ…āĻ¨ā§āϝ āĻŦā§āϝāĻ•ā§āϤāĻŋāϰ āύ⧋āĻŸā§‡ \"āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ\" āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" + step6_3: "āĻāĻ•āϟāĻŋ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āϝ⧋āĻ— āĻ•āϰāϤ⧇, āύ⧋āĻŸā§‡ \"+\" āϚāĻŋāĻšā§āύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĒāĻ›āĻ¨ā§āĻĻ⧇āϰ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύāĨ¤" + step7_1: "āĻ…āĻ­āĻŋāύāĻ¨ā§āĻĻāύ! āφāĻĒāύāĻŋ āĻāĻ–āύ Misskey-āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞāϟāĻŋ āĻļ⧇āώ āĻ•āϰ⧇āϛ⧇āύāĨ¤" + step7_2: "āφāĻĒāύāĻŋ āϝāĻĻāĻŋ Misskey āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϜāĻžāύāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ {help} āĻ āĻĻ⧇āϖ⧁āύāĨ¤" + step7_3: "āĻāĻ–āύ Misskey āωāĻĒāĻ­ā§‹āĻ— āĻ•āϰ⧁āύ 🚀" +_2fa: + alreadyRegistered: "āφāĻĒāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ 2-āĻĢā§āϝāĻžāĻ•ā§āϟāϰ āĻ…āĻĨ⧇āύāϟāĻŋāϕ⧇āĻļāύ āĻĄāĻŋāĻ­āĻžāχāϏ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧇āϛ⧇āύ⧎" + registerDevice: "āύāϤ⧁āύ āĻĄāĻŋāĻ­āĻžāχāϏ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ" + registerKey: "āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧀ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ" + step1: "āĻĒā§āϰāĻĨāĻŽā§‡, āφāĻĒāύāĻžāϰ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ {a} āĻŦāĻž {b} āĻāϰ āĻŽāϤ⧋ āĻāĻ•āϟāĻŋ āĻ…āĻĨ⧇āύāϟāĻŋāϕ⧇āĻļāύ āĻ…ā§āϝāĻžāĻĒ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ⧎" +_permissions: + "read:pages": "āφāĻĒāύāĻžāϰ āĻĒ⧇āϜāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύ" + "write:pages": "āĻĒ⧇āϜāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻŦāĻž āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧁āύ" +_auth: + pleaseGoBack: "āĻĻ⧟āĻž āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āĻĢāĻŋāϰ⧇ āϝāĻžāύ" + callback: "āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āĻĢāĻŋāϰ⧇ āϝāĻžāĻšā§āĻ›āĻŋ" + denied: "āĻĒā§āϰāĻŦ⧇āĻļ āύāĻŋāώ⧇āϧ" +_antennaSources: + all: "āϏāĻ•āϞ āύ⧋āϟ" + homeTimeline: "āφāĻĒāύāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇āύ, āĻāĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āύ⧋āϟ" + users: "āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāϧāĻŋāĻ• āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύ⧋āϟ" + userList: "āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āύāĻžāĻŽ āĻĨāĻžāĻ•āĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āύ⧋āϟ" + userGroup: "āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ—ā§āϰ⧁āĻĒ⧇ āĻĨāĻžāĻ•āĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āύ⧋āϟ" +_weekday: + sunday: "āϰāĻŦāĻŋāĻŦāĻžāϰ" + monday: "āϏ⧋āĻŽāĻŦāĻžāϰ" + tuesday: "āĻŽāĻ™ā§āĻ—āϞāĻŦāĻžāϰ" + wednesday: "āĻŦ⧁āϧāĻŦāĻžāϰ" + thursday: "āĻŦ⧃āĻšāĻ¸ā§āĻĒāϤāĻŋāĻŦāĻžāϰ" + friday: "āĻļ⧁āĻ•ā§āϰāĻŦāĻžāϰ" + saturday: "āĻļāύāĻŋāĻŦāĻžāϰ" _widgets: + memo: "āĻ¸ā§āϟāĻŋāĻ•āĻŋ āύ⧋āϟ" notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" timeline: "āϟāĻžāχāĻŽāϞāĻžāχāύ" + calendar: "āĻ•ā§āϝāĻžāϞ⧇āĻ¨ā§āĻĄāĻžāϰ" + trends: "āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āϜāύāĻĒā§āϰāĻŋ⧟" + clock: "āϘāĻĄāĻŧāĻŋ" + rss: "RSS āϰāĻŋāĻĄāĻžāϰ" activity: "āĻ•āĻžāĻ°ā§āϝāĻ•āϞāĻžāĻĒ" + photos: "āĻĢāĻŸā§‹āϗ⧁āϞāĻŋ" + digitalClock: "āĻĄāĻŋāϜāĻŋāϟāĻžāϞ āϘ⧜āĻŋ" federation: "āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ" + postForm: "āύ⧋āϟ āϞāĻŋāϖ⧁āύ" + slideshow: "āĻ¸ā§āϞāĻžāχāĻĄāĻļā§‹" + button: "āĻŦāĻžāϟāύ" + onlineUsers: "āĻ…āύāϞāĻžāχāύ⧇ āĻĨāĻžāĻ•āĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āĻŖ" jobQueue: "āϜāĻŦ āĻ•āĻŋāω" + serverMetric: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ" + aiscript: "AiScript āĻ•āύāϏ⧋āϞ" + aichan: "āφāχ āϚāĻžāύ" _cw: + hide: "āϞ⧁āĻ•āĻžāύ" show: "āφāϰāĻ“ āĻĻ⧇āϖ⧁āύ" + chars: "{count} āϟāĻŋ āĻ…āĻ•ā§āώāϰ" + files: "{count} āϟāĻŋ āĻĢāĻžāχāϞ" +_poll: + noOnlyOneChoice: "āϏāĻ°ā§āĻŦāύāĻŋāĻŽā§āύ 2 āϟāĻŋ āĻ…āĻĒāĻļāύ āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇" + choiceN: "āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ {n}" + noMore: "āφāĻĒāύāĻŋ āφāϰ āϕ⧋āύ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻž" + canMultipleVote: "āĻāĻ•āĻžāϧāĻŋāĻ• āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦāĻžāĻ›āĻžāχ āĻ•āϰāĻž āϝāĻžāĻŦ⧇" + expiration: "āĻĒā§‹āϞ⧇āϰ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž" + infinite: "āĻ…āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ" + at: "āĻļ⧇āώ āĻšāĻŦ⧇" + after: "āĻļ⧇āώ āĻšāĻŦ⧇" + deadlineDate: "āĻļ⧇āώ āĻšāĻ“ā§ŸāĻžāϰ āϤāĻžāϰāĻŋāĻ–" + deadlineTime: "āϘāĻŖā§āϟāĻž" + duration: "āĻŦā§āϝāĻžāĻĒā§āϤāĻŋāĻ•āĻžāϞ" + votesCount: "{n} āϟāĻŋ āĻ­ā§‹āϟ" + totalVotes: "āϏāĻ°ā§āĻŦāĻŽā§‹āϟ {n} āϟāĻŋ āĻ­ā§‹āϟ" + vote: "āĻ­ā§‹āϟ āĻĻāĻŋāύ" + showResult: "āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĻ⧇āĻ–āĻžāύ" + voted: "āĻ­ā§‹āϟ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āύ" + closed: "āĻļ⧇āώ āĻšā§Ÿā§‡ āϗ⧇āϛ⧇" + remainingDays: "āφāϰ {d} āĻĻāĻŋāύ {h} āϘāĻŖā§āϟāĻž āĻŦāĻžāĻ•āĻŋ āφāϛ⧇" + remainingHours: "āφāϰ {h} āϘāĻŖā§āϟāĻž {m} āĻŽāĻŋāύāĻŋāϟ āĻŦāĻžāĻ•āĻŋ āφāϛ⧇" _visibility: home: "āĻŽā§‚āϞ āĻĒāĻžāϤāĻž" followers: "āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀" @@ -466,13 +1185,17 @@ _profile: name: "āύāĻžāĻŽ" username: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ" _exportOrImport: + allNotes: "āϏāĻ•āϞ āύ⧋āϟ" followingList: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" muteList: "āĻŽāĻŋāωāϟ" blockingList: "āĻŦā§āϞāĻ•" userLists: "āϞāĻŋāĻ¸ā§āϟ" +_charts: + federation: "āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ" _timelines: home: "āĻŽā§‚āϞ āĻĒāĻžāϤāĻž" _pages: + viewPage: "āφāĻĒāύāĻžāϰ āĻĒ⧇āϜāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύ" blocks: image: "āĻ›āĻŦāĻŋ" script: @@ -483,6 +1206,12 @@ _pages: arg1: "āϞāĻŋāĻ¸ā§āϟ" _randomPick: arg1: "āϞāĻŋāĻ¸ā§āϟ" + _dailyRandom: + arg1: "āϏāĻŽā§āĻ­āĻžāĻŦā§āϝāϤāĻž" + dailyRannum: "āĻ°â€ā§āϝāĻžāĻ¨ā§āĻĄāĻŽ āϏāĻ‚āĻ–ā§āϝāĻž (āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧀āϤ āĻšā§Ÿ)" + _dailyRannum: + arg1: "āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻŽāĻžāύ" + arg2: "āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āĻŽāĻžāύ" _dailyRandomPick: arg1: "āϞāĻŋāĻ¸ā§āϟ" _seedRandomPick: @@ -491,20 +1220,83 @@ _pages: arg1: "āϞāĻŋāĻ¸ā§āϟ" _listLen: arg1: "āϞāĻŋāĻ¸ā§āϟ" + _numberToString: + arg1: "āϏāĻ‚āĻ–ā§āϝāĻž" + splitStrByLine: "āĻĒāĻžāĻ ā§āϝāϕ⧇ āϞāĻžāχāύ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰ⧁āύ" + _splitStrByLine: + arg1: "āϞ⧇āĻ–āĻž" + ref: "āϚāϞāĻ•" + aiScriptVar: "AiScript āϚāϞāĻ•" + fn: "āĻĢāĻžāĻ‚āĻļāύ" + _fn: + slots: "āĻ¸ā§āϞāϟāϗ⧁āϞāĻŋ" + slots-info: "āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ¸ā§āϞāϟāϕ⧇ āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāϖ⧁āύ" + arg1: "āφāωāϟāĻĒ⧁āϟ" + for: "for-āϞ⧁āĻĒ" + _for: + arg1: "āĻ•āϤāĻŦāĻžāϰ āϚāϞāĻŦ⧇" + arg2: "āĻ…ā§āϝāĻžāĻ•āĻļāύ" + typeError: "āĻ¸ā§āϞāϟ {slot}, {expect} āϧāϰāύ⧇āϰ āĻŽāĻžāύ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ {actual} āϧāϰāύ⧇āϰ āĻŽāĻžāύ āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§Ÿā§‡āϛ⧇!" + thereIsEmptySlot: "āĻ¸ā§āϞāϟ {slot} āĻ–āĻžāϞāĻŋīŧ" types: + string: "āϞ⧇āĻ–āĻž" + number: "āϏāĻ‚āĻ–ā§āϝāĻž" + boolean: "āĻĢā§āĻ˛ā§āϝāĻžāĻ—" array: "āϞāĻŋāĻ¸ā§āϟ" + stringArray: "āϞ⧇āĻ–āĻžāϰ āϞāĻŋāĻ¸ā§āϟ" + emptySlot: "āĻ–āĻžāϞāĻŋ āĻ¸ā§āϞāϟ" + enviromentVariables: "āĻāύāĻ­āĻžāχāϰāύāĻŽā§‡āĻ¨ā§āϟ āĻ­ā§āϝāĻžāϰāĻŋā§Ÿā§‡āĻŦāϞ" + pageVariables: "āĻĒ⧇āĻœā§‡āϰ āϚāϞāĻ•" + argVariables: "āχāύāĻĒ⧁āĻŸā§‡āϰ āϜāĻžā§ŸāĻ—āĻž" +_relayStatus: + requesting: "āĻ…āĻĒ⧇āĻ•ā§āώāĻŽāĻžāύ" + accepted: "āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ" + rejected: "āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–āĻŋāϤ" _notification: + fileUploaded: "āĻĢāĻžāχāϞ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" + youGotMention: "{name} āφāĻĒāύāĻžāϕ⧇ āωāĻ˛ā§āϞ⧇āĻ–ā§āϝ āĻ•āϰ⧇āϛ⧇" + youGotReply: "{name} āφāĻĒāύāĻžāϕ⧇ āϜāĻŦāĻžāĻŦ āĻĻāĻŋā§Ÿā§‡āϛ⧇" + youGotQuote: "{name} āφāĻĒāύāĻžāϕ⧇ āωāĻĻā§āϧ⧃āϤ āĻ•āϰ⧇āϛ⧇" + youRenoted: "{name} āĻāϰ Renote" + youGotPoll: "{name} āφāĻĒāύāĻžāϰ āĻĒā§‹āϞ⧇ āĻ­ā§‹āϟ āĻĻāĻŋā§Ÿā§‡āϛ⧇" + youGotMessagingMessageFromUser: "{name} āφāĻĒāύāĻžāϕ⧇ āĻŽā§‡āϏ⧇āϜ āĻ•āϰ⧇āϛ⧇" + youGotMessagingMessageFromGroup: "{name} āĻ—ā§āϰ⧁āĻĒ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŽā§‡āϏ⧇āϜ āφāϛ⧇" youWereFollowed: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇" + youReceivedFollowRequest: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ“ā§ŸāĻž āϗ⧇āϛ⧇" + yourFollowRequestAccepted: "āφāĻĒāύāĻžāϰ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻ—ā§ƒāĻšā§€āϤ āĻšā§Ÿā§‡āϛ⧇" + youWereInvitedToGroup: "āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ—ā§āϰ⧁āĻĒ⧇ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇āύ" _types: + all: "āϏāĻ•āϞ" follow: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" mention: "āωāĻ˛ā§āϞ⧇āĻ–" + reply: "āωāĻ¤ā§āϤāϰ āĻĻāĻŋāύ" renote: "āϰāĻŋāύ⧋āϟ" quote: "āωāĻĻā§āϧ⧃āϤāĻŋ" reaction: "āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž" + pollVote: "āĻĒā§‹āϞ⧇ āĻ­ā§‹āϟ āφāϛ⧇" + receiveFollowRequest: "āĻĒā§āϰāĻžāĻĒā§āϤ āĻ…āύ⧁āϏāϰāϪ⧇āϰ āĻ…āύ⧁āϰ⧋āϧāϏāĻŽā§‚āĻš" + followRequestAccepted: "āĻ—ā§ƒāĻšā§€āϤ āĻ…āύ⧁āϏāϰāϪ⧇āϰ āĻ…āύ⧁āϰ⧋āϧāϏāĻŽā§‚āĻš" + groupInvited: "āĻ—ā§āϰ⧁āĻĒ⧇āϰ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāύāϏāĻŽā§‚āĻš" + app: "āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻĒ āĻĨ⧇āϕ⧇ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" _deck: + alwaysShowMainColumn: "āϏāĻ°ā§āĻŦāĻĻāĻž āĻŽā§‡āχāύ āĻ•āϞāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ" + columnAlign: "āĻ•āϞāĻžāĻŽ āϏāĻžāϜāĻžāύ" + columnMargin: "āĻ•āϞāĻžāĻŽā§‡āϰ āĻŽāĻ§ā§āϝāĻŦāĻ°ā§āϤ⧀ āĻŽāĻžāĻ°ā§āϜāĻŋāύ" + columnHeaderHeight: "āĻ•āϞāĻžāĻŽā§‡āϰ āĻšā§‡āĻĄāĻžāϰ⧇āϰ āωāĻšā§āϚāϤāĻž" + addColumn: "āĻ•āϞāĻžāĻŽ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" + swapLeft: "āĻŦāĻžāĻŽā§‡ āϏāϰāĻžāύ" + swapRight: "āĻĄāĻžāύ⧇ āϏāϰāĻžāύ" + swapUp: "āωāĻĒāϰ⧇ āωāĻ āĻžāύ" + swapDown: "āύāĻŋāĻšā§‡ āύāĻžāĻŽāĻžāύ" + stackLeft: "āĻŦāĻžāĻŽ āĻ•āϞāĻžāĻŽā§‡ āϏāĻžāϜāĻžāύ" + popRight: "āĻĄāĻžāύāĻĻāĻŋāϕ⧇ āϰāĻžāϖ⧁āύ" + profile: "āĻĒā§āϰ⧋āĻĢāĻžāχāϞ" _columns: + main: "āĻĒā§āϰāϧāĻžāύ" + widgets: "āωāχāĻœā§‡āϟāϗ⧁āϞāĻŋ" notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" tl: "āϟāĻžāχāĻŽāϞāĻžāχāύ" antenna: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž" list: "āϞāĻŋāĻ¸ā§āϟ" mentions: "āωāĻ˛ā§āϞ⧇āĻ–āϏāĻŽā§‚āĻš" + direct: "āĻĄāĻžāχāϰ⧇āĻ•ā§āϟ āύ⧋āϟāϗ⧁āϞāĻŋ" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 05360e1703..cec230e10d 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -141,6 +141,8 @@ flagAsBot: "Als Bot markieren" flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag fÃŧr andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys interne Systeme dieses Benutzerkonto als Bot behandeln." flagAsCat: "Als Katze markieren" flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu markieren." +flagShowTimelineReplies: "Antworten in der Chronik anzeigen" +flagShowTimelineRepliesDescription: "Ist diese Option aktiviert, so werden Antworten von Benutzern auf die Notizen anderer Benuzter in der Chronik an angezeigt." autoAcceptFollowed: "Follow-Anfragen von Benutzern, denen du folgst, automatisch akzeptieren" addAccount: "Benutzerkonto hinzufÃŧgen" loginFailed: "Anmeldung fehlgeschlagen" @@ -822,6 +824,10 @@ leaveGroupConfirm: "MÃļchtest du \"{name}\" wirklich verlassen?" useDrawerReactionPickerForMobile: "Auf mobilen Geräten ausfahrbare Reaktionsauswahl anzeigen" welcomeBackWithName: "Willkommen zurÃŧck, {name}" clickToFinishEmailVerification: "DrÃŧcke bitte auf [{ok}], um die Email-Bestätigung abzuschließen." +overridedDeviceKind: "Gerätetyp" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Automatisch" _emailUnavailable: used: "Diese Email-Adresse wird bereits verwendet" format: "Das Format dieser Email-Adresse ist ungÃŧltig" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "Stummgeschaltete Benutzer aussortieren" excludeInactiveUsers: "Inaktive Benutzer aussortieren" _charts: - federationInstancesIncDec: "Unterschied in der Anzahl von fÃļrderierenden Instanzen" - federationInstancesTotal: "Anzahl aller fÃļderierenden Instanzen" + federation: "FÃļderation" + apRequest: "Anfragen" usersIncDec: "Unterschied in der Anzahl von Benutzern" usersTotal: "Anzahl aller Benutzer" activeUsers: "Aktive Benutzer" diff --git a/locales/en-US.yml b/locales/en-US.yml index 9a2b0bf5c5..43ecf98206 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -141,6 +141,8 @@ flagAsBot: "Mark this account as a bot" flagAsBotDescription: "Enable this option if this account is controlled by a program. If enabled, it will act as a flag for other developers to prevent endless interaction chains with other bots and adjust Misskey's internal systems to treat this account as a bot." flagAsCat: "Mark this account as a cat" flagAsCatDescription: "Enable this option to mark this account as a cat." +flagShowTimelineReplies: "Show replies in timeline" +flagShowTimelineRepliesDescription: "Shows replies of users to notes of other users in the timeline if turned on." autoAcceptFollowed: "Automatically approve follow requests from users you're following" addAccount: "Add account" loginFailed: "Failed to sign in" @@ -822,6 +824,10 @@ leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?" useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile" welcomeBackWithName: "Welcome back, {name}" clickToFinishEmailVerification: "Please click [{ok}] to complete email verification." +overridedDeviceKind: "Device type" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Auto" _emailUnavailable: used: "This email address is already being used" format: "The format of this email address is invalid" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "Exclude muted users" excludeInactiveUsers: "Exclude inactive users" _charts: - federationInstancesIncDec: "Difference in # of federating instances" - federationInstancesTotal: "Total # of federating instances" + federation: "Federation" + apRequest: "Requests" usersIncDec: "Difference in # of users" usersTotal: "Total # of users" activeUsers: "Active users" diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index 0689834a1e..286a0d857f 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -65,6 +65,8 @@ files: "Dosieroj" download: "Elŝuti" driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Tio ankaÅ­ forviŝos la notojn kiuj citas ĝin." unfollowConfirm: "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?" +exportRequested: "Vi petis elporton. Ĝi povas bezoni longan tempon. ElportaÄĩo estos aldonita al disko post elportado." +importRequested: "Vi petis enportadon. Ĝi povas bezoni longan tempon. " lists: "Listoj" noLists: "Neniu listo" note: "Noti" @@ -77,7 +79,10 @@ manageLists: "Bonteni liston" error: "Eraro" somethingHappened: "Problemo okazis" retry: "Provi denove" +pageLoadError: "Fuŝiĝis enlegi paĝon." +pageLoadErrorDescription: "Ordinare tio okazas pro la retkondiĉo aÅ­ la staplo de retumilo.\nPurigu la staplon, aÅ­ refaru poste. " serverIsDead: "La servilo ne respondas. Vole atendu iom kaj penu denove." +youShouldUpgradeClient: "Por montri ĉi paĝon, bonvolu enlegi refoje kaj uzi klienton novversian." enterListName: "Entajpu nomon de la listo" privacy: "Privateco" makeFollowManuallyApprove: "Eksekvi vin devas peti al vi" @@ -132,6 +137,7 @@ settingGuide: "Agordaj rekomendoj" cacheRemoteFiles: "Stapli forajn dosierojn" flagAsBot: "Marki kiel esti uzanto de roboto" flagAsCat: "Marki kiel esti kato" +flagShowTimelineReplies: "Montri respondon de notoj en templinio." autoAcceptFollowed: "AÅ­tomate akcepti la peton de sekvado far uzantoj kiujn vi sekvas" addAccount: "Aldoni konton" loginFailed: "Saluto malsukcesis" @@ -178,6 +184,7 @@ noUsers: "Neniu uzanto" editProfile: "Redakti profilon" noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?" pinLimitExceeded: "Vi ne povas alpingli pli" +intro: "Instalado de Misskey finiĝis! Kreu administran konton." done: "Fini" processing: "Prilaboradoâ€Ļ" preview: "AntaÅ­montro" @@ -326,6 +333,7 @@ antennaExcludeKeywords: "Krom ĉefterminoj" notifyAntenna: "Oni sciigos novajn notojn" withFileAntenna: "Nur kun aldonaÄĩo" enableServiceworker: "Aktivigi ServiceWorker" +caseSensitive: "Distingi usklecon" withReplies: "Inkluzive respondoj" connectedTo: "Sekva konto estas konektita" notesAndReplies: "Kun respondoj" @@ -363,6 +371,7 @@ notFound: "Ne trovita" uploadFolder: "Dosierujo implicita por alŝuto" cacheClear: "Malplenigi staplon" markAsReadAllNotifications: "Marki ĉiujn sciigojn kiel legita" +markAsReadAllUnreadNotes: "Marki ĉiujn afiŝojn kiel legita" markAsReadAllTalkMessages: "Marki ĉiujn retbabiladojn kiel legita" help: "Manlibro de uzado" inputMessageHere: "Entajpu mesaĝon tie" @@ -385,6 +394,7 @@ next: "Sekve" retype: "Retajpu" noteOf: "Noto de {user}" inviteToGroup: "Inviti al grupo" +maxNoteTextLength: "Limnombro de leteroj en noto" quoteAttached: "Kun citaÄĩo" quoteQuestion: "Ĉu vi volas aldoni citaÄĩon?" noMessagesYet: "AnkoraÅ­ neniu mesaĝo" @@ -393,6 +403,7 @@ onlyOneFileCanBeAttached: "Oni povas aldoni nur unu dosieron po mesaĝo." signinRequired: "Bonvolu saluti" invitations: "Inviti" invitationCode: "Kodo de invito" +checking: "kontrolante..." available: "Disposabla" unavailable: "Ne disponebla" usernameInvalidFormat: "La uzantnomo povas enhavi minusklajn kaj majusklajn literojn, numerojn, nur kaj '_'." @@ -404,6 +415,7 @@ strongPassword: "Forta pasvorto" passwordMatched: "Konforma" passwordNotMatched: "Nekonforma" signinWith: "Saluti kun {x}" +signinFailed: "Fuŝiĝis ensaluti. Bonvolu kontroli uzantnomon kaj pasvorton." or: "AÅ­" language: "Lingvo" uiLanguage: "Lingvo de fasado" @@ -430,6 +442,7 @@ total: "Entute" appearance: "EksteraÄĩo" clientSettings: "Agordoj de kliento" accountSettings: "Agordoj de konto" +promote: "Reklamata" numberOfDays: "Nombro de tagoj" hideThisNote: "Kaŝi la noton" showFeaturedNotesInTimeline: "Montri en via templinio notojn de la tendenco" @@ -465,11 +478,13 @@ scratchpad: "Malneta redaktilo" output: "Elmeto" script: "Skripto" disablePagesScript: "Malebligi AiScript en la paĝoj" +updateRemoteUser: "Aktualigi informon de foraj uzantoj" deleteAllFiles: "Forviŝi ĉiujn dosierojn" deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn dosierojn?" removeAllFollowing: "Ĉesi sekvi ĉiujn sekvatojn" userSuspended: "La uzanto estas flostigita." userSilenced: "La uzanto estas mutigita." +yourAccountSuspendedTitle: "La konto estas frostigita." menu: "Menuo" addItem: "Aldoni novaÄĩon" deletedNote: "Forviŝita noto" @@ -499,6 +514,7 @@ generateAccessToken: "Generi aÅ­tentikigan pecon" permission: "Permesoj" enableAll: "Ebligi ĉiujn" disableAll: "Malebligi ĉiujn" +tokenRequested: "Alirpermeso al konto" notificationType: "Tipo de sciigoj" edit: "Redakti" emailServer: "Retpoŝta servilo" @@ -530,6 +546,7 @@ regenerateLoginToken: "Regeneri la aÅ­tentikigan pecon" fileIdOrUrl: "Dosiera identigilo aÅ­ URL" behavior: "Konduto" sample: "Ekzemplo" +reporter: "Informanto" send: "Sendi" openInNewTab: "Malfermi en nova langeto" editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn povas damaĝi vian konton." @@ -553,6 +570,7 @@ followingCount: "La nombro de sekvatoj" followersCount: "La nombro de sekvantoj" sentReactionsCount: "La nombro de la reagoj senditaj" receivedReactionsCount: "La nombro de la reagoj ricevitaj" +pollVotesCount: "Nombro de voĉdonado" yes: "Jes" no: "Ne" driveFilesCount: "La nombro de la dosieroj sur la disko" @@ -587,6 +605,7 @@ createdAt: "Kreita je" updatedAt: "Laste ĝisdatigita" saveConfirm: "Ĉu vi konservas la ŝanĝon?" deleteConfirm: "Ĉu certas forviŝi?" +invalidValue: "Nevalida valoro" closeAccount: "Forigi konton" currentVersion: "La aktuala versio" latestVersion: "La plej nova versio" @@ -608,14 +627,18 @@ userInfo: "Informoj de uzanto" unknown: "Nekonata" online: "Surkonektita" offline: "Forkonektita" +notRecommended: "Evitindaj" instanceBlocking: "Bloki specifajn nodojn" selectAccount: "Elekti konton" user: "Uzantoj" administration: "Bontenado" accounts: "Kontoj" +configure: "Agordi" recentPosts: "Novaj afiŝoj" +popularPosts: "Populara noto" shareWithNote: "Kundividi en noto" ads: "ReklamaÄĩo" +expiration: "Limtempo" memo: "Memorigilo" high: "Alta" middle: "Meza" @@ -629,12 +652,18 @@ searchResult: "Serĉorezultoj" hashtags: "Kradvorto" troubleshooting: "Problemsolvi" learnMore: "Lernu pli" +misskeyUpdated: "Misskey ĝisdatiĝis!" +whatIsNew: "Montri novaÄĩojn" translate: "Traduki" translatedFrom: "Tradukita el {x}" +accountDeletionInProgress: "La konto estas forviŝanta." +resolved: "Solvita" +unresolved: "Nesolvita" breakFollow: "Ĉesigi la sekvadon al vi" itsOn: "Ŝaltita" emailRequiredForSignup: "Registri konton devas konformi retpoŝtadreson" unread: "Nelegita" +filter: "Filtrilo" controlPanel: "Ŝaltpodio" manageAccounts: "Bonteni la kontojn" classic: "Klasika" @@ -644,6 +673,7 @@ ffVisibility: "Videbleco de viaj sekvatoj/sekvantoj" ffVisibilityDescription: "Oni permesas agordi tiuln kiuj povas vidi la homojn kiujn vi sekvas, kaj la homojn kiuj sekvas vin." continueThread: "Pli vidi la mesaĝaron" incorrectPassword: "Nevalida pasvorto" +voteConfirm: "Ĉu vi voĉdonas {choice}n?" leaveGroup: "Eliĝi el la grupo" leaveGroupConfirm: "Ĉu vi certas ke vi volas eliĝi el la grupo {name}?" welcomeBackWithName: "Bonrevenon, {name}!" @@ -661,11 +691,14 @@ _signup: emailAddressInfo: "Entajpu vian retpoŝton" _accountDelete: accountDelete: "Forigi konton" + requestAccountDelete: "Peti forviŝi konton" + started: "Forviŝado komenciĝis." _ad: back: "Nuligi" _forgotPassword: enterEmail: "Entajpu la retpoŝton kiun vi registrigis al via konto. Ligilo por restarigi pasvorton estos sendita al la retadreso." _gallery: + my: "Mia afiŝo" liked: "Ŝatitaj notoj" like: "Ŝati" _email: @@ -687,6 +720,7 @@ _aboutMisskey: allContributors: "Ĉiuj kontribuantoj" source: "Fontkodo" translation: "Traduki Misskey" + donate: "Mondonaci al Misskey" patrons: "Mecenatoj" _mfm: dummy: "Misskey evoluigas la mondon de Fediverso" @@ -724,6 +758,7 @@ _channel: owned: "Bontenitaj de vi" following: "Sekvado" usersCount: "{n} partoprenantoj" + notesCount: "{n} notoj" _menuDisplay: sideFull: "Flanko" sideIcon: "Flanko (bildsimbolo)" @@ -735,9 +770,15 @@ _wordMute: hard: "Per la servilo" mutedNotes: "Silentigitaj notoj" _theme: + explore: "Serĉi koloraron" + install: "Instali koloraron" manage: "Bonteni kolorarojn" code: "Kolorara kodo" description: "Priskribo" + installedThemes: "Instalita koloraro" + make: "Krei koloraron" + addConstant: "Aldoni konstanton" + constant: "Konstanto" defaultValue: "ImplicitaÄĩa valoro" color: "Koloro" func: "Funkcio" @@ -745,12 +786,14 @@ _theme: lighten: "Brileco" keys: bg: "Fono" + shadow: "Ombro" navBg: "Fono de flanka stango" link: "Ligilo" hashtag: "Kradvorto" mention: "Mencioj" mentionMe: "Mencio al vi" renote: "Plusendita" + infoBg: "Fono de informo" buttonBg: "Fono de butono" driveFolderBg: "Fono de dosierujo de la disko" messageBg: "Fono de la retbabilejo" @@ -823,6 +866,7 @@ _widgets: timeline: "Templinio" clock: "Horloĝo" activity: "Aktiveco" + photos: "Fotoj" federation: "FederaÄĩo" slideshow: "Bildoprezento" button: "Butono" @@ -830,10 +874,12 @@ _widgets: aichan: "Ai" _cw: show: "Vidi pli" + chars: "{count} literoj" files: "{count} dosiero(j)" _poll: choiceN: "Balotilo {n}" noMore: "Oni ne povas aldoni pli." + expiration: "Limtempo" infinite: "Neniam" deadlineTime: "hor" votesCount: "{n} balotiloj" @@ -876,7 +922,7 @@ _exportOrImport: blockingList: "Blokitoj" userLists: "Listoj" _charts: - federationInstancesTotal: "La totala nombro de nodoj federantaj" + federation: "FederaÄĩo" usersTotal: "La totala nombro de la uzantoj" activeUsers: "La nombro de la uzantoj aktivaj" notesTotal: "La totala nombro de notoj" @@ -965,6 +1011,45 @@ _pages: _join: arg1: "Listoj" arg2: "apartigilo" + _add: + arg1: "A" + arg2: "B" + _subtract: + arg1: "A" + arg2: "B" + _multiply: + arg1: "A" + arg2: "B" + _divide: + arg1: "A" + arg2: "B" + _mod: + arg1: "A" + arg2: "B" + _eq: + arg1: "A" + arg2: "B" + _notEq: + arg1: "A" + arg2: "B" + _and: + arg1: "A" + arg2: "B" + _or: + arg1: "A" + arg2: "B" + _lt: + arg1: "A" + arg2: "B" + _gt: + arg1: "A" + arg2: "B" + _ltEq: + arg1: "A" + arg2: "B" + _gtEq: + arg1: "A" + arg2: "B" random: "Hazardo" _randomPick: arg1: "Listoj" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index a9339acf7b..1e85e7d8c4 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1091,8 +1091,8 @@ _exportOrImport: blockingList: "Bloqueados" userLists: "Listas" _charts: - federationInstancesIncDec: "VariaciÃŗn de instancias federando" - federationInstancesTotal: "Total de instancias federando" + federation: "FederaciÃŗn" + apRequest: "Pedidos" usersIncDec: "VariaciÃŗn de usuarios" usersTotal: "Total de usuarios" activeUsers: "Cantidad de usuarios activos" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 62f85bef8d..1deda414ce 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -141,6 +141,7 @@ flagAsBot: "Ce compte est un robot" flagAsBotDescription: "Si ce compte est gÊrÊ de manière automatisÊe, choisissez cette option. Si elle est activÊe, elle agira comme un marqueur pour les autres dÊveloppeurs afin d'Êviter des chaÃŽnes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot." flagAsCat: "Ce compte est un chat" flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." +flagShowTimelineReplies: "Afficher les rÊponses dans le fil" autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur¡rice¡s que vous suivez" addAccount: "Ajouter un compte" loginFailed: "Échec de la connexion" @@ -811,6 +812,7 @@ ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que t continueThread: "Afficher la suite du fil" deleteAccountConfirm: "Votre compte sera supprimÊ. Êtes vous certain ?" incorrectPassword: "Le mot de passe est incorrect." +voteConfirm: "Confirmez-vous votre vote pour ÂĢ {choice} Âģ ?" hide: "Masquer" leaveGroup: "Quitter le groupe" leaveGroupConfirm: "Êtes vous sÃģr de vouloir quitter \"{name}\" ?" @@ -972,6 +974,8 @@ _wordMute: hard: "Strict" mutedNotes: "Notes filtrÊes" _instanceMute: + instanceMuteDescription2: "SÊparer avec de nouvelles lignes" + title: "Masque les notes venant des instances listÊes." heading: "Instances à mettre en sourdine" _theme: explore: "Explorer les thèmes" @@ -1247,8 +1251,8 @@ _exportOrImport: excludeMutingUsers: "Exclure les utilisateur¡rice¡s mis en sourdine" excludeInactiveUsers: "Exclure les utilisateur¡rice¡s inactifs" _charts: - federationInstancesIncDec: "Variation du nombre d'instances fÊdÊrÊes" - federationInstancesTotal: "Nombre total d'instances fÊdÊrÊes" + federation: "FÊdÊration" + apRequest: "RequÃĒtes" usersIncDec: "Variation du nombre d'utilisateur¡rice¡s" usersTotal: "Nombre des utilisateur¡rice¡s au total" activeUsers: "Nombre d'utilisateurices actif¡ve¡s" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index a1d52f6ef1..be766e72c5 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -106,6 +106,7 @@ clickToShow: "Klik untuk melihat" sensitive: "Konten sensitif" add: "Tambahkan" reaction: "Reaksi" +reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi" reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan" rememberNoteVisibility: "Ingat pengaturan visibilitas catatan" attachCancel: "Hapus lampiran" @@ -140,6 +141,8 @@ flagAsBot: "Atur akun ini sebagai Bot" flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot." flagAsCat: "Atur akun ini sebagai kucing" flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing." +flagShowTimelineReplies: "Tampilkan balasan di linimasa" +flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna lain di linimasa apabila dinyalakan." autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti" addAccount: "Tambahkan akun" loginFailed: "Gagal untuk masuk" @@ -234,6 +237,8 @@ resetAreYouSure: "Yakin mau atur ulang?" saved: "Telah disimpan" messaging: "Pesan" upload: "Unggah" +keepOriginalUploading: "Simpan gambar asli" +keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah." fromDrive: "Dari Drive" fromUrl: "Dari URL" uploadFromUrl: "Unggah dari URL" @@ -446,6 +451,7 @@ uiLanguage: "Bahasa antarmuka pengguna" groupInvited: "Telah diundang ke grup" aboutX: "Tentang {x}" useOsNativeEmojis: "Gunakan Emoji bawaan sistem operasi" +disableDrawer: "Jangan gunakan menu bergaya laci" youHaveNoGroups: "Kamu tidak memiliki grup" joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri." noHistory: "Tidak ada riwayat" @@ -589,6 +595,7 @@ smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP" smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS" testEmail: "Tes pengiriman surel" wordMute: "Bisukan kata" +instanceMute: "Bisuka instansi" userSaysSomething: "{name} mengatakan sesuatu" makeActive: "Aktifkan" display: "Tampilkan" @@ -616,8 +623,11 @@ reportAbuse: "Laporkan" reportAbuseOf: "Laporkan {name}" fillAbuseReportDescription: "Mohon isi rincian laporan. Jika laporan ini mengenai catatan yang spesifik, mohon lampirkan serta URL catatan tersebut." abuseReported: "Laporan kamu telah dikirimkan. Terima kasih." +reporter: "Pelapor" reporteeOrigin: "Yang dilaporkan" reporterOrigin: "Pelapor" +forwardReport: "Teruskan laporan ke instansi luar" +forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar." send: "Kirim" abuseMarkAsResolved: "Tandai laporan sebagai selesai" openInNewTab: "Buka di tab baru" @@ -679,6 +689,7 @@ center: "Tengah" wide: "Lebar" narrow: "Sempit" reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali. Apakah kamu ingin memuat halaman kembali sekarang?" +needReloadToApply: "Pengaturan ini hanya akan diterapkan setelah memuat ulang halaman." showTitlebar: "Tampilkan bilah judul" clearCache: "Hapus tembolok" onlineUsersCount: "{n} orang sedang daring" @@ -739,6 +750,7 @@ notRecommended: "Tidak disarankan" botProtection: "Perlindungan Bot" instanceBlocking: "Instansi yang diblokir" selectAccount: "Pilih akun" +switchAccount: "Ganti akun" enabled: "Aktif" disabled: "Nonaktif" quickAction: "Aksi cepat" @@ -787,6 +799,7 @@ pubSub: "Akun Pub/Sub" lastCommunication: "Komunikasi terakhir" resolved: "Selesai" unresolved: "Belum selesai" +breakFollow: "Batalkan mengikuti" itsOn: "Aktif" itsOff: "Nonaktif" emailRequiredForSignup: "Membutuhkan alamat surel untuk mendaftar" @@ -806,6 +819,15 @@ deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?" incorrectPassword: "Kata sandi salah." voteConfirm: "Konfirmasi suara kamu untuk ({choice})īŧŸ" hide: "Sembunyikan" +leaveGroup: "Keluar grup" +leaveGroupConfirm: "Apakah kamu yakin untuk keluar dari \"{name}\"?" +useDrawerReactionPickerForMobile: "Tampilkan bilah reaksi sebagai laci di ponsel" +welcomeBackWithName: "Selamat datang kembali, {name}." +clickToFinishEmailVerification: "Mohon klik [{ok}] untuk menyelesaikan verifikasi email." +overridedDeviceKind: "Tipe perangkat" +smartphone: "Ponsel" +tablet: "Tablet" +auto: "Otomatis" _emailUnavailable: used: "Alamat surel ini telah digunakan" format: "Format tidak valid." @@ -963,6 +985,11 @@ _wordMute: soft: "Lembut" hard: "Keras" mutedNotes: "Catatan yang dibisukan" +_instanceMute: + instanceMuteDescription: "Pengaturan ini akan membisukan note/renote apa saja dari instansi yang terdaftar, termasuk pengguna yang membalas pengguna lain dalam instansi yang dibisukan." + instanceMuteDescription2: "Pisah dengan baris baru" + title: "Sembunyikan note dari instansi terdaftar." + heading: "Daftar instansi yang akan dibisukan" _theme: explore: "Jelajahi tema" install: "Pasang tema" @@ -1234,9 +1261,11 @@ _exportOrImport: muteList: "Bisukan" blockingList: "Blokir" userLists: "Daftar" + excludeMutingUsers: "Kecualikan pengguna yang dibisukan" + excludeInactiveUsers: "Kecualikan pengguna tidak aktif" _charts: - federationInstancesIncDec: "Perbedaan jumlah # instansi yang memfederasi" - federationInstancesTotal: "Jumlah # instansi yang memfederasi" + federation: "Federasi" + apRequest: "Permintaan" usersIncDec: "Perbedaan dalam # pengguna" usersTotal: "Jumlah # pengguna" activeUsers: "Pengguna aktif" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index d13e53625f..c4ec4232a5 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1177,8 +1177,8 @@ _exportOrImport: blockingList: "Account bloccati" userLists: "Liste" _charts: - federationInstancesIncDec: "Variazione del numero di istanze federate" - federationInstancesTotal: "Numero totale di istanze federate" + federation: "Federazione" + apRequest: "Richieste" usersIncDec: "Variazione del numero di utenti" usersTotal: "Numero totale di utenti" activeUsers: "Numero di utenti attivi" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8fd41e533b..ac8d4951a8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -141,6 +141,8 @@ flagAsBot: "BotとしãĻč¨­åŽš" flagAsBotDescription: "こぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒãƒ—ãƒ­ã‚°ãƒŠãƒ ãĢã‚ˆãŖãĻé‹į”¨ã•ã‚Œã‚‹å ´åˆã¯ã€ã“ãŽãƒ•ãƒŠã‚°ã‚’ã‚ĒãƒŗãĢしぞす。ã‚ĒãƒŗãĢすると、反åŋœãŽé€ŖéŽ–ã‚’é˜˛ããŸã‚ãŽãƒ•ãƒŠã‚°ã¨ã—ãĻäģ–ぎ開į™ē者ãĢåŊšįĢ‹ãŖãŸã‚Šã€MisskeyãŽã‚ˇã‚šãƒ†ãƒ ä¸Šã§ãŽæ‰ąã„ãŒBotãĢåˆãŖãŸã‚‚ãŽãĢãĒりぞす。" flagAsCat: "CatとしãĻč¨­åŽš" flagAsCatDescription: "こぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒįŒĢであることをį¤ēす場合は、こぎフナグをã‚ĒãƒŗãĢしぞす。" +flagShowTimelineReplies: "ã‚ŋã‚¤ãƒ ãƒŠã‚¤ãƒŗãĢノãƒŧトへぎčŋ”äŋĄã‚’襨į¤ēする" +flagShowTimelineRepliesDescription: "ã‚ĒãƒŗãĢすると、ã‚ŋã‚¤ãƒ ãƒŠã‚¤ãƒŗãĢãƒĻãƒŧã‚ļãƒŧぎノãƒŧトäģĨ外ãĢもそぎãƒĻãƒŧã‚ļãƒŧぎäģ–ぎノãƒŧトへぎčŋ”äŋĄã‚’襨į¤ēしぞす。" autoAcceptFollowed: "フりロãƒŧ中ãƒĻãƒŧã‚ļãƒŧからぎフりロãƒĒクをč‡Ē動æ‰ŋčĒ" addAccount: "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’čŋŊ加" loginFailed: "ãƒ­ã‚°ã‚¤ãƒŗãĢå¤ąæ•—ã—ãžã—ãŸ" @@ -822,6 +824,10 @@ leaveGroupConfirm: "「{name}」から抜けぞすかīŧŸ" useDrawerReactionPickerForMobile: "ãƒĸバイãƒĢデバイ゚ぎときドロワãƒŧã§čĄ¨į¤ē" welcomeBackWithName: "おかえりãĒさい、{name}さん" clickToFinishEmailVerification: "[{ok}]をæŠŧしãĻã€ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ぎįĸēčĒã‚’åŽŒäē†ã—ãĻください。" +overridedDeviceKind: "デバイ゚ã‚ŋイプ" +smartphone: "゚マãƒŧãƒˆãƒ•ã‚Šãƒŗ" +tablet: "ã‚ŋブãƒŦット" +auto: "č‡Ē動" _emailUnavailable: used: "æ—ĸãĢäŊŋį”¨ã•ã‚ŒãĻいぞす" @@ -1296,8 +1302,8 @@ _exportOrImport: excludeInactiveUsers: "äŊŋわれãĻいãĒいã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’é™¤å¤–" _charts: - federationInstancesIncDec: "é€ŖåˆãŽåĸ—減" - federationInstancesTotal: "é€ŖåˆãŽåˆč¨ˆ" + federation: "é€Ŗåˆ" + apRequest: "ãƒĒクエ゚ト" usersIncDec: "ãƒĻãƒŧã‚ļãƒŧぎåĸ—減" usersTotal: "ãƒĻãƒŧã‚ļãƒŧãŽåˆč¨ˆ" activeUsers: "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãƒĻãƒŧã‚ļãƒŧ数" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 45ab9684d2..b5b4e72576 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -81,6 +81,8 @@ somethingHappened: "ãĒんかã‚ĸã‚Ģãƒŗã“ã¨ãŒčĩˇã“ãŖãŸã§" retry: "ã‚‚ãŖãēんやるīŧŸ" pageLoadError: "ペãƒŧジぎčĒ­ãŋčžŧãŋãĢå¤ąæ•—ã—ãĻしもうたでâ€Ļ" pageLoadErrorDescription: "これは晎通、ネットワãƒŧクかブナã‚Ļã‚ļã‚­ãƒŖãƒƒã‚ˇãƒĨãŒåŽŸå› ã‚„ã‹ã‚‰ã­ã€‚ã‚­ãƒŖãƒƒã‚ˇãƒĨをクãƒĒã‚ĸã™ã‚‹ã‹ã€ã‚‚ã†ãĄãŖã¨ã ã‘åž…ãŖãĻくれへんかīŧŸ" +serverIsDead: "The server is not responding. Please wait for a while before trying again." +youShouldUpgradeClient: "To display this page, please reload and use a new version client. " enterListName: "ãƒĒ゚ト名をå…ĨれãĻや" privacy: "ãƒ—ãƒŠã‚¤ãƒã‚ˇãƒŧ" makeFollowManuallyApprove: "č‡Ē分がčĒã‚ãŸäēēだけがこぎã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’ãƒ•ã‚Šãƒ­ãƒŧできるようãĢする" @@ -104,6 +106,7 @@ clickToShow: "æŠŧしたらčĻ‹ãˆã‚‹ã§" sensitive: "ãĄã‚‡ãŖã¨ã‚ĸã‚Ģãƒŗã‚„ã¤ã‚„ã§" add: "åĸ—やす" reaction: "ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗ" +reactionSetting: "Reaction that will be displayed in Picker. " reactionSettingDescription2: "ドナッグでä¸Ļãŗæ›ŋえ、クãƒĒックで削除、īŧ‹ã‚’æŠŧしãĻčŋŊ加やで。" rememberNoteVisibility: "å…Ŧ開ᝄ回čĻšãˆã¨ã„ãĻ" attachCancel: "ãŽãŖã‘ã‚‹ãŽã‚„ã‚ã‚‹" @@ -138,6 +141,8 @@ flagAsBot: "Botやで" flagAsBotDescription: "もしこぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒãƒ—ãƒ­ã‚°ãƒŠãƒ ãĢã‚ˆãŖãĻé‹į”¨ã•ã‚Œã‚‹ã‚“ã‚„ãŖãŸã‚‰ã€ã“ãŽãƒ•ãƒŠã‚°ã‚’ã‚ĒãƒŗãĢしãĻたぎむで。ã‚ĒãƒŗãĢすると、反åŋœãŽé€ŖéŽ–ã‚’é˜˛ããŸã‚ãŽãƒ•ãƒŠã‚°ã¨ã—ãĻäģ–ぎ開į™ē者ãĢåŊšįĢ‹ãŖãŸã‚Šã€MisskeyãŽã‚ˇã‚šãƒ†ãƒ ä¸Šã§ãŽæ‰ąã„ãŒBotãĢåˆãŖãŸã‚‚ã‚“ãĢãĒるんやで。" flagAsCat: "Catやで" flagAsCatDescription: "ワãƒŦ、įŒĢãĄã‚ƒã‚“ãĒらこぎフナグをつけãĻãŋīŧŸ" +flagShowTimelineReplies: "It will display the reply to the note in the timeline. " +flagShowTimelineRepliesDescription: "It will display the reply to notes other than the user notes in the timeline when you turn it on. " autoAcceptFollowed: "フりロãƒŧしとるãƒĻãƒŧã‚ļãƒŧからぎフりロãƒŧãƒĒクエ゚トを勝手ãĢč¨ąå¯ã—ã¨ã" addAccount: "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’čŋŊ加" loginFailed: "ãƒ­ã‚°ã‚¤ãƒŗãĢå¤ąæ•—ã—ãĻしもうたâ€Ļ" @@ -232,6 +237,8 @@ resetAreYouSure: "ãƒĒã‚ģットしãĻええんīŧŸ" saved: "äŋå­˜ã—たでīŧ" messaging: "ãƒãƒŖãƒƒãƒˆ" upload: "ã‚ĸップロãƒŧド" +keepOriginalUploading: "Retain the original image. " +keepOriginalUploadingDescription: "When uploading the clip, the original version will be retained. Turning it of then uploading will produce images for public use. " fromDrive: "ドナイブから" fromUrl: "URLから" uploadFromUrl: "URLã‚ĸップロãƒŧド" @@ -884,6 +891,8 @@ _exportOrImport: blockingList: "ブロック" userLists: "ãƒĒ゚ト" _charts: + federation: "é€Ŗåˆ" + apRequest: "ãƒĒクエ゚ト" usersTotal: "ãƒĻãƒŧã‚ļãƒŧãŽåˆč¨ˆ" activeUsers: "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãƒĻãƒŧã‚ļãƒŧ数" notesIncDec: "ノãƒŧトぎåĸ—減" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 38a328862f..116e397ff5 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -141,6 +141,8 @@ flagAsBot: "나는 ë´‡ėž…ë‹ˆë‹¤" flagAsBotDescription: "ė´ ęŗ„ė •ė„ ėžë™í™”ëœ ėˆ˜ë‹¨ėœŧ로 ėš´ėšŠí•  ę˛Ŋėš°ė— í™œė„ąí™”í•´ ėŖŧė„¸ėš”. ė´ 플래그ëĨŧ í™œė„ąí™”í•˜ëŠ´, 다ëĨ¸ ë´‡ė´ ė´ëĨŧ ė°¸ęŗ í•˜ė—Ŧ 봇 ëŧëĻŦė˜ ëŦ´í•œ 뗰뇄 ë°˜ė‘ė„ 회í”ŧ하거나, ė´ ęŗ„ė •ė˜ ė‹œėŠ¤í…œ ėƒė—ė„œė˜ ėˇ¨ę¸‰ė´ Bot ėš´ė˜ė— ėĩœė í™”되는 ë“ąė˜ ëŗ€í™”ę°€ ėƒęšë‹ˆë‹¤." flagAsCat: "나는 ęŗ ė–‘ė´ë‹¤ëƒĨ" flagAsCatDescription: "ė´ ęŗ„ė •ė´ ęŗ ė–‘ė´ëŧ늴 í™œė„ąí™” 해ėŖŧė„¸ėš”." +flagShowTimelineReplies: "íƒ€ėž„ëŧė¸ė— ë…¸íŠ¸ė˜ ë‹ĩę¸€ė„ í‘œė‹œí•˜ę¸°" +flagShowTimelineRepliesDescription: "ė´ ė„¤ė •ė„ í™œė„ąí™”í•˜ëŠ´ íƒ€ėž„ëŧė¸ė— 다ëĨ¸ ėœ ė € ę°„ė˜ ë‹ĩę¸€ė„ í‘œė‹œí•Šë‹ˆë‹¤." autoAcceptFollowed: "íŒ”ëĄœėš° ė¤‘ė¸ ėœ ė €ëĄœëļ€í„°ė˜ íŒ”ëĄœėš° ėš”ė˛­ė„ ėžë™ 눘ëŊ" addAccount: "ęŗ„ė • ėļ”ę°€" loginFailed: "ëĄœęˇ¸ė¸ė— ė‹¤íŒ¨í–ˆėŠĩ니다" @@ -822,6 +824,10 @@ leaveGroupConfirm: "\"{name}\"ė—ė„œ ë‚˜ę°ˆęšŒėš”?" useDrawerReactionPickerForMobile: "ëĒ¨ë°”ėŧė—ė„œ ë“œëĄœė–´ 메뉴로 í‘œė‹œ" welcomeBackWithName: "í™˜ė˜í•Šë‹ˆë‹¤, {name}님" clickToFinishEmailVerification: "[{ok}]ëĨŧ 눌ëŸŦ ė´ëŠ”ėŧ ė¸ėĻė„ ė™„ëŖŒí•˜ė„¸ėš”." +overridedDeviceKind: "ėžĨėš˜ ėœ í˜•" +smartphone: "ėŠ¤ë§ˆíŠ¸í°" +tablet: "태블ëĻŋ" +auto: "ėžë™" _emailUnavailable: used: "ė´ 메ėŧ ėŖŧė†ŒëŠ” ė‚ŦėšŠė¤‘ėž…ë‹ˆë‹¤" format: "í˜•ė‹ė´ ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "뮤트한 ėœ ė € ė œė™¸í•˜ę¸°" excludeInactiveUsers: "휴면 ė¤‘ė¸ ęŗ„ė • ė œė™¸í•˜ę¸°" _charts: - federationInstancesIncDec: "ė—°í•Š ė¸ėŠ¤í„´ėŠ¤ 눘 ėĻę°" - federationInstancesTotal: "ė—°í•Š ė¸ėŠ¤í„´ėŠ¤ 눘 í•Šęŗ„" + federation: "ė—°í•Š" + apRequest: "ėš”ė˛­" usersIncDec: "ėœ ė € 눘 ėĻę°" usersTotal: "ėœ ė € 눘 í•Šęŗ„" activeUsers: "í™œė„ą ėœ ė € 눘" diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 386357f2d3..38f9a88af8 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -291,6 +291,8 @@ _exportOrImport: userLists: "Lijsten" excludeMutingUsers: "Negeer gedempte gebruikers" excludeInactiveUsers: "Negeer inactieve gebruikers" +_charts: + federation: "Federatie" _timelines: home: "Startpagina" _pages: diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index 27772663bc..0b57a3a46f 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -1084,7 +1084,8 @@ _exportOrImport: blockingList: "Zablokuj" userLists: "Listy" _charts: - federationInstancesTotal: "Łącznie sfederowanych instancji" + federation: "Federacja" + apRequest: "Åģądania" usersTotal: "Łącznie # uÅŧytkownikÃŗw" activeUsers: "Aktywni uÅŧytkownicy" _instanceCharts: diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 7de9f8ff95..b29d2173c8 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -235,6 +235,7 @@ resetAreYouSure: "На ŅĐ°ĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ?" saved: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐž" messaging: "ĐĄĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ" upload: "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ" +keepOriginalUploading: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ Đ¸ŅŅ…ĐžĐ´ĐŊĐžĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" fromDrive: "ĐĄ ÂĢĐ´Đ¸ŅĐēаÂģ" fromUrl: "По ҁҁҋĐģĐēĐĩ" uploadFromUrl: "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐŋĐž ҁҁҋĐģĐēĐĩ" @@ -743,6 +744,7 @@ notRecommended: "НĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ" botProtection: "Đ‘ĐžŅ‚ĐžĐˇĐ°Ņ‰Đ¸Ņ‚Đ°" instanceBlocking: "БĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēа иĐŊŅŅ‚Đ°ĐŊŅĐžĐ˛" selectAccount: "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅƒŅ‡Ņ‘Ņ‚ĐŊŅƒŅŽ СаĐŋĐ¸ŅŅŒ" +switchAccount: "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅƒŅ‡Ņ‘Ņ‚ĐŊŅƒŅŽ СаĐŋĐ¸ŅŅŒ" enabled: "ВĐēĐģ." disabled: "ĐžŅ‚ĐēĐģ." quickAction: "Đ‘Ņ‹ŅŅ‚Ņ€ĐžĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ" @@ -1249,8 +1251,8 @@ _exportOrImport: excludeMutingUsers: "За Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ ĐˇĐ°ĐŗĐģ҃҈ĐĩĐŊĐŊҋ҅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" excludeInactiveUsers: "БĐĩС ĐŊĐĩаĐēŅ‚Đ¸Đ˛ĐŊҋ҅ ŅƒŅ‡Ņ‘Ņ‚ĐŊҋ҅ СаĐŋĐ¸ŅĐĩĐš" _charts: - federationInstancesIncDec: "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ вĐŊĐĩ҈ĐŊĐ¸Ņ… ŅĐ˛ŅĐˇĐĩĐš" - federationInstancesTotal: "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž вĐŊĐĩ҈ĐŊĐ¸Ņ… ŅĐ˛ŅĐˇĐĩĐš" + federation: "ФĐĩĐ´ĐĩŅ€Đ°Ņ†Đ¸Ņ" + apRequest: "ЗаĐŋŅ€ĐžŅŅ‹" usersIncDec: "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ Ņ‡Đ¸ŅĐģа ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" usersTotal: "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" activeUsers: "АĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи" diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml new file mode 100644 index 0000000000..7ee4f5be79 --- /dev/null +++ b/locales/sk-SK.yml @@ -0,0 +1,1636 @@ +--- +_lang_: "Slovenčina" +headlineMisskey: "SieÅĨ prepojenÃĄ poznÃĄmkami" +introMisskey: "Vitajte! Misskey je otvorenÃĄ a decentralizovanÃĄ mikroblogovacia sluÅžba.\n\"PoznÃĄmkami\" môŞete zdieÄžaÅĨ svoje myÅĄlienky so vÅĄetkÃŊmi okolo. 📡\nPomocou \"reakcií\" môŞete rÃŊchlo vyjadri svoje pocity o kaÅždÊho poznÃĄmkach. 👍\nPoďte objavovaÅĨ svet! 🚀" +monthAndDay: "{day}. {month}." +search: "HÄžadaÅĨ" +notifications: "OznÃĄmenia" +username: "Meno pouŞívateÄža" +password: "Heslo" +forgotPassword: "ZabudnutÊ heslo" +fetchingAsApObject: "Načítam Ãēdaje z Fediverzu" +ok: "OK" +gotIt: "Rozumiem!" +cancel: "ZruÅĄiÅĨ" +enterUsername: "Zadajte meno pouŞívateÄža" +renotedBy: "{user} preposlal/a" +noNotes: "ÅŊiadne poznÃĄmky" +noNotifications: "ÅŊiadne oznÃĄmenia" +instance: "InÅĄtancia" +settings: "Nastavenia" +basicSettings: "VÅĄeobecnÊ nastavenia" +otherSettings: "RozÅĄÃ­renÊ nastavenia" +openInWindow: "OtvoriÅĨ v novom okne" +profile: "Profil" +timeline: "ČasovÃĄ os" +noAccountDescription: "Tento pouŞívateÄž zatiaÄž nenapísal o sebe." +login: "PrihlÃĄsiÅĨ sa" +loggingIn: "Prebieha prihlasovanie" +logout: "OdhlÃĄsiÅĨ" +signup: "RegistrovaÅĨ" +uploading: "NahrÃĄvanie..." +save: "UloÅžiÅĨ" +users: "PouŞívatelia" +addUser: "PridaÅĨ pouŞívateÄža" +favorite: "PÃĄÄi sa mi" +favorites: "ObÄžÃēbenÊ" +unfavorite: "NepÃĄÄi sa mi" +favorited: "PridanÊ do obÄžÃēbenÃŊch" +alreadyFavorited: "UÅž je medzi obÄžÃēbenÃŊmi" +cantFavorite: "Nepodarilo sa pridaÅĨ medzi obÄžÃēbenÊ." +pin: "PripnÃēÅĨ" +unpin: "OdopnÃēÅĨ" +copyContent: "KopírovaÅĨ obsah" +copyLink: "KopírovaÅĨ odkaz" +delete: "OdstrÃĄniÅĨ" +deleteAndEdit: "OdstrÃĄniÅĨ a upraviÅĨ" +deleteAndEditConfirm: "Naozaj chcete odstrÃĄniÅĨ tÃēto poznÃĄmku a upraviÅĨ ju? Stratíte tÃŊm vÅĄetky reakcie a odpovede na ňu." +addToList: "PridaÅĨ do zoznamu" +sendMessage: "OdoslaÅĨ sprÃĄvu" +copyUsername: "KopírovaÅĨ meno pouŞívateÄža" +searchUser: "HÄžadaÅĨ pouŞívateÄžov" +reply: "OdpovedaÅĨ" +loadMore: "ZobraziÅĨ viac" +showMore: "ZobraziÅĨ viac" +youGotNewFollower: "MÃĄte novÊho sledujÃēceho" +receiveFollowRequest: "ÅŊiadosÅĨ o sledovanie prijatÃĄ" +followRequestAccepted: "ÅŊiadosÅĨ o sledovanie akceptovanÃĄ" +mention: "Zmienka" +mentions: "Zmienky" +directNotes: "Priame poznÃĄmky" +importAndExport: "Import a export" +import: "ImportovaÅĨ" +export: "ExportovaÅĨ" +files: "SÃēbor/y" +download: "StiahnuÅĨ" +driveFileDeleteConfirm: "Naozaj chcete odstrÃĄniÅĨ sÃēbor \"{name}\"? PoznÃĄmky s tÃŊmto sÃēborom sa odstrÃĄnia tieÅž." +unfollowConfirm: "Naozaj uÅž nechcete sledovaÅĨ {name}?" +exportRequested: "VyÅžiadali ste export. MôŞe to chvíĞu trvaÅĨ. Po skončení pribudne na vaÅĄom disku." +importRequested: "PoÅžiadali ste o export. MôŞe to chvíĞu trvaÅĨ." +lists: "Zoznamy" +noLists: "NemÃĄte Åžiadne zoznamy" +note: "PoznÃĄmka" +notes: "PoznÃĄmky" +following: "Sledujete" +followers: "SledujÃēci" +followsYou: "SledujÃē vÃĄs" +createList: "VytvoriÅĨ zoznam" +manageLists: "SpravovaÅĨ zoznamy" +error: "Chyba" +somethingHappened: "Ups. Niečo sa nepodarilo." +retry: "OpakovaÅĨ" +pageLoadError: "Nepodarilo sa načítaÅĨ strÃĄnku" +pageLoadErrorDescription: "Toto môŞe byÅĨ spôsobenÊ problÊmami so sieÅĨou alebo cachou prehliadača. SkÃēste vyčistiÅĨ cache a potom skÃēsiÅĨ znova po chvíli." +serverIsDead: "Tento server nereaguje. Prosím chvíĞu počkajte a skÃēste znova." +youShouldUpgradeClient: "Na pozretie tejto strÃĄnky prosím obnovte svojho klienta." +enterListName: "Zadajte nÃĄzov zoznamu" +privacy: "SÃēkromie" +makeFollowManuallyApprove: "ÅŊiadosti o sledovanie treba schvÃĄliÅĨ" +defaultNoteVisibility: "PredvolenÃĄ viditeÄžnosÅĨ" +follow: "SledovaÅĨ" +followRequest: "PoÅžiadaÅĨ o sledovanie" +followRequests: "ÅŊiadosti o sledovanie" +unfollow: "NesledovaÅĨ" +followRequestPending: "ÅŊiadosÅĨ o sledovanie čakÃĄ" +enterEmoji: "Zadajte emoji" +renote: "PreposlaÅĨ" +unrenote: "VrÃĄtiÅĨ preposlanie" +renoted: "PreposlanÊ." +cantRenote: "Tento príspevok sa nedÃĄ preposlaÅĨ." +cantReRenote: "Odpoveď nemôŞe byÅĨ odstrÃĄnenÃĄ." +quote: "CitovaÅĨ" +pinnedNote: "PripnutÊ poznÃĄmky" +pinned: "PripnÃēÅĨ" +you: "Vy" +clickToShow: "Kliknutím zobrazíte" +sensitive: "NSFW" +add: "PridaÅĨ" +reaction: "Reakcie" +reactionSetting: "Reakcie zobrazenÊ vo vÃŊbere reakcií" +reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstrÃĄnite, Stlačením \"+\" pridÃĄte" +rememberNoteVisibility: "ZapamätaÅĨ nastavenia viditeÄžnosti poznÃĄmky" +attachCancel: "OdstrÃĄniÅĨ prílohu" +markAsSensitive: "OznačiÅĨ ako NSFW" +unmarkAsSensitive: "OdznačiÅĨ NSFW" +enterFileName: "Zadajte nÃĄzov sÃēboru" +mute: "VypnÃēÅĨ zvuk" +unmute: "ZapnÃēÅĨ zvuk" +block: "ZablokovaÅĨ" +unblock: "OdblokovaÅĨ" +suspend: "ZmraziÅĨ" +unsuspend: "OdmraziÅĨ" +blockConfirm: "Naozaj chcete zablokovaÅĨ tento Ãēčet?" +unblockConfirm: "Naozaj chcete odblokovaÅĨ tento Ãēčet?" +suspendConfirm: "Naozaj chcete zmraziÅĨ tento Ãēčet?" +unsuspendConfirm: "Naozaj chcete odmraziÅĨ tento Ãēčet?" +selectList: "Vyberte zoznam" +selectAntenna: "Vyberte antÊnu" +selectWidget: "Vyberte widget" +editWidgets: "UpraviÅĨ widget" +editWidgetsExit: "Hotovo" +customEmojis: "VlastnÊ emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "NÃĄzov emoji" +emojiUrl: "URL obrÃĄzku" +addEmoji: "PridaÅĨ emoji" +settingGuide: "OdporÃēčanÊ nastavenia" +cacheRemoteFiles: "Cachovanie vzdialenÃŊch sÃēborov" +cacheRemoteFilesDescription: "ZakÃĄzanie tohoto nastavenia spôsobí, Åže vzdialenÊ sÃēbory budÃē odkazovanÊ priamo, namiesto ukladania do cache. UÅĄetrí sa tak miesto na serveri, ale zvÃŊÅĄi sa dÃĄtovÃŊ tok, pretoÅže sa negenerujÃē miniatÃēry." +flagAsBot: "Tento Ãēčet je bot" +flagAsBotDescription: "Ak je tento Ãēčet ovlÃĄdanÃŊ programom, zaÅĄkrtnite tÃēto voÄžbu. Ostatní uvidia, Åže je to bot a zabrÃĄni nekonečnÃŊm interakciÃĄm s ďalÅĄÃ­mi botmi a upraví internÊ systÊmy Misskey, aby ho povaÅžoval za bota." +flagAsCat: "Tento Ãēčet je mačka" +flagAsCatDescription: "ZvoÄžte tÃēto voÄžbu, aby bol tento Ãēčet označenÃŊ ako mačka." +flagShowTimelineReplies: "ZobraziÅĨ odpovede na poznÃĄmky v časovej osi" +flagShowTimelineRepliesDescription: "Keď je zapnutÊ, na časovej osi sa zobrazia odpovede k poznÃĄmkam pouŞívateÄžov okrem samotnÃŊch poznÃĄmok." +autoAcceptFollowed: "Automaticky prijaÅĨ sledovanie od Ãēčtov, ktorÊ sledujete" +addAccount: "PridaÅĨ Ãēčet" +loginFailed: "PrihlÃĄsenie sa nepodarilo." +showOnRemote: "ZobraziÅĨ na vzdialenom serveri" +general: "VÅĄeobecnÊ" +wallpaper: "Tapeta" +setWallpaper: "NastaviÅĨ tapetu" +removeWallpaper: "OdstrÃĄniÅĨ tapetu" +searchWith: "HÄžadaÅĨ: {q}" +youHaveNoLists: "NemÃĄte Åžiadne zoznamy" +followConfirm: "Naozaj chcete sledovaÅĨ {name}?" +proxyAccount: "Proxy Ãēčet" +proxyAccountDescription: "Proxy Ãēčet je Ãēčet, ktorÃŊ za určitÃŊch podmienok sleduje pouŞívateÄžov na diaÄžku vaÅĄÃ­m menom. Napríklad keď pouŞívateÄž zaradí vzdialenÊho pouŞívateÄža do zoznamu, pokiaÄž nikto nesleduje pouŞívateÄža na zozname, aktivita nebude doručenÃĄ na server, takÅže namiesto toho bude pouŞívateÄža sledova proxy Ãēčet." +host: "Host" +selectUser: "Vyberte pouŞívateÄža" +recipient: "PrijímateÄž" +annotation: "KomentÃĄre" +federation: "FederÃĄcia" +instances: "InÅĄtancia" +registeredAt: "RegistrÃĄcia" +latestRequestSentAt: "PoslednÃĄ odoslanÃĄ poÅžiadavka" +latestRequestReceivedAt: "PoslednÃĄ prijatÃĄ poÅžiadavka" +latestStatus: "PoslednÃŊ status" +storageUsage: "VyuÅžitÊ ÃēloÅžisko" +charts: "Grafy" +perHour: "za hodinu" +perDay: "za deň" +stopActivityDelivery: "ZastaviÅĨ posielanie aktivít" +blockThisInstance: "BlokovaÅĨ tento server" +operations: "OperÃĄcie" +software: "SoftvÊr" +version: "Verzia" +metadata: "MetadÃĄta" +withNFiles: "{n} sÃēbor(ov)" +monitor: "Monitor" +jobQueue: "Fronta Ãēloh" +cpuAndMemory: "CPU a pamäÅĨ" +network: "SieÅĨ" +disk: "Disk" +instanceInfo: "InformÃĄcie o serveri" +statistics: "Å tatistiky" +clearQueue: "VyčistiÅĨ frontu" +clearQueueConfirmTitle: "Naozaj chcete zruÅĄiÅĨ vÅĄetky Ãēlohy vo fronte?" +clearQueueConfirmText: "VÅĄetky nedoručenÊ poznÃĄmky čakajÃēce vo fronte nebudÃē federovanÊ. Zvyčajne tÃĄto operÃĄcia nie je potrebnÃĄ." +clearCachedFiles: "VyprÃĄzdniÅĨ cache" +clearCachedFilesConfirm: "Naozaj chcete odstrÃĄniÅĨ vÅĄetky nacachovanÊ vzdialenÊ sÃēbory?" +blockedInstances: "BlokovanÊ servery" +blockedInstancesDescription: "Zoznam blokovanÃŊch serverov na riadkoch. BlokovanÊ servery nebudÃē môcÅĨ komunikovaÅĨ s tÃŊmto serverom." +muteAndBlock: "Umlčania a blokÃĄcie" +mutedUsers: "Umlčaní pouŞívatelia" +blockedUsers: "Blokovaní pouŞívatelia" +noUsers: "ÅŊiadni pouŞívatelia" +editProfile: "UpraviÅĨ profil" +noteDeleteConfirm: "Naozaj chcete odstrÃĄniÅĨ tÃēto poznÃĄmku?" +pinLimitExceeded: "ĎalÅĄie poznÃĄmky uÅž nemôŞete pripnÃēÅĨ." +intro: "InÅĄtalÃĄcia Misskey je dokončenÃĄ! Prosím vytvorte administrÃĄtora." +done: "Hotovo" +processing: "Pracujem..." +preview: "NÃĄhÄžad" +default: "PredvolenÊ" +noCustomEmojis: "ÅŊiadne emoji" +noJobs: "ÅŊiadne Ãēlohy" +federating: "FederÃĄcia" +blocked: "BlokovanÊ" +suspended: "ZmrazenÊ" +all: "VÅĄetko" +subscribing: "Odoberanie" +publishing: "Zverejňovanie" +notResponding: "NeodpovedÃĄ" +instanceFollowing: "Sledujem na serveri" +instanceFollowers: "SledujÃēci zo servera" +instanceUsers: "PouŞívatelia servera" +changePassword: "ZmeniÅĨ heslo" +security: "Zabezpečenie" +retypedNotMatch: "ZadanÊ vstupy nesÃēhlasia" +currentPassword: "AktuÃĄlne heslo" +newPassword: "NovÊ heslo" +newPasswordRetype: "NovÊ heslo (znovu)" +attachFile: "PriloÅžiÅĨ sÃēbor" +more: "Viac!" +featured: "ObÄžÃēbenÊ poznÃĄmky" +usernameOrUserId: "Meno pouŞívateÄža alebo ID pouŞívateÄža" +noSuchUser: "PouŞívateÄž sa nenaÅĄiel" +lookup: "VyhÄžadaÅĨ" +announcements: "Oznamy" +imageUrl: "URL obrÃĄzku" +remove: "OdstrÃĄniÅĨ" +removed: "OdstrÃĄnenÊ" +removeAreYouSure: "Naozaj chcete odstrÃĄniÅĨ \"{x}\"?" +deleteAreYouSure: "Naozaj chcete odstrÃĄniÅĨ \"{x}\"?" +resetAreYouSure: "Naozaj resetovaÅĨ?" +saved: "UloÅženÊ" +messaging: "Chat" +upload: "NahraÅĨ sÃēbor" +keepOriginalUploading: "ZachovaÅĨ pôvodnÃŊ obrÃĄzok" +keepOriginalUploadingDescription: "UloŞí pôvodnÃŊ obrÃĄzok ako je. Ak je vypnutÊ, verzia pre web sa vygeneruje pri nahratí." +fromDrive: "Z disku" +fromUrl: "Z URL" +uploadFromUrl: "NahraÅĨ z URL adresy" +uploadFromUrlDescription: "URL adresa nahrÃĄvanÊho sÃēboru" +uploadFromUrlRequested: "Upload vyÅžiadanÃŊ" +uploadFromUrlMayTakeTime: "NahrÃĄvanie môŞe nejakÃŊ čas trvaÅĨ." +explore: "ObjavovaÅĨ" +messageRead: "PrečítanÊ" +noMoreHistory: "To je vÅĄetko" +startMessaging: "ZačaÅĨ chat" +nUsersRead: "prečítanÊ {n} pouŞívateÄžmi" +agreeTo: "SÃēhlasím s {0}" +tos: "Podmienky pouŞívania" +start: "ZačaÅĨ" +home: "Domov" +remoteUserCaution: "Tieto informÃĄcie nemusia byÅĨ aktuÃĄlne, keďŞe pouŞívateÄž je na vzdialenom serveri." +activity: "Aktivita" +images: "ObrÃĄzky" +birthday: "DÃĄtum narodenia" +yearsOld: "{age} rokov" +registeredDate: "DÃĄtum registrÃĄcie" +location: "Lokalita" +theme: "TÊma" +themeForLightMode: "TÊma pri svetlom reÅžime" +themeForDarkMode: "TÊma pri tmavom reÅžime" +light: "SvetlÃĄ" +dark: "TmavÃĄ" +lightThemes: "SvetlÃĄ tÊma" +darkThemes: "TmavÃĄ tÊma" +syncDeviceDarkMode: "SynchronizovaÅĨ tmavÃē tÊmu s nastavení vÃĄÅĄho systÊmu" +drive: "Disk" +fileName: "NÃĄzov sÃēboru" +selectFile: "Vyberte sÃēbor" +selectFiles: "Vyberte sÃēbory" +selectFolder: "Vyberte priečinok" +selectFolders: "Vyberte priečinky" +renameFile: "PremenovaÅĨ sÃēbor" +folderName: "NÃĄzov priečinka" +createFolder: "VytvoriÅĨ priečinok" +renameFolder: "PremenovaÅĨ priečinok" +deleteFolder: "OdstrÃĄniÅĨ priečinok" +addFile: "PridaÅĨ sÃēbor" +emptyDrive: "VÃĄÅĄ disk je prÃĄzdny" +emptyFolder: "Tento priečinok je prÃĄzdny" +unableToDelete: "NedÃĄ sa odstrÃĄniÅĨ" +inputNewFileName: "Zadajte novÃŊ nÃĄzov" +inputNewDescription: "Zadajte novÃŊ popis" +inputNewFolderName: "Zadajte novÃŊ nÃĄzov priečinka" +circularReferenceFolder: "CieÄžovÃŊ priečinok je podpriečinkom priečinka, ktorÃŊ chcete presunÃēÅĨ." +hasChildFilesOrFolders: "NemôŞete odstrÃĄniÅĨ priečinok sÃē sÃēbormi." +copyUrl: "KopírovaÅĨ URL" +rename: "PremenovaÅĨ" +avatar: "Avatar" +banner: "BAnner" +nsfw: "NSFW" +whenServerDisconnected: "Keď sa stratí spojenie so serverom" +disconnectedFromServer: "Spojenie so serverom bolo preruÅĄenÊ" +reload: "ObnoviÅĨ" +doNothing: "IgnorovaÅĨ" +reloadConfirm: "Chcete obnoviÅĨ časovÃē os?" +watch: "SledovaÅĨ" +unwatch: "NesledovaÅĨ" +accept: "SÃēhlasím" +reject: "NesÃēhlasím" +normal: "NormÃĄlne" +instanceName: "NÃĄzov servera" +instanceDescription: "Popis servera" +maintainerName: "SprÃĄvca" +maintainerEmail: "E-mailovÃĄ adresa sprÃĄvcu" +tosUrl: "URL zmluvnÃŊch podmienok" +thisYear: "Rok" +thisMonth: "Mesiac" +today: "Dnes" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "StrÃĄnky" +integration: "IntegrÃĄcia" +connectService: "PripojiÅĨ" +disconnectService: "OdpojiÅĨ" +enableLocalTimeline: "PovoliÅĨ lokÃĄlnu časovÃē os" +enableGlobalTimeline: "PovoliÅĨ globÃĄlnu časovÃē os" +disablingTimelinesInfo: "AdministrÃĄtori a moderÃĄtori majÃē vÅždy prístup ku vÅĄetkÃŊm časovÃŊm osiam, aj keď sÃē vypnutÊ." +registration: "RegistrÃĄcia" +enableRegistration: "PovoliÅĨ registrÃĄciu novÃŊch pouŞívateÄžov" +invite: "PozvaÅĨ" +proxyRemoteFiles: "Proxy vzdialenÃŊch sÃēborov" +proxyRemoteFilesDescription: "Ak je zapnutÊ, vzdialenÊ sÃēbory, ktorÊ nie sÃē uloÅženÊ lokÃĄlne alebo boli odstrÃĄnenÊ kvôli obmedzeniam ÃēloÅžiska, budÃē vyÅžiadanÊ cez proxy, vrÃĄtane generovani miniatÃēr. Neovplyvní to ÃēloÅžisko na serveri." +driveCapacityPerLocalAccount: "Kapacita disku pre pouŞívateÄža" +driveCapacityPerRemoteAccount: "Kapacita disku pre vzdialenÊho pouŞívateÄža" +inMb: "V megabajtoch" +iconUrl: "Favicon URL" +bannerUrl: "URL obrÃĄzku bannera" +backgroundImageUrl: "URL obrÃĄzku pozadia" +basicInfo: "ZÃĄkladnÊ informÃĄcie" +pinnedUsers: "Pripnutí pouŞívatelia" +pinnedUsersDescription: "Zoznam mien pouŞívateÄžov oddelenÃŊch riadkami, ktorÃŊ budÃē pripnutí v zÃĄloÅžke \"ObjavovaÅĨ\"." +pinnedPages: "PripnutÊ strÃĄnky" +pinnedPagesDescription: "Na kaÅždÃŊ riadok zadajte cesty strÃĄnok, ktorÊ chcete pripnÃēÅĨ na vrch strÃĄnky tohoto servera." +pinnedClipId: "ID pripnutÊho klipu" +pinnedNotes: "PripnutÊ poznÃĄmky" +hcaptcha: "hCaptcha" +enableHcaptcha: "ZapnÃēÅĨ hCaptchu" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "ZapnÃēÅĨ ReCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "PouÅžitie viacerÃŊch Captcha systÊmov môŞe sposobiÅĨ problÊmy. Chcete radÅĄej vypnÃēÅĨ ostatnÊ Captcha systÊmy? MôŞete ich povoliÅĨ viacerÊ stlačení ZruÅĄiÅĨ." +antennas: "AntÊny" +manageAntennas: "SpravovaÅĨ antÊny" +name: "NÃĄzov" +antennaSource: "Zdroj antÊny" +antennaKeywords: "PočÃēvanÊ kÄžÃēčovÊ slovÃĄ" +antennaExcludeKeywords: "VylÃēčenÊ kÄžÃēčovÊ slovÃĄ" +antennaKeywordsDescription: "OddeÄžte medzerami pre podmienku AND alebo novÃŊmi riadkami pre podmienku OR." +notifyAntenna: "UpozorniÅĨ na novÊ poznÃĄmky" +withFileAntenna: "Len poznÃĄmky so sÃēbormi" +enableServiceworker: "PovoliÅĨ Service Worker" +antennaUsersDescription: "Zoznam pouŞívateÄžov jeden na riadok" +caseSensitive: "RozliÅĄuje malÊ a veÄžkÊ písmenÃĄ" +withReplies: "VrÃĄtane odpovedí" +connectedTo: "NasledujÃēce Ãēčty sÃē pripojenÊ" +notesAndReplies: "PoznÃĄmky a odpovede" +withFiles: "VrÃĄtane sÃēborov" +silence: "Ticho" +silenceConfirm: "Naozaj chcete utÃ­ÅĄiÅĨ tohoto pouŞívateÄža?" +unsilence: "VrÃĄtiÅĨ utÃ­ÅĄenie" +unsilenceConfirm: "Naozaj chcete vrÃĄtiÅĨ utÃ­ÅĄenie tohoto pouŞívateÄža?" +popularUsers: "PopulÃĄrni pouŞívatelia" +recentlyUpdatedUsers: "PouŞívatelia s najnovÅĄou aktivitou" +recentlyRegisteredUsers: "NajnovÅĄÃ­ pouŞívatelia" +recentlyDiscoveredUsers: "Naposledy objavení pouŞívatelia" +exploreUsersCount: "Existuje {count} pouŞívateÄžov" +exploreFediverse: "ObjavovaÅĨ Fediverzum" +popularTags: "PopulÃĄrne značky" +userList: "Zoznamy" +about: "InformÃĄcie" +aboutMisskey: "O Misskey" +administrator: "AdministrÃĄtor" +token: "Token" +twoStepAuthentication: "DvojfaktorovÃĄ autentifikÃĄcia" +moderator: "ModerÃĄtor" +nUsersMentioned: "{n} pouŞívateÄžov spomenulo" +securityKey: "BezpečnostnÃŊ kÄžÃēč" +securityKeyName: "NÃĄzov kÄžÃēča" +registerSecurityKey: "RegistrovaÅĨ bezpečnostnÃŊ kÄžÃēč" +lastUsed: "Naposledy pouÅžitÊ" +unregister: "OdregistrovaÅĨ" +passwordLessLogin: "NastaviÅĨ bezheslovÊ prihlÃĄsenie" +resetPassword: "ResetovaÅĨ heslo" +newPasswordIs: "NovÊ heslo je \"{password}\"" +reduceUiAnimation: "Menej UI animÃĄcií" +share: "ZdieÄžaÅĨ" +notFound: "NenÃĄjdenÊ" +notFoundDescription: "NenaÅĄla sa Åžiadna strÃĄnka na zadanej URL." +uploadFolder: "PredvolenÃŊ priečinok pre nahrÃĄvanie" +cacheClear: "VyčistiÅĨ cache" +markAsReadAllNotifications: "OznačiÅĨ vÅĄetky oznÃĄmenia ako prečítanÊ" +markAsReadAllUnreadNotes: "OznačiÅĨ vÅĄetky poznÃĄmky ako prečítanÊ" +markAsReadAllTalkMessages: "OznačiÅĨ vÅĄetky sprÃĄvy ako prečítanÊ" +help: "Pomoc" +inputMessageHere: "Sem napÃ­ÅĄte sprÃĄvu" +close: "ZavrieÅĨ" +group: "Skupina" +groups: "Skupiny" +createGroup: "VytvoriÅĨ skupinu" +ownedGroups: "VlastnenÊ skupiny" +joinedGroups: "Členstvo v skupinÃĄch" +invites: "PozvaÅĨ" +groupName: "NÃĄzov skupiny" +members: "Členovia" +transfer: "Presun" +messagingWithUser: "SÃēkromnÃŊ chat" +messagingWithGroup: "SkupinovÃŊ chat" +title: "Nadpis" +text: "Text" +enable: "PovoliÅĨ" +next: "ĎalÅĄÃ­" +retype: "Zadajte znovu" +noteOf: "PoznÃĄmky pouŞívateÄža {user}" +inviteToGroup: "PozvaÅĨ do skupiny" +maxNoteTextLength: "MaximÃĄlny počet znakov poznÃĄmky" +quoteAttached: "CitovanÊ" +quoteQuestion: "PripojiÅĨ ako citÃĄt?" +noMessagesYet: "ZatiaÄž Åžiadne sprÃĄvy" +newMessageExists: "MÃĄte novÃē sprÃĄvu" +onlyOneFileCanBeAttached: "Ku sprÃĄve môŞete priloÅžiÅĨ len jeden sÃēbor" +signinRequired: "PrihlÃĄste sa, prosím!" +invitations: "PozvaÅĨ" +invitationCode: "KÃŗd pozvÃĄnky" +checking: "Overujem..." +available: "DostupnÊ" +unavailable: "NedostupnÊ" +usernameInvalidFormat: "PovolenÊ sÃē písmenÃĄ, čísla a _." +tooShort: "PríliÅĄ krÃĄtke" +tooLong: "PríliÅĄ dlhÊ" +weakPassword: "SlabÊ heslo" +normalPassword: "DobrÊ heslo" +strongPassword: "SilnÊ heslo" +passwordMatched: "HeslÃĄ sÃē rovnakÊ" +passwordNotMatched: "HeslÃĄ nie sÃē rovnakÊ" +signinWith: "PrihlÃĄsiÅĨ sa pouÅžitím {x}" +signinFailed: "NedÃĄ sa prihlÃĄsiÅĨ. Skontrolujte prosím meno pouŞívateÄža a heslo." +tapSecurityKey: "Ťuknite na bezpečnostnÃŊ kÄžÃēč" +or: "Alebo" +language: "Jazyk" +uiLanguage: "Jazyk pouŞívateÄžskÊho prostredia" +groupInvited: "PozvaÅĨ do skupiny" +aboutX: "O {x}" +useOsNativeEmojis: "PouŞívaÅĨ natívne emoji z OS" +disableDrawer: "NepouŞívaÅĨ ÅĄuflíkovÊ menu" +youHaveNoGroups: "NemÃĄte Åžiadne skupiny" +joinOrCreateGroup: "PoÅžiadajte o pozvanie do existujÃēcej skupiny alebo vytvorte novÃē." +noHistory: "ÅŊiadna histÃŗria" +signinHistory: "HistÃŗria prihlÃĄsení" +disableAnimatedMfm: "VypnÃēÅĨ MFM s animÃĄciou" +doing: "Pracujem..." +category: "KategÃŗrie" +tags: "Značky" +docSource: "Zdroj tohoto dokumentu" +createAccount: "VytvoriÅĨ Ãēčet" +existingAccount: "ExistujÃēci Ãēčet" +regenerate: "PregenerovaÅĨ" +fontSize: "VeÄžkosÅĨ písma" +noFollowRequests: "NemÃĄte nijakÊ čakajÃēce Åžiadosti o sledovanie" +openImageInNewTab: "OtvoriÅĨ obrÃĄzok v novom tabe" +dashboard: "PrehÄžad" +local: "LokÃĄlne" +remote: "VzdialenÊ" +total: "Celkom" +weekOverWeekChanges: "MedzitÃŊÅždňovÊ zmeny" +dayOverDayChanges: "MedzidennÊ zmeny" +appearance: "VzhÄžad" +clientSettings: "Nastavenia klienta" +accountSettings: "Nastavenia Ãēčtu" +promotion: "PropagÃĄcia" +promote: "PropagovaÅĨ" +numberOfDays: "Počet dní" +hideThisNote: "SkryÅĨ tÃēto poznÃĄmku" +showFeaturedNotesInTimeline: "ZobraziÅĨ vÃŊznamnÊ poznÃĄmky v časovej osi" +objectStorage: "ObjektovÊ ÃēloÅžisko" +useObjectStorage: "PouÅžiÅĨ objektovÊ ÃēloÅžisko" +objectStorageBaseUrl: "ZÃĄkladnÃĄ URL" +objectStorageBaseUrlDesc: "URL pouÅžitÃĄ ako referencia. Zadajte URL svojho CDN alebo Proxy ak niektorÊ pouŞívate. S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/' atď." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Prosím zadajte nÃĄzov bucketu od svojho poskytovateÄža." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "SÃēbory budÃē ukladanÊ do priečinkov pod tÃŊmto prefixom." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Nechajte prÃĄzdne ak pouŞívate AWS S3, inak zadajte endpoint ako \"\" alebo \":\". ZÃĄleŞí to od sluÅžby, ktorÃē pouŞívate." +objectStorageRegion: "RegiÃŗn" +objectStorageRegionDesc: "Zadajte regiÃŗn ako 'xx-east-1'. Ak vaÅĄa sluÅžba nerozliÅĄuje regiÃŗny, nechajte prÃĄzdne alebo zadajte 'us-east-1'." +objectStorageUseSSL: "PouÅžiÅĨ SSL" +objectStorageUseSSLDesc: "Vypnite to ak nechcete pouÅžiÅĨ HTTPS na API spojenia." +objectStorageUseProxy: "PripÃĄjaÅĨ cez Proxy" +objectStorageUseProxyDesc: "Vypnite ak nechcete, aby spojenia na API iÅĄli cez Proxy" +objectStorageSetPublicRead: "Pri nahratí nastaviÅĨ \"public-read\"" +serverLogs: "Logy servera" +deleteAll: "OdstrÃĄniÅĨ vÅĄetko" +showFixedPostForm: "ZobraziÅĨ formulÃĄr na novÊ príspevky nad časovou osou" +newNoteRecived: "SÃē novÊ poznÃĄmky" +sounds: "Zvuky" +listen: "PočÃēvaÅĨ" +none: "ÅŊiadne" +showInPage: "ZobraziÅĨ v strÃĄnke" +popout: "Pop-out" +volume: "HlasitosÅĨ" +masterVolume: "CelkovÃĄ hlasitosÅĨ" +details: "Detaily" +chooseEmoji: "VybraÅĨ emoji" +unableToProcess: "OperÃĄciu sa nepodarilo dokončiÅĨ." +recentUsed: "Neposledy pouÅžitÊ" +install: "NainÅĄtalovaÅĨ" +uninstall: "OdinÅĄtalovaÅĨ" +installedApps: "AutorizovanÊ aplikÃĄcie" +nothing: "Nič tu nie je" +installedDate: "DÃĄtum autorizÃĄcie" +lastUsedDate: "Naposledy pouÅžitÊ" +state: "Status" +sort: "ZoradiÅĨ" +ascendingOrder: "Vzostupne" +descendingOrder: "Zostupne" +scratchpad: "ZÃĄpisník" +scratchpadDescription: "ZÃĄpisník poskytuje prostredia pre experimenty s AiScriptom. MôŞete písaÅĨ, spÃēÅĄÅĨaÅĨ a skÃēÅĄaÅĨ vysledky pri interakcii s Misskey." +output: "VÃŊstup" +script: "Skript" +disablePagesScript: "VypnÃēÅĨ AiScript na strÃĄnkach" +updateRemoteUser: "AktualizovaÅĨ informÃĄcie o vzdialenom Ãēčte" +deleteAllFiles: "OdstrÃĄniÅĨ vÅĄetky sÃēbory" +deleteAllFilesConfirm: "Naozaj chcete odstrÃĄniÅĨ vÅĄetky sÃēbory" +removeAllFollowing: "ZruÅĄiÅĨ sledovani vÅĄetkÃŊch pouŞívateÄžov" +removeAllFollowingDescription: "TÃŊmto zruÅĄÃ­te sledovanie vÅĄetkÃŊch pouŞívateÄžov z {host}. Spustite to prosím, keď server napríklad uÅž neexistuje." +userSuspended: "Tento pouŞívateÄž je zmrazenÃŊ." +userSilenced: "Tento pouŞívateÄž je umlčanÃŊ." +yourAccountSuspendedTitle: "Tento Ãēčet je zmrazenÃŊ" +yourAccountSuspendedDescription: "Tento Ãēčet bol zmrazenÃŊ, lebo poruÅĄoval zmluvnÊ podmienky. Kontaktujte administrÃĄtora ak chcete viac podrobností. Prosím nevytvÃĄrajte novÃŊ Ãēčet." +menu: "Menu" +divider: "OddeÄžovač" +addItem: "PridaÅĨ poloÅžku" +relays: "Prenos" +addRelay: "PridaÅĨ prenos" +inboxUrl: "Inbox URL" +addedRelays: "PridanÊ prenosy" +serviceworkerInfo: "Musí byÅĨ zapnutÊ pre push notifikÃĄcie." +deletedNote: "OdstrÃĄnenÊ príspevky" +invisibleNote: "SkrytÊ príspevky" +enableInfiniteScroll: "ZapnÃēÅĨ nekonečnÊ skrolovanie" +visibility: "ViditeÄžnosÅĨ" +poll: "Hlasovanie" +useCw: "SkryÅĨ obsah" +enablePlayer: "OtvoriÅĨ video prehrÃĄvač" +disablePlayer: "ZavrieÅĨ video prehrÃĄvač" +expandTweet: "RozÅĄÃ­riÅĨ tweet" +themeEditor: "Editor tÊm" +description: "Popis" +describeFile: "PridaÅĨ nadpis" +enterFileDescription: "Zadajte nadpis" +author: "Autor" +leaveConfirm: "MÃĄte neuloÅženÊ zmeny. Chcete ich zahodiÅĨ?" +manage: "AdministrÃĄcia" +plugins: "Pluginy" +deck: "Deck" +useBlurEffectForModal: "PouÅžiÅĨ efekt rozmazania na oknÃĄ" +useFullReactionPicker: "PouÅžiÅĨ plnÃē veÄžkosÅĨ vÃŊberu reakcií" +width: "Šírka" +height: "VÃŊÅĄka" +large: "VeÄžkÊ" +medium: "StrednÊ" +small: "MalÊ" +generateAccessToken: "VygenerovaÅĨ prístupovÃŊ token" +permission: "OprÃĄvnenia" +enableAll: "PovoliÅĨ vÅĄetko" +disableAll: "VypnÃēÅĨ vÅĄetko" +tokenRequested: "PovoliÅĨ prístup k Ãēčtu" +pluginTokenRequestedDescription: "Tento plugin bude môcÅĨ pouŞívaÅĨ oprÃĄvnenia nastavenÊ tu." +notificationType: "Typ oznÃĄmenia" +edit: "UpraviÅĨ" +useStarForReactionFallback: "PouÅžiÅĨ ★ keď emoji reakcie nie je znÃĄme" +emailServer: "Email server" +enableEmail: "ZapnÃēÅĨ email" +emailConfigInfo: "PouŞíva sa na overenie emaily pri registrÃĄcii alebo pri zabudnutí hesla" +email: "Email" +emailAddress: "EmailovÃĄ adresa" +smtpConfig: "Nastavenia SMTP servera" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Meno pouŞívateÄža" +smtpPass: "Heslo" +emptyToDisableSmtpAuth: "Vynechaním mena hesla vypnete SMTP verifikÃĄciu" +smtpSecure: "PouÅžiÅĨ implicitnÊ SSL/TLS pre SMTP spojenia" +smtpSecureInfo: "Toto vypnite keď pouŞívate STARTTLS" +testEmail: "Doručenie testovacieho emailu" +wordMute: "StÃ­ÅĄenie slova" +instanceMute: "StÃ­ÅĄenÊ servery" +userSaysSomething: "{name} niečo povedal/a" +makeActive: "AktivovaÅĨ" +display: "ZobraziÅĨ" +copy: "KopírovaÅĨ" +metrics: "Metriky" +overview: "PrehÄžad" +logs: "Logy" +delayed: "OneskorenÊ" +database: "DatabÃĄza" +channel: "KanÃĄly" +create: "VytvoriÅĨ" +notificationSetting: "Nastavenia oznÃĄmení" +notificationSettingDesc: "Vyberte typ oznÃĄmení na zobrazenie" +useGlobalSetting: "PouÅžiÅĨ globÃĄlne nastavenie" +useGlobalSettingDesc: "Ak je zapnutÊ, pouÅžijÃē sa oznÃĄmenia vÃĄÅĄho Ãēčtu. Ak je vypnutÊ, pouÅžijÃē sa jednotlivÊ nastavenia." +other: "Ostatní" +regenerateLoginToken: "PregenerovaÅĨ prihlasovací token" +regenerateLoginTokenDescription: "Pregeneruje token interne pouŞívanÃŊ počas prihlÃĄsenia. NormÃĄlne toto netreba robiÅĨ. Ak sa pregeneruje, vÅĄetky zariadenia sa odhlÃĄsia." +setMultipleBySeparatingWithSpace: "ViacerÊ poloÅžky oddeÄžte medzerami." +fileIdOrUrl: "ID alebo URL sÃēboru" +behavior: "SprÃĄvanie" +sample: "UkÃĄÅžka" +abuseReports: "NahlÃĄsenia" +reportAbuse: "NahlÃĄsiÅĨ" +reportAbuseOf: "NahlÃĄsiÅĨ {name}" +fillAbuseReportDescription: "Prosím vyplňte podrobnosti nahlÃĄsenia. Ak sa tÃŊka konkrÊtnej poznÃĄmky, prosím napÃ­ÅĄte jej URL." +abuseReported: "VaÅĄe nahlÃĄsenie je odoslanÊ. VeÄžmi pekne ďakujeme." +reporter: "NahlÃĄsil" +reporteeOrigin: "Pôvod nahlÃĄsenÊho" +reporterOrigin: "Pôvod nahlasovača" +forwardReport: "PreposlaÅĨ nahlÃĄsenie na server" +forwardReportIsAnonymous: "Namiesto vÃĄÅĄho Ãēčtu bude zobrazenÃŊ anonymnÃŊ systÊmovÃŊ Ãēčet na vzdialenom serveri ako autor nahlÃĄsenia." +send: "PoslaÅĨ" +abuseMarkAsResolved: "OznačiÅĨ nahlÃĄsenia ako vyrieÅĄenÊ" +openInNewTab: "OtvoriÅĨ v novom tabe" +openInSideView: "OtvoriÅĨ v bočnom paneli" +defaultNavigationBehaviour: "PredvolenÊ sprÃĄvanie navigÃĄcie" +editTheseSettingsMayBreakAccount: "Úpravou tÃŊchto nastavení si môŞete pokaziÅĨ Ãēčet." +instanceTicker: "InformÃĄcie servera o poznÃĄmkach" +waitingFor: "ČakÃĄ sa na {x}" +random: "NÃĄhodnÊ" +system: "SystÊm" +switchUi: "PrepnÃēÅĨ UI" +desktop: "Desktop" +clip: "Klip" +createNew: "VytvoriÅĨ novÃŊ" +optional: "VoliteÄžnÊ" +createNewClip: "VytvoriÅĨ novÃŊ klip" +public: "VerejnÊ" +i18nInfo: "Misskey je prekladanÃŊ do rôznych jazykov dobrovoÄžníkmi. PomôcÅĨ môŞete na {link}." +manageAccessTokens: "SpravovaÅĨ prístupovÊ tokeny" +accountInfo: "InformÃĄcie o Ãēčte" +notesCount: "Počet poznÃĄmok" +repliesCount: "Počet odoslanÃŊch odpovedí" +renotesCount: "Počet preposlanÃŊch poznÃĄmok" +repliedCount: "Počet odpovedí prijatÃŊch" +renotedCount: "Počet preposlaní prijatÃŊch" +followingCount: "Počet sledovanÃŊch Ãēčtov" +followersCount: "Počet sledujÃēcich" +sentReactionsCount: "Počet poslanÃŊch reakcií" +receivedReactionsCount: "Počet prijatÃŊch reakcií" +pollVotesCount: "Počet odoslanÃŊch hlasov" +pollVotedCount: "Počet prijatÃŊch hlasov" +yes: "Áno" +no: "Nie" +driveFilesCount: "Počet sÃēborov na disku" +driveUsage: "VyuÅžitÊ miesto na disku" +noCrawle: "OdmietaÅĨ indexovanie crawlerov" +noCrawleDescription: "PoÅžiadaÅĨ vyhÄžadÃĄvače, aby neindexovali vÃĄÅĄ profil, poznÃĄmky, strÃĄnky, atď." +lockedAccountInfo: "PokÃŊm nenastavíte viditeÄžnosÅĨ poznÃĄmok na \"Len pre sledujÃēcich\", vaÅĄe príspevky bude vidieÅĨ hocikto, aj keď vyÅžadujete manuÃĄlne potvrdenie sledovania." +alwaysMarkSensitive: "Predvolene označovaÅĨ ako NSFW" +loadRawImages: "NačítaÅĨ originÃĄlne obrÃĄzky namiesto miniatÃēr" +disableShowingAnimatedImages: "NeprehrÃĄvaÅĨ animovanÊ obrÃĄzky" +verificationEmailSent: "Odoslali sme overovací email. Overenie dokončíte kliknutím na odkaz v emaili." +notSet: "NenastavenÊ" +emailVerified: "Email overenÃŊ" +noteFavoritesCount: "Počet obÄžÃēbenÃŊch poznÃĄmok" +pageLikesCount: "Počet obÄžÃēbenÃŊch strÃĄnok" +pageLikedCount: "Počet prijatÃŊch \"pÃĄÄi sa mi\"" +contact: "Kontakt" +useSystemFont: "PouÅžiÅĨ predvolenÊ systÊmovÊ písmo" +clips: "Klip" +experimentalFeatures: "ExperimentÃĄlne funkcie" +developer: "VÃŊvojÃĄr" +makeExplorable: "SpraviÅĨ Ãēčet viditeÄžnÃŊ v \"ObjavovaÅĨ\"" +makeExplorableDescription: "Ak toto vypnete, vÃĄÅĄ Ãēčet sa nezobrazí v sekcii \"Objavovat\"." +showGapBetweenNotesInTimeline: "ZobraziÅĨ medzeru medzi príspevkami časovej osi." +duplicate: "DuplikovaÅĨ" +left: "NaÄžavo" +center: "Stred" +wide: "Å iroko" +narrow: "Úzko" +reloadToApplySetting: "Toto nastavenia sa prejaví aÅž po obnovení strÃĄnky. ObnoviÅĨ teraz?" +needReloadToApply: "Toto nastavenie sa prejaví aÅž po obnovení strÃĄnky." +showTitlebar: "ZobraziÅĨ riadok s nadpisom" +clearCache: "VyprÃĄzdniÅĨ cache" +onlineUsersCount: "{n} pouŞívateÄžov je online" +nUsers: "{n} pouŞívateÄžov" +nNotes: "{n} poznÃĄmok" +sendErrorReports: "PoslaÅĨ nahlÃĄsenie chyby" +sendErrorReportsDescription: "Keď je zapnutÊ, v prípade problÊmu sa odoÅĄlÃē podrobnÊ informÃĄcie o chybe do Misskey. PomôŞete tak zvÃŊÅĄiÅĨ kvalitu Misskey.\nTieto informÃĄcie zahŕňajÃē verziu vÃĄÅĄho OS, pouÅžitÃŊ prehliadač, histÃŗriu aktivít, atď." +myTheme: "Moja tÊma" +backgroundColor: "Pozadie" +accentColor: "Akcent" +textColor: "Text" +saveAs: "UloÅžiÅĨ ako..." +advanced: "RozÅĄÃ­renÊ" +value: "Hodnoty" +createdAt: "VytvorenÊ" +updatedAt: "UpravenÊ" +saveConfirm: "UloÅžiÅĨ zmeny?" +deleteConfirm: "Naozaj odstrÃĄniÅĨ?" +invalidValue: "NesprÃĄvna hodnota." +registry: "Register" +closeAccount: "ZavrieÅĨ Ãēčet" +currentVersion: "AktuÃĄlna verzia" +latestVersion: "NajnovÅĄia verzia" +youAreRunningUpToDateClient: "PouŞívate najnovÅĄiu verziu vÃĄÅĄho klienta." +newVersionOfClientAvailable: "Je dostupnÃĄ novÅĄia verzia vÃĄÅĄho klienta." +usageAmount: "VyuÅžitie" +capacity: "Kapacita" +inUse: "PouÅžitÊ" +editCode: "UpraviÅĨ kÃŗd" +apply: "PouÅžiÅĨ" +receiveAnnouncementFromInstance: "PrijaÅĨ notifikÃĄcie z tohoto servera" +emailNotification: "EmailovÊ upozornenia" +publish: "ZverejniÅĨ" +inChannelSearch: "HÄžadaÅĨ v kanÃĄli" +useReactionPickerForContextMenu: "OtvoriÅĨ vÃŊber reakcií na pravÃŊ klik" +typingUsers: "{users} pÃ­ÅĄe/u" +jumpToSpecifiedDate: "SkočiÅĨ na konkrÊtny dÃĄtum" +showingPastTimeline: "PrÃĄve vidíte starÃē časovÃē os" +clear: "VrÃĄtiÅĨ" +markAllAsRead: "OznačiÅĨ vÅĄetko ako prečítanÊ" +goBack: "SpäÅĨ" +unlikeConfirm: "Naozaj odstrÃĄniÅĨ vÃĄÅĄ like?" +fullView: "PlnÃŊ pohÄžad" +quitFullView: "ZavrieÅĨ plnÃŊ pohÄžad" +addDescription: "PridaÅĨ popis" +userPagePinTip: "Tu môŞete zobraziÅĨ poznÃĄmky zvolením \"PripnÃēÅĨ na profil\" z menu jednotlivÃŊch poznÃĄmok." +notSpecifiedMentionWarning: "TÃĄto poznÃĄmka obsahuje spomenutÃŊch pouŞívateÄžov, ktorí nie sÃē medzi adresÃĄtmi." +info: "InformÃĄcie" +userInfo: "InformÃĄcie o pouŞívateÄžovi" +unknown: "NeznÃĄme" +onlineStatus: "Online status" +hideOnlineStatus: "SkryÅĨ online status" +hideOnlineStatusDescription: "Skrytie vÃĄÅĄho online statusu zníŞi pohodlnosÅĨ niektorÃŊch funkcií ako napríklad vyhÄžadÃĄvanie." +online: "Online" +active: "Aktívny" +offline: "Offline" +notRecommended: "NeodporÃēčanÊ" +botProtection: "Bot ochrana" +instanceBlocking: "BlokovanÊ servery" +selectAccount: "Vyberte Ãēčet" +switchAccount: "PrepnÃēt Ãēčet" +enabled: "ZapnutÊ" +disabled: "VypnutÊ" +quickAction: "RÃŊchle akcie" +user: "PouŞívatelia" +administration: "Spravovanie" +accounts: "Účty" +switch: "PrepnÃēÅĨ" +noMaintainerInformationWarning: "InformÃĄcie sprÃĄvcu nie sÃē nastavenÊ." +noBotProtectionWarning: "Ochrana proti botom nie je nastavenÃĄ." +configure: "KonfigurovaÅĨ" +postToGallery: "VytvoriÅĨ novÃŊ príspevok v galÊrii" +gallery: "GalÊria" +recentPosts: "NajnovÅĄie príspevky" +popularPosts: "PopulÃĄrne príspevky" +shareWithNote: "ZdieÄžaÅĨ s poznÃĄmkou" +ads: "Reklamy" +expiration: "UkončiÅĨ hlasovanie" +memo: "Memo" +priority: "Priorita" +high: "VysokÃĄ" +middle: "StrednÊ" +low: "MÃĄlo" +emailNotConfiguredWarning: "Nie je nastavenÃĄ emailovÃĄ adresa." +ratio: "Pomer" +previewNoteText: "ZobraziÅĨ nÃĄhÄžad" +customCss: "VlastnÊ CSS" +customCssWarn: "Toto nastavenie by sa malo pouŞívaÅĨ iba ak viete čo robíte. Zadanie nesprÃĄvnych hodnôt môŞe spôsobiÅĨ nenormÃĄlne sprÃĄvanie klienta." +global: "GlobÃĄlne" +squareAvatars: "ZobrazovaÅĨ ÅĄtvorcovÊ avatary" +sent: "PoslaÅĨ" +received: "PrijatÊ" +searchResult: "VÃŊsledky hÄžadania" +hashtags: "Hashtagy" +troubleshooting: "RieÅĄenie problÊmov" +useBlurEffect: "PouŞívaÅĨ efekty rozmazania v UI" +learnMore: "ZistiÅĨ viac" +misskeyUpdated: "Misskey sa aktualizoval!" +whatIsNew: "Čo je novÊ?" +translate: "PreloÅžiÅĨ" +translatedFrom: "PreloÅženÊ z {x}" +accountDeletionInProgress: "Odstraňovanie Ãēčtu prebieha" +usernameInfo: "Meno, ktorÊ odliÅĄuje vÃĄÅĄ Ãēčet od ostatnÃŊch na tomto serveri. MôŞete pouÅžiÅĨ abecedu (a~z, A~Z), čísla (0~9) alebo podtrÅžník (_). PouŞívateÄžskÊ menÃĄ sa nedajÃē neskôr zmeniÅĨ." +aiChanMode: "Ai reÅžim" +keepCw: "NechaÅĨ varovania obsahu" +pubSub: "Pub/Sub Ãēčty" +lastCommunication: "PoslednÃĄ komunikÃĄcia" +resolved: "VyrieÅĄenÊ" +unresolved: "NevyrieÅĄenÊ" +breakFollow: "NesledovaÅĨ" +itsOn: "ZapnutÊ" +itsOff: "VypnutÊ" +emailRequiredForSignup: "RegistrÃĄcia vyÅžaduje emailovÃē adresu" +unread: "NeprečítanÊ" +filter: "Filter" +controlPanel: "OvlÃĄdací panel" +manageAccounts: "SprÃĄva Ãēčtov" +makeReactionsPublic: "Reakcie sÃē verejnÊ" +makeReactionsPublicDescription: "Toto spraví vÅĄetky vaÅĄe minulÊ reakcie viditeÄžnÊ verejnosti." +classic: "Klasika" +muteThread: "ZtÃ­ÅĄiÅĨ vlÃĄkno" +unmuteThread: "ZruÅĄiÅĨ stÃ­ÅĄenie vlÃĄkna" +ffVisibility: "ViditeÄžnosÅĨ sledujÃēcich/sledovanÃŊch" +ffVisibilityDescription: "UmoŞňuje nastaviÅĨ kto vidí koho sledujete a kto vÃĄs sleduje." +continueThread: "ZobraziÅĨ pokračovanie vlÃĄkna" +deleteAccountConfirm: "Toto nezvrÃĄtiteÄžne vymaÅže vÃĄÅĄ Ãēčet. PokračovaÅĨ?" +incorrectPassword: "NesprÃĄvne heslo." +voteConfirm: "Potvrdzujete svoj hlas za \"{choice}\"?" +hide: "SkryÅĨ" +leaveGroup: "OpustiÅĨ skupiny" +leaveGroupConfirm: "Naozaj chcete opustiÅĨ \"{name}\"?" +useDrawerReactionPickerForMobile: "ZobraziÅĨ vÃŊber reakcií ako ÅĄuflík na mobile" +welcomeBackWithName: "Vitajte späÅĨ, {name}" +clickToFinishEmailVerification: "Kliknutím na [{ok}] dokončíte overeniu emailu." +overridedDeviceKind: "Typ zariadenia" +smartphone: "SmartfÃŗn" +tablet: "Tablet" +auto: "Automaticky" +_emailUnavailable: + used: "TÃĄto emailovÃĄ adresa sa uÅž pouŞíva" + format: "FormÃĄt emailovej adresy je nesprÃĄvny" + disposable: "JednorÃĄzovÊ emailovÊ adresy sa nemôŞu pouŞívaÅĨ." + mx: "Tento emailovÃŊ server nefunguje." + smtp: "Tento emailovÃŊ server neodpovedÃĄ." +_ffVisibility: + public: "ZverejniÅĨ" + followers: "Len viditeÄžní sledujÃēci" + private: "SÃēkromnÊ" +_signup: + almostThere: "Skoro na konci" + emailAddressInfo: "Prosím zadajte svoju emailovÃē adresu!" + emailSent: "Na vaÅĄu emailovÃē adresu ({email}) sme odoslali email. Vytvorenie Ãēčtu dokončíte kliknutím na odkaz v emaili." +_accountDelete: + accountDelete: "OdstrÃĄniÅĨ Ãēčet" + mayTakeTime: "KeďŞe odstrÃĄnenie Ãēčtu je nÃĄročnÃŊ proces, môŞe to nejakÃŊ čas trvaÅĨ. ZÃĄleŞí koÄžko obsahu ste vytvorili a koÄžko sÃēborov ste nahrali." + sendEmail: "Po odstrÃĄnení Ãēčtu vÃĄm poÅĄleme email na emailovÃē adresu zadanÃē pri registrÃĄcii tohoto Ãēčtu." + requestAccountDelete: "PoÅžiadaÅĨ o zmazanie Ãēčtu" + started: "Odstraňovanie začalo." + inProgress: "Odstraňovanie prebieha" +_ad: + back: "SpäÅĨ" + reduceFrequencyOfThisAd: "TÃēto reklamu zobrazovaÅĨ menej" +_forgotPassword: + enterEmail: "Zadajte emailovÃē adresu, ktorÃē ste pouÅžili pri registrÃĄcii. PoÅĄleme vÃĄm na ňu odkaz, cez ktorÃŊ si môŞete obnoviÅĨ heslo." + ifNoEmail: "Ak ste pri registrÃĄcii nepouÅžili email, prosím kontaktujte administrÃĄtora." + contactAdmin: "Tento server nepodporuje pouŞívanie emailovÃŊch adries, prosím kontaktuje administrÃĄtor, ktorÃŊ vÃĄm resetuje heslo." +_gallery: + my: "Moja galÊria" + liked: "ObÄžÃēbenÊ príspevky" + like: "PÃĄÄi sa mi" + unlike: "NepÃĄÄi sa mi" +_email: + _follow: + title: "MÃĄte novÊho sledujÃēceho" + _receiveFollowRequest: + title: "Dostali ste ÅžiadosÅĨ o sledovanie" +_plugin: + install: "InÅĄtalova pluginy" + installWarn: "Prosím neinÅĄtalujte nedôveryhodnÊ pluginy." + manage: "Spravovanie pluginov" +_registry: + scope: "OblasÅĨ" + key: "KÄžÃēč" + keys: "KÄžÃēče" + domain: "DomÊna" + createKey: "VytvoriÅĨ kÄžÃēč" +_aboutMisskey: + about: "Misskey je open-source softvÊr, ktorÃŊ vyvíja syuilo od 2014." + contributors: "Hlavní prispievatelia" + allContributors: "VÅĄetci prispievatelia" + source: "ZdrojovÃŊ kÃŗd" + translation: "PreloÅžiÅĨ Misskey" + donate: "PodporiÅĨ Misskey" + morePatrons: "Takisto oceňujeme podporu mnoÃŊch ďalÅĄÃ­ch, ktorí tu nie sÃē uvedení. Ďakujeme! đŸĨ°" + patrons: "Prispievatelia" +_nsfw: + respect: "SkryÅĨ NSFW mÊdiÃĄ" + ignore: "NeskrÃŊvaÅĨ NSFW mÊdiÃĄ" + force: "SkryÅĨ vÅĄetky mÊdiÃĄ" +_mfm: + cheatSheet: "MFM Cheatsheet" + intro: "MFM je Misskey exkluzívny značkovací jazyk, ktorÃŊ sa dÃĄ pouŞívaÅĨ na viacerÃŊch miestach. Tu môŞete vidieÅĨ zoznam vÅĄetkej dostupnej MFM syntaxe." + dummy: "Misskey rozÅĄiruje svet Fediverza" + mention: "Zmienka" + mentionDescription: "PouŞívateÄža spomeniete pouŞítím zavinÃĄÄa a mena pouŞívateÄža" + hashtag: "Hashtag" + hashtagDescription: "MôŞete zadaÅĨ hashtag pouÅžitím mrieÅžky a textu" + url: "URL" + urlDescription: "URL sa dajÃē zobraziÅĨ." + link: "Odkaz" + linkDescription: "JednotlivÊ časti texty sa dajÃē zobraziÅĨ ako URL." + bold: "TučnÊ" + boldDescription: "ZvÃŊrazní písmenÃĄ tÃŊm, Åže budÃē tučnejÅĄie." + small: "MalÊ" + smallDescription: "Zobrazí obsah malÃŊ a tenkÃŊ." + center: "VystrediÅĨ prvky" + centerDescription: "Zobrazí obsah v strede" + inlineCode: "KÃŗd (inline)" + inlineCodeDescription: "Zobrazí kÃŗd so zvÃŊraznením syntaxe." + blockCode: "KÃŗd (blok)" + blockCodeDescription: "Zobrazí viacriadkovÃŊ kÃŗd so zvÃŊraznením syntaxe v bloku." + inlineMath: "Vzorec (inline)" + inlineMathDescription: "Zobrazí matematickÃŊ vzorec (KaTeX) v riadku." + blockMath: "Vzorec (blok)" + blockMathDescription: "Zobrazí viacriadkovÃŊ matematickÃŊ vzorec (KaTeX) v bloku" + quote: "CitovaÅĨ" + quoteDescription: "Zobrazí obsah ako citÃĄt." + emoji: "VlastnÊ emoji" + emojiDescription: "Pridaním dvojbodiek pred a za nÃĄzov vlastnej emoji, sa dÃĄ zobraziÅĨ vlastnÃĄ emoji." + search: "HÄžadaÅĨ" + searchDescription: "Zobrazí vyhÄžadÃĄvacie pole so zadanÃŊm textom." + flip: "PreklopiÅĨ" + flipDescription: "Preklopí obsah horizontÃĄlne alebo vertikÃĄlne" + jelly: "AnimÃĄcia (ÅželÊ)" + jellyDescription: "Obsah sa bude hÃŊbaÅĨ ako ÅželÊ." + tada: "AnimÃĄcia (tadÃĄ)" + tadaDescription: "Obsah sa bude hÃŊbaÅĨ ako Tada!" + jump: "AnimÃĄcia (skok)" + jumpDescription: "Obsah skočí." + bounce: "AnimÃĄcia (odraz)" + bounceDescription: "Obsah sa bude odrÃĄÅžaÅĨ." + shake: "AnimÃĄcia (trasenie)" + shakeDescription: "Obsah sa bude triasÅĨ." + twitch: "AnimÃĄcia (myknutie)" + twitchDescription: "Obsahu dÃĄ animÃĄciu silnÊho trasenia." + spin: "AnimÃĄcia (rotÃĄcia)" + spinDescription: "Obsahu pridÃĄ otÃĄÄajÃēcu animÃĄciu." + x2: "VeÄžkÃŊ" + x2Description: "Zobrazí obsah vÃ¤ÄÅĄÃ­." + x3: "VeÄžmi veÄžkÃŊ" + x3Description: "Zobrazí obsah eÅĄte vÃ¤ÄÅĄÃ­." + x4: "NeuveriteÄžne veÄžkÃŊ" + x4Description: "Zobrazí obsah eÅĄte viac veÄžkÃŊ neÅž veÄžmi veÄžkÃŊ." + blur: "Rozmazanie" + blurDescription: "TÃŊmto efektom môŞe byÅĨ obsah rozmazanÃŊ. Zaostrí sa keď ned neho príde kurzor." + font: "Písmo" + fontDescription: "Nastaví písmo, ktorÃŊm sa zobrazí text." + rainbow: "DÃēha" + rainbowDescription: "Zobrazí obsah vo farbÃĄch dÃēhy." + sparkle: "Trblietky" + sparkleDescription: "Obsahu dodÃĄ trblietajÃēci efekt." + rotate: "OtÃĄÄaÅĨ" + rotateDescription: "Otočí obsah o určitÃŊ uhol." +_instanceTicker: + none: "Nikdy nezobrazovaÅĨ" + remote: "ZobraziÅĨ pre vzdialenÃŊch pouŞívateÄžov" + always: "ZobraziÅĨ vÅždy" +_serverDisconnectedBehavior: + reload: "Automaticky obnoviÅĨ" + dialog: "ZobraziÅĨ okno s varovaním" + quiet: "ZobraziÅĨ neruÅĄivÊ varovanie" +_channel: + create: "VytvoriÅĨ kanÃĄl" + edit: "UpraviÅĨ kanÃĄl" + setBanner: "NastaviÅĨ banner" + removeBanner: "OdstrÃĄniÅĨ banner" + featured: "Trendy" + owned: "VlastnenÊ" + following: "SledovanÊ" + usersCount: "{n} Ãēčastníkov" + notesCount: "{n} poznÃĄmok" +_menuDisplay: + sideFull: "Strana" + sideIcon: "Strana (Ikony)" + top: "Hore" + hide: "SkryÅĨ" +_wordMute: + muteWords: "UmlčanÊ slovÃĄ" + muteWordsDescription: "Medzerami oddeÄžte pre podmienku AND a novÃŊmi riadkami pre podmienku OR." + muteWordsDescription2: "RegulÃĄrne vÃŊrazy sa pouÅžijÃē keď pouÅžijete okolo lomítka." + softDescription: "Skryje poznÃĄmky z časovej osi, ktorÊ spÄēňajÃē podmienky." + hardDescription: "ZabrÃĄni poznÃĄmky spÄēňajÃēce mnoÅžinu podmienok, aby boli pridanÊ do časovej osi. NavyÅĄe tieto poznÃĄmky nepribudnÃē v časovej osi ani keď sa podmienky zmenia." + soft: "MäkkÊ" + hard: "TvrdÊ" + mutedNotes: "UmlčanÊ poznÃĄmky" +_instanceMute: + instanceMuteDescription: "Toto umlčí vÅĄetky poznÃĄmky/preposlania zo zoznamu serverov, vrÃĄtane tÃŊch, na ktorÊ pouŞívatelia odpovedajÃē z umlčanÊho servera." + instanceMuteDescription2: "OddeÄžte novÃŊmi riadkami" + title: "Skryje poznÃĄmky z uvedenÃŊch serverov." + heading: "Zoznam umlčanÃŊch inÅĄtancií" +_theme: + explore: "ObjavovaÅĨ tÊmy" + install: "NainÅĄtalovaÅĨ tÊmu" + manage: "SpravovaÅĨ tÊmy" + code: "KÃŗd tÊmy" + description: "Popis" + installed: "{name} je nainÅĄtalovanÃĄ" + installedThemes: "NainÅĄtalovanÊ tÊmy" + builtinThemes: "VstavanÊ tÊmy" + alreadyInstalled: "TÃĄto tÊma je uÅž nainÅĄtalovanÃĄ" + invalid: "FormÃĄt tejto tÊmy je nesprÃĄvny" + make: "VytvoriÅĨ tÊmu" + base: "ZÃĄklad" + addConstant: "PridaÅĨ konÅĄtantu" + constant: "KonÅĄtanta" + defaultValue: "PredvolenÃĄ hodnota" + color: "Farba" + refProp: "Odkaz na vlastnosÅĨ" + refConst: "Odkaz na konÅĄtantu" + key: "KÄžÃēč" + func: "Funkcie" + funcKind: "Typ funkcie" + argument: "Argument" + basedProp: "OdkazovanÃĄ vlastnosÅĨ" + alpha: "PriehÄžadnosÅĨ" + darken: "StmaviÅĨ" + lighten: "ZosvetliÅĨ" + inputConstantName: "Zadajte nÃĄzov tejto konÅĄtanty" + importInfo: "Ak sem zadÃĄte kÃŗd tÊmy, môŞete ju importovaÅĨ do editora tÊm." + deleteConstantConfirm: "Naozaj chcete odstrÃĄniÅĨ konÅĄtantu {const}?" + keys: + accent: "Akcent" + bg: "Pozadie" + fg: "Text" + focus: "Fokus" + indicator: "IndikÃĄtor" + panel: "Panel" + shadow: "Tieň" + header: "Hlavička" + navBg: "Pozadie bočnÊho panela" + navFg: "Text bočnÊho panela" + navHoverFg: "Text bočnÊho panela (pod kurzorom)" + navActive: "Text bočnÊho panela (aktívny)" + navIndicator: "IndikÃĄtor bočnÊho panela" + link: "Odkaz" + hashtag: "Hashtag" + mention: "Zmienka" + mentionMe: "Zmienky (mňa)" + renote: "PreposlaÅĨ" + modalBg: "Pozadie modÃĄlu" + divider: "OddeÄžovač" + scrollbarHandle: "RÃēčka scrollbaru" + scrollbarHandleHover: "RÃēčka scrollbaru (pod kurzorom)" + dateLabelFg: "Text dÃĄtovÊho popisku" + infoBg: "Pozadie informÃĄcií" + infoFg: "InformačnÃŊ text" + infoWarnBg: "Pozadie varovania" + infoWarnFg: "Text varovania" + cwBg: "CW pozadie tlačidla" + cwFg: "CW text tlačidla" + cwHoverBg: "CW pozadie tlačidla (pod kurzorom)" + toastBg: "Pozadie upozornenia" + toastFg: "Text upozornenia" + buttonBg: "Pozadie tlačidla" + buttonHoverBg: "Pozadie tlačidla (pod kurzorom)" + inputBorder: "Okraj vstupnÊho poÄža" + listItemHoverBg: "Pozadie poloÅžky zoznamu (pod kurzorom)" + driveFolderBg: "Pozadie priečinu disku" + wallpaperOverlay: "Vrstvenie pozadia" + badge: "Odznak" + messageBg: "Pozadie chatu" + accentDarken: "Akcent (stmavenÊ)" + accentLighten: "Akcent (zosvetlenÊ)" + fgHighlighted: "ZvÃŊraznenÃŊ text" +_sfx: + note: "PoznÃĄmky" + noteMy: "VlastnÃĄ poznÃĄmka" + notification: "OznÃĄmenia" + chat: "Chat" + chatBg: "Chat (pozadie)" + antenna: "AntÊny" + channel: "Upozornenia kanÃĄla" +_ago: + unknown: "NeznÃĄme" + future: "BudÃēcnosÅĨ" + justNow: "Teraz" + secondsAgo: "pred {n} sekundami" + minutesAgo: "pred {n} minÃētami" + hoursAgo: "pred {n} hodinami" + daysAgo: "pred {n} dňami" + weeksAgo: "pred {n} tÃŊÅždňami" + monthsAgo: "pred {n} mesiacmi" + yearsAgo: "pred {n} rokmi" +_time: + second: "s" + minute: "min" + hour: "hod" + day: "dní" +_tutorial: + title: "Ako pouŞívaÅĨ Misskey" + step1_1: "Vitajte!" + step1_2: "TÃĄto strÃĄnka sa volÃĄ \"časovÃĄ os\". Zobrazuje chronologicky zoradenÊ \"poznÃĄmky\" od Äžudí, ktorÃŊch sledujete." + step1_3: "VaÅĄa časovÃĄ os je teraz prÃĄzdna pretoÅže ste nepridali Åžiadne poznÃĄmky ani nikoho zatiaÄž nesledujete." + step2_1: "Podˇme dokončiÅĨ nastavenia vÃĄÅĄho profilu pred napísaním poznÃĄmky alebo sledovaním niekoho." + step2_2: "Poskytnutím informÃĄcií o vÃĄs uÄžahčíte ostatnÃŊm, či chcÃē vidieÅĨ alebo sledovaÅĨ vaÅĄe poznÃĄmky." + step3_1: "Dokončili ste nastavovanie svojho profilu?" + step3_2: "Poďme vyskÃēÅĄaÅĨ napísaÅĨ poznÃĄmku. MôŞete to spraviÅĨ stlačením ikony ceruzky na vrchu obrazovky." + step3_3: "Vyplňte polia a stlačte tlačítko vpravo hore." + step3_4: "NemÃĄte čo povedaÅĨ? SkÃēste \"len si nastavujem môj msky\"!" + step4_1: "Napísali ste svoju prvÃē poznÃĄmku?" + step4_2: "HurÃĄ! Teraz by vaÅĄa prvÃĄ poznÃĄmka mala byÅĨ na vaÅĄej časovej osi." + step5_1: "Teraz skÃēsme oÅživiÅĨ časovÃē os sledovaním nejakÃŊch Äžudí." + step5_2: "{featured} zobrazí populÃĄrne poznÃĄmku na tomto serveri. {explore} môŞete objavovaÅĨ populÃĄrnych pouŞívateÄžov. SkÃēste tam nÃĄjsÅĨ Äžudí, ktorÃŊch by ste radi sledovali!" + step5_3: "Ak chcete sledovaÅĨ ďalÅĄÃ­ch pouŞívateÄžov, kliknite na ich ikonu a stlačte tlačidlo \"SledovaÅĨ\" na ich profile." + step5_4: "Ak mÃĄ niektorÃŊ pouŞívateÄž ikonu zÃĄmku vedÄža svojho mena, znamenÃĄ to, Åže môŞe trvaÅĨ určitÃŊ čas, kÃŊm danÃŊ pouŞívateÄž schvÃĄli vaÅĄu ÅžiadosÅĨ o sledovanie." + step6_1: "Teraz by ste mali vidieÅĨ poznÃĄmky ďalÅĄÃ­ch pouŞívateÄžov na svojej časovej osi." + step6_2: "MôŞete daÅĨ \"reakcie\" na poznÃĄmky ďalÅĄÃ­ch Äžudí ako rÃŊchlu odpoveď." + step6_3: "Reakciu pridÃĄte kliknutím na \"+\" niekoho poznÃĄmke a vybratím emoji, ktorou chcete reagovaÅĨ." + step7_1: "Gralujeme! Dokončili ste zÃĄkladnÊho sprievodcu Misskey." + step7_2: "Ak sa chcete naučiÅĨ viac o Misskey, skÃēste sekciu {help}." + step7_3: "A teraz, veÄža ÅĄÅĨastia, bavte sa s Misskey! 🚀" +_2fa: + alreadyRegistered: "UÅž ste zaregistrovali 2-faktorovÊ autentifikačnÊ zariadenie." + registerDevice: "RegistrovaÅĨ novÊ zariadenie" + registerKey: "RegistrovaÅĨ bezpečnostnÃŊ kÄžÃēč" + step1: "Najprv si nainÅĄtalujte autentifikačnÃē aplikÃĄciu (napríklad {a} alebo {b}) na svoje zariadenie." + step2: "Potom, naskenujte QR kÃŗd zobrazenÃŊ na obrazovke." + step3: "Nastavenie dokončíte zadaním tokenu z vaÅĄej aplikÃĄcie." + step4: "Od teraz, vÅĄetky ďalÅĄie prihlÃĄsenia budÃē vyÅžadovaÅĨ prihlasovací token." + securityKeyInfo: "Okrem odtlačku prsta alebo PIN autentifikÃĄcie si môŞete nastaviÅĨ autentifikÃĄciu cez hardvÊrovÃŊ bezpečnostnÃŊ kÄžÃēč podporujÃēci FIDO2 a tak eÅĄte viac zabezpečiÅĨ svoj Ãēčet." +_permissions: + "read:account": "VidieÅĨ informÃĄcie o vaÅĄom Ãēčte" + "write:account": "UpraviÅĨ informÃĄcie o vaÅĄom Ãēčte" + "read:blocks": "VidieÅĨ zoznam blokovanÃŊch pouŞívateÄžov" + "write:blocks": "UpraviÅĨ zoznam blokovanÃŊch pouŞívateÄžov" + "read:drive": "Prístup k sÃēborom a priečinkom na disku" + "write:drive": "UpraviÅĨ alebo odstrÃĄniÅĨ sÃēbory a priečinky na disku" + "read:favorites": "VidieÅĨ vÃĄÅĄ zoznam obÄžÃēbenÃŊch" + "write:favorites": "UpraviÅĨ vÃĄÅĄ zoznam obÄžÃēbenÃŊch" + "read:following": "VidieÅĨ koho sledujete" + "write:following": "SledovaÅĨ alebo nesledovaÅĨ ďalÅĄie Ãēčty" + "read:messaging": "VidieÅĨ vaÅĄe chaty" + "write:messaging": "PísaÅĨ alebo odstraňovaÅĨ sprÃĄvy v chate" + "read:mutes": "VidieÅĨ vÃĄÅĄ zoznam stÃ­ÅĄenÃŊch pouŞívateÄžov" + "write:mutes": "UpravovaÅĨ zoznam stÃ­ÅĄenÃŊch pouŞívateÄžov" + "write:notes": "PísaÅĨ alebo odstrÃĄniÅĨ poznÃĄmky" + "read:notifications": "VidieÅĨ vaÅĄe oznÃĄmenia" + "write:notifications": "PracovaÅĨ s vaÅĄimi notifikÃĄciami" + "read:reactions": "VidieÅĨ vaÅĄe reakcie" + "write:reactions": "UpravovaÅĨ vaÅĄe reakcie" + "write:votes": "HlasovaÅĨ v hlasovaniach" + "read:pages": "VidieÅĨ vaÅĄe strÃĄnky" + "write:pages": "UpraviÅĨ alebo odstrÃĄniÅĨ vaÅĄe strÃĄnky" + "read:page-likes": "VidieÅĨ vaÅĄe pÃĄÄiky na strÃĄnkach" + "write:page-likes": "UpraviÅĨ pÃĄÄiky na strÃĄnkach" + "read:user-groups": "VidieÅĨ vaÅĄe skupiny" + "write:user-groups": "UpraviÅĨ alebo odstrÃĄniÅĨ vaÅĄe skupiny" + "read:channels": "ČítaÅĨ vaÅĄe kanÃĄly" + "write:channels": "UpravovaÅĨ vaÅĄe kanÃĄly" + "read:gallery": "VidieÅĨ vaÅĄu galÊriu" + "write:gallery": "UpravovaÅĨ vaÅĄu galÊriu" + "read:gallery-likes": "VidieÅĨ zoznam obÄžÃēbenÃŊch príspevkov z galÊrie" + "write:gallery-likes": "UpraviÅĨ zoznam obÄžÃēbenÃŊch príspevov z galÊrie" +_auth: + shareAccess: "Prajete si povoliÅĨ \"{name}\", aby mal prístup k tomuto Ãēčtu?" + shareAccessAsk: "Naozaj chcete povoliÅĨ tejto aplikÃĄcii prístup k tomuto Ãēčtu?" + permissionAsk: "TÃĄto aplikÃĄcia vyÅžaduje nasledujÃēce nastavenia" + pleaseGoBack: "Prosím prejdite späÅĨ na aplikÃĄciu" + callback: "Vraciam sa späÅĨ na aplikÃĄciu" + denied: "Prístup zamietnutÃŊ" +_antennaSources: + all: "VÅĄetky poznÃĄmky" + homeTimeline: "PoznÃĄmky od sledovanÊho pouŞívateÄža" + users: "PoznÃĄmky od konkrÊtneho pouŞívateÄža" + userList: "PoznÃĄmky od pouŞívateÄžov v zozname" + userGroup: "PoznÃĄmky od pouŞívateÄžov z konkrÊtnej skupiny." +_weekday: + sunday: "NedeÄža" + monday: "Pondelok" + tuesday: "Utorok" + wednesday: "Streda" + thursday: "Å tvrtok" + friday: "Piatok" + saturday: "Sobota" +_widgets: + memo: "PrilepenÊ poznÃĄmky" + notifications: "OznÃĄmenia" + timeline: "ČasovÃĄ os" + calendar: "KalendÃĄr" + trends: "Trendy" + clock: "Hodiny" + rss: "RSS čítačka" + activity: "Aktivita" + photos: "Fotky" + digitalClock: "DigitÃĄlne hodiny" + federation: "FederÃĄcia" + postForm: "NapísaÅĨ poznÃĄmku" + slideshow: "PrezentÃĄcia" + button: "Tlačidlo" + onlineUsers: "Online pouŞívatelia" + jobQueue: "Fronta Ãēloh" + serverMetric: "Metriky servera" + aiscript: "Konzola AiScript" + aichan: "Ai" +_cw: + hide: "SkryÅĨ" + show: "ZobraziÅĨ viac" + chars: "{count} znakov" + files: "{count} sÃēbor/ov" +_poll: + noOnlyOneChoice: "Treba aspoň dve voÄžby" + choiceN: "VoÄžba {n}" + noMore: "NemôŞete pridaÅĨ viac volieb" + canMultipleVote: "PovoliÅĨ hlasovaÅĨ za viac volieb." + expiration: "UkončiÅĨ hlasovanie" + infinite: "Nikdy" + at: "KonkrÊtny dÃĄtum..." + after: "UkončiÅĨ po..." + deadlineDate: "DÃĄtum ukončenia" + deadlineTime: "hod" + duration: "Trvanie" + votesCount: "{n} hlasov" + totalVotes: "{n} hlasov celkom" + vote: "HlasovaÅĨ" + showResult: "VidieÅĨ vÃŊsledky hlasovania" + voted: "ZahlasovanÊ" + closed: "Skončilo" + remainingDays: "zostÃĄva {d} dní {h} hodín" + remainingHours: "zostÃĄva {h} hodín {m} minÃēt" + remainingMinutes: "zostÃĄva {m} minÃēt {s} sekÃēnd" + remainingSeconds: "zostÃĄva {s} sekÃēnd" +_visibility: + public: "VerejnÊ" + publicDescription: "VaÅĄa poznÃĄmku bude viditeÄžnÃĄ vÅĄetkÃŊm pouŞívateÄžom" + home: "Domov" + homeDescription: "PridaÅĨ iba na domÃĄcu časovÃē os" + followers: "SledujÃēci" + followersDescription: "ViditeÄžnÊ iba tÃŊm, ktorí vÃĄs sledujÃē" + specified: "Priame" + specifiedDescription: "ViditeÄžnÊ iba pre konkrÊtnych pouŞívateÄžov" + localOnly: "Iba lokÃĄlne" + localOnlyDescription: "VzdialenÃŊ pouŞívatelia nebudÃē vidieÅĨ" +_postForm: + replyPlaceholder: "Odpoveď na tÃēto poznÃĄmku..." + quotePlaceholder: "Citovanie tejto poznÃĄmky..." + channelPlaceholder: "PoslaÅĨ do kanÃĄla..." + _placeholders: + a: "Čo mÃĄte v plÃĄne?" + b: "Čo sa deje?" + c: "O čom rozmÃŊÅĄÄžaÅĄ?" + d: "Čo chcete povedaÅĨ?" + e: "Začnite písaÅĨ..." + f: "ČakÃĄ sa na písanie..." +_profile: + name: "NÃĄzov" + username: "Meno pouŞívateÄža" + description: "Bio" + youCanIncludeHashtags: "Vo svojom bio môŞete maÅĨ aj hashtagy." + metadata: "DodatočnÊ informÃĄcie" + metadataEdit: "UpraviÅĨ dodatočnÊ informÃĄcie" + metadataDescription: "Vo svojom profile môŞete uviesÅĨ aÅž ÅĄtyri dodatočnÊ informačnÊ polia." + metadataLabel: "Popisok" + metadataContent: "Obsah" + changeAvatar: "ZmeniÅĨ avatara" + changeBanner: "ZmeniÅĨ banner" +_exportOrImport: + allNotes: "VÅĄetky poznÃĄmky" + followingList: "Sledujete" + muteList: "VypnÃēÅĨ zvuk" + blockingList: "ZablokovaÅĨ" + userLists: "Zoznamy" + excludeMutingUsers: "VylÃēčiÅĨ stÃ­ÅĄenÃŊch pouŞívateÄžov" + excludeInactiveUsers: "VylÃēčiÅĨ neaktívnych pouŞívateÄžov" +_charts: + federation: "FederÃĄcia" + apRequest: "ÅŊiadosti" + usersIncDec: "Rozdiel v počte pouŞívateÄžov" + usersTotal: "CelkovÃŊ počet pouŞívateÄžov" + activeUsers: "Aktívni pouŞívatelia" + notesIncDec: "Rozdiel v počte poznÃĄmok" + localNotesIncDec: "Rozdiel v počte lokÃĄlnych poznÃĄmok" + remoteNotesIncDec: "Rozdiel v počte vzdialenÃŊch poznÃĄmok" + notesTotal: "CelkovÃŊ počet poznÃĄmok" + filesIncDec: "Rozdiel v počte sÃēborov" + filesTotal: "CelkovÃŊ počet sÃēborov" + storageUsageIncDec: "Rozdiel vyuÅžitÊho ÃēloÅžiska" + storageUsageTotal: "CelkovÊ vyuÅžitÊ ÃēloÅžisko" +_instanceCharts: + requests: "ÅŊiadosti" + users: "Rozdiel v počte pouŞívateÄžov" + usersTotal: "Celkom spolu počet pouŞívateÄžov" + notes: "Rozdiel v počte poznÃĄmok" + notesTotal: "Celkom spolu počet poznÃĄmok" + ff: "Rozdiel v počte sledovanÃŊch/sledujÃēcich" + ffTotal: "Celkom spolu počet sledovanÃŊch / sledujÃēcich" + cacheSize: "Rozdiel vo veÄžkosti cache" + cacheSizeTotal: "Celkom spolu veÄžkosÅĨ cache" + files: "Rozdiel v počte sÃēborov" + filesTotal: "Celkom spolu počet sÃēborov" +_timelines: + home: "Domov" + local: "LokÃĄlne" + social: "SociÃĄlne" + global: "GlobÃĄlne" +_pages: + newPage: "VytvoriÅĨ novÃē strÃĄnku" + editPage: "UpraviÅĨ tÃēto strÃĄnku" + readPage: "Zobrazenie zdroja aktívne" + created: "StrÃĄnka ÃēspeÅĄne vytvorenÃĄ" + updated: "StrÃĄnka ÃēspeÅĄne upravenÃĄ" + deleted: "StrÃĄnka ÃēspeÅĄne odstrÃĄnenÃĄ" + pageSetting: "Nastavenia strÃĄnky" + nameAlreadyExists: "ZadanÃĄ URL strÃĄnku uÅž existuje" + invalidNameTitle: "ZadanÃĄ URL strÃĄnku je nesprÃĄvna" + invalidNameText: "Uistite sa, Åže nadpis strÃĄnky nie je prÃĄzdny" + editThisPage: "UpraviÅĨ tÃēto strÃĄnku" + viewSource: "UkÃĄzaÅĨ zdroj" + viewPage: "UkÃĄzaÅĨ vaÅĄe strÃĄnky" + like: "PÃĄÄi sa mi" + unlike: "NepÃĄÄi sa mi" + my: "Moje strÃĄnky" + liked: "ObÄžÃēbenÊ strÃĄnky" + featured: "VÃŊznačnÊ" + inspector: "InÅĄpektor" + contents: "Obsah" + content: "Blok strÃĄnky" + variables: "PremennÊ" + title: "Nadpis" + url: "URL strÃĄnky" + summary: "Zhrnutie strÃĄnky" + alignCenter: "VystrediÅĨ prvky" + hideTitleWhenPinned: "SkryÅĨ nadpis strÃĄnky keď je pripnutÃĄ na profil" + font: "Písmo" + fontSerif: "PätkovÊ" + fontSansSerif: "BezpätkovÊ" + eyeCatchingImageSet: "NastaviÅĨ miniatÃēru" + eyeCatchingImageRemove: "OdstrÃĄniÅĨ miniatÃēru" + chooseBlock: "PridaÅĨ blok" + selectType: "Vyberte typ" + enterVariableName: "Zadajte meno premennej" + variableNameIsAlreadyUsed: "Meno premennej s uÅž pouŞíva" + contentBlocks: "Obsah" + inputBlocks: "Vstup" + specialBlocks: "Å peciÃĄlne" + blocks: + text: "Text" + textarea: "TextovÊ pole" + section: "Sekcia" + image: "ObrÃĄzky" + button: "Tlačidlo" + if: "Ak" + _if: + variable: "PremennÊ" + post: "NapísaÅĨ poznÃĄmku" + _post: + text: "Obsah" + attachCanvasImage: "Príspevok s obrÃĄzkom na plÃĄtne" + canvasId: "ID plÃĄtna" + textInput: "TextovÃŊ vstup" + _textInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + textareaInput: "ViacriadkovÃŊ textovÃŊ vstup" + _textareaInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + numberInput: "ČíselnÃŊ vstup" + _numberInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + canvas: "PlÃĄtno" + _canvas: + id: "ID plÃĄtna" + width: "Šírka" + height: "VÃŊÅĄka" + note: "VloÅženÃĄ poznÃĄmka" + _note: + id: "ID poznÃĄmky" + idDescription: "Alebo môŞete vloÅžiÅĨ URL poznÃĄmky sem" + detailed: "PodrobnÃŊ pohÄžad" + switch: "PrepnÃēÅĨ" + _switch: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + counter: "Počítadlo" + _counter: + name: "Meno premennej" + text: "Nadpis" + inc: "PripočítaÅĨ" + _button: + text: "Nadpis" + colored: "FarebnÊ" + action: "OperÃĄcia po stlačení tlačidla" + _action: + dialog: "ZobraziÅĨ dialÃŗg" + _dialog: + content: "Obsah" + resetRandom: "ResetovaÅĨ zdroj nÃĄhodnosti" + pushEvent: "PoslaÅĨ udalosÅĨ" + _pushEvent: + event: "NÃĄzov udalosti" + message: "ZobrazenÃĄ sprÃĄva po aktivÃĄcii" + variable: "OdoslanÃĄ premennÃĄ" + no-variable: "ÅŊiadne" + callAiScript: "SpustiÅĨ AiScript" + _callAiScript: + functionName: "NÃĄzov funkcie" + radioButton: "MoÅžnosÅĨ" + _radioButton: + name: "Meno premennej" + title: "Nadpis" + values: "Zoznam moÅžností oddelenÊ novÃŊmi riadkami" + default: "PredvolenÃĄ hodnota" + script: + categories: + flow: "Riadenie behu" + logical: "LogickÃĄ operÃĄcia" + operation: "VÃŊpočet" + comparison: "Porovnanie" + random: "NÃĄhodnÊ" + value: "Hodnoty" + fn: "Funkcie" + text: "TextovÊ operÃĄcie" + convert: "TransformÃĄcie" + list: "Zoznamy" + blocks: + text: "Text" + multiLineText: "Text (viacriadkovÃŊ)" + textList: "Zoznam textov" + _textList: + info: "OddeÄžte kaÅždÃē poloÅžku novÃŊm riadkom" + strLen: "DÄēÅžka textu" + _strLen: + arg1: "Text" + strPick: "VybraÅĨ znak" + _strPick: + arg1: "Text" + arg2: "Pozícia znaku" + strReplace: "NÃĄhradnÃŊ text" + _strReplace: + arg1: "Text" + arg2: "NahradenÃŊ text" + arg3: "NahradiÅĨ s" + strReverse: "OtočiÅĨ text" + _strReverse: + arg1: "Text" + join: "SpojiÅĨ texty" + _join: + arg1: "Zoznamy" + arg2: "OddeÄžovač" + add: "PridaÅĨ" + _add: + arg1: "A" + arg2: "B" + subtract: "OdčítaÅĨ" + _subtract: + arg1: "A" + arg2: "B" + multiply: "NÃĄsobiÅĨ" + _multiply: + arg1: "A" + arg2: "B" + divide: "DeliÅĨ" + _divide: + arg1: "A" + arg2: "B" + mod: "ZvyÅĄok po delení" + _mod: + arg1: "A" + arg2: "B" + round: "ZaokrÃēhliÅĨ" + _round: + arg1: "Číslo" + eq: "A a B sa rovnajÃē" + _eq: + arg1: "A" + arg2: "B" + notEq: "A a B sa nerovnajÃē" + _notEq: + arg1: "A" + arg2: "B" + and: "A a zÃĄroveň B" + _and: + arg1: "A" + arg2: "B" + or: "A alebo B" + _or: + arg1: "A" + arg2: "B" + lt: "< A je menÅĄie ako B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A je vÃ¤ÄÅĄie ako B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A je menÅĄie alebo rovnÊ B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A je vÃ¤ÄÅĄie alebo rovnÊ B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Vetva" + _if: + arg1: "Ak" + arg2: "Potom" + arg3: "Inak" + not: "Opak" + _not: + arg1: "Opak" + random: "NÃĄhodnÊ" + _random: + arg1: "PravdepodobnosÅĨ" + rannum: "NÃĄhodnÊ číslo" + _rannum: + arg1: "MinimÃĄlna hodnota" + arg2: "MaximÃĄlna hodnota" + randomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu" + _randomPick: + arg1: "Zoznam" + dailyRandom: "NÃĄhodne (zmení sa raz denne pre kaÅždÊho pouŞívateÄža)" + _dailyRandom: + arg1: "PravdepodobnosÅĨ" + dailyRannum: "NÃĄhodnÊ číslo (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _dailyRannum: + arg1: "MinimÃĄlna hodnota" + arg2: "MaximÃĄlna hodnota" + dailyRandomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _dailyRandomPick: + arg1: "Zoznam" + seedRandom: "NÃĄhodne (so seedom)" + _seedRandom: + arg1: "Seed" + arg2: "PravdepodobnosÅĨ" + seedRannum: "NÃĄhodnÊ číslo (so seedom)" + _seedRannum: + arg1: "Seed" + arg2: "MinimÃĄlna hodnota" + arg3: "MaximÃĄlna hodnota" + seedRandomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu (so seedom)" + _seedRandomPick: + arg1: "Seed" + arg2: "Zoznam" + DRPWPM: "NÃĄhodnÃŊ vÃŊber z vÃĄÅženÊho zoznamu (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _DRPWPM: + arg1: "Zoznam textov" + pick: "VybraÅĨ zo zoznamu" + _pick: + arg1: "Zoznam" + arg2: "Pozícia" + listLen: "ZískaÅĨ dÄēÅžku zoznamu" + _listLen: + arg1: "Zoznam" + number: "Číslo" + stringToNumber: "Text na číslo" + _stringToNumber: + arg1: "Text" + numberToString: "Číslo na text" + _numberToString: + arg1: "Číslo" + splitStrByLine: "Rozdelí text po riadkoch" + _splitStrByLine: + arg1: "Text" + ref: "PremennÊ" + aiScriptVar: "AiScript premennÃĄ" + fn: "Funkcie" + _fn: + slots: "Sloty" + slots-info: "OddeÄžte kaÅždÃŊ slot novÃŊm riadkom" + arg1: "VÃŊstup" + for: "For cyklus" + _for: + arg1: "Počet opakovaní" + arg2: "Akcia" + typeError: "Slot {slot} akceptuje hodnoty typu \"{expect}\", ale dodanÃĄ hodnota je typu \"{actual}\"!" + thereIsEmptySlot: "Slot {slot} je prÃĄzdny!" + types: + string: "Text" + number: "Číslo" + boolean: "Boolean" + array: "Zoznamy" + stringArray: "Zoznam textov" + emptySlot: "PrÃĄzdny slot" + enviromentVariables: "PremennÊ prostredia" + pageVariables: "PremennÊ strÃĄnky" + argVariables: "VstupnÊ sloty" +_relayStatus: + requesting: "ČakÃĄ sa" + accepted: "AkceptovanÊ" + rejected: "OdmietnutÊ" +_notification: + fileUploaded: "SÃēbor sa ÃēspeÅĄne nahral" + youGotMention: "{name} vÃĄs spomenul/a" + youGotReply: "{name} vÃĄm odpovedal/a" + youGotQuote: "{name} vÃĄs citoval/a" + youRenoted: "{name} preposlal/a vaÅĄu poznÃĄmku" + youGotPoll: "{name} hlasoval/a" + youGotMessagingMessageFromUser: "{name} vÃĄm poslal/a sprÃĄvu" + youGotMessagingMessageFromGroup: "PriÅĄla sprÃĄva do skupiny {name}" + youWereFollowed: "MÃĄte novÊho sledujÃēceho" + youReceivedFollowRequest: "Dostali ste ÅžiadosÅĨ o sledovanie" + yourFollowRequestAccepted: "VaÅĄa ÅžiadosÅĨ o sledovanie bola prijatÃĄ" + youWereInvitedToGroup: "PozvaÅĨ do skupiny" + _types: + all: "VÅĄetky" + follow: "Sledujete" + mention: "Zmienka" + reply: "Odpovede" + renote: "PreposlaÅĨ" + quote: "CitovaÅĨ" + reaction: "Reakcie" + pollVote: "Hlasy v hlasovaniach" + receiveFollowRequest: "DoručenÊ Åžiadosti o sledovanie" + followRequestAccepted: "SchvÃĄlenÊ Åžiadosti o sledovanie" + groupInvited: "PozvÃĄnky do skupín" + app: "OznÃĄmenia z prepojenÃŊch aplikÃĄcií" +_deck: + alwaysShowMainColumn: "VÅždy zobraziÅĨ v hlavnom stÄēpci" + columnAlign: "ZarovnaÅĨ stÄēpce" + columnMargin: "Rozostup medzi stÄēpcami" + columnHeaderHeight: "VÃŊÅĄka hlavičky stÄēpca" + addColumn: "PridaÅĨ stÄēpec" + swapLeft: "VymeniÅĨ vÄžavo" + swapRight: "VymeniÅĨ vpravo" + swapUp: "VymeniÅĨ hore" + swapDown: "VymeniÅĨ s nasledujÃēcim" + stackLeft: "PriloÅžiÅĨ do ÄžavÊho stÄēpca" + popRight: "VybraÅĨ napravo" + profile: "Profil" + _columns: + main: "HlavnÃŊ" + widgets: "Widgety" + notifications: "OznÃĄmenia" + tl: "ČasovÃĄ os" + antenna: "AntÊny" + list: "Zoznam" + mentions: "Zmienky" + direct: "Priame poznÃĄmky" diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 2dd6056011..588df8d325 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -1038,7 +1038,8 @@ _exportOrImport: blockingList: "ЗабĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸" userLists: "ĐĄĐŋĐ¸ŅĐēи" _charts: - federationInstancesTotal: "Đ—Đ°ĐŗĐ°ĐģҌĐŊа ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊĐ¸Ņ… Ņ–ĐŊŅŅ‚Đ°ĐŊŅŅ–Đ˛" + federation: "ФĐĩĐ´Ņ–Đ˛ĐĩҀҁ" + apRequest: "ЗаĐŋĐ¸Ņ‚Đ¸" usersTotal: "Đ—Đ°ĐŗĐ°ĐģҌĐŊа ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛" activeUsers: "АĐēŅ‚Đ¸Đ˛ĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–" notesTotal: "Đ—Đ°ĐŗĐ°ĐģҌĐŊа ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŊĐžŅ‚Đ°Ņ‚ĐžĐē" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c54e64214a..f4f1680caa 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -141,6 +141,8 @@ flagAsBot: "čŋ™æ˜¯ä¸€ä¸Ēæœē器äēēč´Ļåˇ" flagAsBotDescription: "åĻ‚æžœæ­¤å¸æˆˇį”ąį¨‹åēæŽ§åˆļīŧŒč¯ˇå¯į”¨æ­¤éĄšã€‚å¯į”¨åŽīŧŒæ­¤æ ‡åŋ—可äģĨ帎劊å…ļäģ–åŧ€å‘äēēå‘˜é˜˛æ­ĸæœē器äēē之间äē§į”Ÿæ— é™äē’åŠ¨įš„čĄŒä¸ēīŧŒåšļ莊Misskeyįš„å†…éƒ¨įŗģįģŸå°†æ­¤å¸æˆˇč¯†åˆĢä¸ēæœē器äēē。" flagAsCat: "将čŋ™ä¸Ēč´ĻæˆˇčŽžåŽšä¸ē一åĒįŒĢ" flagAsCatDescription: "åĻ‚æžœæ‚¨æƒŗčĄ¨æ˜Žæ­¤å¸æˆˇæ˜¯ä¸€åĒįŒĢīŧŒč¯ˇæ‰“åŧ€æ­¤æ ‡åŋ—。" +flagShowTimelineReplies: "在æ—ļ间įēŋ上昞į¤ēå¸–å­įš„å›žå¤" +flagShowTimelineRepliesDescription: "吝ᔍæ—ļīŧŒæ—ļ间įēŋ除ä熿˜žį¤ēį”¨æˆˇįš„å¸–å­å¤–īŧŒčŋ˜äŧšæ˜žį¤ēå…ļäģ–į”¨æˆˇå¯šå¸–å­įš„å›žå¤ã€‚" autoAcceptFollowed: "č‡ĒåŠ¨å…čŽ¸å…ŗæŗ¨" addAccount: "æˇģ加č´Ļæˆˇ" loginFailed: "į™ģåŊ•å¤ąč´Ĩ" @@ -822,6 +824,10 @@ leaveGroupConfirm: "įĄŽåŽšįĻģåŧ€ã€Œ{name}」īŧŸ" useDrawerReactionPickerForMobile: "在į§ģåŠ¨čŽžå¤‡ä¸ŠäŊŋᔍæŠŊåą‰æ˜žį¤ē" welcomeBackWithName: "æŦĸčŋŽå›žæĨīŧŒ{name}" clickToFinishEmailVerification: "į‚šå‡ģ [{ok}] 厌成į”ĩ子邎äģļåœ°å€čŽ¤č¯ã€‚" +overridedDeviceKind: "čŽžå¤‡įąģ型" +smartphone: "æ™ēčƒŊ手æœē" +tablet: "åšŗæŋ" +auto: "č‡Ē动" _emailUnavailable: used: "厞įģčĸĢäŊŋᔍčŋ‡" format: "æ— æ•ˆįš„æ ŧåŧ" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "æŽ’é™¤åąč”Ŋį”¨æˆˇ" excludeInactiveUsers: "排除不æ´ģčˇƒį”¨æˆˇ" _charts: - federationInstancesIncDec: "č”åˆīŧšåĸžåŠ /减少" - federationInstancesTotal: "č”åˆæ€ģ数" + federation: "č”åˆ" + apRequest: "č¯ˇæą‚" usersIncDec: "į”¨æˆˇæ•°é‡īŧšåĸžåŠ /减少" usersTotal: "į”¨æˆˇæ€ģ数" activeUsers: "æ´ģčˇƒį”¨æˆˇæ•°" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 798398a6a9..b10871ec1d 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1114,6 +1114,8 @@ _exportOrImport: blockingList: "封鎖" userLists: "清喎" _charts: + federation: "įĢ™å°č¯é‚Ļ" + apRequest: "čĢ‹æą‚" usersIncDec: "äŊŋᔍ者åĸ—減" usersTotal: "äŊŋį”¨č€…åˆå…ą" activeUsers: "æ´ģčēäŊŋᔍ者" diff --git a/package.json b/package.json index 27fd81cd86..46dac95db3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.103.1", + "version": "12.104.0", "codename": "indigo", "repository": { "type": "git", @@ -46,7 +46,7 @@ "@types/fluent-ffmpeg": "2.1.20", "@typescript-eslint/parser": "5.10.0", "cross-env": "7.0.3", - "cypress": "9.3.1", + "cypress": "9.4.1", "start-server-and-test": "1.14.0", "typescript": "4.5.5" } diff --git a/packages/backend/migration/1629833361000-AddShowTLReplies.js b/packages/backend/migration/1629833361000-AddShowTLReplies.js new file mode 100644 index 0000000000..bfd4ab7ff7 --- /dev/null +++ b/packages/backend/migration/1629833361000-AddShowTLReplies.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class addShowTLReplies1629833361000 { + constructor() { + this.name = 'addShowTLReplies1629833361000'; + } + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`COMMENT ON COLUMN "user"."showTimelineReplies" IS 'Whether to show users replying to other users in the timeline.'`); + } + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`); + } +} +exports.addShowTLReplies1629833361000 = addShowTLReplies1629833361000; diff --git a/packages/backend/migration/1643963705770-chart-v4.js b/packages/backend/migration/1643963705770-chart-v4.js new file mode 100644 index 0000000000..91b0a747e6 --- /dev/null +++ b/packages/backend/migration/1643963705770-chart-v4.js @@ -0,0 +1,63 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV41643963705770 { + name = 'chartV41643963705770' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___drive_totalUsage"`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___drive_totalUsage"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___drive_totalUsage" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___drive_totalUsage" bigint NOT NULL`); + } +} diff --git a/packages/backend/migration/1643966656277-chart-v5.js b/packages/backend/migration/1643966656277-chart-v5.js new file mode 100644 index 0000000000..9ff05be63b --- /dev/null +++ b/packages/backend/migration/1643966656277-chart-v5.js @@ -0,0 +1,27 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV51643966656277 { + name = 'chartV51643966656277' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`); + } +} diff --git a/packages/backend/migration/1643967331284-chart-v6.js b/packages/backend/migration/1643967331284-chart-v6.js new file mode 100644 index 0000000000..86feade9d1 --- /dev/null +++ b/packages/backend/migration/1643967331284-chart-v6.js @@ -0,0 +1,343 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV61643967331284 { + name = 'chartV61643967331284' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`); + } +} diff --git a/packages/backend/migration/1644058404077-chart-v7.js b/packages/backend/migration/1644058404077-chart-v7.js new file mode 100644 index 0000000000..a462a7cd36 --- /dev/null +++ b/packages/backend/migration/1644058404077-chart-v7.js @@ -0,0 +1,511 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV71644058404077 { + name = 'chartV71644058404077' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___totalCount"=2147483647 WHERE "___totalCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___totalSize"=2147483647 WHERE "___totalSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___incCount"=32767 WHERE "___incCount" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___incSize"=2147483647 WHERE "___incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___decCount"=32767 WHERE "___decCount" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___decSize"=2147483647 WHERE "___decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___totalCount"=2147483647 WHERE "___totalCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___totalSize"=2147483647 WHERE "___totalSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___incCount"=32767 WHERE "___incCount" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___incSize"=2147483647 WHERE "___incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___decCount"=32767 WHERE "___decCount" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___decSize"=2147483647 WHERE "___decSize" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`); + } +} diff --git a/packages/backend/migration/1644059847460-chart-v8.js b/packages/backend/migration/1644059847460-chart-v8.js new file mode 100644 index 0000000000..7c5db0db33 --- /dev/null +++ b/packages/backend/migration/1644059847460-chart-v8.js @@ -0,0 +1,25 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV81644059847460 { + name = 'chartV81644059847460' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + } +} diff --git a/packages/backend/migration/1644060125705-chart-v9.js b/packages/backend/migration/1644060125705-chart-v9.js new file mode 100644 index 0000000000..bc607067b3 --- /dev/null +++ b/packages/backend/migration/1644060125705-chart-v9.js @@ -0,0 +1,25 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV91644060125705 { + name = 'chartV91644060125705' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + } +} diff --git a/packages/backend/migration/1644073149413-chart-v10.js b/packages/backend/migration/1644073149413-chart-v10.js new file mode 100644 index 0000000000..6ca568718f --- /dev/null +++ b/packages/backend/migration/1644073149413-chart-v10.js @@ -0,0 +1,35 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV101644073149413 { + name = 'chartV101644073149413' + + async up(queryRunner) { + await queryRunner.query(`CREATE TABLE "__chart__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_e56f4beac5746d44bc3e19c80d0" UNIQUE ("date"), CONSTRAINT "PK_56a25cd447c7ee08876b3baf8d8" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e56f4beac5746d44bc3e19c80d" ON "__chart__ap_request" ("date") `); + await queryRunner.query(`CREATE TABLE "__chart_day__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_a848f66d6cec11980a5dd595822" UNIQUE ("date"), CONSTRAINT "PK_9318b49daee320194e23f712e69" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a848f66d6cec11980a5dd59582" ON "__chart_day__ap_request" ("date") `); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___deliveredInstances"`); + await queryRunner.query(`DROP INDEX "public"."IDX_a848f66d6cec11980a5dd59582"`); + await queryRunner.query(`DROP TABLE "__chart_day__ap_request"`); + await queryRunner.query(`DROP INDEX "public"."IDX_e56f4beac5746d44bc3e19c80d"`); + await queryRunner.query(`DROP TABLE "__chart__ap_request"`); + } +} diff --git a/packages/backend/migration/1644095659741-chart-v11.js b/packages/backend/migration/1644095659741-chart-v11.js new file mode 100644 index 0000000000..40b1c3072b --- /dev/null +++ b/packages/backend/migration/1644095659741-chart-v11.js @@ -0,0 +1,91 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV111644095659741 { + name = 'chartV111644095659741' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`); + } +} diff --git a/packages/backend/migration/1644328606241-chart-v12.js b/packages/backend/migration/1644328606241-chart-v12.js new file mode 100644 index 0000000000..226de6ece9 --- /dev/null +++ b/packages/backend/migration/1644328606241-chart-v12.js @@ -0,0 +1,27 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV121644328606241 { + name = 'chartV121644328606241' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" DROP COLUMN "___diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" DROP COLUMN "___diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___notes_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___notes_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___remote_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___local_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___remote_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___local_diffs_withFile"`); + } +} diff --git a/packages/backend/migration/1644331238153-chart-v13.js b/packages/backend/migration/1644331238153-chart-v13.js new file mode 100644 index 0000000000..ed36659b34 --- /dev/null +++ b/packages/backend/migration/1644331238153-chart-v13.js @@ -0,0 +1,19 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV131644331238153 { + name = 'chartV131644331238153' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___stalled"`); + } +} diff --git a/packages/backend/migration/1644344266289-chart-v14.js b/packages/backend/migration/1644344266289-chart-v14.js new file mode 100644 index 0000000000..8496cc2d42 --- /dev/null +++ b/packages/backend/migration/1644344266289-chart-v14.js @@ -0,0 +1,47 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV141644344266289 { + name = 'chartV141644344266289' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___write"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___write"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___read"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___read"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___readWrite"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___write"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___write"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___read"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___read"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___readWrite"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + } +} diff --git a/packages/backend/package.json b/packages/backend/package.json index 3541e803f3..d81688cbfe 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -19,12 +19,11 @@ "@koa/cors": "3.1.0", "@koa/multer": "3.0.0", "@koa/router": "9.0.1", - "@sinonjs/fake-timers": "7.1.2", + "@sinonjs/fake-timers": "9.1.0", "@syuilo/aiscript": "0.11.1", "@types/bcryptjs": "2.4.2", "@types/bull": "3.15.7", "@types/cbor": "6.0.0", - "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.1", "@types/glob": "7.2.0", "@types/is-url": "1.2.30", @@ -43,7 +42,7 @@ "@types/koa__multer": "2.0.4", "@types/koa__router": "8.0.11", "@types/mocha": "8.2.3", - "@types/node": "17.0.10", + "@types/node": "17.0.14", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.4", "@types/oauth": "0.9.1", @@ -56,43 +55,40 @@ "@types/ratelimiter": "3.4.3", "@types/redis": "4.0.11", "@types/rename": "1.0.4", - "@types/request-stats": "3.0.0", "@types/sanitize-html": "2.6.2", - "@types/seedrandom": "2.4.28", + "@types/seedrandom": "3.0.1", "@types/sharp": "0.29.5", - "@types/sinonjs__fake-timers": "6.0.4", + "@types/sinonjs__fake-timers": "8.1.1", "@types/speakeasy": "2.0.7", "@types/throttle-debounce": "2.1.0", "@types/tinycolor2": "1.4.3", "@types/tmp": "0.2.3", "@types/uuid": "8.3.4", "@types/web-push": "3.3.2", - "@types/webpack": "5.28.0", - "@types/webpack-stream": "3.2.12", - "@types/websocket": "1.0.4", + "@types/websocket": "1.0.5", "@types/ws": "8.2.2", - "@typescript-eslint/eslint-plugin": "5.10.0", - "@typescript-eslint/parser": "5.10.0", + "@typescript-eslint/eslint-plugin": "5.10.2", + "@typescript-eslint/parser": "5.10.2", "abort-controller": "3.0.0", "archiver": "5.3.0", "autobind-decorator": "2.4.0", "autwh": "0.1.0", - "aws-sdk": "2.1061.0", + "aws-sdk": "2.1067.0", "bcryptjs": "2.4.3", "blurhash": "1.1.4", "broadcast-channel": "4.9.0", - "bull": "4.2.1", + "bull": "4.5.0", "cacheable-lookup": "6.0.4", "cafy": "15.2.1", "cbor": "8.1.0", "chalk": "4.1.2", "cli-highlight": "2.1.11", "content-disposition": "0.5.4", - "crc-32": "1.2.0", - "dateformat": "4.5.1", + "crc-32": "1.2.1", + "date-fns": "2.28.0", "deep-email-validator": "0.1.21", "escape-regexp": "0.0.1", - "eslint": "8.7.0", + "eslint": "8.8.0", "eslint-plugin-import": "2.25.4", "eventemitter3": "4.0.7", "feed": "4.2.2", @@ -105,7 +101,7 @@ "ip-cidr": "3.0.4", "is-svg": "4.3.2", "js-yaml": "4.1.0", - "jsdom": "16.7.0", + "jsdom": "19.0.0", "json5": "2.2.0", "json5-loader": "4.0.1", "jsonld": "5.2.0", @@ -134,7 +130,7 @@ "pg": "8.7.1", "portscanner": "2.2.0", "private-ip": "2.3.3", - "probe-image-size": "7.2.2", + "probe-image-size": "7.2.3", "promise-limit": "2.7.0", "pug": "3.0.2", "punycode": "2.1.1", @@ -147,20 +143,19 @@ "redis-lock": "0.1.4", "reflect-metadata": "0.1.13", "rename": "1.0.4", - "request-stats": "3.0.0", "require-all": "3.0.0", "rndstr": "1.0.0", "s-age": "1.1.2", "sanitize-html": "2.6.1", "seedrandom": "3.0.5", - "sharp": "0.29.3", + "sharp": "0.30.0", "speakeasy": "2.0.0", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", "style-loader": "3.3.1", "summaly": "2.5.0", "syslog-pro": "1.0.0", - "systeminformation": "5.9.9", + "systeminformation": "5.11.0", "throttle-debounce": "3.0.1", "tinycolor2": "1.4.2", "tmp": "0.2.1", diff --git a/packages/backend/@types/hcaptcha.d.ts b/packages/backend/src/@types/hcaptcha.d.ts similarity index 100% rename from packages/backend/@types/hcaptcha.d.ts rename to packages/backend/src/@types/hcaptcha.d.ts diff --git a/packages/backend/@types/http-signature.d.ts b/packages/backend/src/@types/http-signature.d.ts similarity index 100% rename from packages/backend/@types/http-signature.d.ts rename to packages/backend/src/@types/http-signature.d.ts diff --git a/packages/backend/@types/jsrsasign.d.ts b/packages/backend/src/@types/jsrsasign.d.ts similarity index 100% rename from packages/backend/@types/jsrsasign.d.ts rename to packages/backend/src/@types/jsrsasign.d.ts diff --git a/packages/backend/@types/koa-json-body.d.ts b/packages/backend/src/@types/koa-json-body.d.ts similarity index 100% rename from packages/backend/@types/koa-json-body.d.ts rename to packages/backend/src/@types/koa-json-body.d.ts diff --git a/packages/backend/@types/koa-slow.d.ts b/packages/backend/src/@types/koa-slow.d.ts similarity index 100% rename from packages/backend/@types/koa-slow.d.ts rename to packages/backend/src/@types/koa-slow.d.ts diff --git a/packages/backend/@types/langmap.d.ts b/packages/backend/src/@types/langmap.d.ts similarity index 100% rename from packages/backend/@types/langmap.d.ts rename to packages/backend/src/@types/langmap.d.ts diff --git a/packages/backend/@types/os-utils.d.ts b/packages/backend/src/@types/os-utils.d.ts similarity index 100% rename from packages/backend/@types/os-utils.d.ts rename to packages/backend/src/@types/os-utils.d.ts diff --git a/packages/backend/@types/package.json.d.ts b/packages/backend/src/@types/package.json.d.ts similarity index 100% rename from packages/backend/@types/package.json.d.ts rename to packages/backend/src/@types/package.json.d.ts diff --git a/packages/backend/@types/probe-image-size.d.ts b/packages/backend/src/@types/probe-image-size.d.ts similarity index 100% rename from packages/backend/@types/probe-image-size.d.ts rename to packages/backend/src/@types/probe-image-size.d.ts diff --git a/packages/backend/src/mfm/from-html.ts b/packages/backend/src/mfm/from-html.ts index fc6d3b3062..21e5ebb7a1 100644 --- a/packages/backend/src/mfm/from-html.ts +++ b/packages/backend/src/mfm/from-html.ts @@ -5,9 +5,7 @@ import { URL } from 'url'; const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/; const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/; -export function fromHtml(html: string, hashtagNames?: string[]): string | null { - if (html == null) return null; - +export function fromHtml(html: string, hashtagNames?: string[]): string { const dom = parse5.parseFragment(html); let text = ''; diff --git a/packages/backend/src/misc/before-shutdown.ts b/packages/backend/src/misc/before-shutdown.ts index 33abf5fb4d..93ac7a1f39 100644 --- a/packages/backend/src/misc/before-shutdown.ts +++ b/packages/backend/src/misc/before-shutdown.ts @@ -24,14 +24,14 @@ const SHUTDOWN_TIMEOUT = 15000; * down the process. * @type {BeforeShutdownListener[]} */ -const shutdownListeners = []; +const shutdownListeners: ((signalOrEvent: string) => void)[] = []; /** * Listen for signals and execute given `fn` function once. * @param {string[]} signals System signals to listen to. * @param {function(string)} fn Function to execute on shutdown. */ -const processOnce = (signals, fn) => { +const processOnce = (signals: string[], fn: (signalOrEvent: string) => void) => { for (const sig of signals) { process.once(sig, fn); } @@ -41,7 +41,7 @@ const processOnce = (signals, fn) => { * Sets a forced shutdown mechanism that will exit the process after `timeout` milliseconds. * @param {number} timeout Time to wait before forcing shutdown (milliseconds) */ -const forceExitAfter = timeout => () => { +const forceExitAfter = (timeout: number) => () => { setTimeout(() => { // Force shutdown after timeout console.warn(`Could not close resources gracefully after ${timeout}ms: forcing shutdown`); @@ -55,7 +55,7 @@ const forceExitAfter = timeout => () => { * be logged out as a warning, but won't prevent other callbacks from executing. * @param {string} signalOrEvent The exit signal or event name received on the process. */ -async function shutdownHandler(signalOrEvent) { +async function shutdownHandler(signalOrEvent: string) { if (process.env.NODE_ENV === 'test') return process.exit(0); console.warn(`Shutting down: received [${signalOrEvent}] signal`); @@ -64,7 +64,9 @@ async function shutdownHandler(signalOrEvent) { try { await listener(signalOrEvent); } catch (err) { - console.warn(`A shutdown handler failed before completing with: ${err.message || err}`); + if (err instanceof Error) { + console.warn(`A shutdown handler failed before completing with: ${err.message || err}`); + } } } @@ -78,7 +80,7 @@ async function shutdownHandler(signalOrEvent) { * @param {BeforeShutdownListener} listener The shutdown listener to register. * @returns {BeforeShutdownListener} Echoes back the supplied `listener`. */ -export function beforeShutdown(listener) { +export function beforeShutdown(listener: () => void) { shutdownListeners.push(listener); return listener; } diff --git a/packages/backend/src/misc/download-url.ts b/packages/backend/src/misc/download-url.ts index 8e1f7b9e24..ba2fa9fae0 100644 --- a/packages/backend/src/misc/download-url.ts +++ b/packages/backend/src/misc/download-url.ts @@ -38,7 +38,9 @@ export async function downloadUrl(url: string, path: string): Promise { https: httpsAgent, }, http2: false, // default - retry: 0, + retry: { + limit: 0, + }, }).on('response', (res: Got.Response) => { if ((process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test') && !config.proxy && res.ip) { if (isPrivateIp(res.ip)) { @@ -75,7 +77,7 @@ export async function downloadUrl(url: string, path: string): Promise { logger.succ(`Download finished: ${chalk.cyan(url)}`); } -function isPrivateIp(ip: string) { +function isPrivateIp(ip: string): boolean { for (const net of config.allowedPrivateNetworks || []) { const cidr = new IPCIDR(net); if (cidr.contains(ip)) { diff --git a/packages/backend/src/misc/gen-identicon.ts b/packages/backend/src/misc/gen-identicon.ts index 5cedd7afaf..fca67fcf21 100644 --- a/packages/backend/src/misc/gen-identicon.ts +++ b/packages/backend/src/misc/gen-identicon.ts @@ -39,7 +39,7 @@ const sideN = Math.floor(n / 2); */ export function genIdenticon(seed: string, stream: WriteStream): Promise { const rand = gen.create(seed); - const canvas = p.make(size, size); + const canvas = p.make(size, size, undefined); const ctx = canvas.getContext('2d'); ctx.fillStyle = bg; diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts index 23d8ceb1b7..04ff191e41 100644 --- a/packages/backend/src/misc/is-duplicate-key-value-error.ts +++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts @@ -1,3 +1,3 @@ -export function isDuplicateKeyValueError(e: Error): boolean { - return e.message.startsWith('duplicate key value'); +export function isDuplicateKeyValueError(e: unknown | Error): boolean { + return (e as any).message && (e as Error).message.startsWith('duplicate key value'); } diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 0aa01ba00a..e4d9a3ced9 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -225,6 +225,12 @@ export class User { }) public followersUri: string | null; + @Column('boolean', { + default: false, + comment: 'Whether to show users replying to other users in the timeline' + }) + public showTimelineReplies: boolean; + @Index({ unique: true }) @Column('char', { length: 16, nullable: true, unique: true, diff --git a/packages/backend/src/models/repositories/abuse-user-report.ts b/packages/backend/src/models/repositories/abuse-user-report.ts index 943b65eb64..144195855b 100644 --- a/packages/backend/src/models/repositories/abuse-user-report.ts +++ b/packages/backend/src/models/repositories/abuse-user-report.ts @@ -12,7 +12,7 @@ export class AbuseUserReportRepository extends Repository { return await awaitAll({ id: report.id, - createdAt: report.createdAt, + createdAt: report.createdAt.toISOString(), comment: report.comment, resolved: report.resolved, reporterId: report.reporterId, diff --git a/packages/backend/src/models/repositories/moderation-logs.ts b/packages/backend/src/models/repositories/moderation-logs.ts index 1585d5bfcf..f530613bcc 100644 --- a/packages/backend/src/models/repositories/moderation-logs.ts +++ b/packages/backend/src/models/repositories/moderation-logs.ts @@ -12,7 +12,7 @@ export class ModerationLogRepository extends Repository { return await awaitAll({ id: log.id, - createdAt: log.createdAt, + createdAt: log.createdAt.toISOString(), type: log.type, info: log.info, userId: log.userId, diff --git a/packages/backend/src/models/repositories/note-favorite.ts b/packages/backend/src/models/repositories/note-favorite.ts index c5de55c0c0..f4cd64e393 100644 --- a/packages/backend/src/models/repositories/note-favorite.ts +++ b/packages/backend/src/models/repositories/note-favorite.ts @@ -13,7 +13,7 @@ export class NoteFavoriteRepository extends Repository { return { id: favorite.id, - createdAt: favorite.createdAt, + createdAt: favorite.createdAt.toISOString(), noteId: favorite.noteId, note: await Notes.pack(favorite.note || favorite.noteId, me), }; diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 2b8398832d..33b2b32fee 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -220,6 +220,7 @@ export class UserRepository extends Repository { isModerator: user.isModerator || falsy, isBot: user.isBot || falsy, isCat: user.isCat || falsy, + showTimelineReplies: user.showTimelineReplies || falsy, instance: user.host ? Instances.findOne({ host: user.host }).then(instance => instance ? { name: instance.name, softwareName: instance.softwareName, diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index f9994c3b59..16acabfbf8 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -6,7 +6,8 @@ import { envOption } from '../env'; import processDeliver from './processors/deliver'; import processInbox from './processors/inbox'; import processDb from './processors/db/index'; -import procesObjectStorage from './processors/object-storage/index'; +import processObjectStorage from './processors/object-storage/index'; +import processSystemQueue from './processors/system/index'; import { queueLogger } from './logger'; import { DriveFile } from '@/models/entities/drive-file'; import { getJobInfo } from './get-job-info'; @@ -255,12 +256,19 @@ export default function() { deliverQueue.process(config.deliverJobConcurrency || 128, processDeliver); inboxQueue.process(config.inboxJobConcurrency || 16, processInbox); processDb(dbQueue); - procesObjectStorage(objectStorageQueue); + processObjectStorage(objectStorageQueue); systemQueue.add('resyncCharts', { }, { repeat: { cron: '0 0 * * *' }, }); + + systemQueue.add('cleanCharts', { + }, { + repeat: { cron: '0 0 * * *' }, + }); + + processSystemQueue(systemQueue); } export function destroy() { diff --git a/packages/backend/src/queue/processors/db/export-blocking.ts b/packages/backend/src/queue/processors/db/export-blocking.ts index 01edaaeb63..f4de9ce005 100644 --- a/packages/backend/src/queue/processors/db/export-blocking.ts +++ b/packages/backend/src/queue/processors/db/export-blocking.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Blockings } from '@/models/index'; import { MoreThan } from 'typeorm'; @@ -85,7 +85,7 @@ export async function exportBlocking(job: Bull.Job, done: any): P stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-custom-emojis.ts b/packages/backend/src/queue/processors/db/export-custom-emojis.ts index 240a542fec..2f7505f158 100644 --- a/packages/backend/src/queue/processors/db/export-custom-emojis.ts +++ b/packages/backend/src/queue/processors/db/export-custom-emojis.ts @@ -7,7 +7,7 @@ const mime = require('mime-types'); const archiver = require('archiver'); import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { Users, Emojis } from '@/models/index'; import { } from '@/queue/types'; import { downloadUrl } from '@/misc/download-url'; @@ -110,7 +110,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi archiveStream.on('close', async () => { logger.succ(`Exported to: ${archivePath}`); - const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.zip'; + const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.zip'; const driveFile = await addFile({ user, path: archivePath, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-following.ts b/packages/backend/src/queue/processors/db/export-following.ts index 06572acec1..2ac558381b 100644 --- a/packages/backend/src/queue/processors/db/export-following.ts +++ b/packages/backend/src/queue/processors/db/export-following.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Followings, Mutings } from '@/models/index'; import { In, MoreThan, Not } from 'typeorm'; @@ -86,7 +86,7 @@ export async function exportFollowing(job: Bull.Job, done: () => stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'following-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-mute.ts b/packages/backend/src/queue/processors/db/export-mute.ts index 4a856f8ef9..9e917ccbf3 100644 --- a/packages/backend/src/queue/processors/db/export-mute.ts +++ b/packages/backend/src/queue/processors/db/export-mute.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Mutings } from '@/models/index'; import { MoreThan } from 'typeorm'; @@ -85,7 +85,7 @@ export async function exportMute(job: Bull.Job, done: any): Promi stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-notes.ts b/packages/backend/src/queue/processors/db/export-notes.ts index 305abf44cf..0e65cb8849 100644 --- a/packages/backend/src/queue/processors/db/export-notes.ts +++ b/packages/backend/src/queue/processors/db/export-notes.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { Users, Notes, Polls } from '@/models/index'; import { MoreThan } from 'typeorm'; import { Note } from '@/models/entities/note'; @@ -94,7 +94,7 @@ export async function exportNotes(job: Bull.Job, done: any): Prom stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json'; + const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.json'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-user-lists.ts b/packages/backend/src/queue/processors/db/export-user-lists.ts index f907cf9526..fcd2ba336c 100644 --- a/packages/backend/src/queue/processors/db/export-user-lists.ts +++ b/packages/backend/src/queue/processors/db/export-user-lists.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, UserLists, UserListJoinings } from '@/models/index'; import { In } from 'typeorm'; @@ -62,7 +62,7 @@ export async function exportUserLists(job: Bull.Job, done: any): stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/import-custom-emojis.ts b/packages/backend/src/queue/processors/db/import-custom-emojis.ts index 04e93671ed..b6c0126534 100644 --- a/packages/backend/src/queue/processors/db/import-custom-emojis.ts +++ b/packages/backend/src/queue/processors/db/import-custom-emojis.ts @@ -41,7 +41,9 @@ export async function importCustomEmojis(job: Bull.Job, don fs.writeFileSync(destPath, '', 'binary'); await downloadUrl(file.url, destPath); } catch (e) { // TODO: äŊ•åēĻか再čŠĻ行 - logger.error(e); + if (e instanceof Error || typeof e === 'string') { + logger.error(e); + } throw e; } diff --git a/packages/backend/src/queue/processors/db/import-user-lists.ts b/packages/backend/src/queue/processors/db/import-user-lists.ts index e060e86dd8..9b3c0ed60e 100644 --- a/packages/backend/src/queue/processors/db/import-user-lists.ts +++ b/packages/backend/src/queue/processors/db/import-user-lists.ts @@ -51,7 +51,6 @@ export async function importUserLists(job: Bull.Job, done: createdAt: new Date(), userId: user.id, name: listName, - userIds: [], }).then(x => UserLists.findOneOrFail(x.identifiers[0])); } @@ -67,9 +66,9 @@ export async function importUserLists(job: Bull.Job, done: target = await resolveUser(username, host); } - if (await UserListJoinings.findOne({ userListId: list.id, userId: target.id }) != null) continue; + if (await UserListJoinings.findOne({ userListId: list!.id, userId: target.id }) != null) continue; - pushUserToUserList(target, list); + pushUserToUserList(target, list!); } catch (e) { logger.warn(`Error in line:${linenum} ${e}`); } diff --git a/packages/backend/src/queue/processors/deliver.ts b/packages/backend/src/queue/processors/deliver.ts index 46aeb8cb7e..bd91dfc3b5 100644 --- a/packages/backend/src/queue/processors/deliver.ts +++ b/packages/backend/src/queue/processors/deliver.ts @@ -4,7 +4,7 @@ import request from '@/remote/activitypub/request'; import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc'; import Logger from '@/services/logger'; import { Instances } from '@/models/index'; -import { instanceChart } from '@/services/chart/index'; +import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index'; import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata'; import { fetchMeta } from '@/misc/fetch-meta'; import { toPuny } from '@/misc/convert-host'; @@ -61,6 +61,8 @@ export default async (job: Bull.Job) => { fetchInstanceMetadata(i); instanceChart.requestSent(i.host, true); + apRequestChart.deliverSucc(); + federationChart.deliverd(i.host, true); }); return 'Success'; @@ -74,6 +76,8 @@ export default async (job: Bull.Job) => { }); instanceChart.requestSent(i.host, false); + apRequestChart.deliverFail(); + federationChart.deliverd(i.host, false); }); if (res instanceof StatusError) { diff --git a/packages/backend/src/queue/processors/inbox.ts b/packages/backend/src/queue/processors/inbox.ts index bfdebc0077..c189256c33 100644 --- a/packages/backend/src/queue/processors/inbox.ts +++ b/packages/backend/src/queue/processors/inbox.ts @@ -5,7 +5,7 @@ import perform from '@/remote/activitypub/perform'; import Logger from '@/services/logger'; import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc'; import { Instances } from '@/models/index'; -import { instanceChart } from '@/services/chart/index'; +import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { toPuny, extractDbHost } from '@/misc/convert-host'; import { getApId } from '@/remote/activitypub/type'; @@ -54,10 +54,12 @@ export default async (job: Bull.Job): Promise => { authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor)); } catch (e) { // å¯žčąĄãŒ4xxãĒら゚キップ - if (e instanceof StatusError && e.isClientError) { - return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; + if (e instanceof StatusError) { + if (e.isClientError) { + return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; + } + throw `Error in actor ${activity.actor} - ${e.statusCode || e}`; } - throw `Error in actor ${activity.actor} - ${e.statusCode || e}`; } } @@ -141,6 +143,8 @@ export default async (job: Bull.Job): Promise => { fetchInstanceMetadata(i); instanceChart.requestReceived(i.host); + apRequestChart.inbox(); + federationChart.inbox(i.host); }); // ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ“ãƒ†ã‚Ŗã‚’å‡Ļᐆ diff --git a/packages/backend/src/queue/processors/system/clean-charts.ts b/packages/backend/src/queue/processors/system/clean-charts.ts new file mode 100644 index 0000000000..3ae0f495f8 --- /dev/null +++ b/packages/backend/src/queue/processors/system/clean-charts.ts @@ -0,0 +1,28 @@ +import * as Bull from 'bull'; + +import { queueLogger } from '../../logger'; +import { activeUsersChart, driveChart, federationChart, hashtagChart, instanceChart, notesChart, perUserDriveChart, perUserFollowingChart, perUserNotesChart, perUserReactionsChart, usersChart, apRequestChart } from '@/services/chart/index'; + +const logger = queueLogger.createSubLogger('clean-charts'); + +export async function cleanCharts(job: Bull.Job>, done: any): Promise { + logger.info(`Clean charts...`); + + await Promise.all([ + federationChart.clean(), + notesChart.clean(), + usersChart.clean(), + activeUsersChart.clean(), + instanceChart.clean(), + perUserNotesChart.clean(), + driveChart.clean(), + perUserReactionsChart.clean(), + hashtagChart.clean(), + perUserFollowingChart.clean(), + perUserDriveChart.clean(), + apRequestChart.clean(), + ]); + + logger.succ(`All charts successfully cleaned.`); + done(); +} diff --git a/packages/backend/src/queue/processors/system/index.ts b/packages/backend/src/queue/processors/system/index.ts index 8460ea0a9b..636fefc402 100644 --- a/packages/backend/src/queue/processors/system/index.ts +++ b/packages/backend/src/queue/processors/system/index.ts @@ -1,8 +1,10 @@ import * as Bull from 'bull'; import { resyncCharts } from './resync-charts'; +import { cleanCharts } from './clean-charts'; const jobs = { resyncCharts, + cleanCharts, } as Record> | Bull.ProcessPromiseFunction>>; export default function(dbQueue: Bull.Queue>) { diff --git a/packages/backend/src/remote/activitypub/kernel/announce/note.ts b/packages/backend/src/remote/activitypub/kernel/announce/note.ts index e9158f7752..eae92d4180 100644 --- a/packages/backend/src/remote/activitypub/kernel/announce/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/announce/note.ts @@ -42,11 +42,14 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity: renote = await resolveNote(targetUri); } catch (e) { // å¯žčąĄãŒ4xxãĒら゚キップ - if (e instanceof StatusError && e.isClientError) { - logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); - return; + if (e instanceof StatusError) { + if (e.isClientError) { + logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); + return; + } + + logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`); } - logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`); throw e; } diff --git a/packages/backend/src/remote/activitypub/kernel/flag/index.ts b/packages/backend/src/remote/activitypub/kernel/flag/index.ts index aec6d2daaa..d910e2ebe2 100644 --- a/packages/backend/src/remote/activitypub/kernel/flag/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/flag/index.ts @@ -10,7 +10,7 @@ export default async (actor: IRemoteUser, activity: IFlag): Promise => { // å¯žčąĄãƒĻãƒŧã‚ļãƒŧは一į•Ē最初ぎãƒĻãƒŧã‚ļãƒŧ としãĻ ã‚ã¨ã¯ã‚ŗãƒĄãƒŗãƒˆã¨ã—ãĻæ ŧį´ã™ã‚‹ const uris = getApIds(activity.object); - const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()); + const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()!); const users = await Users.find({ id: In(userIds), }); diff --git a/packages/backend/src/remote/activitypub/kernel/index.ts b/packages/backend/src/remote/activitypub/kernel/index.ts index 20df28eec6..a103e5a1be 100644 --- a/packages/backend/src/remote/activitypub/kernel/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/index.ts @@ -25,8 +25,10 @@ export async function performActivity(actor: IRemoteUser, activity: IObject) { const act = await resolver.resolve(item); try { await performOneActivity(actor, act); - } catch (e) { - apLogger.error(e); + } catch (err) { + if (err instanceof Error || typeof err === 'string') { + apLogger.error(err); + } } } } else { diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts index 946914bfaa..3b799c755c 100644 --- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts +++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts @@ -24,7 +24,7 @@ export class LdSignature { } as { type: string; creator: string; - domain: string; + domain?: string; nonce: string; created: string; }; @@ -114,7 +114,7 @@ export class LdSignature { Accept: 'application/ld+json, application/json', }, timeout: this.loderTimeout, - agent: u => u.protocol == 'http:' ? httpAgent : httpsAgent, + agent: u => u.protocol === 'http:' ? httpAgent : httpsAgent, }).then(res => { if (!res.ok) { throw `${res.status} ${res.statusText}`; diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 19a7a70903..aaccf51fa9 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -164,6 +164,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise { +export default async function renderNote(note: Note, dive = true, isTalk = false): Promise> { const getPromisedFiles = async (ids: string[]) => { if (!ids || ids.length === 0) return []; const items = await DriveFiles.find({ id: In(ids) }); diff --git a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts index c4b4337af8..ff9a77be3d 100644 --- a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts +++ b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts @@ -6,7 +6,14 @@ * @param last URL of last page (optional) * @param orderedItems attached objects (optional) */ -export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record) { +export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record[]): { + id: string | null; + type: 'OrderedCollection'; + totalItems: any; + first?: string; + last?: string; + orderedItems?: Record[]; +} { const page: any = { id, type: 'OrderedCollection', diff --git a/packages/backend/src/server/activitypub/featured.ts b/packages/backend/src/server/activitypub/featured.ts index 40b8d8cc81..ed5bfc4267 100644 --- a/packages/backend/src/server/activitypub/featured.ts +++ b/packages/backend/src/server/activitypub/featured.ts @@ -32,7 +32,7 @@ export default async (ctx: Router.RouterContext) => { const rendered = renderOrderedCollection( `${config.url}/users/${userId}/collections/featured`, - renderedNotes.length, undefined, undefined, renderedNotes + renderedNotes.length, undefined, undefined, renderedNotes, ); ctx.body = renderActivity(rendered); diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts index 5bc7d2f25e..18143340ae 100644 --- a/packages/backend/src/server/api/call.ts +++ b/packages/backend/src/server/api/call.ts @@ -79,18 +79,28 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac // Cast non JSON input if (ep.meta.requireFile && ep.meta.params) { - const body = (ctx!.request as any).body; for (const k of Object.keys(ep.meta.params)) { const param = ep.meta.params[k]; - if (['Boolean', 'Number'].includes(param.validator.name) && typeof body[k] === 'string') { - body[k] = JSON.parse(body[k]); + if (['Boolean', 'Number'].includes(param.validator.name) && typeof data[k] === 'string') { + try { + data[k] = JSON.parse(data[k]); + } catch (e) { + throw new ApiError({ + message: 'Invalid param.', + code: 'INVALID_PARAM', + id: '0b5f1631-7c1a-41a6-b399-cce335f34d85', + }, { + param: k, + reason: `cannot cast to ${param.validator.name}`, + }) + } } } } // API invoking const before = performance.now(); - return await ep.exec(data, user, token, ctx!.file).catch((e: Error) => { + return await ep.exec(data, user, token, ctx?.file).catch((e: Error) => { if (e instanceof ApiError) { throw e; } else { diff --git a/packages/backend/src/server/api/common/generate-replies-query.ts b/packages/backend/src/server/api/common/generate-replies-query.ts index fbc41b2c25..249064d589 100644 --- a/packages/backend/src/server/api/common/generate-replies-query.ts +++ b/packages/backend/src/server/api/common/generate-replies-query.ts @@ -1,7 +1,7 @@ import { User } from '@/models/entities/user'; import { Brackets, SelectQueryBuilder } from 'typeorm'; -export function generateRepliesQuery(q: SelectQueryBuilder, me?: { id: User['id'] } | null) { +export function generateRepliesQuery(q: SelectQueryBuilder, me?: Pick | null) { if (me == null) { q.andWhere(new Brackets(qb => { qb .where(`note.replyId IS NULL`) // čŋ”äŋĄã§ã¯ãĒい @@ -10,7 +10,7 @@ export function generateRepliesQuery(q: SelectQueryBuilder, me?: { id: User .andWhere('note.replyUserId = note.userId'); })); })); - } else { + } else if(!me.showTimelineReplies) { q.andWhere(new Brackets(qb => { qb .where(`note.replyId IS NULL`) // čŋ”äŋĄã§ã¯ãĒい .orWhere('note.replyUserId = :meId', { meId: me.id }) // čŋ”äŋĄã ã‘おč‡Ē分ぎノãƒŧトへぎčŋ”äŋĄ diff --git a/packages/backend/src/server/api/define.ts b/packages/backend/src/server/api/define.ts index 71e5fadde0..e0720e2adb 100644 --- a/packages/backend/src/server/api/define.ts +++ b/packages/backend/src/server/api/define.ts @@ -9,6 +9,7 @@ type NonOptional = T extends undefined ? never : T; type SimpleUserInfo = { id: ILocalUser['id']; + createdAt: ILocalUser['createdAt']; host: ILocalUser['host']; username: ILocalUser['username']; uri: ILocalUser['uri']; diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts index b00457f092..a47b69ec1a 100644 --- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts +++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts @@ -36,9 +36,9 @@ export default define(meta, async (ps, me) => { if (ps.forward && report.targetUserHost != null) { const actor = await getInstanceActor(); - const targetUser = await Users.findOne(report.targetUserId); + const targetUser = await Users.findOneOrFail(report.targetUserId); - deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri], report.comment)), targetUser.inbox); + deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri!], report.comment)), targetUser.inbox); } await AbuseUserReports.update(report.id, { diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index c2a6a294b5..0d0cc9087a 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -18,144 +18,6 @@ export const meta = { res: { type: 'object', nullable: false, optional: false, - properties: { - id: { - type: 'string', - nullable: false, optional: false, - format: 'id', - }, - createdAt: { - type: 'string', - nullable: false, optional: false, - format: 'date-time', - }, - updatedAt: { - type: 'string', - nullable: true, optional: false, - format: 'date-time', - }, - lastFetchedAt: { - type: 'string', - nullable: true, optional: false, - }, - username: { - type: 'string', - nullable: false, optional: false, - }, - name: { - type: 'string', - nullable: true, optional: false, - }, - folowersCount: { - type: 'number', - nullable: false, optional: true, - }, - followingCount: { - type: 'number', - nullable: false, optional: false, - }, - notesCount: { - type: 'number', - nullable: false, optional: false, - }, - avatarId: { - type: 'string', - nullable: true, optional: false, - }, - bannerId: { - type: 'string', - nullable: true, optional: false, - }, - tags: { - type: 'array', - nullable: false, optional: false, - items: { - type: 'string', - nullable: false, optional: false, - }, - }, - avatarUrl: { - type: 'string', - nullable: true, optional: false, - format: 'url', - }, - bannerUrl: { - type: 'string', - nullable: true, optional: false, - format: 'url', - }, - avatarBlurhash: { - type: 'any', - nullable: true, optional: false, - default: null, - }, - bannerBlurhash: { - type: 'any', - nullable: true, optional: false, - default: null, - }, - isSuspended: { - type: 'boolean', - nullable: false, optional: false, - }, - isSilenced: { - type: 'boolean', - nullable: false, optional: false, - }, - isLocked: { - type: 'boolean', - nullable: false, optional: false, - }, - isBot: { - type: 'boolean', - nullable: false, optional: false, - }, - isCat: { - type: 'boolean', - nullable: false, optional: false, - }, - isAdmin: { - type: 'boolean', - nullable: false, optional: false, - }, - isModerator: { - type: 'boolean', - nullable: false, optional: false, - }, - emojis: { - type: 'array', - nullable: false, optional: false, - items: { - type: 'string', - nullable: false, optional: false, - }, - }, - host: { - type: 'string', - nullable: true, optional: false, - }, - inbox: { - type: 'string', - nullable: true, optional: false, - }, - sharedInbox: { - type: 'string', - nullable: true, optional: false, - }, - featured: { - type: 'string', - nullable: true, optional: false, - }, - uri: { - type: 'string', - nullable: true, optional: false, - }, - token: { - type: 'string', - nullable: true, optional: false, - default: '', - }, - }, }, } as const; diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts index 0bd29607d6..22c13743a8 100644 --- a/packages/backend/src/server/api/endpoints/announcements.ts +++ b/packages/backend/src/server/api/endpoints/announcements.ts @@ -89,5 +89,9 @@ export default define(meta, async (ps, user) => { } } - return ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements; + return (ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements).map((a) => ({ + ...a, + createdAt: a.createdAt.toISOString(), + updatedAt: a.updatedAt?.toISOString() ?? null, + })); }); diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts index 927ce7c741..2639095f8a 100644 --- a/packages/backend/src/server/api/endpoints/channels/timeline.ts +++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts @@ -80,7 +80,7 @@ export default define(meta, async (ps, user) => { const timeline = await query.take(ps.limit!).getMany(); - if (user) activeUsersChart.update(user); + if (user) activeUsersChart.read(user); return await Notes.packMany(timeline, user); }); diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts index f7eadc7089..a51cd00351 100644 --- a/packages/backend/src/server/api/endpoints/charts/active-users.ts +++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(activeUsersChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/network.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts similarity index 71% rename from packages/backend/src/server/api/endpoints/charts/network.ts rename to packages/backend/src/server/api/endpoints/charts/ap-request.ts index c5a39bbd76..38bbddb27a 100644 --- a/packages/backend/src/server/api/endpoints/charts/network.ts +++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import define from '../../define'; import { convertLog } from '@/services/chart/core'; -import { networkChart } from '@/services/chart/index'; +import { apRequestChart } from '@/services/chart/index'; export const meta = { tags: ['charts'], @@ -22,10 +22,10 @@ export const meta = { }, }, - res: convertLog(networkChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export export default define(meta, async (ps) => { - return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null); + return await apRequestChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null); }); diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts index 364279da95..4bbb9861f8 100644 --- a/packages/backend/src/server/api/endpoints/charts/drive.ts +++ b/packages/backend/src/server/api/endpoints/charts/drive.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(driveChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts index 6feb82b6d9..237678ffed 100644 --- a/packages/backend/src/server/api/endpoints/charts/federation.ts +++ b/packages/backend/src/server/api/endpoints/charts/federation.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(federationChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts index 99dc77998e..6c12cb063e 100644 --- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts +++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts @@ -26,7 +26,7 @@ export const meta = { }, }, - res: convertLog(hashtagChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts index 23e6fbf2b0..32a10d5a28 100644 --- a/packages/backend/src/server/api/endpoints/charts/instance.ts +++ b/packages/backend/src/server/api/endpoints/charts/instance.ts @@ -26,7 +26,7 @@ export const meta = { }, }, - res: convertLog(instanceChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts index dcbd80c3e9..09255f1d2d 100644 --- a/packages/backend/src/server/api/endpoints/charts/notes.ts +++ b/packages/backend/src/server/api/endpoints/charts/notes.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(notesChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts index 94787b4a57..89379858d1 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserDriveChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts index effe0c54b9..26c3f5c126 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/following.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserFollowingChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts index df68a5fe52..ecf85becfa 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserNotesChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts index dcd067305f..6e08d07511 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserReactionsChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts index d32e14ad61..15a9ec038e 100644 --- a/packages/backend/src/server/api/endpoints/charts/users.ts +++ b/packages/backend/src/server/api/endpoints/charts/users.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(usersChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts index 877e76677e..ac7863ec7e 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/create.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts @@ -86,7 +86,9 @@ export default define(meta, async (ps, user, _, file, cleanup) => { const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive }); return await DriveFiles.pack(driveFile, { self: true }); } catch (e) { - apiLogger.error(e); + if (e instanceof Error || typeof e === 'string') { + apiLogger.error(e); + } throw new ApiError(); } finally { cleanup!(); diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts index 96aede4550..b840ab7696 100644 --- a/packages/backend/src/server/api/endpoints/following/create.ts +++ b/packages/backend/src/server/api/endpoints/following/create.ts @@ -6,6 +6,7 @@ import define from '../../define'; import { ApiError } from '../../error'; import { getUser } from '../../common/getters'; import { Followings, Users } from '@/models/index'; +import { IdentifiableError } from '@/misc/identifiable-error'; export const meta = { tags: ['following', 'users'], @@ -92,8 +93,10 @@ export default define(meta, async (ps, user) => { try { await create(follower, followee); } catch (e) { - if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking); - if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked); + if (e instanceof IdentifiableError) { + if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking); + if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked); + } throw e; } diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts index 19ed02c152..c9abbf36de 100644 --- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts +++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts @@ -5,6 +5,7 @@ import define from '../../../define'; import { ApiError } from '../../../error'; import { getUser } from '../../../common/getters'; import { Users } from '@/models/index'; +import { IdentifiableError } from '@/misc/identifiable-error'; export const meta = { tags: ['following', 'account'], @@ -51,7 +52,9 @@ export default define(meta, async (ps, user) => { try { await cancelFollowRequest(followee, user); } catch (e) { - if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound); + if (e instanceof IdentifiableError) { + if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound); + } throw e; } diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 6b7e53aa1f..eb57aa2bfc 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -96,6 +96,10 @@ export const meta = { validator: $.optional.bool, }, + showTimelineReplies: { + validator: $.optional.bool, + }, + injectFeaturedNote: { validator: $.optional.bool, }, @@ -197,6 +201,7 @@ export default define(meta, async (ps, _user, token) => { if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus; if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions; if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot; + if (typeof ps.showTimelineReplies === 'boolean') updates.showTimelineReplies = ps.showTimelineReplies; if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot; if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed; if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle; diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts index cac8b7d8a9..cdd110994e 100644 --- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts @@ -96,7 +96,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts index 9683df4611..b438491026 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -153,7 +153,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts index 7776644124..ce0bcbeb7b 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -122,7 +122,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index 8be2861aec..f8cd083249 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -145,7 +145,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts index 89de73fb9d..3512fb3638 100644 --- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts @@ -142,7 +142,7 @@ export default define(meta, async (ps, user) => { const timeline = await query.take(ps.limit!).getMany(); - activeUsersChart.update(user); + activeUsersChart.read(user); return await Notes.packMany(timeline, user); }); diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts index 9879ef2adf..17281888a6 100644 --- a/packages/backend/src/server/api/endpoints/stats.ts +++ b/packages/backend/src/server/api/endpoints/stats.ts @@ -56,8 +56,6 @@ export default define(meta, async () => { reactionsCount, //originalReactionsCount, instances, - driveUsageLocal, - driveUsageRemote, ] = await Promise.all([ Notes.count({ cache: 3600000 }), // 1 hour Notes.count({ where: { userHost: null }, cache: 3600000 }), @@ -66,8 +64,6 @@ export default define(meta, async () => { NoteReactions.count({ cache: 3600000 }), // 1 hour //NoteReactions.count({ where: { userHost: null }, cache: 3600000 }), federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]), - driveChart.getChart('hour', 1, null).then(chart => chart.local.totalSize[0]), - driveChart.getChart('hour', 1, null).then(chart => chart.remote.totalSize[0]), ]); return { @@ -78,7 +74,7 @@ export default define(meta, async () => { reactionsCount, //originalReactionsCount, instances, - driveUsageLocal, - driveUsageRemote, + driveUsageLocal: 0, + driveUsageRemote: 0, }; }); diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index d67625e624..72e79c8824 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -114,4 +114,6 @@ export default define(meta, async (ps, me) => { return await Users.packMany(users, me, { detail: !!ps.detail }); } + + return []; }); diff --git a/packages/backend/src/server/api/service/discord.ts b/packages/backend/src/server/api/service/discord.ts index f574fe3878..dd731c422e 100644 --- a/packages/backend/src/server/api/service/discord.ts +++ b/packages/backend/src/server/api/service/discord.ts @@ -11,18 +11,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : ''; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/service/github.ts b/packages/backend/src/server/api/service/github.ts index 5e0839df93..b23219986a 100644 --- a/packages/backend/src/server/api/service/github.ts +++ b/packages/backend/src/server/api/service/github.ts @@ -11,18 +11,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : ''; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/service/twitter.ts b/packages/backend/src/server/api/service/twitter.ts index 8659b82cbe..bca00b7924 100644 --- a/packages/backend/src/server/api/service/twitter.ts +++ b/packages/backend/src/server/api/service/twitter.ts @@ -10,18 +10,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { - return url.endsWith('/') ? url.substr(0, url.length - 1) : url; +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { + return url == null ? '' : url.endsWith('/') ? url.substr(0, url.length - 1) : url; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts index f14f597aac..ecd87d093d 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -43,7 +43,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒã‘ã‚Œã°ã€ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģãŒčĄŒãŖãŸčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts index 3bd491421d..445db5c382 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -54,7 +54,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒã‘ã‚Œã°ã€ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģãŒčĄŒãŖãŸčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts index 0ae19aa7ce..c0be71fe2d 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -62,7 +62,7 @@ export default class extends Channel { if (isInstanceMuted(note, new Set(this.userProfile?.mutedInstances ?? []))) return; // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒã‘ã‚Œã°ã€ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģãŒčĄŒãŖãŸčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts index 3178b1d511..ae8f62ba61 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -43,7 +43,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒã‘ã‚Œã°ã€ã€ŒãƒãƒŖãƒŗãƒãƒĢæŽĨįļšä¸ģãŒčĄŒãŖãŸčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts index e70c26f5e5..e2f1c6fc9c 100644 --- a/packages/backend/src/server/api/stream/types.ts +++ b/packages/backend/src/server/api/stream/types.ts @@ -105,7 +105,10 @@ export interface NoteStreamTypes { }; reacted: { reaction: string; - emoji?: Emoji; + emoji?: { + name: string; + url: string; + } | null; userId: User['id']; }; unreacted: { diff --git a/packages/backend/src/server/api/streaming.ts b/packages/backend/src/server/api/streaming.ts index ad87311064..b706b1b8df 100644 --- a/packages/backend/src/server/api/streaming.ts +++ b/packages/backend/src/server/api/streaming.ts @@ -59,7 +59,7 @@ module.exports = (server: http.Server) => { }); connection.on('message', async (data) => { - if (data.utf8Data === 'ping') { + if (data.type === 'utf8' && data.utf8Data === 'ping') { connection.send('pong'); } }); diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 764306c7d8..4d6b402e64 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -10,7 +10,6 @@ import * as Koa from 'koa'; import * as Router from '@koa/router'; import * as mount from 'koa-mount'; import * as koaLogger from 'koa-logger'; -import * as requestStats from 'request-stats'; import * as slow from 'koa-slow'; import activityPub from './activitypub'; @@ -18,11 +17,9 @@ import nodeinfo from './nodeinfo'; import wellKnown from './well-known'; import config from '@/config/index'; import apiServer from './api/index'; -import { sum } from '@/prelude/array'; import Logger from '@/services/logger'; import { envOption } from '../env'; import { UserProfiles, Users } from '@/models/index'; -import { networkChart } from '@/services/chart/index'; import { genIdenticon } from '@/misc/gen-identicon'; import { createTemp } from '@/misc/create-temp'; import { publishMainStream } from '@/services/stream'; @@ -153,27 +150,4 @@ export default () => new Promise(resolve => { // Listen server.listen(config.port, resolve); - - //#region Network stats - let queue: any[] = []; - - requestStats(server, (stats: any) => { - if (stats.ok) { - queue.push(stats); - } - }); - - // Bulk write - setInterval(() => { - if (queue.length === 0) return; - - const requests = queue.length; - const time = sum(queue.map(x => x.time)); - const incomingBytes = sum(queue.map(x => x.req.byets)); - const outgoingBytes = sum(queue.map(x => x.res.byets)); - queue = []; - - networkChart.update(requests, time, incomingBytes, outgoingBytes); - }, 5000); - //#endregion }); diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 44f32bf882..4209fc7f14 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -2,7 +2,7 @@ import * as Router from '@koa/router'; import config from '@/config/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { Users, Notes } from '@/models/index'; -import { Not, IsNull, MoreThan } from 'typeorm'; +import { MoreThan } from 'typeorm'; const router = new Router(); @@ -25,14 +25,12 @@ const nodeinfo2 = async () => { activeHalfyear, activeMonth, localPosts, - localComments, ] = await Promise.all([ fetchMeta(true), Users.count({ where: { host: null } }), - Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 15552000000)) } }), - Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 2592000000)) } }), - Notes.count({ where: { userHost: null, replyId: null } }), - Notes.count({ where: { userHost: null, replyId: Not(IsNull()) } }), + Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 15552000000)) } }), + Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 2592000000)) } }), + Notes.count({ where: { userHost: null } }), ]); const proxyAccount = meta.proxyAccountId ? await Users.pack(meta.proxyAccountId).catch(() => null) : null; @@ -52,7 +50,7 @@ const nodeinfo2 = async () => { usage: { users: { total, activeHalfyear, activeMonth }, localPosts, - localComments, + localComments: 0, }, metadata: { nodeName: meta.name, diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts index c234b70c55..b7dcd0292b 100644 --- a/packages/backend/src/server/proxy/proxy-media.ts +++ b/packages/backend/src/server/proxy/proxy-media.ts @@ -11,6 +11,11 @@ import { FILE_TYPE_BROWSERSAFE } from '@/const'; export async function proxyMedia(ctx: Koa.Context) { const url = 'url' in ctx.query ? ctx.query.url : 'https://' + ctx.params.url; + if (typeof url !== 'string') { + ctx.status = 400; + return; + } + // Create temp file const [path, cleanup] = await createTemp(); diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts index e95a115aec..a0667f0c20 100644 --- a/packages/backend/src/server/web/index.ts +++ b/packages/backend/src/server/web/index.ts @@ -276,6 +276,7 @@ router.get('/@:user/pages/:page', async (ctx, next) => { page: _page, profile, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); if (['public'].includes(page.visibility)) { @@ -305,6 +306,7 @@ router.get('/clips/:clip', async (ctx, next) => { clip: _clip, profile, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); ctx.set('Cache-Control', 'public, max-age=180'); @@ -350,6 +352,7 @@ router.get('/channels/:channel', async (ctx, next) => { await ctx.render('channel', { channel: _channel, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); ctx.set('Cache-Control', 'public, max-age=180'); diff --git a/packages/backend/src/server/web/url-preview.ts b/packages/backend/src/server/web/url-preview.ts index 71465c8083..26fffbea88 100644 --- a/packages/backend/src/server/web/url-preview.ts +++ b/packages/backend/src/server/web/url-preview.ts @@ -9,22 +9,34 @@ import { getJson } from '@/misc/fetch'; const logger = new Logger('url-preview'); module.exports = async (ctx: Koa.Context) => { + const url = ctx.query.url; + if (typeof url !== 'string') { + ctx.status = 400; + return; + } + + const lang = ctx.query.lang; + if (Array.isArray(lang)) { + ctx.status = 400; + return; + } + const meta = await fetchMeta(); logger.info(meta.summalyProxy - ? `(Proxy) Getting preview of ${ctx.query.url}@${ctx.query.lang} ...` - : `Getting preview of ${ctx.query.url}@${ctx.query.lang} ...`); + ? `(Proxy) Getting preview of ${url}@${lang} ...` + : `Getting preview of ${url}@${lang} ...`); try { const summary = meta.summalyProxy ? await getJson(`${meta.summalyProxy}?${query({ - url: ctx.query.url, - lang: ctx.query.lang || 'ja-JP', - })}`) : await summaly(ctx.query.url, { + url: url, + lang: lang ?? 'ja-JP', + })}`) : await summaly(url, { followRedirects: false, - lang: ctx.query.lang || 'ja-JP', + lang: lang ?? 'ja-JP', }); - logger.succ(`Got preview of ${ctx.query.url}: ${summary.title}`); + logger.succ(`Got preview of ${url}: ${summary.title}`); summary.icon = wrap(summary.icon); summary.thumbnail = wrap(summary.thumbnail); @@ -33,8 +45,8 @@ module.exports = async (ctx: Koa.Context) => { ctx.set('Cache-Control', 'max-age=604800, immutable'); ctx.body = summary; - } catch (e) { - logger.warn(`Failed to get preview of ${ctx.query.url}: ${e}`); + } catch (err) { + logger.warn(`Failed to get preview of ${url}: ${err}`); ctx.status = 200; ctx.set('Cache-Control', 'max-age=86400, immutable'); ctx.body = '{}'; diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug index 42c068c403..b8b733dd60 100644 --- a/packages/backend/src/server/web/views/base.pug +++ b/packages/backend/src/server/web/views/base.pug @@ -21,6 +21,7 @@ html meta(name='referrer' content='origin') meta(name='theme-color' content='#86b300') meta(name='theme-color-orig' content='#86b300') + meta(property='twitter:card' content='summary') meta(property='og:site_name' content= instanceName || 'Misskey') meta(name='viewport' content='width=device-width, initial-scale=1') link(rel='icon' href= icon || '/favicon.ico') @@ -29,8 +30,8 @@ html link(rel='prefetch' href='https://xn--931a.moe/assets/info.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg') - link(rel='preload' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css' as='style') - link(rel='stylesheet' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css') + link(rel='preload' href='/assets/fontawesome/css/all.css' as='style') + link(rel='stylesheet' href='/assets/fontawesome/css/all.css') title block title @@ -42,7 +43,9 @@ html block meta block og - meta(property='og:image' content=img) + meta(property='og:title' content= title || 'Misskey') + meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨') + meta(property='og:image' content= img) style include ../style.css diff --git a/packages/backend/src/server/web/views/channel.pug b/packages/backend/src/server/web/views/channel.pug index 273632f0e0..486f0ecc47 100644 --- a/packages/backend/src/server/web/views/channel.pug +++ b/packages/backend/src/server/web/views/channel.pug @@ -16,6 +16,3 @@ block og meta(property='og:description' content= channel.description) meta(property='og:url' content= url) meta(property='og:image' content= channel.bannerUrl) - -block meta - meta(name='twitter:card' content='summary') diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug index 8de53f19d6..7a84d50f6c 100644 --- a/packages/backend/src/server/web/views/clip.pug +++ b/packages/backend/src/server/web/views/clip.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:clip-id' content=clip.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/gallery-post.pug b/packages/backend/src/server/web/views/gallery-post.pug index 95bbb2437c..ca0663a481 100644 --- a/packages/backend/src/server/web/views/gallery-post.pug +++ b/packages/backend/src/server/web/views/gallery-post.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug index fce91bdabe..34b03f9833 100644 --- a/packages/backend/src/server/web/views/note.pug +++ b/packages/backend/src/server/web/views/note.pug @@ -26,9 +26,7 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) meta(name='misskey:note-id' content=note.id) - - meta(name='twitter:card' content='summary') - + // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/page.pug b/packages/backend/src/server/web/views/page.pug index cb9e1039e1..b6c9548025 100644 --- a/packages/backend/src/server/web/views/page.pug +++ b/packages/backend/src/server/web/views/page.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:page-id' content=page.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/user.pug b/packages/backend/src/server/web/views/user.pug index 1a8a6b4413..2adec0f889 100644 --- a/packages/backend/src/server/web/views/user.pug +++ b/packages/backend/src/server/web/views/user.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - if profile.twitter meta(name='twitter:creator' content=`@${profile.twitter.screenName}`) diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts index 9490101e36..87dd95f4dc 100644 --- a/packages/backend/src/services/chart/charts/active-users.ts +++ b/packages/backend/src/services/chart/charts/active-users.ts @@ -1,51 +1,44 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/active-users'; -type ActiveUsersLog = SchemaType; +const week = 1000 * 60 * 60 * 24 * 7; +const month = 1000 * 60 * 60 * 24 * 30; +const year = 1000 * 60 * 60 * 24 * 365; /** * ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãƒĻãƒŧã‚ļãƒŧãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class ActiveUsersChart extends Chart { +export default class ActiveUsersChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: ActiveUsersLog): DeepPartial { + protected async queryCurrentState(): Promise>> { return {}; } @autobind - protected aggregate(logs: ActiveUsersLog[]): ActiveUsersLog { - return { - local: { - users: logs.reduce((a, b) => a.concat(b.local.users), [] as ActiveUsersLog['local']['users']), - }, - remote: { - users: logs.reduce((a, b) => a.concat(b.remote.users), [] as ActiveUsersLog['remote']['users']), - }, - }; + public async read(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise { + await this.commit({ + 'read': [user.id], + 'registeredWithinWeek': (Date.now() - user.createdAt.getTime() < week) ? [user.id] : [], + 'registeredWithinMonth': (Date.now() - user.createdAt.getTime() < month) ? [user.id] : [], + 'registeredWithinYear': (Date.now() - user.createdAt.getTime() < year) ? [user.id] : [], + 'registeredOutsideWeek': (Date.now() - user.createdAt.getTime() > week) ? [user.id] : [], + 'registeredOutsideMonth': (Date.now() - user.createdAt.getTime() > month) ? [user.id] : [], + 'registeredOutsideYear': (Date.now() - user.createdAt.getTime() > year) ? [user.id] : [], + }); } @autobind - protected async fetchActual(): Promise> { - return {}; - } - - @autobind - public async update(user: { id: User['id'], host: User['host'] }): Promise { - const update: Obj = { - users: [user.id], - }; - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + public async write(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise { + await this.commit({ + 'write': [user.id], }); } } diff --git a/packages/backend/src/services/chart/charts/ap-request.ts b/packages/backend/src/services/chart/charts/ap-request.ts new file mode 100644 index 0000000000..bac5e425c8 --- /dev/null +++ b/packages/backend/src/services/chart/charts/ap-request.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Chart, { KVs } from '../core'; +import { name, schema } from './entities/ap-request'; + +/** + * Chart about ActivityPub requests + */ +// eslint-disable-next-line import/no-default-export +export default class ApRequestChart extends Chart { + constructor() { + super(name, schema); + } + + @autobind + protected async queryCurrentState(): Promise>> { + return {}; + } + + @autobind + public async deliverSucc(): Promise { + await this.commit({ + 'deliverSucceeded': 1, + }); + } + + @autobind + public async deliverFail(): Promise { + await this.commit({ + 'deliverFailed': 1, + }); + } + + @autobind + public async inbox(): Promise { + await this.commit({ + 'inboxReceived': 1, + }); + } +} diff --git a/packages/backend/src/services/chart/charts/drive.ts b/packages/backend/src/services/chart/charts/drive.ts index 06cf7ebeeb..2f00adae2b 100644 --- a/packages/backend/src/services/chart/charts/drive.ts +++ b/packages/backend/src/services/chart/charts/drive.ts @@ -1,95 +1,37 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { DriveFile } from '@/models/entities/drive-file'; import { name, schema } from './entities/drive'; -type DriveLog = SchemaType; - /** * ドナイブãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class DriveChart extends Chart { +export default class DriveChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: DriveLog): DeepPartial { - return { - local: { - totalCount: latest.local.totalCount, - totalSize: latest.local.totalSize, - }, - remote: { - totalCount: latest.remote.totalCount, - totalSize: latest.remote.totalSize, - }, - }; - } - - @autobind - protected aggregate(logs: DriveLog[]): DriveLog { - return { - local: { - totalCount: logs[0].local.totalCount, - totalSize: logs[0].local.totalSize, - incCount: logs.reduce((a, b) => a + b.local.incCount, 0), - incSize: logs.reduce((a, b) => a + b.local.incSize, 0), - decCount: logs.reduce((a, b) => a + b.local.decCount, 0), - decSize: logs.reduce((a, b) => a + b.local.decSize, 0), - }, - remote: { - totalCount: logs[0].remote.totalCount, - totalSize: logs[0].remote.totalSize, - incCount: logs.reduce((a, b) => a + b.remote.incCount, 0), - incSize: logs.reduce((a, b) => a + b.remote.incSize, 0), - decCount: logs.reduce((a, b) => a + b.remote.decCount, 0), - decSize: logs.reduce((a, b) => a + b.remote.decSize, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { - const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([ - DriveFiles.count({ userHost: null }), - DriveFiles.count({ userHost: Not(IsNull()) }), - DriveFiles.calcDriveUsageOfLocal(), - DriveFiles.calcDriveUsageOfRemote(), - ]); - - return { - local: { - totalCount: localCount, - totalSize: localSize, - }, - remote: { - totalCount: remoteCount, - totalSize: remoteSize, - }, - }; + protected async queryCurrentState(): Promise>> { + return {}; } @autobind public async update(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalCount = isAdditional ? 1 : -1; - update.totalSize = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incCount = 1; - update.incSize = file.size; - } else { - update.decCount = 1; - update.decSize = file.size; - } - - await this.inc({ - [file.userHost === null ? 'local' : 'remote']: update, + const fileSizeKb = file.size / 1000; + await this.commit(file.userHost === null ? { + 'local.incCount': isAdditional ? 1 : 0, + 'local.incSize': isAdditional ? fileSizeKb : 0, + 'local.decCount': isAdditional ? 0 : 1, + 'local.decSize': isAdditional ? 0 : fileSizeKb, + } : { + 'remote.incCount': isAdditional ? 1 : 0, + 'remote.incSize': isAdditional ? fileSizeKb : 0, + 'remote.decCount': isAdditional ? 0 : 1, + 'remote.decSize': isAdditional ? 0 : fileSizeKb, }); } } diff --git a/packages/backend/src/services/chart/charts/entities/active-users.ts b/packages/backend/src/services/chart/charts/entities/active-users.ts index d6b49c86c3..843843836d 100644 --- a/packages/backend/src/services/chart/charts/entities/active-users.ts +++ b/packages/backend/src/services/chart/charts/entities/active-users.ts @@ -2,35 +2,16 @@ import Chart from '../../core'; export const name = 'activeUsers'; -const logSchema = { - /** - * ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãƒĻãƒŧã‚ļãƒŧ - */ - users: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'readWrite': { intersection: ['read', 'write'], range: 'small' }, + 'read': { uniqueIncrement: true, range: 'small' }, + 'write': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinWeek': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinMonth': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinYear': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideWeek': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideMonth': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideYear': { uniqueIncrement: true, range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/ap-request.ts b/packages/backend/src/services/chart/charts/entities/ap-request.ts new file mode 100644 index 0000000000..21fb40d138 --- /dev/null +++ b/packages/backend/src/services/chart/charts/entities/ap-request.ts @@ -0,0 +1,11 @@ +import Chart from '../../core'; + +export const name = 'apRequest'; + +export const schema = { + 'deliverFailed': { }, + 'deliverSucceeded': { }, + 'inboxReceived': { }, +} as const; + +export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/drive.ts b/packages/backend/src/services/chart/charts/entities/drive.ts index 3362cbd4cb..c5cdfd85bd 100644 --- a/packages/backend/src/services/chart/charts/entities/drive.ts +++ b/packages/backend/src/services/chart/charts/entities/drive.ts @@ -2,71 +2,15 @@ import Chart from '../../core'; export const name = 'drive'; -const logSchema = { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - totalCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢãŽåˆč¨ˆã‚ĩイã‚ē - */ - totalSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—åŠ ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - incCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したドナイブäŊŋį”¨é‡ - */ - incSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * æ¸›å°‘ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - decCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したドナイブäŊŋį”¨é‡ - */ - decSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.incCount': {}, + 'local.incSize': {}, // in kilobyte + 'local.decCount': {}, + 'local.decSize': {}, // in kilobyte + 'remote.incCount': {}, + 'remote.incSize': {}, // in kilobyte + 'remote.decCount': {}, + 'remote.decSize': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts index 836116bd06..0c8c20991d 100644 --- a/packages/backend/src/services/chart/charts/entities/federation.ts +++ b/packages/backend/src/services/chart/charts/entities/federation.ts @@ -3,28 +3,12 @@ import Chart from '../../core'; export const name = 'federation'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - instance: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'instance.total': { accumulate: true }, + 'instance.inc': { range: 'small' }, + 'instance.dec': { range: 'small' }, + 'deliveredInstances': { uniqueIncrement: true, range: 'small' }, + 'inboxInstances': { uniqueIncrement: true, range: 'small' }, + 'stalled': { uniqueIncrement: true, range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/hashtag.ts b/packages/backend/src/services/chart/charts/entities/hashtag.ts index 43e15456a5..bd2ae38a16 100644 --- a/packages/backend/src/services/chart/charts/entities/hashtag.ts +++ b/packages/backend/src/services/chart/charts/entities/hashtag.ts @@ -2,35 +2,9 @@ import Chart from '../../core'; export const name = 'hashtag'; -const logSchema = { - /** - * 投į¨ŋしたãƒĻãƒŧã‚ļãƒŧ - */ - users: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.users': { uniqueIncrement: true }, + 'remote.users': { uniqueIncrement: true }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/instance.ts b/packages/backend/src/services/chart/charts/entities/instance.ts index 9d1f651dbb..b98e1640c8 100644 --- a/packages/backend/src/services/chart/charts/entities/instance.ts +++ b/packages/backend/src/services/chart/charts/entities/instance.ts @@ -3,156 +3,30 @@ import Chart from '../../core'; export const name = 'instance'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - requests: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - failed: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - succeeded: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - received: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - notes: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, - }, - - users: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - following: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - followers: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - drive: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - totalFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - totalUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - decFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - decUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'requests.failed': { range: 'small' }, + 'requests.succeeded': { range: 'small' }, + 'requests.received': { range: 'small' }, + 'notes.total': { accumulate: true }, + 'notes.inc': {}, + 'notes.dec': {}, + 'notes.diffs.normal': {}, + 'notes.diffs.reply': {}, + 'notes.diffs.renote': {}, + 'notes.diffs.withFile': {}, + 'users.total': { accumulate: true }, + 'users.inc': { range: 'small' }, + 'users.dec': { range: 'small' }, + 'following.total': { accumulate: true }, + 'following.inc': { range: 'small' }, + 'following.dec': { range: 'small' }, + 'followers.total': { accumulate: true }, + 'followers.inc': { range: 'small' }, + 'followers.dec': { range: 'small' }, + 'drive.totalFiles': { accumulate: true }, + 'drive.incFiles': {}, + 'drive.decFiles': {}, + 'drive.incUsage': {}, // in kilobyte + 'drive.decUsage': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/network.ts b/packages/backend/src/services/chart/charts/entities/network.ts deleted file mode 100644 index 3d4fffb855..0000000000 --- a/packages/backend/src/services/chart/charts/entities/network.ts +++ /dev/null @@ -1,32 +0,0 @@ -import Chart from '../../core'; - -export const name = 'network'; - -export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - incomingRequests: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - outgoingRequests: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - totalTime: { // TIP: (totalTime / incomingRequests) ã§ã˛ã¨ã¤ãŽãƒĒクエ゚トãĢåšŗå‡ã§ãŠã‚Œãã‚‰ã„ãŽæ™‚é–“ãŒã‹ã‹ãŖãŸã‹įŸĨれる - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incomingBytes: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - outgoingBytes: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - -export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/notes.ts b/packages/backend/src/services/chart/charts/entities/notes.ts index 554d3abe12..f9b9b20eed 100644 --- a/packages/backend/src/services/chart/charts/entities/notes.ts +++ b/packages/backend/src/services/chart/charts/entities/notes.ts @@ -2,59 +2,21 @@ import Chart from '../../core'; export const name = 'notes'; -const logSchema = { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.total': { accumulate: true }, + 'local.inc': {}, + 'local.dec': {}, + 'local.diffs.normal': {}, + 'local.diffs.reply': {}, + 'local.diffs.renote': {}, + 'local.diffs.withFile': {}, + 'remote.total': { accumulate: true }, + 'remote.inc': {}, + 'remote.dec': {}, + 'remote.diffs.normal': {}, + 'remote.diffs.reply': {}, + 'remote.diffs.renote': {}, + 'remote.diffs.withFile': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts index ebf64e733e..00d85b1620 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts @@ -3,57 +3,12 @@ import Chart from '../../core'; export const name = 'perUserDrive'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - totalCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢãŽåˆč¨ˆã‚ĩイã‚ē - */ - totalSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—åŠ ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - incCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したドナイブäŊŋį”¨é‡ - */ - incSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * æ¸›å°‘ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - decCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したドナイブäŊŋį”¨é‡ - */ - decSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, -}; + 'totalCount': { accumulate: true }, + 'totalSize': { accumulate: true }, // in kilobyte + 'incCount': { range: 'small' }, + 'incSize': {}, // in kilobyte + 'decCount': { range: 'small' }, + 'decSize': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-following.ts b/packages/backend/src/services/chart/charts/entities/per-user-following.ts index 8016c5fe97..1efd4977fc 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-following.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-following.ts @@ -2,89 +2,19 @@ import Chart from '../../core'; export const name = 'perUserFollowing'; -const logSchema = { - /** - * フりロãƒŧしãĻいる - */ - followings: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * フりロãƒŧしãĻã„ã‚‹åˆč¨ˆ - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧした数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧč§Ŗé™¤ã—ãŸæ•° - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - /** - * フりロãƒŧされãĻいる - */ - followers: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * フりロãƒŧされãĻã„ã‚‹åˆč¨ˆ - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧされた数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧč§Ŗé™¤ã•ã‚ŒãŸæ•° - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.followings.total': { accumulate: true }, + 'local.followings.inc': { range: 'small' }, + 'local.followings.dec': { range: 'small' }, + 'local.followers.total': { accumulate: true }, + 'local.followers.inc': { range: 'small' }, + 'local.followers.dec': { range: 'small' }, + 'remote.followings.total': { accumulate: true }, + 'remote.followings.inc': { range: 'small' }, + 'remote.followings.dec': { range: 'small' }, + 'remote.followers.total': { accumulate: true }, + 'remote.followers.inc': { range: 'small' }, + 'remote.followers.dec': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts index d8f645b36e..562cde9b00 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts @@ -3,45 +3,13 @@ import Chart from '../../core'; export const name = 'perUserNotes'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'total': { accumulate: true }, + 'inc': { range: 'small' }, + 'dec': { range: 'small' }, + 'diffs.normal': { range: 'small' }, + 'diffs.reply': { range: 'small' }, + 'diffs.renote': { range: 'small' }, + 'diffs.withFile': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts index bcb7012661..ab315d24c9 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts @@ -2,31 +2,9 @@ import Chart from '../../core'; export const name = 'perUserReaction'; -const logSchema = { - /** - * čĸĢãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗæ•° - */ - count: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.count': { range: 'small' }, + 'remote.count': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/test-grouped.ts b/packages/backend/src/services/chart/charts/entities/test-grouped.ts index ca1c8c5700..78c2bbd548 100644 --- a/packages/backend/src/services/chart/charts/entities/test-grouped.ts +++ b/packages/backend/src/services/chart/charts/entities/test-grouped.ts @@ -3,30 +3,9 @@ import Chart from '../../core'; export const name = 'testGrouped'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'foo.total': { accumulate: true }, + 'foo.inc': {}, + 'foo.dec': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/test-intersection.ts b/packages/backend/src/services/chart/charts/entities/test-intersection.ts new file mode 100644 index 0000000000..dc56eb93f5 --- /dev/null +++ b/packages/backend/src/services/chart/charts/entities/test-intersection.ts @@ -0,0 +1,11 @@ +import Chart from '../../core'; + +export const name = 'testIntersection'; + +export const schema = { + 'a': { uniqueIncrement: true }, + 'b': { uniqueIncrement: true }, + 'aAndB': { intersection: ['a', 'b'] }, +} as const; + +export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/test-unique.ts b/packages/backend/src/services/chart/charts/entities/test-unique.ts index 2e917ee9ed..dc7c1520e1 100644 --- a/packages/backend/src/services/chart/charts/entities/test-unique.ts +++ b/packages/backend/src/services/chart/charts/entities/test-unique.ts @@ -3,18 +3,7 @@ import Chart from '../../core'; export const name = 'testUnique'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; + 'foo': { uniqueIncrement: true }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/test.ts b/packages/backend/src/services/chart/charts/entities/test.ts index fa536ff2cf..edfa4c524b 100644 --- a/packages/backend/src/services/chart/charts/entities/test.ts +++ b/packages/backend/src/services/chart/charts/entities/test.ts @@ -3,30 +3,9 @@ import Chart from '../../core'; export const name = 'test'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'foo.total': { accumulate: true }, + 'foo.inc': {}, + 'foo.dec': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/users.ts b/packages/backend/src/services/chart/charts/entities/users.ts index 08d51c9414..d2cec72497 100644 --- a/packages/backend/src/services/chart/charts/entities/users.ts +++ b/packages/backend/src/services/chart/charts/entities/users.ts @@ -2,47 +2,13 @@ import Chart from '../../core'; export const name = 'users'; -const logSchema = { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒĻãƒŧã‚ļãƒŧ数 - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したãƒĻãƒŧã‚ļãƒŧ数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したãƒĻãƒŧã‚ļãƒŧ数 - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.total': { accumulate: true }, + 'local.inc': { range: 'small' }, + 'local.dec': { range: 'small' }, + 'remote.total': { accumulate: true }, + 'remote.inc': { range: 'small' }, + 'remote.dec': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/federation.ts b/packages/backend/src/services/chart/charts/federation.ts index 8abb18b51f..19c75c98ad 100644 --- a/packages/backend/src/services/chart/charts/federation.ts +++ b/packages/backend/src/services/chart/charts/federation.ts @@ -1,66 +1,50 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Instances } from '@/models/index'; import { name, schema } from './entities/federation'; -type FederationLog = SchemaType; - /** * フェデãƒŦãƒŧã‚ˇãƒ§ãƒŗãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class FederationChart extends Chart { +export default class FederationChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: FederationLog): DeepPartial { - return { - instance: { - total: latest.instance.total, - }, - }; - } - - @autobind - protected aggregate(logs: FederationLog[]): FederationLog { - return { - instance: { - total: logs[0].instance.total, - inc: logs.reduce((a, b) => a + b.instance.inc, 0), - dec: logs.reduce((a, b) => a + b.instance.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [total] = await Promise.all([ Instances.count({}), ]); return { - instance: { - total: total, - }, + 'instance.total': total, }; } @autobind public async update(isAdditional: boolean): Promise { - const update: Obj = {}; + await this.commit({ + 'instance.total': isAdditional ? 1 : -1, + 'instance.inc': isAdditional ? 1 : 0, + 'instance.dec': isAdditional ? 0 : 1, + }); + } - update.total = isAdditional ? 1 : -1; - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } + @autobind + public async deliverd(host: string, succeeded: boolean): Promise { + await this.commit(succeeded ? { + 'deliveredInstances': [host], + } : { + 'stalled': [host], + }); + } - await this.inc({ - instance: update, + @autobind + public async inbox(host: string): Promise { + await this.commit({ + 'inboxInstances': [host], }); } } diff --git a/packages/backend/src/services/chart/charts/hashtag.ts b/packages/backend/src/services/chart/charts/hashtag.ts index 34e0614643..0b7bc467d2 100644 --- a/packages/backend/src/services/chart/charts/hashtag.ts +++ b/packages/backend/src/services/chart/charts/hashtag.ts @@ -1,51 +1,28 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/hashtag'; -type HashtagLog = SchemaType; - /** * ãƒãƒƒã‚ˇãƒĨã‚ŋグãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class HashtagChart extends Chart { +export default class HashtagChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: HashtagLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: HashtagLog[]): HashtagLog { - return { - local: { - users: logs.reduce((a, b) => a.concat(b.local.users), [] as HashtagLog['local']['users']), - }, - remote: { - users: logs.reduce((a, b) => a.concat(b.remote.users), [] as HashtagLog['remote']['users']), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { return {}; } @autobind public async update(hashtag: string, user: { id: User['id'], host: User['host'] }): Promise { - const update: Obj = { - users: [user.id], - }; - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + await this.commit({ + 'local.users': Users.isLocalUser(user) ? [user.id] : [], + 'remote.users': Users.isLocalUser(user) ? [] : [user.id], }, hashtag); } } diff --git a/packages/backend/src/services/chart/charts/instance.ts b/packages/backend/src/services/chart/charts/instance.ts index 7f3419b69c..5ea4d567e1 100644 --- a/packages/backend/src/services/chart/charts/instance.ts +++ b/packages/backend/src/services/chart/charts/instance.ts @@ -1,221 +1,110 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles, Followings, Users, Notes } from '@/models/index'; import { DriveFile } from '@/models/entities/drive-file'; import { Note } from '@/models/entities/note'; import { toPuny } from '@/misc/convert-host'; import { name, schema } from './entities/instance'; -type InstanceLog = SchemaType; - /** * ã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šã”ã¨ãŽãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class InstanceChart extends Chart { +export default class InstanceChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: InstanceLog): DeepPartial { - return { - notes: { - total: latest.notes.total, - }, - users: { - total: latest.users.total, - }, - following: { - total: latest.following.total, - }, - followers: { - total: latest.followers.total, - }, - drive: { - totalFiles: latest.drive.totalFiles, - totalUsage: latest.drive.totalUsage, - }, - }; - } - - @autobind - protected aggregate(logs: InstanceLog[]): InstanceLog { - return { - requests: { - failed: logs.reduce((a, b) => a + b.requests.failed, 0), - succeeded: logs.reduce((a, b) => a + b.requests.succeeded, 0), - received: logs.reduce((a, b) => a + b.requests.received, 0), - }, - notes: { - total: logs[0].notes.total, - inc: logs.reduce((a, b) => a + b.notes.inc, 0), - dec: logs.reduce((a, b) => a + b.notes.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.notes.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.notes.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.notes.diffs.normal, 0), - }, - }, - users: { - total: logs[0].users.total, - inc: logs.reduce((a, b) => a + b.users.inc, 0), - dec: logs.reduce((a, b) => a + b.users.dec, 0), - }, - following: { - total: logs[0].following.total, - inc: logs.reduce((a, b) => a + b.following.inc, 0), - dec: logs.reduce((a, b) => a + b.following.dec, 0), - }, - followers: { - total: logs[0].followers.total, - inc: logs.reduce((a, b) => a + b.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.followers.dec, 0), - }, - drive: { - totalFiles: logs[0].drive.totalFiles, - totalUsage: logs[0].drive.totalUsage, - incFiles: logs.reduce((a, b) => a + b.drive.incFiles, 0), - incUsage: logs.reduce((a, b) => a + b.drive.incUsage, 0), - decFiles: logs.reduce((a, b) => a + b.drive.decFiles, 0), - decUsage: logs.reduce((a, b) => a + b.drive.decUsage, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [ notesCount, usersCount, followingCount, followersCount, driveFiles, - driveUsage, + //driveUsage, ] = await Promise.all([ Notes.count({ userHost: group }), Users.count({ host: group }), Followings.count({ followerHost: group }), Followings.count({ followeeHost: group }), DriveFiles.count({ userHost: group }), - DriveFiles.calcDriveUsageOfHost(group), + //DriveFiles.calcDriveUsageOfHost(group), ]); return { - notes: { - total: notesCount, - }, - users: { - total: usersCount, - }, - following: { - total: followingCount, - }, - followers: { - total: followersCount, - }, - drive: { - totalFiles: driveFiles, - totalUsage: driveUsage, - }, + 'notes.total': notesCount, + 'users.total': usersCount, + 'following.total': followingCount, + 'followers.total': followersCount, + 'drive.totalFiles': driveFiles, }; } @autobind public async requestReceived(host: string): Promise { - await this.inc({ - requests: { - received: 1, - }, + await this.commit({ + 'requests.received': 1, }, toPuny(host)); } @autobind public async requestSent(host: string, isSucceeded: boolean): Promise { - const update: Obj = {}; - - if (isSucceeded) { - update.succeeded = 1; - } else { - update.failed = 1; - } - - await this.inc({ - requests: update, + await this.commit({ + 'requests.succeeded': isSucceeded ? 1 : 0, + 'requests.failed': isSucceeded ? 0 : 1, }, toPuny(host)); } @autobind public async newUser(host: string): Promise { - await this.inc({ - users: { - total: 1, - inc: 1, - }, + await this.commit({ + 'users.total': 1, + 'users.inc': 1, }, toPuny(host)); } @autobind public async updateNote(host: string, note: Note, isAdditional: boolean): Promise { - const diffs = {} as Record; - - if (note.replyId != null) { - diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - diffs.renote = isAdditional ? 1 : -1; - } else { - diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc({ - notes: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - diffs: diffs, - }, + await this.commit({ + 'notes.total': isAdditional ? 1 : -1, + 'notes.inc': isAdditional ? 1 : 0, + 'notes.dec': isAdditional ? 0 : 1, + 'notes.diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, }, toPuny(host)); } @autobind public async updateFollowing(host: string, isAdditional: boolean): Promise { - await this.inc({ - following: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - }, + await this.commit({ + 'following.total': isAdditional ? 1 : -1, + 'following.inc': isAdditional ? 1 : 0, + 'following.dec': isAdditional ? 0 : 1, }, toPuny(host)); } @autobind public async updateFollowers(host: string, isAdditional: boolean): Promise { - await this.inc({ - followers: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - }, + await this.commit({ + 'followers.total': isAdditional ? 1 : -1, + 'followers.inc': isAdditional ? 1 : 0, + 'followers.dec': isAdditional ? 0 : 1, }, toPuny(host)); } @autobind public async updateDrive(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalFiles = isAdditional ? 1 : -1; - update.totalUsage = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incFiles = 1; - update.incUsage = file.size; - } else { - update.decFiles = 1; - update.decUsage = file.size; - } - - await this.inc({ - drive: update, + const fileSizeKb = file.size / 1000; + await this.commit({ + 'drive.totalFiles': isAdditional ? 1 : -1, + 'drive.incFiles': isAdditional ? 1 : 0, + 'drive.incUsage': isAdditional ? fileSizeKb : 0, + 'drive.decFiles': isAdditional ? 1 : 0, + 'drive.decUsage': isAdditional ? fileSizeKb : 0, }, file.userHost); } } diff --git a/packages/backend/src/services/chart/charts/network.ts b/packages/backend/src/services/chart/charts/network.ts deleted file mode 100644 index 73ea2f7e19..0000000000 --- a/packages/backend/src/services/chart/charts/network.ts +++ /dev/null @@ -1,49 +0,0 @@ -import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; -import { name, schema } from './entities/network'; - -type NetworkLog = SchemaType; - -/** - * ネットワãƒŧクãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト - */ -// eslint-disable-next-line import/no-default-export -export default class NetworkChart extends Chart { - constructor() { - super(name, schema); - } - - @autobind - protected genNewLog(latest: NetworkLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: NetworkLog[]): NetworkLog { - return { - incomingRequests: logs.reduce((a, b) => a + b.incomingRequests, 0), - outgoingRequests: logs.reduce((a, b) => a + b.outgoingRequests, 0), - totalTime: logs.reduce((a, b) => a + b.totalTime, 0), - incomingBytes: logs.reduce((a, b) => a + b.incomingBytes, 0), - outgoingBytes: logs.reduce((a, b) => a + b.outgoingBytes, 0), - }; - } - - @autobind - protected async fetchActual(): Promise> { - return {}; - } - - @autobind - public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number): Promise { - const inc: DeepPartial = { - incomingRequests: incomingRequests, - totalTime: time, - incomingBytes: incomingBytes, - outgoingBytes: outgoingBytes, - }; - - await this.inc(inc); - } -} diff --git a/packages/backend/src/services/chart/charts/notes.ts b/packages/backend/src/services/chart/charts/notes.ts index 86cda17225..5c56a9a718 100644 --- a/packages/backend/src/services/chart/charts/notes.ts +++ b/packages/backend/src/services/chart/charts/notes.ts @@ -1,101 +1,44 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Notes } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { Note } from '@/models/entities/note'; import { name, schema } from './entities/notes'; -type NotesLog = SchemaType; - /** * ノãƒŧトãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class NotesChart extends Chart { +export default class NotesChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: NotesLog): DeepPartial { - return { - local: { - total: latest.local.total, - }, - remote: { - total: latest.remote.total, - }, - }; - } - - @autobind - protected aggregate(logs: NotesLog[]): NotesLog { - return { - local: { - total: logs[0].local.total, - inc: logs.reduce((a, b) => a + b.local.inc, 0), - dec: logs.reduce((a, b) => a + b.local.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.local.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.local.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.local.diffs.normal, 0), - }, - }, - remote: { - total: logs[0].remote.total, - inc: logs.reduce((a, b) => a + b.remote.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.remote.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.remote.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.remote.diffs.normal, 0), - }, - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [localCount, remoteCount] = await Promise.all([ Notes.count({ userHost: null }), Notes.count({ userHost: Not(IsNull()) }), ]); return { - local: { - total: localCount, - }, - remote: { - total: remoteCount, - }, + 'local.total': localCount, + 'remote.total': remoteCount, }; } @autobind public async update(note: Note, isAdditional: boolean): Promise { - const update: Obj = { - diffs: {}, - }; + const prefix = note.userHost === null ? 'local' : 'remote'; - update.total = isAdditional ? 1 : -1; - - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - if (note.replyId != null) { - update.diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - update.diffs.renote = isAdditional ? 1 : -1; - } else { - update.diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc({ - [note.userHost === null ? 'local' : 'remote']: update, + await this.commit({ + [`${prefix}.total`]: isAdditional ? 1 : -1, + [`${prefix}.inc`]: isAdditional ? 1 : 0, + [`${prefix}.dec`]: isAdditional ? 0 : 1, + [`${prefix}.diffs.normal`]: note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.renote`]: note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.reply`]: note.replyId != null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.withFile`]: note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, }); } } diff --git a/packages/backend/src/services/chart/charts/per-user-drive.ts b/packages/backend/src/services/chart/charts/per-user-drive.ts index fff790367f..969ed018f9 100644 --- a/packages/backend/src/services/chart/charts/per-user-drive.ts +++ b/packages/backend/src/services/chart/charts/per-user-drive.ts @@ -1,68 +1,41 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles } from '@/models/index'; import { DriveFile } from '@/models/entities/drive-file'; import { name, schema } from './entities/per-user-drive'; -type PerUserDriveLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎドナイブãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserDriveChart extends Chart { +export default class PerUserDriveChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserDriveLog): DeepPartial { - return { - totalCount: latest.totalCount, - totalSize: latest.totalSize, - }; - } - - @autobind - protected aggregate(logs: PerUserDriveLog[]): PerUserDriveLog { - return { - totalCount: logs[0].totalCount, - totalSize: logs[0].totalSize, - incCount: logs.reduce((a, b) => a + b.incCount, 0), - incSize: logs.reduce((a, b) => a + b.incSize, 0), - decCount: logs.reduce((a, b) => a + b.decCount, 0), - decSize: logs.reduce((a, b) => a + b.decSize, 0), - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [count, size] = await Promise.all([ DriveFiles.count({ userId: group }), DriveFiles.calcDriveUsageOf(group), ]); return { - totalCount: count, - totalSize: size, + 'totalCount': count, + 'totalSize': size, }; } @autobind public async update(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalCount = isAdditional ? 1 : -1; - update.totalSize = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incCount = 1; - update.incSize = file.size; - } else { - update.decCount = 1; - update.decSize = file.size; - } - - await this.inc(update, file.userId); + const fileSizeKb = file.size / 1000; + await this.commit({ + 'totalCount': isAdditional ? 1 : -1, + 'totalSize': isAdditional ? fileSizeKb : -fileSizeKb, + 'incCount': isAdditional ? 1 : 0, + 'incSize': isAdditional ? fileSizeKb : 0, + 'decCount': isAdditional ? 0 : 1, + 'decSize': isAdditional ? 0 : fileSizeKb, + }, file.userId); } } diff --git a/packages/backend/src/services/chart/charts/per-user-following.ts b/packages/backend/src/services/chart/charts/per-user-following.ts index d0a80abdaf..cdd0aad947 100644 --- a/packages/backend/src/services/chart/charts/per-user-following.ts +++ b/packages/backend/src/services/chart/charts/per-user-following.ts @@ -1,76 +1,21 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Followings, Users } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { User } from '@/models/entities/user'; import { name, schema } from './entities/per-user-following'; -type PerUserFollowingLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎフりロãƒŧãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserFollowingChart extends Chart { +export default class PerUserFollowingChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserFollowingLog): DeepPartial { - return { - local: { - followings: { - total: latest.local.followings.total, - }, - followers: { - total: latest.local.followers.total, - }, - }, - remote: { - followings: { - total: latest.remote.followings.total, - }, - followers: { - total: latest.remote.followers.total, - }, - }, - }; - } - - @autobind - protected aggregate(logs: PerUserFollowingLog[]): PerUserFollowingLog { - return { - local: { - followings: { - total: logs[0].local.followings.total, - inc: logs.reduce((a, b) => a + b.local.followings.inc, 0), - dec: logs.reduce((a, b) => a + b.local.followings.dec, 0), - }, - followers: { - total: logs[0].local.followers.total, - inc: logs.reduce((a, b) => a + b.local.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.local.followers.dec, 0), - }, - }, - remote: { - followings: { - total: logs[0].remote.followings.total, - inc: logs.reduce((a, b) => a + b.remote.followings.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.followings.dec, 0), - }, - followers: { - total: logs[0].remote.followers.total, - inc: logs.reduce((a, b) => a + b.remote.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.followers.dec, 0), - }, - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [ localFollowingsCount, localFollowersCount, @@ -84,42 +29,27 @@ export default class PerUserFollowingChart extends Chart { ]); return { - local: { - followings: { - total: localFollowingsCount, - }, - followers: { - total: localFollowersCount, - }, - }, - remote: { - followings: { - total: remoteFollowingsCount, - }, - followers: { - total: remoteFollowersCount, - }, - }, + 'local.followings.total': localFollowingsCount, + 'local.followers.total': localFollowersCount, + 'remote.followings.total': remoteFollowingsCount, + 'remote.followers.total': remoteFollowersCount, }; } @autobind public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise { - const update: Obj = {}; + const prefixFollower = Users.isLocalUser(follower) ? 'local' : 'remote'; + const prefixFollowee = Users.isLocalUser(followee) ? 'local' : 'remote'; - update.total = isFollow ? 1 : -1; - - if (isFollow) { - update.inc = 1; - } else { - update.dec = 1; - } - - this.inc({ - [Users.isLocalUser(follower) ? 'local' : 'remote']: { followings: update }, + this.commit({ + [`${prefixFollower}.followings.total`]: isFollow ? 1 : -1, + [`${prefixFollower}.followings.inc`]: isFollow ? 1 : 0, + [`${prefixFollower}.followings.dec`]: isFollow ? 0 : 1, }, follower.id); - this.inc({ - [Users.isLocalUser(followee) ? 'local' : 'remote']: { followers: update }, + this.commit({ + [`${prefixFollowee}.followers.total`]: isFollow ? 1 : -1, + [`${prefixFollowee}.followers.inc`]: isFollow ? 1 : 0, + [`${prefixFollowee}.followers.dec`]: isFollow ? 0 : 1, }, followee.id); } } diff --git a/packages/backend/src/services/chart/charts/per-user-notes.ts b/packages/backend/src/services/chart/charts/per-user-notes.ts index d048c88885..6a4f0363b2 100644 --- a/packages/backend/src/services/chart/charts/per-user-notes.ts +++ b/packages/backend/src/services/chart/charts/per-user-notes.ts @@ -1,45 +1,21 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Notes } from '@/models/index'; import { Note } from '@/models/entities/note'; import { name, schema } from './entities/per-user-notes'; -type PerUserNotesLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎノãƒŧトãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserNotesChart extends Chart { +export default class PerUserNotesChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserNotesLog): DeepPartial { - return { - total: latest.total, - }; - } - - @autobind - protected aggregate(logs: PerUserNotesLog[]): PerUserNotesLog { - return { - total: logs[0].total, - inc: logs.reduce((a, b) => a + b.inc, 0), - dec: logs.reduce((a, b) => a + b.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.diffs.normal, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [count] = await Promise.all([ Notes.count({ userId: group }), ]); @@ -51,26 +27,14 @@ export default class PerUserNotesChart extends Chart { @autobind public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise { - const update: Obj = { - diffs: {}, - }; - - update.total = isAdditional ? 1 : -1; - - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - if (note.replyId != null) { - update.diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - update.diffs.renote = isAdditional ? 1 : -1; - } else { - update.diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc(update, user.id); + await this.commit({ + 'total': isAdditional ? 1 : -1, + 'inc': isAdditional ? 1 : 0, + 'dec': isAdditional ? 0 : 1, + 'diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + 'diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + 'diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0, + 'diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, + }, user.id); } } diff --git a/packages/backend/src/services/chart/charts/per-user-reactions.ts b/packages/backend/src/services/chart/charts/per-user-reactions.ts index 2f5353340d..2ec347f40a 100644 --- a/packages/backend/src/services/chart/charts/per-user-reactions.ts +++ b/packages/backend/src/services/chart/charts/per-user-reactions.ts @@ -1,48 +1,29 @@ import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; import { Note } from '@/models/entities/note'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/per-user-reactions'; -type PerUserReactionsLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserReactionsChart extends Chart { +export default class PerUserReactionsChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserReactionsLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: PerUserReactionsLog[]): PerUserReactionsLog { - return { - local: { - count: logs.reduce((a, b) => a + b.local.count, 0), - }, - remote: { - count: logs.reduce((a, b) => a + b.remote.count, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { return {}; } @autobind public async update(user: { id: User['id'], host: User['host'] }, note: Note): Promise { - this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: { count: 1 }, + const prefix = Users.isLocalUser(user) ? 'local' : 'remote'; + this.commit({ + [`${prefix}.count`]: 1, }, note.userId); } } diff --git a/packages/backend/src/services/chart/charts/test-grouped.ts b/packages/backend/src/services/chart/charts/test-grouped.ts index c851d2df01..5f0b1aafdc 100644 --- a/packages/backend/src/services/chart/charts/test-grouped.ts +++ b/packages/backend/src/services/chart/charts/test-grouped.ts @@ -1,15 +1,12 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test-grouped'; -type TestGroupedLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestGroupedChart extends Chart { +export default class TestGroupedChart extends Chart { private total = {} as Record; constructor() { @@ -17,31 +14,9 @@ export default class TestGroupedChart extends Chart { } @autobind - protected genNewLog(latest: TestGroupedLog): DeepPartial { + protected async queryCurrentState(group: string): Promise>> { return { - foo: { - total: latest.foo.total, - }, - }; - } - - @autobind - protected aggregate(logs: TestGroupedLog[]): TestGroupedLog { - return { - foo: { - total: logs[0].foo.total, - inc: logs.reduce((a, b) => a + b.foo.inc, 0), - dec: logs.reduce((a, b) => a + b.foo.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { - return { - foo: { - total: this.total[group], - }, + 'foo.total': this.total[group], }; } @@ -49,14 +24,11 @@ export default class TestGroupedChart extends Chart { public async increment(group: string): Promise { if (this.total[group] == null) this.total[group] = 0; - const update: Obj = {}; - - update.total = 1; - update.inc = 1; this.total[group]++; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': 1, + 'foo.inc': 1, }, group); } } diff --git a/packages/backend/src/services/chart/charts/test-intersection.ts b/packages/backend/src/services/chart/charts/test-intersection.ts new file mode 100644 index 0000000000..c6ba71a956 --- /dev/null +++ b/packages/backend/src/services/chart/charts/test-intersection.ts @@ -0,0 +1,32 @@ +import autobind from 'autobind-decorator'; +import Chart, { KVs } from '../core'; +import { name, schema } from './entities/test-intersection'; + +/** + * For testing + */ +// eslint-disable-next-line import/no-default-export +export default class TestIntersectionChart extends Chart { + constructor() { + super(name, schema); + } + + @autobind + protected async queryCurrentState(): Promise>> { + return {}; + } + + @autobind + public async addA(key: string): Promise { + await this.commit({ + a: [key], + }); + } + + @autobind + public async addB(key: string): Promise { + await this.commit({ + b: [key], + }); + } +} diff --git a/packages/backend/src/services/chart/charts/test-unique.ts b/packages/backend/src/services/chart/charts/test-unique.ts index 3564f675ad..e67036acef 100644 --- a/packages/backend/src/services/chart/charts/test-unique.ts +++ b/packages/backend/src/services/chart/charts/test-unique.ts @@ -1,39 +1,24 @@ import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test-unique'; -type TestUniqueLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestUniqueChart extends Chart { +export default class TestUniqueChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: TestUniqueLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: TestUniqueLog[]): TestUniqueLog { - return { - foo: logs.reduce((a, b) => a.concat(b.foo), [] as TestUniqueLog['foo']), - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { return {}; } @autobind public async uniqueIncrement(key: string): Promise { - await this.inc({ + await this.commit({ foo: [key], }); } diff --git a/packages/backend/src/services/chart/charts/test.ts b/packages/backend/src/services/chart/charts/test.ts index 06add7ede9..878acd51be 100644 --- a/packages/backend/src/services/chart/charts/test.ts +++ b/packages/backend/src/services/chart/charts/test.ts @@ -1,15 +1,12 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test'; -type TestLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestChart extends Chart { +export default class TestChart extends Chart { public total = 0; // publicãĢするぎはテ゚トぎため constructor() { @@ -17,57 +14,29 @@ export default class TestChart extends Chart { } @autobind - protected genNewLog(latest: TestLog): DeepPartial { + protected async queryCurrentState(): Promise>> { return { - foo: { - total: latest.foo.total, - }, - }; - } - - @autobind - protected aggregate(logs: TestLog[]): TestLog { - return { - foo: { - total: logs[0].foo.total, - inc: logs.reduce((a, b) => a + b.foo.inc, 0), - dec: logs.reduce((a, b) => a + b.foo.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { - return { - foo: { - total: this.total, - }, + 'foo.total': this.total, }; } @autobind public async increment(): Promise { - const update: Obj = {}; - - update.total = 1; - update.inc = 1; this.total++; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': 1, + 'foo.inc': 1, }); } @autobind public async decrement(): Promise { - const update: Obj = {}; - - update.total = -1; - update.dec = 1; this.total--; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': -1, + 'foo.dec': 1, }); } } diff --git a/packages/backend/src/services/chart/charts/users.ts b/packages/backend/src/services/chart/charts/users.ts index c36c6cd979..50fca3a8d6 100644 --- a/packages/backend/src/services/chart/charts/users.ts +++ b/packages/backend/src/services/chart/charts/users.ts @@ -1,80 +1,40 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Users } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { User } from '@/models/entities/user'; import { name, schema } from './entities/users'; -type UsersLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧ数ãĢé–ĸã™ã‚‹ãƒãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class UsersChart extends Chart { +export default class UsersChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: UsersLog): DeepPartial { - return { - local: { - total: latest.local.total, - }, - remote: { - total: latest.remote.total, - }, - }; - } - - @autobind - protected aggregate(logs: UsersLog[]): UsersLog { - return { - local: { - total: logs[0].local.total, - inc: logs.reduce((a, b) => a + b.local.inc, 0), - dec: logs.reduce((a, b) => a + b.local.dec, 0), - }, - remote: { - total: logs[0].remote.total, - inc: logs.reduce((a, b) => a + b.remote.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [localCount, remoteCount] = await Promise.all([ Users.count({ host: null }), Users.count({ host: Not(IsNull()) }), ]); return { - local: { - total: localCount, - }, - remote: { - total: remoteCount, - }, + 'local.total': localCount, + 'remote.total': remoteCount, }; } @autobind public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean): Promise { - const update: Obj = {}; + const prefix = Users.isLocalUser(user) ? 'local' : 'remote'; - update.total = isAdditional ? 1 : -1; - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + await this.commit({ + [`${prefix}.total`]: isAdditional ? 1 : -1, + [`${prefix}.inc`]: isAdditional ? 1 : 0, + [`${prefix}.dec`]: isAdditional ? 0 : 1, }); } } diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts index e406449f4f..5888e1a144 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -7,24 +7,19 @@ import * as nestedProperty from 'nested-property'; import autobind from 'autobind-decorator'; import Logger from '../logger'; -import { Schema } from '@/misc/schema'; import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm'; import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/prelude/time'; import { getChartInsertLock } from '@/misc/app-lock'; const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test'); -export type Obj = { [key: string]: any }; +const columnPrefix = '___' as const; +const uniqueTempColumnPrefix = 'unique_temp___' as const; +const columnDot = '_' as const; -export type DeepPartial = { - [P in keyof T]?: DeepPartial; -}; +type KeyToColumnName = T extends `${infer R1}.${infer R2}` ? `${R1}${typeof columnDot}${KeyToColumnName}` : T; -type ArrayValue = { - [P in keyof T]: T[P] extends number ? T[P][] : ArrayValue; -}; - -type Log = { +type RawRecord = { id: number; /** @@ -36,6 +31,10 @@ type Log = { * 集計æ—Ĩ時ぎUnixã‚ŋイム゚ã‚ŋãƒŗãƒ—(į§’) */ date: number; +} & { + [K in keyof S as `${typeof uniqueTempColumnPrefix}${KeyToColumnName}`]: S[K]['uniqueIncrement'] extends true ? string[] : never; +} & { + [K in keyof S as `${typeof columnPrefix}${KeyToColumnName}`]: number; }; const camelToSnake = (str: string): string => { @@ -44,123 +43,74 @@ const camelToSnake = (str: string): string => { const removeDuplicates = (array: any[]) => Array.from(new Set(array)); +type Schema = Record; + + range?: 'big' | 'small' | 'medium'; + + // previousãĒ値をåŧ•きįļ™ãã‹ãŠã†ã‹ + accumulate?: boolean; +}>; + +type Commit = { + [K in keyof S]?: S[K]['uniqueIncrement'] extends true ? string[] : number; +}; + +export type KVs = { + [K in keyof S]: number; +}; + +type ChartResult = { + [P in keyof T]: number[]; +}; + /** * 様々ãĒãƒãƒŖãƒŧãƒˆãŽįŽĄį†ã‚’å¸ã‚‹ã‚¯ãƒŠã‚š */ // eslint-disable-next-line import/no-default-export -export default abstract class Chart> { - private static readonly columnPrefix = '___'; - private static readonly columnDot = '_'; +export default abstract class Chart { + public schema: T; private name: string; private buffer: { - diff: DeepPartial; + diff: Commit; group: string | null; }[] = []; - public schema: Schema; - protected repositoryForHour: Repository; - protected repositoryForDay: Repository; + protected repositoryForHour: Repository>; + protected repositoryForDay: Repository>; - protected abstract genNewLog(latest: T): DeepPartial; - - /** - * @param logs æ—Ĩ時が新しい斚が先頭 - */ - protected abstract aggregate(logs: T[]): T; - - protected abstract fetchActual(group: string | null): Promise>; + protected abstract queryCurrentState(group: string | null): Promise>>; @autobind - private static convertSchemaToFlatColumnDefinitions(schema: Schema) { - const columns = {} as Record; - const flatColumns = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}${this.columnDot}${k}` : k; - if (v.type === 'object') { - flatColumns(v.properties, p); - } else if (v.type === 'number') { - columns[this.columnPrefix + p] = { - type: 'bigint', - }; - } else if (v.type === 'array' && v.items.type === 'string') { - columns[this.columnPrefix + p] = { - type: 'varchar', - array: true, - }; - } + private static convertSchemaToColumnDefinitions(schema: Schema): Record { + const columns = {} as Record; + for (const [k, v] of Object.entries(schema)) { + const name = k.replaceAll('.', columnDot); + const type = v.range === 'big' ? 'bigint' : v.range === 'small' ? 'smallint' : 'integer'; + if (v.uniqueIncrement) { + columns[uniqueTempColumnPrefix + name] = { + type: 'varchar', + array: true, + default: '{}', + }; + columns[columnPrefix + name] = { + type, + default: 0, + }; + } else { + columns[columnPrefix + name] = { + type, + default: 0, + }; } - }; - flatColumns(schema.properties!); + } return columns; } @autobind - private static convertFlattenColumnsToObject(x: Record): Record { - const obj = {} as Record; - for (const k of Object.keys(x).filter(k => k.startsWith(Chart.columnPrefix))) { - // now k is ___x_y_z - const path = k.substr(Chart.columnPrefix.length).split(Chart.columnDot).join('.'); - nestedProperty.set(obj, path, x[k]); - } - return obj; - } - - @autobind - private static convertObjectToFlattenColumns(x: Record) { - const columns = {} as Record; - const flatten = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}${this.columnDot}${k}` : k; - if (typeof v === 'object' && !Array.isArray(v)) { - flatten(v, p); - } else { - columns[this.columnPrefix + p] = v; - } - } - }; - flatten(x); - return columns; - } - - @autobind - private static countUniqueFields(x: Record) { - const exec = (x: Obj) => { - const res = {} as Record; - for (const [k, v] of Object.entries(x)) { - if (typeof v === 'object' && !Array.isArray(v)) { - res[k] = exec(v); - } else if (Array.isArray(v)) { - res[k] = Array.from(new Set(v)).length; - } else { - res[k] = v; - } - } - return res; - }; - return exec(x); - } - - @autobind - private static convertQuery(diff: Record) { - const query: Record string> = {}; - - for (const [k, v] of Object.entries(diff)) { - if (typeof v === 'number') { - if (v > 0) query[k] = () => `"${k}" + ${v}`; - if (v < 0) query[k] = () => `"${k}" - ${Math.abs(v)}`; - } else if (Array.isArray(v)) { - // TODO: item が文字列äģĨ外ぎ場合も寞åŋœ - // TODO: item をSQLã‚¨ã‚šã‚ąãƒŧプ - const items = v.map(item => `"${item}"`).join(','); - query[k] = () => `array_cat("${k}", '{${items}}'::varchar[])`; - } - } - - return query; - } - - @autobind - private static dateToTimestamp(x: Date): Log['date'] { + private static dateToTimestamp(x: Date): number { return Math.floor(x.getTime() / 1000); } @@ -207,7 +157,7 @@ export default abstract class Chart> { length: 128, }, } : {}), - ...Chart.convertSchemaToFlatColumnDefinitions(schema), + ...Chart.convertSchemaToColumnDefinitions(schema), }, indices: [{ columns: grouped ? ['date', 'group'] : ['date'], @@ -233,37 +183,39 @@ export default abstract class Chart> { }; } - constructor(name: string, schema: Schema, grouped = false) { + constructor(name: string, schema: T, grouped = false) { this.name = name; this.schema = schema; const { hour, day } = Chart.schemaToEntity(name, schema, grouped); - this.repositoryForHour = getRepository(hour); - this.repositoryForDay = getRepository(day); + this.repositoryForHour = getRepository>(hour); + this.repositoryForDay = getRepository>(day); } @autobind - private getNewLog(latest: T | null): T { - const log = latest ? this.genNewLog(latest) : {}; - const flatColumns = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}.${k}` : k; - if (v.type === 'object') { - flatColumns(v.properties, p); - } else { - if (nestedProperty.get(log, p) == null) { - const emptyValue = v.type === 'number' ? 0 : []; - nestedProperty.set(log, p, emptyValue); - } - } + private convertRawRecord(x: RawRecord): KVs { + const kvs = {} as KVs; + for (const k of Object.keys(x).filter(k => k.startsWith(columnPrefix))) { + kvs[k.substr(columnPrefix.length).split(columnDot).join('.')] = x[k]; + } + return kvs; + } + + @autobind + private getNewLog(latest: KVs | null): KVs { + const log = {} as Record; + for (const [k, v] of Object.entries(this.schema)) { + if (v.accumulate && latest) { + log[k] = latest[k]; + } else { + log[k] = 0; } - }; - flatColumns(this.schema.properties!); - return log as T; + } + return log as KVs; } @autobind - private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise { + private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise | null> { const repository = span === 'hour' ? this.repositoryForHour : span === 'day' ? this.repositoryForDay : @@ -282,7 +234,7 @@ export default abstract class Chart> { * įžåœ¨(=äģŠãŽHour or Day)ぎログをデãƒŧã‚ŋベãƒŧ゚からæŽĸしãĻ、あればそれをčŋ”し、ãĒければäŊœæˆã—ãĻčŋ”しぞす。 */ @autobind - private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise { + private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise> { const [y, m, d, h] = Chart.getCurrentDate(); const current = dateUTC( @@ -306,8 +258,8 @@ export default abstract class Chart> { return currentLog; } - let log: Log; - let data: T; + let log: RawRecord; + let data: KVs; // é›†č¨ˆæœŸé–“ãŒå¤‰ã‚ãŖãĻから、初めãĻãŽãƒãƒŖãƒŧト更新ãĒら // 最も最čŋ‘ãŽãƒ­ã‚°ã‚’æŒãŖãĻくる @@ -318,10 +270,8 @@ export default abstract class Chart> { const latest = await this.getLatestLog(group, span); if (latest != null) { - const obj = Chart.convertFlattenColumnsToObject(latest) as T; - // įŠēログデãƒŧã‚ŋをäŊœæˆ - data = this.getNewLog(obj); + data = this.getNewLog(this.convertRawRecord(latest)); } else { // ログが存在しãĒã‹ãŖãŸã‚‰ // (Misskeyã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šã‚’åģēãĻãĻ初めãĻãŽãƒãƒŖãƒŧト更新時ãĒお) @@ -346,11 +296,17 @@ export default abstract class Chart> { // ログがあればそれをčŋ”しãĻįĩ‚äē† if (currentLog != null) return currentLog; + const columns = {} as Record; + for (const [k, v] of Object.entries(data)) { + const name = k.replaceAll('.', columnDot); + columns[columnPrefix + name] = v; + } + // 新čĻãƒ­ã‚°æŒŋå…Ĩ log = await repository.insert({ date: date, ...(group ? { group: group } : {}), - ...Chart.convertObjectToFlattenColumns(data), + ...columns, }).then(x => repository.findOneOrFail(x.identifiers[0])); logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`); @@ -362,7 +318,10 @@ export default abstract class Chart> { } @autobind - protected commit(diff: DeepPartial, group: string | null = null): void { + protected commit(diff: Commit, group: string | null = null): void { + for (const [k, v] of Object.entries(diff)) { + if (v == null || v === 0 || (Array.isArray(v) && v.length === 0)) delete diff[k]; + } this.buffer.push({ diff, group, }); @@ -381,13 +340,11 @@ export default abstract class Chart> { // そぎログはæœŦæĨは 01:00~ ぎログとしãĻDBãĢäŋå­˜ã•れãĻæŦ˛ã—いぎãĢ、02:00~ ãŽãƒ­ã‚°æ‰ąã„ãĢãĒãŖãĻしぞう。 // これを回éŋã™ã‚‹ãŸã‚ãŽåŽŸčŖ…ã¯č¤‡é›‘ãĢãĒりそうãĒため、一æ—Ļäŋį•™ã€‚ - const update = async (logHour: Log, logDay: Log): Promise => { + const update = async (logHour: RawRecord, logDay: RawRecord): Promise => { const finalDiffs = {} as Record; for (const diff of this.buffer.filter(q => q.group == null || (q.group === logHour.group)).map(q => q.diff)) { - const columns = Chart.convertObjectToFlattenColumns(diff); - - for (const [k, v] of Object.entries(columns)) { + for (const [k, v] of Object.entries(diff)) { if (finalDiffs[k] == null) { finalDiffs[k] = v; } else { @@ -400,18 +357,72 @@ export default abstract class Chart> { } } - const query = Chart.convertQuery(finalDiffs); + const queryForHour: Record string)> = {}; + const queryForDay: Record string)> = {}; + for (const [k, v] of Object.entries(finalDiffs)) { + if (typeof v === 'number') { + const name = columnPrefix + k.replaceAll('.', columnDot); + if (v > 0) queryForHour[name] = () => `"${name}" + ${v}`; + if (v < 0) queryForHour[name] = () => `"${name}" - ${Math.abs(v)}`; + if (v > 0) queryForDay[name] = () => `"${name}" + ${v}`; + if (v < 0) queryForDay[name] = () => `"${name}" - ${Math.abs(v)}`; + } else if (Array.isArray(v) && v.length > 0) { // ãƒĻニãƒŧã‚¯ã‚¤ãƒŗã‚¯ãƒĒãƒĄãƒŗãƒˆ + const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot); + // TODO: item をSQLã‚¨ã‚šã‚ąãƒŧプ + const itemsForHour = v.filter(item => !logHour[tempColumnName].includes(item)).map(item => `"${item}"`); + const itemsForDay = v.filter(item => !logDay[tempColumnName].includes(item)).map(item => `"${item}"`); + if (itemsForHour.length > 0) queryForHour[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForHour.join(',')}}'::varchar[])`; + if (itemsForDay.length > 0) queryForDay[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForDay.join(',')}}'::varchar[])`; + } + } + + // bake unique count + for (const [k, v] of Object.entries(finalDiffs)) { + if (this.schema[k].uniqueIncrement) { + const name = columnPrefix + k.replaceAll('.', columnDot); + const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot); + queryForHour[name] = new Set([...v, ...logHour[tempColumnName]]).size; + queryForDay[name] = new Set([...v, ...logDay[tempColumnName]]).size; + } + } + + // compute intersection + // TODO: intersectionãĢ指厚されたã‚Ģナムがintersectionã ãŖãŸå ´åˆãŽå¯žåŋœ + for (const [k, v] of Object.entries(this.schema)) { + const intersection = v.intersection; + if (intersection) { + const name = columnPrefix + k.replaceAll('.', columnDot); + const firstKey = intersection[0]; + const firstTempColumnName = uniqueTempColumnPrefix + firstKey.replaceAll('.', columnDot); + const currentValuesForHour = new Set([...(finalDiffs[firstKey] ?? []), ...logHour[firstTempColumnName]]); + const currentValuesForDay = new Set([...(finalDiffs[firstKey] ?? []), ...logDay[firstTempColumnName]]); + for (let i = 1; i < intersection.length; i++) { + const targetKey = intersection[i]; + const targetTempColumnName = uniqueTempColumnPrefix + targetKey.replaceAll('.', columnDot); + const targetValuesForHour = new Set([...(finalDiffs[targetKey] ?? []), ...logHour[targetTempColumnName]]); + const targetValuesForDay = new Set([...(finalDiffs[targetKey] ?? []), ...logDay[targetTempColumnName]]); + currentValuesForHour.forEach(v => { + if (!targetValuesForHour.has(v)) currentValuesForHour.delete(v); + }); + currentValuesForDay.forEach(v => { + if (!targetValuesForDay.has(v)) currentValuesForDay.delete(v); + }); + } + queryForHour[name] = currentValuesForHour.size; + queryForDay[name] = currentValuesForDay.size; + } + } // ログ更新 await Promise.all([ this.repositoryForHour.createQueryBuilder() .update() - .set(query) + .set(queryForHour) .where('id = :id', { id: logHour.id }) .execute(), this.repositoryForDay.createQueryBuilder() .update() - .set(query) + .set(queryForDay) .where('id = :id', { id: logDay.id }) .execute(), ]); @@ -435,18 +446,28 @@ export default abstract class Chart> { @autobind public async resync(group: string | null = null): Promise { - const data = await this.fetchActual(group); + const data = await this.queryCurrentState(group); - const update = async (logHour: Log, logDay: Log): Promise => { + const columns = {} as Record; + for (const [k, v] of Object.entries(data)) { + const name = k.replaceAll('.', columnDot); + columns[columnPrefix + name] = v; + } + + if (Object.keys(columns).length === 0) { + return; + } + + const update = async (logHour: RawRecord, logDay: RawRecord): Promise => { await Promise.all([ this.repositoryForHour.createQueryBuilder() .update() - .set(Chart.convertObjectToFlattenColumns(data)) + .set(columns as any) .where('id = :id', { id: logHour.id }) .execute(), this.repositoryForDay.createQueryBuilder() .update() - .set(Chart.convertObjectToFlattenColumns(data)) + .set(columns as any) .where('id = :id', { id: logDay.id }) .execute(), ]); @@ -460,12 +481,43 @@ export default abstract class Chart> { } @autobind - protected async inc(inc: DeepPartial, group: string | null = null): Promise { - await this.commit(inc, group); + public async clean(): Promise { + const current = dateUTC(Chart.getCurrentDate()); + + // 一æ—ĨäģĨ上前かつ三æ—ĨäģĨ内 + const gt = Chart.dateToTimestamp(current) - (60 * 60 * 24 * 3); + const lt = Chart.dateToTimestamp(current) - (60 * 60 * 24); + + const columns = {} as Record; + for (const [k, v] of Object.entries(this.schema)) { + if (v.uniqueIncrement) { + const name = k.replaceAll('.', columnDot); + columns[uniqueTempColumnPrefix + name] = []; + } + } + + if (Object.keys(columns).length === 0) { + return; + } + + await Promise.all([ + this.repositoryForHour.createQueryBuilder() + .update() + .set(columns as any) + .where('date > :gt', { gt }) + .andWhere('date < :lt', { lt }) + .execute(), + this.repositoryForDay.createQueryBuilder() + .update() + .set(columns as any) + .where('date > :gt', { gt }) + .andWhere('date < :lt', { lt }) + .execute(), + ]); } @autobind - public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { + public async getChartRaw(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { const [y, m, d, h, _m, _s, _ms] = cursor ? Chart.parseDate(subtractTime(addTime(cursor, 1, span), 1)) : Chart.getCurrentDate(); const [y2, m2, d2, h2] = cursor ? Chart.parseDate(addTime(cursor, 1, span)) : [] as never; @@ -526,7 +578,7 @@ export default abstract class Chart> { } } - const chart: T[] = []; + const chart: KVs[] = []; for (let i = (amount - 1); i >= 0; i--) { const current = @@ -537,17 +589,16 @@ export default abstract class Chart> { const log = logs.find(l => isTimeSame(new Date(l.date * 1000), current)); if (log) { - const data = Chart.convertFlattenColumnsToObject(log); - chart.unshift(Chart.countUniqueFields(data) as T); + chart.unshift(this.convertRawRecord(log)); } else { // 隙間埋め const latest = logs.find(l => isTimeBefore(new Date(l.date * 1000), current)); - const data = latest ? Chart.convertFlattenColumnsToObject(latest) as T : null; - chart.unshift(Chart.countUniqueFields(this.getNewLog(data)) as T); + const data = latest ? this.convertRawRecord(latest) : null; + chart.unshift(this.getNewLog(data)); } } - const res = {} as Record; + const res = {} as ChartResult; /** * [{ foo: 1, bar: 5 }, { foo: 2, bar: 6 }, { foo: 3, bar: 7 }] @@ -555,36 +606,26 @@ export default abstract class Chart> { * { foo: [1, 2, 3], bar: [5, 6, 7] } * ãĢする */ - const compact = (x: Obj, path?: string): void => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}.${k}` : k; - if (typeof v === 'object' && !Array.isArray(v)) { - compact(v, p); + for (const record of chart) { + for (const [k, v] of Object.entries(record)) { + if (res[k]) { + res[k].push(v); } else { - const values = chart.map(s => nestedProperty.get(s, p)); - nestedProperty.set(res, p, values); + res[k] = [v]; } } - }; - - compact(chart[0]); - - return res as ArrayValue; - } -} - -export function convertLog(logSchema: Schema): Schema { - const v: Schema = JSON.parse(JSON.stringify(logSchema)); // copy - if (v.type === 'number') { - v.type = 'array'; - v.items = { - type: 'number' as const, - optional: false as const, nullable: false as const, - }; - } else if (v.type === 'object') { - for (const k of Object.keys(v.properties!)) { - v.properties![k] = convertLog(v.properties![k]); } + + return res; + } + + @autobind + public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { + const result = await this.getChartRaw(span, amount, cursor, group); + const object = {}; + for (const [k, v] of Object.entries(result)) { + nestedProperty.set(object, k, v); + } + return object; } - return v; } diff --git a/packages/backend/src/services/chart/entities.ts b/packages/backend/src/services/chart/entities.ts index dedbd47080..569b328557 100644 --- a/packages/backend/src/services/chart/entities.ts +++ b/packages/backend/src/services/chart/entities.ts @@ -1,7 +1,6 @@ import { entity as FederationChart } from './charts/entities/federation'; import { entity as NotesChart } from './charts/entities/notes'; import { entity as UsersChart } from './charts/entities/users'; -import { entity as NetworkChart } from './charts/entities/network'; import { entity as ActiveUsersChart } from './charts/entities/active-users'; import { entity as InstanceChart } from './charts/entities/instance'; import { entity as PerUserNotesChart } from './charts/entities/per-user-notes'; @@ -10,12 +9,12 @@ import { entity as PerUserReactionsChart } from './charts/entities/per-user-reac import { entity as HashtagChart } from './charts/entities/hashtag'; import { entity as PerUserFollowingChart } from './charts/entities/per-user-following'; import { entity as PerUserDriveChart } from './charts/entities/per-user-drive'; +import { entity as ApRequestChart } from './charts/entities/ap-request'; export const entities = [ FederationChart.hour, FederationChart.day, NotesChart.hour, NotesChart.day, UsersChart.hour, UsersChart.day, - NetworkChart.hour, NetworkChart.day, ActiveUsersChart.hour, ActiveUsersChart.day, InstanceChart.hour, InstanceChart.day, PerUserNotesChart.hour, PerUserNotesChart.day, @@ -24,4 +23,5 @@ export const entities = [ HashtagChart.hour, HashtagChart.day, PerUserFollowingChart.hour, PerUserFollowingChart.day, PerUserDriveChart.hour, PerUserDriveChart.day, + ApRequestChart.hour, ApRequestChart.day, ]; diff --git a/packages/backend/src/services/chart/index.ts b/packages/backend/src/services/chart/index.ts index 0b9887b36f..1c0f7aadc1 100644 --- a/packages/backend/src/services/chart/index.ts +++ b/packages/backend/src/services/chart/index.ts @@ -3,7 +3,6 @@ import { beforeShutdown } from '@/misc/before-shutdown'; import FederationChart from './charts/federation'; import NotesChart from './charts/notes'; import UsersChart from './charts/users'; -import NetworkChart from './charts/network'; import ActiveUsersChart from './charts/active-users'; import InstanceChart from './charts/instance'; import PerUserNotesChart from './charts/per-user-notes'; @@ -12,11 +11,11 @@ import PerUserReactionsChart from './charts/per-user-reactions'; import HashtagChart from './charts/hashtag'; import PerUserFollowingChart from './charts/per-user-following'; import PerUserDriveChart from './charts/per-user-drive'; +import ApRequestChart from './charts/ap-request'; export const federationChart = new FederationChart(); export const notesChart = new NotesChart(); export const usersChart = new UsersChart(); -export const networkChart = new NetworkChart(); export const activeUsersChart = new ActiveUsersChart(); export const instanceChart = new InstanceChart(); export const perUserNotesChart = new PerUserNotesChart(); @@ -25,12 +24,12 @@ export const perUserReactionsChart = new PerUserReactionsChart(); export const hashtagChart = new HashtagChart(); export const perUserFollowingChart = new PerUserFollowingChart(); export const perUserDriveChart = new PerUserDriveChart(); +export const apRequestChart = new ApRequestChart(); const charts = [ federationChart, notesChart, usersChart, - networkChart, activeUsersChart, instanceChart, perUserNotesChart, @@ -39,6 +38,7 @@ const charts = [ hashtagChart, perUserFollowingChart, perUserDriveChart, + apRequestChart, ]; // 20分おきãĢãƒĄãƒĸãƒĒæƒ…å ąã‚’DBãĢ書きčžŧãŋ diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index a89e068f45..9a8a543904 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -160,8 +160,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool webpublic: null, thumbnail, }; - } catch (e) { - logger.warn(`GenerateVideoThumbnail failed: ${e}`); + } catch (err) { + logger.warn(`GenerateVideoThumbnail failed: ${err}`); return { webpublic: null, thumbnail: null, @@ -191,8 +191,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool thumbnail: null, }; } - } catch (e) { - logger.warn(`sharp failed: ${e}`); + } catch (err) { + logger.warn(`sharp failed: ${err}`); return { webpublic: null, thumbnail: null, @@ -215,8 +215,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool } else { logger.debug(`web image not created (not an required image)`); } - } catch (e) { - logger.warn(`web image not created (an error occured)`, e); + } catch (err) { + logger.warn(`web image not created (an error occured)`, err as Error); } } else { logger.info(`web image not created (from remote)`); @@ -234,8 +234,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool } else { logger.debug(`thumbnail not created (not an required file)`); } - } catch (e) { - logger.warn(`thumbnail not created (an error occured)`, e); + } catch (err) { + logger.warn(`thumbnail not created (an error occured)`, err as Error); } // #endregion thumbnail @@ -451,9 +451,9 @@ export async function addFile({ file.storedInternal = false; file = await DriveFiles.insert(file).then(x => DriveFiles.findOneOrFail(x.identifiers[0])); - } catch (e) { + } catch (err) { // duplicate key error (when already registered) - if (isDuplicateKeyValueError(e)) { + if (isDuplicateKeyValueError(err)) { logger.info(`already registered ${file.uri}`); file = await DriveFiles.findOne({ @@ -461,8 +461,8 @@ export async function addFile({ userId: user ? user.id : null, }) as DriveFile; } else { - logger.error(e); - throw e; + logger.error(err as Error); + throw err; } } } else { diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts index 626cc6b44c..1962088b63 100644 --- a/packages/backend/src/services/logger.ts +++ b/packages/backend/src/services/logger.ts @@ -1,6 +1,6 @@ import * as cluster from 'cluster'; import * as chalk from 'chalk'; -import * as dateformat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { envOption } from '../env'; import config from '@/config/index'; @@ -57,7 +57,7 @@ export default class Logger { return; } - const time = dateformat(new Date(), 'HH:MM:ss'); + const time = dateFormat(new Date(), 'HH:mm:ss'); const worker = cluster.isPrimary ? '*' : cluster.worker.id; const l = level === 'error' ? important ? chalk.bgRed.white('ERR ') : chalk.red('ERR ') : @@ -116,7 +116,7 @@ export default class Logger { } public debug(message: string, data?: Record | null, important = false): void { // ãƒ‡ãƒãƒƒã‚°į”¨ãĢäŊŋう(開į™ē者ãĢåŋ…čĻã ãŒåˆŠį”¨č€…ãĢ不čρãĒæƒ…å ą) - if (process.env.NODE_ENV != 'production' || envOption.verbose) { + if (process.env.NODE_ENV !== 'production' || envOption.verbose) { this.log('debug', message, data, important); } } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index fb22bd6593..7a4c2cef12 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -59,7 +59,7 @@ class NotificationManager { if (exist) { // ã€ŒãƒĄãƒŗã‚ˇãƒ§ãƒŗã•ã‚ŒãĻいるかつčŋ”äŋĄã•れãĻã„ã‚‹ã€å ´åˆã¯ã€ãƒĄãƒŗã‚ˇãƒ§ãƒŗã¨ã—ãĻぎ通įŸĨではãĒくčŋ”äŋĄã¨ã—ãĻぎ通įŸĨãĢする - if (reason != 'mention') { + if (reason !== 'mention') { exist.reason = reason; } } else { @@ -111,7 +111,7 @@ type Option = { app?: App | null; }; -export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; }, data: Option, silent = false) => new Promise(async (res, rej) => { +export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; createdAt: User['createdAt']; }, data: Option, silent = false) => new Promise(async (res, rej) => { // ãƒãƒŖãƒŗãƒãƒĢ外ãĢãƒĒãƒ—ãƒŠã‚¤ã—ãŸã‚‰å¯žčąĄãŽã‚šã‚ŗãƒŧプãĢ合わせる // (クナイã‚ĸãƒŗãƒˆã‚ĩã‚¤ãƒ‰ã§ã‚„ãŖãĻã‚‚č‰¯ã„å‡Ļį†ã ã¨æ€ã†ã‘ãŠã¨ã‚Šã‚ãˆãšã‚ĩãƒŧバãƒŧã‚ĩイドで) if (data.reply && data.channel && data.reply.channelId !== data.channel.id) { @@ -201,7 +201,7 @@ export default async (user: { id: User['id']; username: User['username']; host: mentionedUsers.push(await Users.findOneOrFail(data.reply.userId)); } - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -297,11 +297,10 @@ export default async (user: { id: User['id']; username: User['username']; host: } if (!silent) { - // ロãƒŧã‚ĢãƒĢãƒĻãƒŧã‚ļãƒŧãŽãƒãƒŖãƒŧトはã‚ŋã‚¤ãƒ ãƒŠã‚¤ãƒŗå–åž—æ™‚ãĢ更新しãĻいるぎでãƒĒãƒĸãƒŧトãƒĻãƒŧã‚ļãƒŧぎ場合だけでよい - if (Users.isRemoteUser(user)) activeUsersChart.update(user); + if (Users.isLocalUser(user)) activeUsersChart.write(user); // æœĒčĒ­é€šįŸĨをäŊœæˆ - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -439,7 +438,7 @@ export default async (user: { id: User['id']; username: User['username']; host: async function renderNoteOrRenoteActivity(data: Option, note: Note) { if (data.localOnly) return null; - const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length == 0) + const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0) ? renderAnnounce(data.renote.uri ? data.renote.uri : `${config.url}/notes/${data.renote.id}`, note) : renderCreate(await renderNote(note, false), note); @@ -478,7 +477,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O userId: user.id, localOnly: data.localOnly!, visibility: data.visibility as any, - visibleUserIds: data.visibility == 'specified' + visibleUserIds: data.visibility === 'specified' ? data.visibleUsers ? data.visibleUsers.map(u => u.id) : [] @@ -502,7 +501,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O insert.mentions = mentionedUsers.map(u => u.id); const profiles = await UserProfiles.find({ userId: In(insert.mentions) }); insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => { - const profile = profiles.find(p => p.userId == u.id); + const profile = profiles.find(p => p.userId === u.id); const url = profile != null ? profile.url : null; return { uri: u.uri, diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts index 64383ee928..77723fe8b7 100644 --- a/packages/backend/src/services/note/delete.ts +++ b/packages/backend/src/services/note/delete.ts @@ -39,7 +39,7 @@ export default async function(user: User, note: Note, quiet = false) { let renote: Note | undefined; // if deletd note is renote - if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length == 0)) { + if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) { renote = await Notes.findOne({ id: note.renoteId, }); diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts index 47f46419dd..c01d43c221 100644 --- a/packages/backend/src/services/note/reaction/create.ts +++ b/packages/backend/src/services/note/reaction/create.ts @@ -76,7 +76,7 @@ export default async (user: { id: User['id']; host: User['host']; }, note: Note, // ã‚Ģ゚ã‚ŋムįĩĩ文字ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗã ãŖãŸã‚‰įĩĩæ–‡å­—æƒ…å ąã‚‚é€ã‚‹ const decodedReaction = decodeReaction(reaction); - let emoji = await Emojis.findOne({ + const emoji = await Emojis.findOne({ where: { name: decodedReaction.name, host: decodedReaction.host, diff --git a/packages/backend/src/services/note/read.ts b/packages/backend/src/services/note/read.ts index aaf1c5ed71..032f1e84e6 100644 --- a/packages/backend/src/services/note/read.ts +++ b/packages/backend/src/services/note/read.ts @@ -52,7 +52,7 @@ export default async function( if (note.user != null) { // たãļんnullãĢãĒã‚‹ã“ã¨ã¯į„Ąã„ã¯ãšã ã‘ãŠä¸€åŋœ for (const antenna of myAntennas) { - if (await checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) { + if (await checkHitAntenna(antenna, note, note.user, undefined, Array.from(following))) { readAntennaNotes.push(note); } } diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts index f5f36148f6..1fd406cb68 100644 --- a/packages/backend/src/services/send-email.ts +++ b/packages/backend/src/services/send-email.ts @@ -114,9 +114,9 @@ export async function sendEmail(to: string, subject: string, html: string, text: `, }); - logger.info('Message sent: %s', info.messageId); - } catch (e) { - logger.error(e); - throw e; + logger.info(`Message sent: ${info.messageId}`); + } catch (err) { + logger.error(err as Error); + throw err; } } diff --git a/packages/backend/test/chart.ts b/packages/backend/test/chart.ts index 66000bc928..bd8d4c8171 100644 --- a/packages/backend/test/chart.ts +++ b/packages/backend/test/chart.ts @@ -6,14 +6,17 @@ import { async, initTestDb } from './utils'; import TestChart from '../src/services/chart/charts/test'; import TestGroupedChart from '../src/services/chart/charts/test-grouped'; import TestUniqueChart from '../src/services/chart/charts/test-unique'; +import TestIntersectionChart from '../src/services/chart/charts/test-intersection'; import * as _TestChart from '../src/services/chart/charts/entities/test'; import * as _TestGroupedChart from '../src/services/chart/charts/entities/test-grouped'; import * as _TestUniqueChart from '../src/services/chart/charts/entities/test-unique'; +import * as _TestIntersectionChart from '../src/services/chart/charts/entities/test-intersection'; describe('Chart', () => { let testChart: TestChart; let testGroupedChart: TestGroupedChart; let testUniqueChart: TestUniqueChart; + let testIntersectionChart: TestIntersectionChart; let clock: lolex.Clock; beforeEach(async(async () => { @@ -21,11 +24,13 @@ describe('Chart', () => { _TestChart.entity.hour, _TestChart.entity.day, _TestGroupedChart.entity.hour, _TestGroupedChart.entity.day, _TestUniqueChart.entity.hour, _TestUniqueChart.entity.day, + _TestIntersectionChart.entity.hour, _TestIntersectionChart.entity.day, ]); testChart = new TestChart(); testGroupedChart = new TestGroupedChart(); testUniqueChart = new TestUniqueChart(); + testIntersectionChart = new TestIntersectionChart(); clock = lolex.install({ now: new Date(Date.UTC(2000, 0, 1, 0, 0, 0)) @@ -426,6 +431,53 @@ describe('Chart', () => { foo: [2, 0, 0], }); })); + + describe('Intersection', () => { + it('æĄäģļがæē€ãŸã•れãĻいãĒい場合はã‚Ģã‚Ļãƒŗãƒˆã•ã‚ŒãĒい', async(async () => { + await testIntersectionChart.addA('alice'); + await testIntersectionChart.addA('bob'); + await testIntersectionChart.addB('carol'); + await testIntersectionChart.save(); + + const chartHours = await testIntersectionChart.getChart('hour', 3, null); + const chartDays = await testIntersectionChart.getChart('day', 3, null); + + assert.deepStrictEqual(chartHours, { + a: [2, 0, 0], + b: [1, 0, 0], + aAndB: [0, 0, 0], + }); + + assert.deepStrictEqual(chartDays, { + a: [2, 0, 0], + b: [1, 0, 0], + aAndB: [0, 0, 0], + }); + })); + + it('æĄäģļがæē€ãŸã•れãĻいる場合ãĢã‚Ģã‚Ļãƒŗãƒˆã•ã‚Œã‚‹', async(async () => { + await testIntersectionChart.addA('alice'); + await testIntersectionChart.addA('bob'); + await testIntersectionChart.addB('carol'); + await testIntersectionChart.addB('alice'); + await testIntersectionChart.save(); + + const chartHours = await testIntersectionChart.getChart('hour', 3, null); + const chartDays = await testIntersectionChart.getChart('day', 3, null); + + assert.deepStrictEqual(chartHours, { + a: [2, 0, 0], + b: [2, 0, 0], + aAndB: [1, 0, 0], + }); + + assert.deepStrictEqual(chartDays, { + a: [2, 0, 0], + b: [2, 0, 0], + aAndB: [1, 0, 0], + }); + })); + }); }); describe('Resync', () => { diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 3311e117de..f3252b2860 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -30,7 +30,7 @@ "outDir": "./built", "typeRoots": [ "./node_modules/@types", - "./@types" + "./src/@types" ], "lib": [ "esnext" diff --git a/packages/backend/yarn.lock b/packages/backend/yarn.lock index 5bf6e05a71..c4afef8b5c 100644 --- a/packages/backend/yarn.lock +++ b/packages/backend/yarn.lock @@ -238,9 +238,9 @@ integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== "@sindresorhus/is@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" - integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185" + integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ== "@sinonjs/commons@^1.7.0": version "1.7.2" @@ -249,10 +249,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz#8c92c56f195e0bed4c893ba59c8e3d55831ca0df" + integrity sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA== dependencies: "@sinonjs/commons" "^1.7.0" @@ -289,6 +289,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@tsconfig/node10@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606" @@ -316,11 +321,6 @@ dependencies: "@types/node" "*" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - "@types/bcryptjs@2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" @@ -386,11 +386,6 @@ "@types/keygrip" "*" "@types/node" "*" -"@types/dateformat@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" - integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== - "@types/disposable-email-domains@^1.0.1": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/disposable-email-domains/-/disposable-email-domains-1.0.2.tgz#0280f6b38fa7f14e54b056a434135ecd254483b1" @@ -401,27 +396,6 @@ resolved "https://registry.yarnpkg.com/@types/escape-regexp/-/escape-regexp-0.0.1.tgz#f1a977ccdf2ef059e9862bd3af5e92cbbe723e0e" integrity sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw== -"@types/eslint-scope@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" - integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.0.tgz#eb5c5b575237334df24c53195e37b53d66478d7b" - integrity sha512-LpUXkr7fnmPXWGxB0ZuLEzNeTURuHPavkC5zuU4sg62/TgL5ZEjamr5Y8b6AftwHtx2bPJasI+CL0TT2JwQ7aA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.46": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== - "@types/express-serve-static-core@*": version "4.17.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz#a00ac7dadd746ae82477443e4d480a6a93ea083c" @@ -496,11 +470,6 @@ "@types/parse5" "*" "@types/tough-cookie" "*" -"@types/json-schema@*": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -665,10 +634,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50" integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA== -"@types/node@17.0.10": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab" - integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog== +"@types/node@17.0.14": + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20" + integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng== "@types/node@^14.11.8": version "14.17.9" @@ -770,13 +739,6 @@ resolved "https://registry.yarnpkg.com/@types/rename/-/rename-1.0.4.tgz#30c6f0306042591a560361ea02639e89647dd173" integrity sha512-eV81+6bVv2mdCBahkMefjEUwAjKDAP3AuyhqWCWRxcRaeVdUeHUBaoq2zSz+5HNHF2jzTajMcfLvJsy4K3cbwA== -"@types/request-stats@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/request-stats/-/request-stats-3.0.0.tgz#d3909a9f778b8ae0b42fb8c1ed20cb936ed95f99" - integrity sha512-POsDF7nETH8up49iBNvbZuO0pEk9F+TG0rXCkvjxCClcOS99xfF+mKmJteYlwKYpuRKkixzysKlL8rwN1hU2lw== - dependencies: - "@types/node" "*" - "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -791,10 +753,10 @@ dependencies: htmlparser2 "^6.0.0" -"@types/seedrandom@2.4.28": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" - integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== "@types/serve-static@*": version "1.13.3" @@ -811,15 +773,10 @@ dependencies: "@types/node" "*" -"@types/sinonjs__fake-timers@6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d" - integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/speakeasy@2.0.7": version "2.0.7" @@ -828,11 +785,6 @@ dependencies: "@types/node" "*" -"@types/tapable@^1": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" - integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== - "@types/throttle-debounce@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" @@ -853,13 +805,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== -"@types/uglify-js@*": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" - integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== - dependencies: - source-map "^0.6.1" - "@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -872,48 +817,10 @@ dependencies: "@types/node" "*" -"@types/webpack-sources@*": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" - integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" - -"@types/webpack-stream@3.2.12": - version "3.2.12" - resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.12.tgz#cf13e64067a662a7acd8cd0524b3f64c86b0ecb6" - integrity sha512-znMUl4kKT0V0SwkUgRgwUNSAO7J5I/jdTCBNy3utkCsgMJ3IHp4FBTDwsQC+tfQ73TWeKIH05QNmbUYmeGThGw== - dependencies: - "@types/node" "*" - "@types/webpack" "^4" - -"@types/webpack@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03" - integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== - dependencies: - "@types/node" "*" - tapable "^2.2.0" - webpack "^5" - -"@types/webpack@^4": - version "4.41.27" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.27.tgz#f47da488c8037e7f1b2dbf2714fbbacb61ec0ffc" - integrity sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA== - dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" - -"@types/websocket@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" - integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA== +"@types/websocket@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c" + integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ== dependencies: "@types/node" "*" @@ -929,14 +836,14 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== -"@typescript-eslint/eslint-plugin@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a" - integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ== +"@typescript-eslint/eslint-plugin@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz#f8c1d59fc37bd6d9d11c97267fdfe722c4777152" + integrity sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q== dependencies: - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/type-utils" "5.10.0" - "@typescript-eslint/utils" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/type-utils" "5.10.2" + "@typescript-eslint/utils" "5.10.2" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -944,69 +851,69 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/parser@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c" - integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== +"@typescript-eslint/parser@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.2.tgz#b6076d27cc5499ce3f2c625f5ccde946ecb7db9a" + integrity sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg== dependencies: - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/typescript-estree" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" - integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== +"@typescript-eslint/scope-manager@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz#92c0bc935ec00f3d8638cdffb3d0e70c9b879639" + integrity sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw== dependencies: - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/visitor-keys" "5.10.0" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" -"@typescript-eslint/type-utils@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5" - integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ== +"@typescript-eslint/type-utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz#ad5acdf98a7d2ab030bea81f17da457519101ceb" + integrity sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw== dependencies: - "@typescript-eslint/utils" "5.10.0" + "@typescript-eslint/utils" "5.10.2" debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/types@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" - integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== +"@typescript-eslint/types@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.2.tgz#604d15d795c4601fffba6ecb4587ff9fdec68ce8" + integrity sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w== -"@typescript-eslint/typescript-estree@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" - integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== +"@typescript-eslint/typescript-estree@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz#810906056cd3ddcb35aa333fdbbef3713b0fe4a7" + integrity sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ== dependencies: - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/visitor-keys" "5.10.0" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65" - integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== +"@typescript-eslint/utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.2.tgz#1fcd37547c32c648ab11aea7173ec30060ee87a8" + integrity sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/typescript-estree" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" - integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== +"@typescript-eslint/visitor-keys@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz#fdbf272d8e61c045d865bd6c8b41bea73d222f3d" + integrity sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q== dependencies: - "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/types" "5.10.2" eslint-visitor-keys "^3.0.0" "@ungap/promise-all-settled@1.1.2": @@ -1014,137 +921,6 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@webassemblyjs/ast@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" - integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - -"@webassemblyjs/floating-point-hex-parser@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" - integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== - -"@webassemblyjs/helper-api-error@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" - integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== - -"@webassemblyjs/helper-buffer@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" - integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== - -"@webassemblyjs/helper-numbers@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" - integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" - integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== - -"@webassemblyjs/helper-wasm-section@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" - integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - -"@webassemblyjs/ieee754@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" - integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" - integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" - integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== - -"@webassemblyjs/wasm-edit@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" - integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/helper-wasm-section" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-opt" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - "@webassemblyjs/wast-printer" "1.11.0" - -"@webassemblyjs/wasm-gen@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" - integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" - -"@webassemblyjs/wasm-opt@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" - integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - -"@webassemblyjs/wasm-parser@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" - integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" - -"@webassemblyjs/wast-printer@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" - integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -1198,22 +974,12 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4: - version "8.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" - integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== - -acorn@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" - integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== - acorn@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== -acorn@^8.7.0: +acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== @@ -1476,10 +1242,10 @@ autwh@0.1.0: dependencies: oauth "0.9.15" -aws-sdk@2.1061.0: - version "2.1061.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1061.0.tgz#79c75e6856e5a59e0857d0d066a8ff5ff5e0d752" - integrity sha512-T29yV+EPo4Fis9hAArxAXS/u6utKnlBq3DEu85LTSIA8i6e6Xg7e9u7Rveo8DmrlVrf7EGCNThaeF9WERHnwLg== +aws-sdk@2.1067.0: + version "2.1067.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1067.0.tgz#2e7f5a2d765fcf77a45f25fdd1f12a64942628a7" + integrity sha512-3Ys1k4cNQy4z37IpPjQ9c5ldkXMeZGbWoarKHynPPY3WCEj+Nw2u6zk484fA9/lTHNN3YesLuZ0OmEzGgjFEOw== dependencies: buffer "4.9.2" events "1.1.1" @@ -1638,17 +1404,6 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== - dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" - escalade "^3.1.1" - node-releases "^1.1.70" - buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1711,16 +1466,17 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "~3.7.0" -bull@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/bull/-/bull-4.2.1.tgz#c5a7e1496c7903274ce90192e4e5cb18f6c866c0" - integrity sha512-YkCQZMOub++siHw3SbYYXZ5xGEn6Tt3BPoCVq/irPNCxUqUYzta8yDlXyyAsfMKMVj0M7PcnynUabfMf9PFpOA== +bull@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/bull/-/bull-4.5.0.tgz#d6106b011b711ffb76c687d7f2db416955225f64" + integrity sha512-BejJxGwNNQPIrK1jFTN74kymFORYQ6ZyXWNsZx+6jtDtafQNUMHNSdoepabLLmeldmUvgAHvZDDIJWFGEo2MYg== dependencies: - cron-parser "^2.13.0" + cron-parser "^4.2.1" debuglog "^1.0.0" get-port "^5.1.1" ioredis "^4.27.0" lodash "^4.17.21" + msgpackr "^1.5.2" p-timeout "^3.2.0" semver "^7.3.2" uuid "^8.3.0" @@ -1821,11 +1577,6 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001181: - version "1.0.30001191" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" - integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== - canonicalize@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.1.tgz#657b4f3fa38a6ecb97a9e5b7b26d7a19cc6e0da9" @@ -1945,13 +1696,6 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2053,10 +1797,10 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" - integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== +color-string@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -2066,15 +1810,15 @@ color-support@^1.1.2: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67" - integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA== +color@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.0.tgz#0c782459a3e98838ea01e4bc0fb43310ca35af78" + integrity sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ== dependencies: color-convert "^2.0.1" - color-string "^1.6.0" + color-string "^1.9.0" -colorette@^1.2.0, colorette@^1.2.1: +colorette@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -2086,7 +1830,7 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.20.0: +commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2195,7 +1939,15 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -crc-32@1.2.0, crc-32@^1.2.0: +crc-32@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" + integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.3.1" + +crc-32@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== @@ -2216,13 +1968,12 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cron-parser@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.13.0.tgz#6f930bb6f2931790d2a9eec83b3ec276e27a6725" - integrity sha512-UWeIpnRb0eyoWPVk+pD3TDpNx3KCFQeezO224oJIkktBrcW6RoAPOx5zIKprZGfk6vcYSmA8yQXItejSaDBhbQ== +cron-parser@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.2.1.tgz#b43205d05ccd5c93b097dae64f3bd811f5993af3" + integrity sha512-5sJBwDYyCp+0vU5b7POl8zLWfgV5fOHxlc45FWoWdHecGC7MQHCjx0CHivCMRnGFovghKhhyYM+Zm9DcY5qcHg== dependencies: - is-nan "^1.2.1" - moment-timezone "^0.5.25" + luxon "^1.28.0" cross-env@7.0.3: version "7.0.3" @@ -2255,10 +2006,10 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" @@ -2297,19 +2048,19 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== +data-urls@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" + integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== dependencies: abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" -dateformat@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" - integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== +date-fns@2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== debug@2, debug@^2.2.0, debug@^2.5.2, debug@^2.6.9: version "2.6.9" @@ -2368,10 +2119,10 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== +decimal.js@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decompress-response@^6.0.0: version "6.0.0" @@ -2462,10 +2213,10 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.0.tgz#c528bc09bc6d1aa30149228240917c225448f204" + integrity sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw== detect-node@2.1.0, detect-node@^2.1.0: version "2.1.0" @@ -2566,12 +2317,12 @@ domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^5.0.0" + webidl-conversions "^7.0.0" domhandler@^2.3.0: version "2.4.2" @@ -2661,11 +2412,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.649: - version "1.3.672" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a" - integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2708,14 +2454,6 @@ enhanced-resolve@^5.0.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c" - integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -2762,11 +2500,6 @@ es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-module-lexer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.0.tgz#21f4181cc8b7eee06855f1c59e6087c7bc4f77b0" - integrity sha512-iuEGihqqhKWFgh72Q/Jtch7V2t/ft8w8IPP2aEN8ArYKO+IWyo6hsi96hCdgyeEDQIV3InhYQ9BlwUFPGXrbEQ== - es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2912,10 +2645,10 @@ eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== -eslint@8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.7.0.tgz#22e036842ee5b7cf87b03fe237731675b4d3633c" - integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w== +eslint@8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d" + integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ== dependencies: "@eslint/eslintrc" "^1.0.5" "@humanwhocodes/config-array" "^0.9.2" @@ -3021,11 +2754,6 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -events@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - execa@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.0.0.tgz#598b46f09ae44f5d8097a30cfb1681d0f0371503" @@ -3241,10 +2969,10 @@ follow-redirects@^1.14.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== -form-data@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" - integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -3419,11 +3147,6 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@7.1.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -3619,12 +3342,12 @@ hpagent@^0.1.1: resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.1.tgz#66f67f16e5c7a8b59a068e40c2658c2c749ad5e2" integrity sha512-IxJWQiY0vmEjetHdoE9HZjD4Cx+mYTr25tR7JCxXaiI3QxW0YqYyM11KyZbHufoa/piWhMb2+D3FGpMgmA2cFQ== -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.5" + whatwg-encoding "^2.0.0" html-entities@2.3.2: version "2.3.2" @@ -3687,13 +3410,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-headers@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-headers/-/http-headers-3.0.2.tgz#5147771292f0b39d6778d930a3a59a76fc7ef44d" - integrity sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw== - dependencies: - next-line "^1.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3703,6 +3419,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -3712,7 +3437,7 @@ http-signature@1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -http2-wrapper@^1.0.0-beta.5.0: +http2-wrapper@^1.0.0-beta.5.0, http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== @@ -3720,14 +3445,6 @@ http2-wrapper@^1.0.0-beta.5.0: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.0-beta.5.2" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" - integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - http_ece@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75" @@ -3767,6 +3484,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + iconv-lite@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" @@ -4043,13 +3767,6 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= -is-nan@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03" - integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ== - dependencies: - define-properties "^1.1.3" - is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -4184,15 +3901,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - jmespath@0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" @@ -4253,23 +3961,23 @@ jschardet@3.0.0: resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== -jsdom@16.7.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== +jsdom@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== dependencies: abab "^2.0.5" - acorn "^8.2.4" + acorn "^8.5.0" acorn-globals "^6.0.0" - cssom "^0.4.4" + cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" @@ -4278,24 +3986,19 @@ jsdom@16.7.0: symbol-tree "^3.2.4" tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4610,11 +4313,6 @@ listenercount@~1.0.1: resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - loader-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" @@ -4731,17 +4429,12 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= -lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4773,6 +4466,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^1.28.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" + integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== + mailcheck@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/mailcheck/-/mailcheck-1.1.1.tgz#d87cf6ba0b64ba512199dbf93f1489f479591e34" @@ -4867,7 +4565,7 @@ mime-types@2.1.34: dependencies: mime-db "1.51.0" -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -5029,14 +4727,7 @@ mocha@8.4.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -moment-timezone@^0.5.25: - version "0.5.28" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338" - integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw== - dependencies: - moment ">= 2.9.0" - -"moment@>= 2.9.0", moment@^2.22.2: +moment@^2.22.2: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -5061,6 +4752,21 @@ ms@3.0.0-canary.1: resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== +msgpackr-extract@^1.0.14: + version "1.0.16" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.16.tgz#701c4f6e6f25c100ae84557092274e8fffeefe45" + integrity sha512-fxdRfQUxPrL/TizyfYfMn09dK58e+d65bRD/fcaVH4052vj30QOzzqxcQIS7B0NsqlypEQ/6Du3QmP2DhWFfCA== + dependencies: + nan "^2.14.2" + node-gyp-build "^4.2.3" + +msgpackr@^1.5.2: + version "1.5.4" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.5.4.tgz#2b6ea6cb7d79c0ad98fc76c68163c48eda50cf0d" + integrity sha512-Z7w5Jg+2Q9z9gJxeM68d7tSuWZZGnFIRhZnyqcZCa/1dKkhOCNvR1TUV3zzJ3+vj78vlwKRzUgVDlW4jiSOeDA== + optionalDependencies: + msgpackr-extract "^1.0.14" + multer@1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" @@ -5089,7 +4795,7 @@ mz@^2.4.0, mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.15.0: +nan@^2.14.2, nan@^2.15.0: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== @@ -5135,11 +4841,6 @@ negotiator@0.6.2, negotiator@^0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - nested-property@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-4.0.0.tgz#a67b5a31991e701e03cdbaa6453bc5b1011bb88d" @@ -5150,11 +4851,6 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -next-line@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-line/-/next-line-1.1.0.tgz#fcae57853052b6a9bae8208e40dd7d3c2d304603" - integrity sha1-/K5XhTBStqm66CCOQN19PC0wRgM= - next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -5167,10 +4863,10 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" - integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== node-domexception@^1.0.0: version "1.0.0" @@ -5199,6 +4895,11 @@ node-fetch@3.0.0-beta.9: data-uri-to-buffer "^3.0.1" fetch-blob "^2.1.1" +node-gyp-build@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + node-gyp-build@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" @@ -5220,11 +4921,6 @@ node-gyp@^8.4.1: tar "^6.1.2" which "^2.0.2" -node-releases@^1.1.70: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== - nodemailer@6.7.2: version "6.7.2" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.2.tgz#44b2ad5f7ed71b7067f7a21c4fedabaec62b85e0" @@ -5464,13 +5160,6 @@ p-limit@^3.0.2: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5743,12 +5432,12 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prebuild-install@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574" - integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA== +prebuild-install@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" + integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== dependencies: - detect-libc "^1.0.3" + detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" @@ -5786,6 +5475,11 @@ printj@~1.1.0: resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== +printj@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" + integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== + private-ip@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-2.3.3.tgz#1e80ff8443e5ac78f555631aec3ea6ff027fa6aa" @@ -5796,10 +5490,10 @@ private-ip@2.3.3: is-ip "^3.1.0" netmask "^2.0.2" -probe-image-size@7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.2.tgz#e5851b9be7864f21e3bac5e6e4fac9da9055b412" - integrity sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug== +probe-image-size@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309" + integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w== dependencies: lodash.merge "^4.6.2" needle "^2.5.2" @@ -6194,14 +5888,6 @@ rename@1.0.4: dependencies: debug "^2.5.2" -request-stats@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-stats/-/request-stats-3.0.0.tgz#769155dc8974d78d4a1cb87bbf14eaab985afe25" - integrity sha1-dpFV3Il0141KHLh7vxTqq5ha/iU= - dependencies: - http-headers "^3.0.1" - once "^1.4.0" - require-all@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/require-all/-/require-all-3.0.0.tgz#473d49704be310115ce124f77383b1ebd8671312" @@ -6397,7 +6083,7 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -serialize-javascript@5.0.1, serialize-javascript@^5.0.1: +serialize-javascript@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== @@ -6432,17 +6118,17 @@ sha.js@^2.4.11: inherits "^2.0.1" safe-buffer "^5.0.1" -sharp@0.29.3: - version "0.29.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.3.tgz#0da183d626094c974516a48fab9b3e4ba92eb5c2" - integrity sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA== +sharp@0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.0.tgz#b2dd62d5f14088b11c72212354f31dff6511b070" + integrity sha512-L3m/l6yQFr3oGBUzcSAlN/R9yGFPYqM9FpMUe6Z4nHg4sWtP3hW1rcz+aaHklhD4wX5Jqh5PY9z+A1d4Qt3Hfg== dependencies: - color "^4.0.1" - detect-libc "^1.0.3" - node-addon-api "^4.2.0" - prebuild-install "^7.0.0" + color "^4.2.0" + detect-libc "^2.0.0" + node-addon-api "^4.3.0" + prebuild-install "^7.0.1" semver "^7.3.5" - simple-get "^4.0.0" + simple-get "^4.0.1" tar-fs "^2.1.1" tunnel-agent "^0.6.0" @@ -6496,6 +6182,15 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -6530,34 +6225,16 @@ socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" -source-list-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - source-map-js@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - speakeasy@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a" @@ -6794,7 +6471,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6813,12 +6490,12 @@ syslog-pro@1.0.0: dependencies: moment "^2.22.2" -systeminformation@5.9.9: - version "5.9.9" - resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.9.9.tgz#aa8234a138363bd988f438fed3273370f79d7e30" - integrity sha512-xciy6NKCLfs4dqMD1Tdlo7v1/g0NfdA1EKsIptUQjlcVvpwHyjifAbNOF7ppFezGSMXxYE8me+l2+RlFF4lyTg== +systeminformation@5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.11.0.tgz#2060779e1e7c7372192dbcd850c65cfd85f4ea71" + integrity sha512-mI/5nFK7NUe9Qbmy65WoB5TlCWKAhP4kG0w6uR2mZM8Mpdi8b45b3hTIK3W5+kQYZnYFWeS9/O5nn5rdcSvqfA== -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== @@ -6889,27 +6566,6 @@ tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" - integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q== - dependencies: - jest-worker "^26.6.2" - p-limit "^3.1.0" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.5.1" - -terser@^5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" - integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6990,10 +6646,10 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tr46@^2.0.0, tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -7057,7 +6713,7 @@ tsconfig-paths@3.12.0, tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== @@ -7318,20 +6974,12 @@ w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== dependencies: - xml-name-validator "^3.0.0" - -watchpack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0.tgz#b12248f32f0fd4799b7be0802ad1f6573a45955c" - integrity sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" + xml-name-validator "^4.0.0" web-push@3.4.5: version "3.4.5" @@ -7350,52 +6998,10 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-sources@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" - integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - -webpack@^5: - version "5.33.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.33.2.tgz#c049717c9b038febf5a72fd2f53319ad59a8c1fc" - integrity sha512-X4b7F1sYBmJx8mlh2B7mV5szEkE0jYNJ2y3akgAP0ERi0vLCG1VvdsIxt8lFd4st6SUy0lf7W0CCQS566MBpJg== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.46" - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/wasm-edit" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - acorn "^8.0.4" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.7.0" - es-module-lexer "^0.4.0" - 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 "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.0.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.1" - watchpack "^2.0.0" - webpack-sources "^2.1.1" +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== websocket@1.0.34: version "1.0.34" @@ -7409,35 +7015,25 @@ websocket@1.0.34: utf-8-validate "^5.0.2" yaeti "^0.0.6" -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - iconv-lite "0.4.24" + iconv-lite "0.6.3" -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -whatwg-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" - integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ== +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.0" - webidl-conversions "^5.0.0" - -whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== - dependencies: - lodash "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" + tr46 "^3.0.0" + webidl-conversions "^7.0.0" which-boxed-primitive@^1.0.2: version "1.0.2" @@ -7526,16 +7122,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@8.4.2: +ws@8.4.2, ws@^8.2.3: version "8.4.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== -ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - xev@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7" @@ -7548,10 +7139,10 @@ xml-js@^1.6.11: dependencies: sax "^1.2.4" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xml2js@0.4.19: version "0.4.19" @@ -7695,11 +7286,6 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - zen-observable-ts@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz#30d1202b81d8ba4c489e3781e8ca09abf0075e70" diff --git a/packages/client/package.json b/packages/client/package.json index b840bafe8c..cf4214e72b 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -11,8 +11,8 @@ }, "dependencies": { "@discordapp/twemoji": "13.1.0", + "@fortawesome/fontawesome-free": "6.0.0-beta3", "@syuilo/aiscript": "0.11.1", - "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.1", "@types/glob": "7.2.0", "@types/gulp": "4.0.9", @@ -26,7 +26,6 @@ "@types/punycode": "2.1.0", "@types/qrcode": "1.4.2", "@types/random-seed": "0.3.3", - "@types/request-stats": "3.0.0", "@types/seedrandom": "2.4.28", "@types/throttle-debounce": "2.1.0", "@types/tinycolor2": "1.4.3", @@ -47,6 +46,7 @@ "broadcast-channel": "4.9.0", "chart.js": "3.7.0", "chartjs-adapter-date-fns": "2.0.0", + "chartjs-plugin-gradient": "0.2.1", "chartjs-plugin-zoom": "1.2.0", "compare-versions": "4.1.3", "content-disposition": "0.5.4", @@ -87,7 +87,6 @@ "querystring": "0.2.1", "random-seed": "0.3.0", "reflect-metadata": "0.1.13", - "request-stats": "3.0.0", "rndstr": "1.0.0", "s-age": "1.1.2", "sass": "1.49.0", diff --git a/packages/client/src/components/chart-tooltip.vue b/packages/client/src/components/chart-tooltip.vue index b080eaf2b4..20e094a5a7 100644 --- a/packages/client/src/components/chart-tooltip.vue +++ b/packages/client/src/components/chart-tooltip.vue @@ -1,5 +1,5 @@ - diff --git a/packages/client/src/pages/admin/users.vue b/packages/client/src/pages/admin/users.vue index 03e155ddcf..f05aa5ff45 100644 --- a/packages/client/src/pages/admin/users.vue +++ b/packages/client/src/pages/admin/users.vue @@ -36,7 +36,7 @@ - +