Commit graph

1258 commits

Author SHA1 Message Date
Christian Fehmer 460f803bca
impr: use tsrest for admin endpoint (@fehmer) (#5713)
!nuf
2024-08-08 12:41:07 +02:00
Christian Fehmer 9f9663682d
chore: fix tests using machine timezone (@fehmer) (#5740) 2024-08-08 12:10:11 +02:00
dependabot[bot] c413cbd364
chore(deps): bump nodemon from 3.0.1 to 3.1.4 (@dependabot) (#5733)
Bumps [nodemon](https://github.com/remy/nodemon) from 3.0.1 to 3.1.4.
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v3.0.1...v3.1.4)

---
updated-dependencies:
- dependency-name: nodemon
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jack <jack@monkeytype.com>
2024-08-06 12:28:03 +02:00
dependabot[bot] 35379383a0
chore(deps): bump uuid and @types/uuid (@dependabot) (#5735)
Bumps [uuid](https://github.com/uuidjs/uuid) and [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid). These dependencies needed to be updated together.

Updates `uuid` from 9.0.1 to 10.0.0
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v9.0.1...v10.0.0)

Updates `@types/uuid` from 8.3.4 to 10.0.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-major
- dependency-name: "@types/uuid"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-06 12:24:15 +02:00
Adam Sasine b26cb887e4
feat(funbox): add hexadecimal (@asasine) (#5724)
* feat(funbox): added hexadecimal

* missing list definition

* lower max to 4

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-08-05 10:53:03 +02:00
Christian Fehmer 4a55db5284
fix: csp preventing new documentation unable to display logo (@fehmer) (#5719)
!nuf
2024-08-05 10:38:06 +02:00
Miodec fb45f05c3f chore: missing min string length causing firebase to throw errors 2024-08-05 10:34:13 +02:00
Miodec 98108dead8 chore: fix lint warnings 2024-08-02 21:56:54 +02:00
Christian Fehmer 8a09acd8d5
impr: use tsrest for ape-keys endpoint (@fehmer) (#5706)
!nuf
2024-08-01 13:29:25 +02:00
Christian Fehmer a6912d20af
impr(server): store some logs forever (@miodec) (#5708)
!nuf
2024-08-01 12:48:36 +02:00
Nad Alaba 8bc47960ef
build(backend): activate inspector to allow attaching debugger (@NadAlaba) (#5704) 2024-08-01 12:47:07 +02:00
Jack 2720c07664
chore: switch from npm to pnpm (#5690)
* pnpm

* v4, pnpm lock

* checkout, node setup

* cache dir

* path, name

* store path

* name

* setup pnpm, get store then check cache

* unnecessary if

* missing dependencies

* fix docker

* lock file name

* remove prop

* wip

* fix

* reduce image sizes

* save exact

* correct command

* lock

---------

Co-authored-by: Christian Fehmer <cfe@sexy-developer.com>
2024-07-30 22:36:19 +02:00
Miodec 47438fa8d1 chore(lint): enable no unsafe return 2024-07-30 22:10:30 +02:00
Jack 1110248f7b
chore: upgrade node to 20.16.0 (#5688)
* nooOoOoOOoOoode

* ci

* nvm

* env is back baby, cache

* cache name, restore keys

* remove restore keys

* package lock

* conditional node setup

* unnecessary assertion

* update rule

* lock
2024-07-30 18:44:35 +02:00
Jack fe7a67d0fb
chore: add more eslint rules (#5687)
* duplicate

* no meaningless void

* no-unnecessary-boolean-literal-compare

* prefer includes

* fixes

* type cast

* ignore rule

* backend

* duplicate

* interface > type

* no-confusing-void-expression

* no-unnecessary-type-assertion

* extend plugin

* fix

* ignore
2024-07-30 18:17:58 +02:00
Christian Fehmer 6b9f4a0f18
chore: remove config from shared-types (@fehmer) (#5681)
* chore: remove config from shared-types (@fehmer)

* fix

* remove shared-types/user

* build before test

* fix

* add madge to contracts
2024-07-30 17:37:38 +02:00
Christian Fehmer 6c6e1529a2
impr: use tsrest for presets endpoints (@fehmer) (#5675)
!nuf
2024-07-30 12:58:22 +02:00
dependabot[bot] ccc483226d
chore(deps-dev): bump @types/bcrypt from 5.0.0 to 5.0.2 (#5677)
Bumps [@types/bcrypt](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bcrypt) from 5.0.0 to 5.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bcrypt)

---
updated-dependencies:
- dependency-name: "@types/bcrypt"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-30 12:33:10 +02:00
Miodec 471e844c6b chore: remove hard npm version requirement 2024-07-29 11:49:28 +02:00
Christian Fehmer 7f9f704dcd
impr: use tsrest/zod for config endpoints (@fehmer) (#5649)
!nuf
2024-07-29 11:31:14 +02:00
Miodec 642a2b22a1 chore: update backend out dir 2024-07-25 19:59:05 +02:00
dependabot[bot] d717ae0058
chore(deps): bump express from 4.17.3 to 4.19.2 in /backend (#5650)
* chore(deps): bump express from 4.17.3 to 4.19.2 in /backend

Bumps [express](https://github.com/expressjs/express) from 4.17.3 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.3...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* lock update

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Miodec <jack@monkeytype.com>
2024-07-25 11:16:48 +02:00
Christian Fehmer 40514cd248
chore: start application in dev mode using docker (@fehmer) (#5647)
* chore: start application in dev mode using docker (@fehmer)

* expose port env variable

* regen lock

* regen lock

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-07-24 19:48:01 +02:00
Miodec 8de977a45f chore: bump ua-parser 2024-07-22 16:56:50 +02:00
Jack 3e88ac2f12
refactor: restructure project to a true monorepo (#5626)
* split ts files

* packages

* nomore workspace?

* blah

* build, exports

* declaration

* blargh

* turrrrbo

* fix fontawesome paths

* allow file in eslint, fix ts errors

* optimise package, update tsconfig

* fix ts

* update turbo config

* eslint split

* fix imports

* fix types

* lock

* add turbo task

* script

* test task

* pretty scripts

* update prettier ignore

* no cache for tests

* lint task

* turbo

* no out

* depend on env

* fix mono breaking things

* odl

* fix version dependency of mongodb-memory-server

* Revert "fix version dependency of mongodb-memory-server"

This reverts commit 52ffac47b1.

* update vitest-mongodb

* release scripts

* update ci

* update dev script

* ignore issues around firebase config

* add check ts tasks

* import isaxioserror

* shared types package

* replace tsnodedev with tsx

* fix import

* shared types

* module

* backend imports

* declaration

* node version

* test code

* assert json

* verbatim

* type

* lodash

* ts ver

* fix fix fix?

* remove assert

* remove module and resolution

* cleanup

* tsconfig

* fix frontend

* remove unecessary props

* more unused

* remove skiplib

* declaration map, dev script

* remove install scripts

* fix regex

* move shared types to package

* dont include shared types

* remove path

* update scripts

* test code

* test code

* fix backend types

* fully fix backend

* fix frontend d.ts

* add .js to imports

* remove module

* revert add .js

* update tsconfig

* use bundler module resolution

* almost all frontend types

* mooore

* date fns

* fix backend docker

* fix ape keys

* fix type

* clean rimraf type

* fix shared-types in workspace

* fix import resolving

* fix docker builds

* ignore type problems on slim-select until new version is released

* turrrrbo

* fix npm ci

* fix lint task

* expose env variables needed by frontend build

* fix dependencies

* package-lock

* backend watch ts and lint

* add fe and be build scripts to root

* fix dev not building packages

* shared-types missing eslint

* move shared types back to dev-deps

* add packages to labeler

* add packages step to ci

* typo

* filter update

* remove concurrently from root

* add scripts

* abbreviate

* rename

* yeet

* fixed path

* test pkg

* consistent ordering

* rename

* Revert "backend imports"

This reverts commit d715198829.

* fix missing imports, remove last .js

* remove test package

---------

Co-authored-by: Christian Fehmer <cfe@sexy-developer.com>
2024-07-22 15:08:11 +02:00
Jack 8f4d291fcf
Revert "impr: use tsrest/zod for type-safety on both ends (@fehmer) (#5479)" (#5619)
This reverts commit 4c9e949f10.
2024-07-16 17:29:09 +02:00
Christian Fehmer 4c9e949f10
impr: use tsrest/zod for type-safety on both ends (@fehmer) (#5479)
!nuf
2024-07-16 15:24:06 +02:00
Jack 2af5879f23
refactor: split middlewares into smaller files (#5616)
* split

* fix imports

* rename
2024-07-15 17:08:32 +02:00
Christian Fehmer 088ff638cc
fix: optimize / fix concurrency in UserDal (@fehmer) (#5558)
* fix addResultFilterPreset

* refactor, fix  removeResultFilters

* fix isDiscordIdAvailable, addTag, editTag and removeTag

* fix removeTagPb, updateLbMemory

* incrementBanana

* addTheme, removeTheme, editTheme

* wip

* cleanup incrementBananas

* toMongoFunction

* give up on making toMongoFunction type-safe

* be less stupid, addFavoriteQuote

* removeFavoriteQuote

* cleanup updateInbox

* don't use function if possible

* cleanup

* update error messages

* update error messages again

* review comments
2024-07-15 14:18:22 +02:00
Christian Fehmer 94a393fd87
impr: provide all-time LB results during LB update (@fehmer) (#5614) 2024-07-15 12:25:47 +02:00
Christian Fehmer aca3fe205b
test: add test coverage for PresetDal (@fehmer) (#5615) 2024-07-15 12:21:31 +02:00
Miodec 1cabbaa3e8 fix(server): not being able to view profiles which had a dot in the name 2024-07-13 21:39:07 +02:00
Miodec 9953c5ed02 impr(report quote): add reason: duplicate quote 2024-07-11 15:48:01 +02:00
Miodec 65a3f9dacb chore: relax user forgot password rate limit 2024-07-08 19:47:44 +02:00
Christian Fehmer 3722000d85
fix: updateInbox claiming all rewards (@fehmer) (#5560)
!nuf
2024-07-05 13:47:54 +02:00
Christian Fehmer 1f085580e6
fix: cleanup tmp while updating users inbox (#5559) 2024-07-04 18:35:52 +02:00
Miodec 8c00315c5b impr(server): disallow dots in tags, presets and custom theme names 2024-07-03 17:34:29 +02:00
Miodec dd4943bae0 impr(server): dont allow dots in usernames 2024-07-03 15:08:26 +02:00
Christian Fehmer ce093c538d
fix: concurrency issue while claiming rewards (@fehmer) (#5553) 2024-07-02 20:39:27 +02:00
Christian Fehmer e8d9ce63da
chore: fix check annotations for dev routes (@fehmer) (#5549) 2024-07-01 14:46:04 +02:00
Christian Fehmer d566ba6468
perf: optimize database access for UserDal (@fehmer) (#5544)
* impr: optimize database access for UserDal (@fehmer)

* rename getPartial to getPartialUser
2024-07-01 14:37:12 +02:00
Aaron 0877723fdf
chore: replace twitter urls with x (unrealapex) (#5541)
* chore: replace twitter urls with x

* chore: fix twitter account url
2024-07-01 13:53:49 +02:00
theiereman 2714af1eeb
impr(server): trim consecutive newlines when updating user profile (theiereman) (#5538) 2024-07-01 12:30:27 +02:00
Miodec 6da0e6a0fa chore: remove some words from the profanity list 2024-07-01 12:04:34 +02:00
Christian Fehmer 442153724a
feat: add test activity and streak into to the apekey endpoints (@fehmer) (#5513)
* feat: add test activity and streak into to the apekey endpoints (@fehmer)

* add public conract

* review comments
2024-06-24 13:55:13 +02:00
Christian Fehmer b4ea7f119f
impr(dev): add endpoint to create test user/data (fehmer) (#5396)
!nuf
2024-06-17 15:21:55 +02:00
Christian Fehmer d5b3103967
fix: unable to rename freshly created theme (fehmer) (#5486) 2024-06-12 10:24:52 +02:00
Miodec 6a768b40b4 feat(funbox): add plus zero funbox. only the current word is visible 2024-06-11 12:25:26 +02:00
Miodec ff86c83211 impr(server): log server versions which generate 500 errors
!nuf
2024-06-06 12:49:20 +02:00
Miodec 66a91011d7 fix(server): incorrect error message when profanity was detected
this reworks the profanity check a little bit, usernames with profanity
are still considered valid if they match the regex pattern and they
match the length check
2024-06-05 15:16:38 +02:00
Christian Fehmer 01076986be
fix: test activity graph bugs (fehmer) (#5468) 2024-06-03 13:00:30 +02:00
Miodec 05d6160b2a test: remove double mock 2024-05-29 14:44:54 +02:00
Miodec 57ff186f91 build: add @shared alias pointing to the shared directory 2024-05-29 14:29:47 +02:00
Miodec 90c96a2bd7 refactor: move token revoke call to other auth util functions 2024-05-28 19:02:08 +02:00
Miodec d2d1f83a36 fix: also disallow stop on letter on the daily leaderboards 2024-05-28 18:10:02 +02:00
Miodec 40423baa2a test: fix missing mocks breaking tests 2024-05-28 17:38:54 +02:00
Miodec 0c38d99bde fix(backend): use correct function
!nuf
2024-05-28 17:23:54 +02:00
Miodec aa2466a0d1 feat(result): disallow stop on error letter from getting new pbs 2024-05-28 17:10:51 +02:00
Miodec 8e057e3cb6 impr(server): move password update from client to server
this allows us to make sure to invalidate user tokens on password change

!nuf
2024-05-28 11:06:14 +02:00
Miodec 313468cee3 chore: remove unnecessary import 2024-05-28 11:06:14 +02:00
Miodec f7a97505db refactor(backend): revoke tokens, update email
move revoke tokens function from delete user to its own funciton (together with removing from cache)
remove authutil calls from dal and move them to the controller layer
make sure to revoke tokens on email change
2024-05-28 11:06:14 +02:00
Christian Fehmer fd3fc7ca47
test: fix flaky tests on user creation (fehmer) (#5434) 2024-05-24 12:33:44 +02:00
Christian Fehmer d9767ebc97
fix: testActivity not removed on account reset (fehmer) (#5427) 2024-05-23 10:53:23 +02:00
Miodec 3255654921 impr: add admin endpoint to send forgot password email
!nuf
2024-05-20 15:35:52 +02:00
Christian Fehmer 4589bbf679
feat: maintain hashed blocklist of banned usernames, emails and discordids (fehmer) (#5371)
* feat: maintain blocklist of banned usernames and email (fehmer)

* update privacy policy

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-05-20 12:21:14 +02:00
Miodec b17803918b chore: migration log 2024-05-17 22:20:54 +02:00
Miodec c164b84291 chore: better migration script logs 2024-05-17 16:57:27 +02:00
Christian Fehmer d9e975b286
fix: migration breaking tests (fehmer) (#5397)
!nuf
2024-05-15 16:20:09 +02:00
Christian Fehmer 59615fb02c
feat(account page): add test activity graph (fehmer, Singh233) (#5309)
* wip

* wip frontend

* cleanup

* wip

* refactoring

* wip

* first working version

* wip

* update calendar with new result

* add migration script

* dates are hard

* fix naming inconsistencies

* requested changes on migration

* timezones

* update date-fns, use date-fns/utc

* resolve cyclic dependency by extracting test activity calender into new file

* cleanup

* fix increment

* fix

* tests

* test coverage

* test migration

* migration more logging

* migration add unique index on uid if missing

* update legend styling

* 53 columns

* wip

* move dropdown and legend to the top
add dropdown border
yeet hotpink
invisible filler boxes
remove year from month format

* responsive update

* lowercase months

* handle current year, fix tests

* handle year change

* make days square again

* handle newly created users correctly

* move css

* add wrapper for easier styling
rework some font sizes/widths
reorder styles

* media queries

* align

* rework styling once more

* dont commit debug

* add days full to fill the space a bit

* show partial months

* hover on 0 tests

* start dynamic calendar on sunday

* no activity

* hover

* remove label on fillers

* remove label on fillers

* fix months, update tests for months

* adjust tests to new requirements

* cleanup

* fix migration

* impr(commandline): add "add/remove quote to favorites" commands

closes #5368

* chore: remove daily lb which is no longer in the backend

* fix: dropdown element flashing for couple frames on page load

* feat(language): add japanese romaji 1k (nthngnssmnnglss)

* fix: optional chaining

!nuf

* fix(words generator): infinite custom text tests not working correctly

* chore: missing languages in list and group files

* fix(language): remove duplicates

!nuf

* add readline sync to confirm

* gh action complaints

* unnecessary check

* premium only

* add years to drop down only if premium

* Update setup-tests.ts

* test fix

* cleanup

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-05-15 15:23:36 +02:00
Christian Fehmer 059c9e271b
test: update to vitest 1.6.0, use v8 coverage provider (#5389) 2024-05-13 13:25:21 +02:00
Christian Fehmer 0dab2ecd7e
impr: build docker images for linux/arm64 on release (#5369)
!nuf
2024-05-13 11:53:46 +02:00
Miodec c1e4fb3722 chore: allow user deletion again 2024-05-06 13:35:54 +02:00
Miodec 2f3fc419b8 chore: remove unused code 2024-05-05 18:11:36 +02:00
Jack 79f77b80eb
refactor: live stats (#5352) 2024-05-02 17:33:17 +02:00
Miodec b2e563429b impr(server): dont allow banned users to unlink from discord 2024-04-30 21:19:30 +02:00
Miodec 7f04503921 impr(max line width): setting the value to 0 will now always align the words to the width of the container 2024-04-30 21:00:02 +02:00
Miodec 5bee69a639 impr(server): also dont allow name changing for banned users 2024-04-28 19:33:55 +02:00
Miodec bfe39c62de impr(server): dont allow banned accounts to reset or delete their data 2024-04-28 16:44:49 +02:00
Miodec a2078dab17 fix(server): not being able to save custom text shuffle tests 2024-04-28 13:25:04 +02:00
Miodec 36df36be73 feat: add max line width
controls how many characters per line (estimated) to display during the test
literally bullied into adding it back, hope you love me again
2024-04-26 20:01:32 +02:00
Miodec 79e8566f95 refactor(config): remove "show live progress" and move it to "live progress style: off" 2024-04-25 12:58:08 +02:00
Jack 4039ed8b26
refactor: media queries (#5329) 2024-04-24 14:22:41 +02:00
Jack ccc9a39a99
refactor: custom text logic and modal (#5327) 2024-04-23 16:58:00 +02:00
Sanidhya Singh cebec73f6d
impr(backend): add ability to send report feedback to user about accepted and rejected reports (sanidhyas3s) (#5298)
!nuf
2024-04-23 11:54:06 +02:00
Christian Fehmer 9bdbf5c595
test: replace jest with vitest on backend (fehmer) (#5314)
* test: replace jest with vitest on backend

* fix
2024-04-17 13:39:10 +02:00
Nad Alaba bdc19de2ec
build(backend): fix dev script flags not being processed (NadAlaba) (#5296) 2024-04-09 11:58:28 +02:00
Miodec 4607297c95 impr(reporting): dont allow users to report the same content multiple times
closes #5288
!nuf
2024-04-08 12:56:58 +02:00
Christian Fehmer a306ab4f32
impr(profile/account page): show leaderboard rank percentage (fehmer) (#5212) 2024-03-25 12:36:25 +01:00
Miodec 26d61f595f chore: better error message 2024-03-18 12:04:53 +01:00
Miodec 1686287f93 impr(dev): add configurable server response slowdown 2024-03-14 23:04:01 +01:00
Miodec 0ac470656c refactor: move /configuration below the artificial dev slowdown 2024-03-14 22:35:12 +01:00
Christian Fehmer 9432602727
impr: add selfhosting using docker only (fehmer) (#5170)
* impr: add selfhosting using docker only

* add recaptcha config and docs

* add documentation on the backend-configuration.json file, remove ---redacted--- from example config

---------

Co-authored-by: Jack <jack@monkeytype.com>
2024-03-12 12:02:13 +01:00
Christian Fehmer 8eb3206c8a
refactor: get actual rank with the user data instead of using lbmemory (fehmer) (#5189)
Co-authored-by: Jack <jack@monkeytype.com>
2024-03-11 20:29:18 +01:00
Martin Trigaux 1bb0bdffb0
fix(server): config saving with layout that includes a dash (mart-e) (#5193)
* [FIX] Accept layout with dash

At least seht-drai and ergo-l is not compatible

* add regex

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-03-11 20:17:10 +01:00
Christian Fehmer c95e3b2fa8
feat: indicate premium users (fehmer) (#5092)
* feat: indicate premium users

* frontend

* Test multiple userFlags, remove later

* cleanup

* fix flag alignment on profile and leaderboards

* fix name auto scaling

* update screenshot watermark

* update header text

* use userFlags for lbOptOut

* use flex end

* removeo unused code, increase margin

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-03-05 16:09:23 +01:00
Christian Fehmer b4af0917b2
chore: improve docker files for local development (#5157) 2024-03-04 16:10:22 +01:00
Christian Fehmer 171133c795
chore: fix eslint errors (fehmer) (#5166)
* fix eslint errors

* better type

* update type

* define type instead of ignoring errors

* add comment

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-03-04 15:25:32 +01:00
Christian Fehmer f7fe0e3f01
impr: better handling of ghost accounts (fehmer) (#5159)
* impr: better handling of ghost accounts

* move deletion to server

* wording
2024-03-04 14:23:33 +01:00
Miodec f7f09d16b1 fix: error when trying to update result tags 2024-02-29 15:10:48 +01:00
Paul Ebose a0416d3eba
impr(dev): allow docker compose to start the backend server (plbstl, Miodec) (#4995)
* chore: allow backend docker compose to start the api-server alongside redis & mongodb

* chore: update node versions in docker compose

* chore: add an extra compose file in backend

* docs: update advanced contribution guide with docker compose changes

* add docker script
support server_open env variable

* move files

* npm scripts
rename file

* add docker ignore

* fix redis not working

* rename file

* mounting root instead

* update docs

* update docs table of contents

* restart on fail

---------

Co-authored-by: Miodec <jack@monkeytype.com>
2024-02-28 14:17:09 +01:00