Skip to content

Commit e74f187

Browse files
Nikolay Khabarovjonathanpoelen
Nikolay Khabarov
authored andcommitted
Add mouse extended events support
1 parent c885c6d commit e74f187

20 files changed

+122
-13
lines changed

src/acl/mod_wrapper.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ void ModWrapper::rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y)
198198
this->get_mod().rdp_input_mouse(device_flags, x, y);
199199
}
200200

201+
void ModWrapper::rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y)
202+
{
203+
this->get_mod().rdp_input_mouse_ex(device_flags, x, y);
204+
}
205+
201206
void ModWrapper::rdp_input_invalidate(Rect r)
202207
{
203208
if (this->get_protected_rect().isempty() || !r.has_intersection(this->get_protected_rect())) {

src/acl/mod_wrapper.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class ModWrapper final : public gdi::OsdApi, private Callback
7575

7676
void rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y) override;
7777

78+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override;
79+
7880
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
7981

8082
void rdp_input_unicode(KbdFlags flag, uint16_t unicode) override

src/core/callback.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ enum : uint16_t {
4444
// RDP_INPUT_VIRTKEY = 2,
4545
RDP_INPUT_SCANCODE = 4,
4646
RDP_INPUT_UNICODE = 5,
47-
RDP_INPUT_MOUSE = 0x8001
47+
RDP_INPUT_MOUSE = 0x8001,
48+
RDP_INPUT_MOUSE_EX = 0x8002
4849
};
4950

5051
// TODO move that + enum class
@@ -71,6 +72,7 @@ struct RdpInput : private noncopyable
7172
virtual void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) = 0;
7273
virtual void rdp_input_unicode(KbdFlags flag, uint16_t unicode) = 0;
7374
virtual void rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y) = 0;
75+
virtual void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) = 0;
7476
virtual void rdp_input_synchronize(KeyLocks locks) = 0;
7577
virtual void rdp_input_invalidate(Rect r) = 0;
7678
virtual void rdp_input_invalidate2(array_view<Rect> vr)
@@ -128,6 +130,13 @@ struct NullCallback : Callback
128130
(void)y;
129131
}
130132

133+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override
134+
{
135+
(void)device_flags;
136+
(void)x;
137+
(void)y;
138+
}
139+
131140
void rdp_input_synchronize(KeyLocks locks) override
132141
{
133142
(void)locks;

src/front/front.hpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -2512,11 +2512,11 @@ class Front : public FrontAPI, public gdi::GraphicApi
25122512
{
25132513
FastPath::MouseExEvent_Recv me(cfpie.payload, byte);
25142514

2515-
LOG(LOG_WARNING,
2516-
"Front::Received unexpected fast-path PDU, extended mouse pointerFlags=0x%X, xPos=0x%X, yPos=0x%X",
2515+
LOG_IF(bool(this->verbose & Verbose::basic_trace3), LOG_INFO,
2516+
"Front::incoming: Received Fast-Path PDU, extended mouse pointerFlags=0x%X, xPos=0x%X, yPos=0x%X",
25172517
me.pointerFlags, me.xPos, me.yPos);
25182518

2519-
this->input_extended_mouse(me.pointerFlags);
2519+
this->input_extended_mouse(me.xPos, me.yPos, me.pointerFlags, cb);
25202520
}
25212521
break;
25222522

@@ -3315,6 +3315,7 @@ class Front : public FrontAPI, public gdi::GraphicApi
33153315
// Slow/Fast-path
33163316
input_caps.inputFlags =
33173317
INPUT_FLAG_SCANCODES
3318+
| INPUT_FLAG_MOUSEX
33183319
| (this->ini.get<cfg::client::unicode_keyboard_event_support>() ? INPUT_FLAG_UNICODE : 0)
33193320
| (this->fastpath_support ? (INPUT_FLAG_FASTPATH_INPUT | INPUT_FLAG_FASTPATH_INPUT2) : 0);
33203321
input_caps.keyboardLayout = 0;
@@ -4152,9 +4153,10 @@ class Front : public FrontAPI, public gdi::GraphicApi
41524153
{
41534154
SlowPath::ExtendedMouseEvent_Recv me(ie.payload);
41544155

4155-
LOG(LOG_WARNING, "Front::process_data: Unexpected Slow-Path INPUT_EVENT_MOUSEX eventTime=%u pointerFlags=0x%04X, xPos=%u, yPos=%u)",
4156+
LOG_IF(bool(this->verbose & Verbose::basic_trace3), LOG_INFO,
4157+
"Front::process_data: Slow-Path INPUT_EVENT_MOUSEEX eventTime=%u pointerFlags=0x%04X, xPos=%u, yPos=%u)",
41564158
ie.eventTime, me.pointerFlags, me.xPos, me.yPos);
4157-
this->input_extended_mouse(me.pointerFlags);
4159+
this->input_extended_mouse(me.xPos, me.yPos, me.pointerFlags, cb);
41584160
}
41594161
break;
41604162

@@ -5360,9 +5362,10 @@ class Front : public FrontAPI, public gdi::GraphicApi
53605362
}
53615363
}
53625364

5363-
void input_extended_mouse(uint16_t /*pointer_flags*/)
5365+
void input_extended_mouse(uint16_t x, uint16_t y, uint16_t pointer_flags, Callback & cb)
53645366
{
53655367
this->has_user_activity = true;
5368+
cb.rdp_input_mouse_ex(pointer_flags, x, y);
53665369

53675370
// TODO unimplemented
53685371

src/headlessclient/headless_repl.hpp

+9
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ struct HeadlessRepl final : FrontAPI, SessionLogApi, private RdpInput
148148
input_mod->rdp_input_mouse(device_flags, x, y);
149149
}
150150

151+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override
152+
{
153+
x = std::min(x, client_info.screen_info.width);
154+
y = std::min(y, client_info.screen_info.height);
155+
cmd_ctx.mouse_x = x;
156+
cmd_ctx.mouse_x = y;
157+
input_mod->rdp_input_mouse_ex(device_flags, x, y);
158+
}
159+
151160
void rdp_input_synchronize(KeyLocks locks) override
152161
{
153162
input_mod->rdp_input_synchronize(locks);

src/headlessclient/input_collector.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ InputCollector::ConsumedInput InputCollector::send_next_input(RdpInput& mod, Key
5555
input.y
5656
);
5757
break;
58+
59+
case InputType::MouseEx:
60+
mod.rdp_input_mouse_ex(
61+
checked_int(input.flags_or_locks),
62+
input.sc_or_uc_or_x,
63+
input.y
64+
);
65+
break;
5866
}
5967

6068
++current_input_index;

src/headlessclient/input_collector.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class InputCollector : public RdpInput
2121
Unicode,
2222
KeyLock,
2323
Mouse,
24+
MouseEx,
2425
};
2526

