Michael Telatynski
ed0d9973b7
Switch to a discriminated unions
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-07-20 16:33:53 +01:00
Michael Telatynski
2bf5e4b142
clean up
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-07-15 09:49:02 +01:00
Michael Telatynski
8812f98b35
Convert editor to TypeScript
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-07-15 09:45:45 +01:00
Jorik Schellekens
7699aafcaf
Use new eslint package- fix lint issues in ts and js
2020-06-23 17:01:19 +01:00
Travis Ralston
803b7bb30f
Merge pull request #4694 from justin-sleep/remove-escape-backslashes
...
Remove escape backslashes in non-Markdown messages
2020-06-17 11:06:04 -06:00
Michael Telatynski
ef80a0b0b4
avoid negatives
2020-06-16 14:06:42 +01:00
Michael Telatynski
fcd3ebe051
Fix case-sensitivity of /me to match rest of slash commands
...
also better error handling for attempted runs of unimplemented commands
2020-06-16 00:41:21 +01:00
Justin Sleep
bdc451d66b
Remove escape backslashes in non-Markdown messages
2020-06-03 17:08:13 -05:00
Bruno Windels
0c5c2501e6
remove prefixes as we're using data urls now
2020-05-06 12:23:03 +02:00
Sergey Shpikin
a97a3cea51
Make avatars in pills occupy the entire space using cropping
...
Signed-off-by: Sergey Shpikin <rkfg@rkfg.me>
2020-04-23 10:55:49 +03:00
Michael Telatynski
9c1939b756
match all, not just first instance of tokens to escape
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-04-15 02:31:30 +01:00
Michael Telatynski
4454db30d6
Escape opening square bracket too
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-04-15 01:02:08 +01:00
Michael Telatynski
cb10640eaf
detslint
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-04-15 00:53:35 +01:00
Michael Telatynski
c72139fc3f
Convert serialize and deserialize to TypeScript
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-04-15 00:49:08 +01:00
Michael Telatynski
95eaf94cd8
Fix pills being broken by unescaped characters
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-04-15 00:40:38 +01:00
J. Ryan Stinnett
7ad8eeb906
Fix composer touch bar flickering on keypress in Chrome
...
This changes our selection state handling to leave things alone if the browser's
state already matches what we want. This avoids strange side effects like the
touch bar flickering on each key press in Chrome.
Fixes https://github.com/vector-im/riot-web/issues/9299
2020-03-04 14:35:11 +00:00
Bruno Windels
dc85346e5c
Merge pull request #4102 from matrix-org/bwindels/aliasautocomplete
...
Use alt_aliases for pills and autocomplete
2020-02-24 12:18:07 +00:00
Bruno Windels
13b08b5fcc
Revert "Fix escaped markdown passing backslashes through"
2020-02-24 11:27:22 +00:00
Michael Telatynski
e799691573
Apply null-guard to room pills for when we can't fetch the room
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-02-21 14:14:24 +00:00
Bruno Windels
16815a752b
use alt_aliases instead of aliases to match a pill to a room
...
when deserializing a pill
2020-02-21 13:02:41 +01:00
Bruno Windels
8870da6c24
Add alt_aliases to room completion candidates
...
but don't match on name otherwise you see multiple entries per room
when searching for a room name
Also pass the roomId to the composer autocomplete, so
it's easier to we don't need to loop through all the rooms and
it's also easier accept room with local aliases as well in the future
2020-02-21 13:02:41 +01:00
Bob
9cf53aa9d8
Only return formatted text when necessary (for escaped chars)
...
Signed-off-by: Bob Rao <bob+git@vulpin.com>
2020-02-02 16:34:19 +11:00
BobVul
fde30577e4
Fix escaped markdown passing backslashes through
...
Fixes https://github.com/vector-im/riot-web/issues/11230
Signed-off-by: Bob Rao <bob+git@vulpin.com>
2020-01-31 12:33:57 +11:00
Michael Telatynski
7e45979e00
change order of if or conditions as micro-optimization
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-01-30 20:59:30 +00:00
Michael Telatynski
b84fd245b1
Fix room completion for invited rooms and upgraded rooms
...
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-01-30 18:03:45 +00:00
Michael Telatynski
d7a4698db8
Merge pull request #3891 from matrix-org/t3chguy/fix_multi_paragraph_formatting
...
Fix paragraph-awareness of the composer formatting features
2020-01-23 13:31:12 +00:00
Michael Telatynski
13bb719a89
Add comment for operations loop
2020-01-23 11:22:22 +00:00
Michael Telatynski
832da062cc
Improve trailing spurious breaks + tests
2020-01-22 13:37:27 +00:00
Michael Telatynski
b5e902e1f2
Fix escaping commands using double-slash //, e.g //plain sends `/plain`
2020-01-21 15:55:21 +00:00
Michael Telatynski
b2aba6db35
Initial attempt to make toggleInlineFormat paragraph-aware
2020-01-21 15:32:32 +00:00
Travis Ralston
1b4ab856c9
Assume the position is at the end when the offset has no last part
...
We get an NPE when the user cuts their entire message, and this fixes it.
2020-01-15 21:05:00 -07:00
Travis Ralston
d56f0f2a25
Convert many imports to handle ES6 exports
...
Reliant upon https://github.com/matrix-org/matrix-react-sdk/pull/3761
2019-12-22 21:04:42 -07:00
Michael Telatynski
93ecc9839b
Fix linty failures
2019-10-22 13:49:02 +01:00
Tulir Asokan
75bcc3f849
Update src/editor/deserialize.js
...
Co-Authored-By: Bruno Windels <bruno@windels.cloud>
2019-10-18 19:58:55 +03:00
Tulir Asokan
a95f7be22d
Persist list indexes when editing
...
Signed-off-by: Tulir Asokan <tulir@maunium.net>
2019-10-13 14:31:32 +03:00
Tulir Asokan
29367766fd
Fix "decend" typo
...
Signed-off-by: Tulir Asokan <tulir@maunium.net>
2019-10-13 14:31:32 +03:00
Tulir Asokan
a160bdf4df
Persist code block language when editing
...
Signed-off-by: Tulir Asokan <tulir@maunium.net>
2019-10-13 14:31:32 +03:00
Bruno Windels
905aa81bf8
safeguard if the offsetnode is null when determining caret position
2019-10-10 16:39:41 +02:00
Travis Ralston
fc66e69c02
Rename RoomPermalinkCreator -> Permalinks due to scope
...
The file handles more than just a RoomPermalinkCreator, so we should name it accordingly.
2019-09-30 20:39:58 -06:00
Travis Ralston
ce0a534db1
Fix pills for CIDER too
2019-09-30 20:37:24 -06:00
Bruno Windels
4933b9b050
Merge pull request #3468 from matrix-org/bwindels/cider-autocomplete-fixes
...
Fix: when using autocomplete, ensure command is not sent as text, and @room notifs gets needed suffix
2019-09-23 13:57:07 +00:00
Bruno Windels
04720db2a3
don't append extra newline after blockquote anymore
...
now that P prepends newline when not first element
2019-09-23 15:33:30 +02:00
Bruno Windels
2445421270
add extra newline before P tags (when not first node)
2019-09-23 15:06:22 +02:00
Bruno Windels
0a663398ed
Use underscore for <em> when doing html > md
...
to be consistent with the format bar, which also uses underscores for italics
2019-09-23 14:59:53 +02:00
Bruno Windels
40f7fa8f94
add suffixes from provider to room and @room completions
...
this prevents the @room not working when not typing an extra space
2019-09-23 14:40:41 +02:00
Bruno Windels
228905bec2
insert command completion as command part (instead of plain)
...
this prevents the command being sent as plain text
this adds a `type` property to completions to decide which
parts should be inserted into the composer, hence deciding how
they will be rendered.
2019-09-23 14:39:19 +02:00
Bruno Windels
26bd694c6a
support toggling inline formatting
2019-09-06 16:25:55 +02:00
Bruno Windels
5014b606db
Merge pull request #3391 from matrix-org/bwindels/cider-format-history
...
New composer: ensure undo history is persisted before applying formatting
2019-09-06 09:28:18 +00:00
Bruno Windels
df4762871a
Merge pull request #3392 from matrix-org/bwindels/cider-paste-plain
...
New composer: fix pasting from word processors
2019-09-06 09:22:37 +00:00
Bruno Windels
6b104f6344
Merge pull request #3393 from matrix-org/bwindels/cider-fix-lastcaret
...
New composer: fix needing to push arrow-up twice after sending first message after switching to a room
2019-09-06 09:22:10 +00:00
Bruno Windels
9dac91a70d
ensure step before formatting is persisted in undo history
2019-09-06 11:20:24 +02:00
Bruno Windels
0252c7ae37
force pasting as plain text in new composer
2019-09-06 11:10:41 +02:00
Bruno Windels
2596281a7c
update last caret from update callback instead of input event
...
many editor updates are not caused by an input event, so
the last caret wasn't always up to date.
Updating the caret from the update callback ensures that every
time the editor contents is changed, the last caret is updated.
2019-09-06 11:09:01 +02:00
Bruno Windels
02681d50b9
Merge pull request #3386 from matrix-org/bwindels/cider-formatbar
...
New composer: show format bar on selection
2019-09-06 08:38:01 +00:00
Bruno Windels
d2949babcd
copyright is solely assigned to matrix foundation now, copy paste error
2019-09-06 10:29:12 +02:00
Bruno Windels
124b7135cd
make sure the update callback gets a caret when calling reset
2019-09-05 17:54:08 +02:00
Bruno Windels
2ea556e0b4
support update callback setting selection instead of caret
2019-09-04 16:40:34 +02:00
Bruno Windels
037ac29c57
be more forgiving with offset that don't have atNodeEnd=true
...
if index is not found, it means the last position should be returned
if there is any.
We still return -1 for empty documents, as index should always point
to a valid part if positive.
2019-09-04 16:40:34 +02:00
Bruno Windels
42c37d8293
fixup: improve quote and code block newline handling
2019-09-04 16:40:34 +02:00
Bruno Windels
e0668e8517
improve algorithm to reduce selection to text node + charactar offset
...
this follows the documentation of {focus|anchor}{Offset|Node} better
and was causing problems for creating ranges from the document selection
when doing ctrl+A in firefox as the anchorNode/Offset was expressed
as childNodes from the editor root.
2019-09-04 16:40:34 +02:00
Bruno Windels
4691108a16
only increase offset if caret hasn't been found yet
...
also rename caret away as this isn't used for the caret solely anymore
2019-09-04 16:40:34 +02:00
Bruno Windels
7a01d1407f
make _replaceRange internal only
2019-09-04 16:40:34 +02:00
Bruno Windels
6e694c113a
add support for inline/block code formatting
2019-09-04 16:40:34 +02:00
Bruno Windels
b35a3531bb
move quote formatting out of react component
2019-09-04 16:40:34 +02:00
Bruno Windels
b72d1a78ec
move inline formatting code out of react component
2019-09-04 16:40:34 +02:00
Bruno Windels
47d8d86bbe
whitespace (in model)
2019-09-04 16:40:23 +02:00
Bruno Windels
c15dfc3c05
make Range start and end public
2019-09-04 16:38:42 +02:00
Bruno Windels
77b14beb1f
add getter for intersecting parts of range, and total length
...
we'll need this when replacing selection, to preserve
newlines, etc ... in the selected range (e.g. we can't just
use range.text).
2019-09-04 16:35:03 +02:00
Bruno Windels
48f1bf1816
sort positions in Range constructor, so start always comes before end
2019-09-04 16:35:03 +02:00
Bruno Windels
4575aaa9f6
Merge pull request #3382 from matrix-org/bwindels/escape-command-slash
...
New composer: allow escaping the first slash to not write a command
2019-09-03 16:04:23 +00:00
Bruno Windels
0d02ab59d6
allow starting a range with both positions known already
...
we'll need this to start a range for the selection
2019-09-03 16:00:50 +02:00
Bruno Windels
eb87301855
allow getting the DocumentOffset for any node+offset, not just focusNode
...
we need this to get both offsets of the selection boundaries
getSelectionOffsetAndText offers the extra flexibility,
getCaretOffsetAndText keeps the old api for focusNode/focusOffset
Also did some renaming here now that it's not just for the caret anymore
2019-09-03 15:58:50 +02:00
Bruno Windels
648ae37ff4
make DocumentOffset compatible with what is returned from dom/getCaret
...
so we can return a DocumentOffset from there without breakage
2019-09-03 15:58:05 +02:00
Bruno Windels
712c3e5450
allow escaping the first slash to not write a command
2019-09-02 17:53:14 +02:00
Bruno Windels
6a0842d1ab
Merge pull request #3379 from matrix-org/bwindels/cider-deserialize-headers
...
Message editing: deserialize headers from html back to markdown
2019-09-02 14:58:54 +00:00
Bruno Windels
c4d7df768d
Merge pull request #3375 from matrix-org/bwindels/cider-colononmention
...
New composer: share user pill postfix between autocomplete and insert mention
2019-09-02 14:58:23 +00:00
Bruno Windels
5b54cf566d
deserialize headers from html back to markdown
2019-09-02 16:23:56 +02:00
Bruno Windels
2683627a82
disable spell check for pills in the new composer
2019-09-02 14:26:15 +02:00
Bruno Windels
c595371845
share user pill postfix between autocomplete and insert mention
...
where we decide to add a colon only if the composer is empty
2019-09-02 14:06:30 +02:00
Bruno Windels
4329d8c4ef
Merge pull request #3372 from matrix-org/bwindels/fix-command-tab-complete
...
New composer: fix tab-complete in commands
2019-09-02 11:38:13 +00:00
Bruno Windels
00d81eece9
don't accept @/#/: as part of command, allow to create pill candidate
...
so if you type these 3 characters, you get the correct autocomplete
2019-09-02 11:26:20 +02:00
Bruno Windels
a4376a76f0
only pass keyboard to autocomplete when it has selections
...
otherwise if tab is pressed, try to tab complete the last word
2019-09-02 11:25:29 +02:00
Bruno Windels
63be16beff
Merge pull request #3366 from matrix-org/bwindels/cider-user-pill-text-fallback
...
New composer: put display name in user pill text fallback instead of mxid
2019-08-30 16:03:28 +00:00
Bruno Windels
ec0d048cf0
Merge pull request #3361 from matrix-org/bwindels/autocomplete-colon
...
New composer: append colon to completed user pill when at start of message
2019-08-30 16:02:58 +00:00
Bruno Windels
b16f983a1f
put display name in user pill text fallback instead of mxid
2019-08-30 11:51:29 +02:00
Bruno Windels
c9572250be
only append colon to user-pill when at start of composer
...
by passing position to autocomplete, so completion
can depend on where the pill-candidate appears.
2019-08-29 17:47:14 +02:00
Bruno Windels
2ff2ff0e75
support autocomplete replacing text with multiple parts
...
and append ": " to user pills
2019-08-29 17:43:18 +02:00
Bruno Windels
80523f5dbe
still convert \n to NewlinePart when pasting/dropping
...
before we skipped the complete validation (which creates NewlineParts)
when pasting or dropping text. We don't want to create PillCandidatePart
when inserting text like this, as it would open the auto-complete, but
newlines should still be applied. So instead of skipping validation,
pass the inputType to the validation code so they can only reject
pill candidate characters when not pasting.
2019-08-29 13:00:31 +02:00
Bruno Windels
e531b29307
don't ignore BR elements when converting to editor dom to text
2019-08-29 13:00:31 +02:00
Bruno Windels
85efb71a23
add visual bell when no replacements are available
...
also add try/catch in _tabCompleteName so errors don't get swallowed
2019-08-28 15:53:16 +02:00
Bruno Windels
c44fbb73d0
fix bug when replacing range starting at end of previous part
2019-08-28 15:52:39 +02:00
Bruno Windels
d8bb9ecedf
bring insert method inline with transform callback, add docs
...
before the insertPartsAt method would call the update callback
on its own, but now we have the concept of a transformation session,
so lets bring the API in line
2019-08-27 16:43:05 +02:00
Bruno Windels
8e66d382de
don't crash on race with room members and initial composer render
...
not ideal, but for now this prevents a crash at startup
when a user-pill is persisted in local storage
2019-08-27 16:43:05 +02:00
Bruno Windels
e0ec827a64
extra docs
2019-08-27 16:43:05 +02:00
Bruno Windels
68c2bb7ca6
introduce `transform` method so update can be called with a position
...
and also for multiple transformations at once. This removes
the need to call the update callback from `replaceRange()` as well
2019-08-27 16:43:05 +02:00
Bruno Windels
f76a23d5dd
return promise from updating autocomplete
...
so one can await if needed
2019-08-27 16:43:05 +02:00
Bruno Windels
0f6465a1db
don't close autocomplete when hitting tab
...
that's not what the slate impl does and it's not an improvement
2019-08-27 16:43:05 +02:00
Bruno Windels
713205e0ab
close autocomplete when removing auto-completed part
2019-08-27 16:43:05 +02:00
Bruno Windels
f10e1d7654
fix jsdoc comments
2019-08-27 09:54:13 +02:00
Bruno Windels
5c28b57681
always recalculate position after doing transform step
...
as the amount of characters might not have changed,
parts may still have been merged, removed or added which
requires a new position.
2019-08-27 09:49:22 +02:00
Bruno Windels
4fd4ad41c1
improve editor model documentation
2019-08-26 16:16:27 +02:00
Bruno Windels
f8f0e77bde
add transform step during editor model update
2019-08-26 16:16:27 +02:00
Bruno Windels
0e65f71a37
support incrementing/decrementing doc positions with predicate
2019-08-26 16:16:27 +02:00
Bruno Windels
10291bafe0
add support for selecting ranges in the editor model, and replacing them
...
this to support finding emoticons and replacing them with an emoji
2019-08-26 16:16:27 +02:00
Bruno Windels
5cebce9bbf
fix bug detected by tests
2019-08-22 14:41:40 +01:00
Bruno Windels
e2dfe888cc
only capture Enter when autocompletion list has selection
...
this is the old behaviour and makes sense IMO
also close the auto complete when resetting the composer model,
in case it was still open
2019-08-22 13:33:20 +01:00
Bruno Windels
c5cd8b943a
support auto complete for /commands
2019-08-22 13:33:20 +01:00
Bruno Windels
88cc1c428d
add support for emotes and running /commands
...
this does not yet include autocomplete for commands
2019-08-22 13:33:20 +01:00
Bruno Windels
9bc8ff7e1e
clear composer undo history when sending a message
2019-08-22 13:33:20 +01:00
Bruno Windels
0adca10f9f
make named options argument optional
2019-08-22 13:33:20 +01:00
Bruno Windels
10c218825b
allow inserting multiple parts at a position
2019-08-22 13:33:20 +01:00
Bruno Windels
ce44c651d0
keep deserialized parts compatible with part api,
...
to avoid breakage when passing real parts
2019-08-22 13:33:20 +01:00
Bruno Windels
d4fbe7ed69
make editor event parsing suitable for parsing messages to be quoted
2019-08-22 13:33:20 +01:00
Bruno Windels
c135cd60d2
restore insert mention
...
for this, we need to store the last caret in the editor,
to know where to insert the user pill.
Because clicking on a member blurs the editor, and the
selection is moved away from the editor.
For this reason, we keep as cache of the last caretOffset object,
invalidated by a selection with different values.
The selection needs to be cloned because apparently the browser
mutates the object instead of returning a new one.
2019-08-22 13:33:20 +01:00
Bruno Windels
f9992a1fc6
implement editor placeholder
2019-08-22 13:33:20 +01:00
Bruno Windels
d22745a5b2
make it obvious arguments are optional
...
because now they have a setter
2019-08-22 13:33:20 +01:00
Bruno Windels
063eabed71
don't return invalid indices from model, fix for #10358
2019-08-22 13:33:20 +01:00
Bruno Windels
299cf8542c
Split MessageEditor in edit-specifics & reusable part for main composer
2019-08-05 15:31:18 +02:00
Bruno Windels
c53708b245
set lastNode directly when not decending
2019-08-02 16:36:09 +02:00
Bruno Windels
af3eebd0a6
add undo steps after word boundary (or capped) when typing or removing
2019-08-02 11:31:01 +02:00
Bruno Windels
07b2e51dce
put max step length in constant
2019-08-01 16:27:17 +02:00
Bruno Windels
abde8b45d2
fix bug that prevented a line from being removed when undoing a newline
2019-08-01 11:28:40 +02:00
Bruno Windels
234404e598
add mod+z/y shortcuts, set editor state to what history manager returns
2019-08-01 11:27:09 +02:00
Bruno Windels
98bc0d24f4
push changes to history manager
2019-08-01 11:26:20 +02:00
Bruno Windels
aa22c90f2c
HistoryManager + unit tests
2019-08-01 11:25:04 +02:00
Bruno Windels
a999acbd04
fix argument order
2019-07-30 17:17:25 +02:00
Bruno Windels
44e4661198
document return type
2019-07-30 12:34:30 +02:00
Bruno Windels
0b92077bba
tests for turning caret position from model into dom position
2019-07-25 18:38:00 +02:00
Bruno Windels
f8e1977f0a
remove dead code
2019-07-25 14:50:20 +02:00
Bruno Windels
9bfba9db3e
make PartCreator a bit more testable by not asking for deps of dep
2019-07-25 14:50:20 +02:00
Bruno Windels
419c800167
add tests for diffAtCaret
2019-07-25 14:50:20 +02:00
Bruno Windels
595dc82543
unit test + fixes + comments + simplication for diffDeletion
2019-07-25 14:50:20 +02:00
Bruno Windels
3753e5261d
Implement diffing html messages in the edit history
2019-07-24 11:28:56 +02:00
Bruno Windels
ee9dd8ce81
adjust jsdoc
2019-07-12 10:06:38 +02:00
Bruno Windels
dedf978948
prevent inserting parts at index -1 for empty documents
2019-07-11 18:46:56 +02:00
Bruno Windels
06fb892df9
prevent autocomplete when doing bulk insertion (paste, drop text)
2019-07-11 18:46:56 +02:00
Bruno Windels
f6e71b2335
turn flag into options object
2019-07-08 16:55:56 +02:00
Bruno Windels
888e4d1ec2
preserve reply fallback when editing
2019-07-08 15:25:44 +02:00
Bruno Windels
1c7af38d83
Merge pull request #3126 from matrix-org/bwindels/caret-refactoring
...
Editor caret improvements
2019-06-21 15:02:41 +00:00
Bruno Windels
c443dd7a32
clarify why use a BOM marker for the caret nodes
2019-06-21 16:37:29 +02:00
Bruno Windels
503d702f47
take list nesting into account for indenting
2019-06-21 11:40:27 +02:00
Bruno Windels
da766b8cba
caretNode is a better className
2019-06-21 11:21:38 +02:00
Bruno Windels
c5c987f62e
use BOM marker instead of ZWS
...
that's what others do ...
2019-06-21 11:21:13 +02:00
Bruno Windels
366a4aa308
put zero-width spaces in caret nodes so chrome doesn't ignore them
...
this requires an update of the editor DOM > text & caret offset logic,
as the ZWS need to be ignored.
2019-06-20 14:44:18 +02:00
Bruno Windels
f0271b593d
remove special casing for moving caret after newline and pills
...
not needed anymore with new caret logic and having caret nodes
2019-06-19 17:42:18 +02:00
Bruno Windels
a229641985
use caret nodes in caret positioning code, to move caret out of pills
2019-06-19 17:42:18 +02:00
Bruno Windels
607fc328ed
also process first part when processing empty and mergeable parts
...
this was preventing clearing an emtpy plain part when inserting
a pill-candidate at the beginning of the model, which
prevented a caret node from being inserted before the pill.
2019-06-19 17:42:18 +02:00
Bruno Windels
75fc769742
insert "caret nodes" where pills don't have an adjacent text node
...
just empty spans, where the caret can be placed.
2019-06-19 17:42:18 +02:00
Bruno Windels
1db505c667
comment typo
2019-06-18 09:50:31 +02:00
Bruno Windels
3119feaa17
whitespace
2019-06-18 09:48:25 +02:00