2627
struct InputData
@@ -60,6 +61,11 @@ class InputCollector : public RdpInput
6061
push_data(InputData{InputType::Mouse, device_flags, x, y});
6162
}
6263

64+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override
65+
{
66+
push_data(InputData{InputType::MouseEx, device_flags, x, y});
67+
}
68+
6369
void rdp_input_synchronize(KeyLocks locks) override
6470
{
6571
push_data(InputData{InputType::KeyLock, underlying_cast(locks), 0, 0});

src/mod/internal/bouncer2_mod.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ class Bouncer2Mod : public mod_api
7676
this->mouse_y = y;
7777
}
7878

79+
void rdp_input_mouse_ex(uint16_t /*device_flags*/, uint16_t x, uint16_t y) override
80+
{
81+
this->mouse_x = x;
82+
this->mouse_y = y;
83+
}
84+
7985
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
8086

8187
void rdp_input_unicode(KbdFlags flag, uint16_t unicode) override

src/mod/internal/rail_mod_base.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,20 @@ void RailModBase::rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y)
9191
}
9292
}
9393

94+
void RailModBase::rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y)
95+
{
96+
if (device_flags & (MOUSE_FLAG_WHEEL | MOUSE_FLAG_HWHEEL)) {
97+
x = this->old_mouse_x;
98+
y = this->old_mouse_y;
99+
}
100+
else {
101+
this->old_mouse_x = x;
102+
this->old_mouse_y = y;
103+
}
104+
105+
this->screen.rdp_input_mouse_ex(device_flags, x, y);
106+
}
107+
94108
void RailModBase::rdp_input_scancode(
95109
KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap)
96110
{

src/mod/internal/rail_mod_base.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class RailModBase : public mod_api
4343

4444
void rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y) override;
4545

46+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override;
47+
4648
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
4749

4850
void rdp_input_unicode(KbdFlags flag, uint16_t unicode) override;

src/mod/internal/replay_mod.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class ReplayMod : public mod_api
5959

6060
void rdp_input_mouse(uint16_t /*device_flags*/, uint16_t /*x*/, uint16_t /*y*/) override {}
6161

62+
void rdp_input_mouse_ex(uint16_t /*device_flags*/, uint16_t /*x*/, uint16_t /*y*/) override {}
63+
6264
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
6365

6466
void rdp_input_unicode(KbdFlags /*flag*/, uint16_t /*unicode*/) override {}

src/mod/internal/test_card_mod.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class TestCardMod : public mod_api
5252

5353
void rdp_input_mouse(uint16_t /*device_flags*/, uint16_t /*x*/, uint16_t /*y*/) override {}
5454

55+
void rdp_input_mouse_ex(uint16_t /*device_flags*/, uint16_t /*x*/, uint16_t /*y*/) override {}
56+
5557
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
5658

5759
void rdp_input_unicode(KbdFlags flag, uint16_t unicode) override

src/mod/internal/widget/widget.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,14 @@ class Widget : public RdpInput
180180
(void)y;
181181
}
182182

183+
// - mouve extended event (mouse exta button went up or down)
184+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override
185+
{
186+
(void)device_flags;
187+
(void)x;
188+
(void)y;
189+
}
190+
183191
// - synchronisation of capslock, numlock, etc state.
184192
void rdp_input_synchronize(KeyLocks locks) override
185193
{

src/mod/null/null.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ struct null_mod : public mod_api
3939
[[maybe_unused]] uint16_t y) override
4040
{}
4141

42+
void rdp_input_mouse_ex(
43+
[[maybe_unused]] uint16_t device_flags,
44+
[[maybe_unused]] uint16_t x,
45+
[[maybe_unused]] uint16_t y) override
46+
{}
47+
4248
void rdp_input_scancode(
4349
[[maybe_unused]] KbdFlags flags,
4450
[[maybe_unused]] Scancode scancode,

src/mod/rdp/rdp.hpp

+21
Original file line numberDiff line numberDiff line change
@@ -2505,6 +2505,15 @@ class mod_rdp : public mod_api, public rdp_api, public sespro_api
25052505
}
25062506
}
25072507

2508+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override
2509+
{
2510+
if (UP_AND_RUNNING == this->connection_finalization_state
2511+
&& !this->input_event_disabled
2512+
) {
2513+
this->send_input_mouse_ex(device_flags, x, y);
2514+
}
2515+
}
2516+
25082517
// TODO: move to channels (and also remains here as it is mod API)
25092518
void send_to_mod_channel(
25102519
CHANNELS::ChannelNameId front_channel_name,
@@ -6401,6 +6410,18 @@ class mod_rdp : public mod_api, public rdp_api, public sespro_api
64016410
}
64026411
}
64036412

6413+
void send_input_mouse_ex(uint16_t flags, uint16_t x, uint16_t y)
6414+
{
6415+
if (this->enable_fastpath_client_input_event) {
6416+
this->send_input_fastpath([&](OutStream & stream) {
6417+
FastPath::MouseExEvent_Send(stream, flags, x, y);
6418+
});
6419+
}
6420+
else {
6421+
this->send_input_slowpath(0, RDP_INPUT_MOUSE_EX, flags, x, y);
6422+
}
6423+
}
6424+
64046425
void send_input_slowpath(uint32_t time, uint16_t message_type, uint16_t device_flags, uint16_t param1, uint16_t param2)
64056426
{
64066427
LOG_IF(bool(this->verbose & RDPVerbose::input), LOG_INFO,

src/mod/vnc/vnc.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ void mod_vnc::rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y)
322322
this->t.send(out_stream.get_produced_bytes());
323323
}
324324

325+
void mod_vnc::rdp_input_mouse_ex(uint16_t /*device_flags*/, uint16_t /*x*/, uint16_t /*y*/)
326+
{
327+
// this->mouse seems that cannot handle extended mouse events, so do nothing
328+
}
329+
325330
void mod_vnc::rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap)
326331
{
327332
(void)event_time;

src/mod/vnc/vnc.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,7 @@ class mod_vnc : public mod_api
780780

781781
// TODO It may be possible to change several mouse buttons at once ? Current code seems to perform several send if that occurs. Is it what we want ?
782782
void rdp_input_mouse(uint16_t device_flags, uint16_t x, uint16_t y) override;
783+
void rdp_input_mouse_ex(uint16_t device_flags, uint16_t x, uint16_t y) override;
783784
void rdp_input_scancode(KbdFlags flags, Scancode scancode, uint32_t event_time, Keymap const& keymap) override;
784785
void rdp_input_unicode(KbdFlags flag, uint16_t unicode) override;
785786

tests/includes/fixtures/trace_mstsc_client.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ const char outdata[] = /* NOLINT */
485485
/* 0090 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00" // ................ |
486486
/* 00a0 */ "\x01\x00\x00\x00\x00\xa1\x06\x00\x00\x40\x42\x0f\x00\x40\x42\x0f" // .........@B..@B. |
487487
/* 00b0 */ "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x08\x00\x0a\x00\x01\x00\x19" // ................ |
488-
/* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.)........ |
488+
/* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.-........ |
489489
/* 00d0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
490490
/* 00e0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
491491
/* 00f0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
@@ -1348,7 +1348,7 @@ const char indata[] = /* NOLINT */
13481348
// /* 0090 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00" // ................ |
13491349
// /* 00a0 */ "\x01\x00\x00\x00\x00\xa1\x06\x00\x00\x40\x42\x0f\x00\x40\x42\x0f" // .........@B..@B. |
13501350
// /* 00b0 */ "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x08\x00\x0a\x00\x01\x00\x19" // ................ |
1351-
// /* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.)........ |
1351+
// /* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.-........ |
13521352
// /* 00d0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
13531353
// /* 00e0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
13541354
// /* 00f0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |

tests/includes/fixtures/trace_mstsc_client_rdp50bulk.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ const char outdata[] = /* NOLINT */
485485
/* 0090 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00" // ................ |
486486
/* 00a0 */ "\x01\x00\x00\x00\x00\xa1\x06\x00\x00\x40\x42\x0f\x00\x40\x42\x0f" // .........@B..@B. |
487487
/* 00b0 */ "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x08\x00\x0a\x00\x01\x00\x19" // ................ |
488-
/* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.)........ |
488+
/* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.-........ |
489489
/* 00d0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
490490
/* 00e0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
491491
/* 00f0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
@@ -1656,7 +1656,7 @@ const char indata[] = /* NOLINT */
16561656
// /* 0090 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00" // ................ |
16571657
// /* 00a0 */ "\x01\x00\x00\x00\x00\xa1\x06\x00\x00\x40\x42\x0f\x00\x40\x42\x0f" // .........@B..@B. |
16581658
// /* 00b0 */ "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x08\x00\x0a\x00\x01\x00\x19" // ................ |
1659-
// /* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.)........ |
1659+
// /* 00c0 */ "\x00\x19\x00\x0d\x00\x58\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00" // .....X.-........ |
16601660
// /* 00d0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
16611661
// /* 00e0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |
16621662
// /* 00f0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ................ |

tests/includes/fixtures/trace_rdesktop_client.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ const char outdata[] = /* NOLINT */
477477
// ColorCache caps::pad2octets 0 |
478478
// Sending on RDP Client (4) 327 bytes |
479479
/* 0000 */ "\x03\x00\x01\x47\x02\xf0\x80\x68\x00\x00\x03\xeb\x70\x81\x38\x08" // ...G...h....p.8. |
480-
/* 0010 */ "\x00\x00\x00\x7e\x0e\x56\xe3\x17\x71\x18\xcf\xb5\xfe\x81\x03\xf6" // .....62KX....... |
480+
/* 0010 */ "\x00\x00\x00\x04\x5c\xc4\x3f\x0e\x0b\x72\x78\xb5\xfe\x81\x03\xf6" // ......?..rx..... |
481481
/* 0020 */ "\x1d\xcc\x5f\x7f\x2c\x1a\xa9\x3b\x9f\xa7\xed\x51\x37\xfc\x0c\xe5" // .._.,..;...Q7... |
482482
/* 0030 */ "\xa4\xfd\x15\x05\xd5\xa7\xd3\x68\xf1\xf1\xe7\xa8\x2a\x02\x50\x64" // .......h....*.Pd |
483483
/* 0040 */ "\xfd\x71\xca\x6a\x0a\x75\x02\x12\x84\x97\x64\x45\xb4\xf1\x15\xb9" // .q.j.u....dE.... |
@@ -489,7 +489,7 @@ const char outdata[] = /* NOLINT */
489489
/* 00a0 */ "\x57\xf3\xdb\x62\xa6\x33\x25\x75\xf9\xe8\x66\x0c\x91\xb1\x4d\x90" // W..b.3%u..f...M. |
490490
/* 00b0 */ "\x64\xff\xfc\x07\xb4\x26\x64\x38\xfa\xe5\x99\x2c\xe3\x00\x14\x04" // d....&d8...,.... |
491491
/* 00c0 */ "\x60\x8c\xd4\xc5\xb2\x9c\x87\xfe\x9b\xf9\xb6\xe3\x33\x89\x6d\xd9" // `...........3.m. |
492-
/* 00d0 */ "\x6b\x8e\xe8\x8e\x7d\xb9\x2a\xa7\xec\xbb\xcf\xb2\x14\xe2\xe6\xe9" // k...}.*......... |
492+
/* 00d0 */ "\x6b\x8e\xe8\x8a\x7d\xb9\x2a\xa7\xec\xbb\xcf\xb2\x14\xe2\xe6\xe9" // k...}.*......... |
493493
/* 00e0 */ "\x23\x99\xf2\x48\x6e\x1a\xff\x9f\x9a\xb0\x0d\xe3\x6e\xf4\xc2\x5d" // #..Hn.......n..] |
494494
/* 00f0 */ "\x3a\xca\x37\x04\x2c\xac\x36\x65\xed\x9f\x90\xdc\xa9\xa7\xde\x5a" // :.7.,.6e.......Z |
495495
/* 0100 */ "\x5a\xa3\x81\x24\xa6\xbb\x05\xc6\x6c\x51\xd5\x53\x9d\xf8\xd1\xc3" // Z..$....lQ.S.... |

0 commit comments

Comments
 (0)